免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6779 | 回复: 19
打印 上一主题 下一主题

共享内存,申请大内存。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-03 10:44 |只看该作者 |倒序浏览
20可用积分
驱动部分



18
19 #include    <stdio.h>
20 #include    "smas_param.h" 32 MODULE_LICENSE("GPL");
33 #define MAJOR_NUM 201
34
35 unsigned long shmem_addr;
36 unsigned long shmem_phy_addr;
37 unsigned long shmem_pid=0xffff;
38 static int order = 0;
39 static ssize_t shmem_read(struct file *,char *,size_t,loff_t *);
40 static ssize_t shmem_write(struct file *,const char *,size_t,loff_t *);
41 static int shmem_open(struct inode *inode,struct file *file);
42 static int shmem_release(struct inode *inode,struct file *file);
43
44 struct file_operations shmem_fops=
45 {
46 read:shmem_read,
47 write:shmem_write,
48 open:shmem_open,
49 release:shmem_release,
50 };
51
52
53 static int __init shmem_init(void)
54 {
55     unsigned char *p_virt;
56     unsigned long p_phy;
57     unsigned int i;
58     pgd_t *dir;
59     pmd_t *pmdp;
60     pte_t *ptep;
ret=register_chrdev(MAJOR_NUM,"shmem",&shmem_fops);
66     if(ret)
67     {
68         printk("shmem register failure\n");
69     }
70     else
71     {
72         printk("shmem register success\n");
73     }
74     order = get_order(4*1024);
75     printk("order = %d,\n",order);
76     shmem_addr=__get_free_pages(GFP_KERNEL,10);
77
78     for (i = 0; i < 1024 ; i ++)
79         SetPageReserved(virt_to_page(shmem_addr + i * 4096));
80
81     printk("shmem_addr = %x\n",shmem_addr);
82     p_phy=virt_to_phys(shmem_addr);
83     shmem_phy_addr=p_phy;
84     printk("p_phy= %x\n",p_phy);
85
86     //
87     return 0;
88 }
89
90 static void __exit shmem_exit(void)
91 {
92     printk("shmem_exit\n");
93     unsigned int i;
94
95     for (i = 0; i < 1024 ; i ++)
96         ClearPageReserved(virt_to_page(shmem_addr + i * 4096));
97     free_pages(shmem_addr,10);
98     unregister_chrdev(MAJOR_NUM,"shmem");
99 }

应用部分

61     pgprot_t newprot;
62
63     int ret;
64

21
22 int main(int argc, char *argv[])
23 {
24     int i = 0;
25
26     printf("share_memory_init \n");
27
28     SMAS_Param * temp_t;
29     if (NULL == (temp_t = (SMAS_Param *)share_memory_init()))
30     {
31         printf("share_memory_init error! \n");
32     }
33
34     printf("share_memory_init ok \n");
35
36     while(1)
37     {
38 //      for (i = 0; i < 10 ;i ++)
39         {
40             temp_t->system.system_value.camera[0].web_camera.camera_port += 1;
41         }
42         printf("\n");
43         sleep(2);
44     }
45
46
47     return 0;
48 }

论坛徽章:
52
码神
日期:2017-03-28 10:27:10综合交流区版块每日发帖之星
日期:2015-10-11 06:20:00综合交流区版块每日发帖之星
日期:2015-09-28 06:20:00综合交流区版块每日发帖之星
日期:2015-09-22 06:20:00每日论坛发贴之星
日期:2015-09-12 06:20:00综合交流区版块每日发帖之星
日期:2015-09-12 06:20:00综合交流区版块每日发帖之星
日期:2015-09-08 06:20:00综合交流区版块每日发帖之星
日期:2015-09-05 06:20:00综合交流区版块每日发帖之星
日期:2015-09-04 06:20:002015亚冠之德黑兰石油
日期:2015-09-01 10:41:53每日论坛发贴之星
日期:2015-10-11 06:20:00综合交流区版块每日发帖之星
日期:2015-10-12 06:20:00
2 [报告]
发表于 2009-12-03 11:45 |只看该作者
什么意思?

论坛徽章:
0
3 [报告]
发表于 2009-12-03 11:46 |只看该作者
我想声请一个 4M以上的共享内存?

论坛徽章:
0
4 [报告]
发表于 2009-12-03 13:19 |只看该作者
get_free_pages有4M限制,共享内存不需要写驱动这么麻烦吧,修改/proc/sys/kernel/shmall,调用shmget

论坛徽章:
0
5 [报告]
发表于 2009-12-03 13:24 |只看该作者
alloc_bootmem

论坛徽章:
0
6 [报告]
发表于 2009-12-03 14:22 |只看该作者
我看我的shmall 是 2M。 但是 我的SMAS_Param 结构 才 500 多K,怎么frok的时候有错误呢。

39 void * share_memory_init()
40 {
41
42     int fd;
43     key_t key;
44     if (-1 == (key = ftok(SHARE_MEMORY_PATH , 0)))
45     {
46         printf("ftok fail \n");
47         return 0;
48     }
49     if (-1 == (fd = shmget(key,sizeof(SMAS_Param),IPC_CREAT)))
50     {
51         printf("shmget fail \n");
52         return 0;
53     }
54     SMAS_Param * temp_t = (SMAS_Param * ) shmat(fd ,NULL , 0);
55
56     return temp_t;
57 }   
58
59 void share_memory_destory(void * p_map)
60 {
61     if (p_map != NULL)
62         shm_unlink(SHARE_MEMORY_PATH);
63 }

论坛徽章:
0
7 [报告]
发表于 2009-12-03 14:27 |只看该作者
现在是这个错误! 刚才是 路径错误。
share_memory_init
shmget fail
share_memory_init error!
share_memory_init ok
Segmentation fault

论坛徽章:
0
8 [报告]
发表于 2009-12-03 14:28 |只看该作者
把errno打出来看

论坛徽章:
0
9 [报告]
发表于 2009-12-03 14:30 |只看该作者
# cat /proc/sys/kernel/shmall
2097152
# cat /proc/sys/kernel/shmm
/proc/sys/kernel/shmmax  /proc/sys/kernel/shmmni
# cat /proc/sys/kernel/shmmax
33554432
# cat /proc/sys/kernel/shmm
/proc/sys/kernel/shmmax  /proc/sys/kernel/shmmni
# cat /proc/sys/kernel/shmmni
4096
#

论坛徽章:
0
10 [报告]
发表于 2009-12-03 14:36 |只看该作者
只要 那个结构变大,就有问题,报段错误!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP