本人想要让Linux能看到一片特定的内存区域, 这里称之为预留内存, 但Linux并不会在这片内存区域中进行内存分配等操作. 也就是说, linux能access到这片内存, 但什么时候access, 完全听我的指挥. 下文就是讲如何实现这种预留内存.

在Arm体系结构下, Linux通过设备树获取内存大小等信息, 例如:

	memory@40000000 {
		reg = <0x00 0x40000000 0x00 0x40000000>;
		device_type = "memory";
	};

表示物理内存的起始地址为0x40000000, 大小也为0x40000000, 即1GB.

然而在虚拟化环境下, 我想要预留一块连续的物理内存, 以供另一个Linux使用, 且这块物理内存可用作两个Linux的共享内存区域. 经查阅资料, 发现通过修改linux内核的启动参数可以做到这一点. 例如, 如果想预留大小为0x1000_0000B的内存, linux的启动命令行中增加:

"mem=768m"

768MiB的大小正好就是0x3000_0000B. 当linux的用户态想要访问预留内存, 则可以通过mmap的方式实现:

int mem_fd = open("/dev/mem", O_RDWR | O_NDELAY);
phys_addr = 0x70000000;
virt_addr = mmap(NULL, 0x8000000, PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, phys_addr);

上面这段代码, 首先打开了/dev/mem设备, 然后将从0x70000000开始, 大小为0x8000000的内存区域映射到当前进程的虚拟地址空间, 其首地址为virt_addr. 这样, 进程通过virt_addr就可以操作这片预留内存区域了.