通过 /dev/mem 设备文件和 mmap 系统调用,可以将线性地址的物理内存映射到进程的地址空间,然后就可以访问这段内存了。比如,标准 VGA 16 色模式的实模式地址是 A000:0000,而线性地址则是 A00000。设定显存大小为 0x10000,则可以如下操作。
mem_fd = open ("/dev/mem", O_RDWR);
vga_mem = mmap (0, 0x10000, PROT_READ PROT_WRITE, MAP_SHARED, mem_fd, 0xA00000);
close (mem_fd);
然后直接对 vga_mem 进行访问,就可以了。当然,如果是操作 VGA 显卡,还要获得 I/O 端口的访问权限,以便进行直接的 I/O 操作,用来设置模式、调色板、选择位面等等。
在工控领域中还有一种常用的方法,用来在内核和应用程序之间高效传递数据:
1. 假定系统有 64M 物理内存,则可以通过 lilo 通知内核只使用 63M,而 保留 1M 物理内存作为数据交换使用(使用 mem=63M 标记)。 2. 然后打开 /dev/mem 设备,并将 63M 开始的 1M 地址空间映射到进程 的地址空间。
(出处:http://www.sheup.com)