linux核心提供了/dev/mem驅動,提供了一種直接訪問記憶體實體地址的方法,具體實施有兩種方法,一是裝置驅動,二是系統呼叫的方法。
/dev/mem驅動的原始檔在drivers/char/mem.c中。這個檔案還生成了一些常用的字元裝置驅動,表現為/dev/zero,/dev/null等一些特殊的字元裝置驅動。cat /dev/mem時,顯示的是所有物理記憶體的位址以及內容資訊,通常情況下,只有root使用者對其有讀寫許可權。
1. 像使用普通字元裝置驅動一樣使用/dev/mem.
2. 通過hexedit工具來直接檢視/dev/mem,結果如下圖:
最左邊顯示的是實體地址,右邊的以4個位元組為一組,一行4組,共16個位元組。最右邊顯示的是各記憶體位元組單元內容的ascii碼對於的字元資訊。這個檔案可以直接修改,按下tab鍵進入修改模式,按下f2鍵儲存修改內容,修改實時生效。
3. 既然/dev/mem內是全部的記憶體資訊,通過mmap系統呼叫,將物理記憶體位址對映到程序的位址空間,從而實現對記憶體實體地址的讀寫。
介紹一下,mmap系統呼叫。
length:想要對映的檔案大小,以位元組為單位。
prot:對映區域的保護方式,有以下幾種。
prot_exec:對映區域可執行。
prot_read: 對映區域可讀。
prot_write:對映區域科學
prot_none :對映區域不能被訪問
flags:對映區域的一些特性,有以下幾種。
map_fixed 如果對映不成功則出錯返回,
map_shared 對對映區域的寫入資料會寫回到原來的檔案
map_private 對對映區域的寫入資料不會寫回原來的檔案
map_anonymous
map_denywrite 只允許對對映區域的寫入操作,其他對檔案直接寫入的操作將被拒絕
map_locked 鎖定對映區域
fd: open返回的檔案描述符
offset:被對映檔案的偏移量,表示從檔案的哪個地方開始對映,一般設定為0.offset必須為4k的整數倍。
map_base = mmap(0, alloc_size, prot_read, map_private, fd, 0x35004000);
type = read_reg32(map_base + 0x20);
///….to do what you want.
close(fd);
munmap(map_base, alloc_size);
採用這種方法,可以實現使用者空間的驅動。
Linux下訪問記憶體實體地址
linux核心裡提供的 dev mem驅動,為我們讀寫記憶體實體地址,提供了乙個渠道。下面講述2種利用mem裝置檔案進行實體地址讀寫的方法,一種是裝置驅動的方法,另一種是系統呼叫的方法。首先我們看下mem這個裝置檔案,dev mem是linux下的乙個字元裝置,原始檔是 drivers char m...
Linux下訪問記憶體實體地址
原文 linux核心裡提供的 dev mem驅動,為我們讀寫記憶體實體地址,提供了乙個渠道。下面講述2種利用mem裝置檔案進行實體地址讀寫的方法,一種是裝置驅動的方法,另一種是系統呼叫的方法。首先我們看下mem這個裝置檔案,dev mem是linux下的乙個字元裝置,原始檔是 drivers cha...
WINCE 對實體地址的訪問
wince程式設計 對實體地址的訪問 1 io介面是xscale處理器的外部裝置,對於一般的微控制器,可以直接操作硬體,即通過直接讀寫io埠來訪問硬體.而對於wicne作業系統,它遮蔽了使用者應用程式對硬體訪問的許可權,只有核心應用程式才可以訪問硬體資源.如果要直接訪問某一址的物理記憶體 對於arm...