ioremap/mmap的几个测试结论

环境:pc机,ubuntu 14.04  64位,物理机

            arm板 omap3530 , 1G内存, 内核linux-2.6.32

1. mmap在pc机上测试映射大小,可以将文件映射大小4G,并且这4G可以使用数据全部覆盖,即映射的4G空间可以全部访问他的物理地址

#include <stdio.h>

#include <stdlib.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <fcntl.h>

...

int mian (int argc, char* argv[]) {

int fd = open ("a.txt", O_RDWR);

if (fd < 0) {

perror ("open");

return -1;

}

void* pn = mmap (NULL, 0xffffffff, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

if (NULL == pn) {

perror ("mmap");

return -1;

}

unsigned int i = 0;

for (i = 0; i < 0xffffffff; ++i) {

*((char*)pn + i) = 'c'; // 向映射的区域写c

if (i % 0x100000) {

printf ("*((char*) + 0x%x) = %c \n", i, *((char*) + i)); // 每写1M的c打印一次,为了提高测试程序的运行效率

}

}

close (fd);

return 0;

}

使用gcc编译,其映射大小可以根据自己测试的实际大小做修改,然后编译,在pc机上进行运行测试


注意: 在编译过程中,如果出现未定义的宏,或者未声明的函数,那就是头文件没有包含全,可以使用man 对应的函数进行添加


2. mmap在arm的linux上最大可以将文件映射大小1.5G的虚拟内存,即这1.5G可以被数据全部覆盖/访问,如果映射2G,则编译没错,运行就会出错

使用开发板对应的交叉编译器进行编译,然后运行测试,其映射大小可以根据自己想要测试的大小修改,编译运行,就可以测试出你的映射是否成功

3. ioremap在内核申请,映射内存如果是1G,可以编译通过,但是insmod 模块后,只要运行到内存映射这条语句,立马内核崩溃,死机,各种各样的error

                                                                        512M,可以编译通过,insmod模块,数据在0~256M可以正常被覆盖,访问,但是一旦超过256M就会出现上边的错误

                                                                        256M及以下,程序均可正确编译,正确运行,不会出现然和错误。


最近做了一个大数据从内核态传到用户态,用到了这个问题,ioremap的大小多少对程序有点限制,想即时解决。。。


mmap/ioremap 映射的大小与物理内存的大小有关么,请哪位大侠可以指点一下,非常感谢!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值