本文出自:http://www.nsfocus.com 維護:小四
22. Linux Kernel Programming
22.1 直接訪問內存[顯存]地址
22.2
--------------------------------------------------------------------------
23. Linux相關問題
23.1
--------------------------------------------------------------------------
22. Linux Kernel Programming
22.1 直接訪問內存[顯存]地址
Q: 現在在修改linux內核,希望能訪問一段地址(其實是顯存)。但發覺不能直接訪問
A: Kongming (Luther 整理)
通過/dev/mem設備文件和mmap系統調用,可以將線性地址描述的物理內存映射到進程
的地址空間,然後就可以直接訪問這段內存了。
比如,標准VGA 16色模式的實模式地址是A000:0000,而線性地址則是A0000。設定顯
存大小為0x10000,則可以如下操作
mem_fd = open( "/dev/mem", O_RDWR );
vga_mem = mmap( 0, 0x10000, PROT_READ PROT_WRITE, MAP_SHARED,
mem_fd, 0xA0000 );
close( mem_fd );
然後直接對vga_mem進行訪問,就可以了。當然,如果是操作VGA顯卡,還要獲得I/O
端口的訪問權限,以便進行直接的I/O操作,用來設置模式/調色板/選擇位面等等
在工控領域中還有一種常用的方法,用來在內核和應用程序之間高效傳遞數據:
1) 假定系統有64M物理內存,則可以通過lilo通知內核只使用63M,而保留1M物理內
存作為數據交換使用(使用 mem=63M 標記)。
2) 然後打開/dev/mem設備,並將63M開始的1M地址空間映射到進程的地址空間。