免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
[收藏(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 }

论坛徽章:
0
19 [报告]
发表于 2009-12-03 17:09 |只看该作者
看你的shmmax只有33554432,那么就算把shmall改成33554432,最大也只能支持32M

论坛徽章:
0
18 [报告]
发表于 2009-12-03 17:06 |只看该作者
这个和平台无关吧,只要/proc/sys/kernel/shmall在shmmax和shmmni之间就可以了,是不是要字节对齐我没有试过。

论坛徽章:
0
17 [报告]
发表于 2009-12-03 16:09 |只看该作者
在我的机器上报错,但是我把100*1024*1024——》1*1024*1024 就对了
估计要把那里该一下阿

论坛徽章:
0
16 [报告]
发表于 2009-12-03 16:07 |只看该作者
我说的是在 mipsel 嵌入式 设备上,不是pc上。

论坛徽章:
0
15 [报告]
发表于 2009-12-03 15:19 |只看该作者

回复 #14 fanronghua 的帖子

EINVAL A  new  segment  was  to be created and size < SHMMIN or size > SHMMAX, or no new segment was to be created, a segment with given key existed, but size is greater than the size of that segment.
size不对,试试把之前生成的shm文件删掉重来。

刚才我测试申请100M内存没问题:
$ cat /proc/sys/kernel/shmall
268435456
$ cat shm.c
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
main()
{
        int fd;
        key_t key;
        if((-1!=(key = ftok("/dev/shm/test", 0))) &&
                (-1 != (fd = shmget(key,100*1024*1024,IPC_CREAT)))){
                printf("shmget success\n");
        }
        else{
                printf("error: %d, key: %d, fd: %d\n", errno, key, fd);
        }

}
$ gcc shm.c
$ ./a.out
shmget success
$

论坛徽章:
0
14 [报告]
发表于 2009-12-03 15:14 |只看该作者
原帖由 baicj 于 2009-12-3 14:54 发表
Segmentation fault是你代码的问题。shmget失败你需要自己把参数和errno打印出来,结合man一查就知道原因了



是这个错误。请看看,是怎么回事
: Invalid argument

论坛徽章:
0
13 [报告]
发表于 2009-12-03 15:14 |只看该作者
: Invalid argument

论坛徽章:
0
12 [报告]
发表于 2009-12-03 15:01 |只看该作者
原帖由 fanronghua 于 2009-12-3 14:54 发表
共享内存是安页搞的,最多只能一页 4K,共享内存不能分页,如果一定要搞大,只能改页大小了。
各位高手如何看。


是这样的吗?

[ 本帖最后由 雨过白鹭洲 于 2009-12-3 15:04 编辑 ]

论坛徽章:
0
11 [报告]
发表于 2009-12-03 14:54 |只看该作者
Segmentation fault是你代码的问题。shmget失败你需要自己把参数和errno打印出来,结合man一查就知道原因了

论坛徽章:
0
10 [报告]
发表于 2009-12-03 14:54 |只看该作者
共享内存是安页搞的,最多只能一页 4K,共享内存不能分页,如果一定要搞大,只能改页大小了。
各位高手如何看。
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP