环境: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 映射的大小与物理内存的大小有关么,请哪位大侠可以指点一下,非常感谢!!!