通過 /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 地址空間映射到進程 的地址空間。