利用mmap dev mem 讀寫Linux記憶體

2021-07-02 06:27:13 字數 1562 閱讀 9895

使用 hexedit /dev/mem 可以顯示所有物理記憶體中的資訊。 運用mmap將/dev/mem map出來,然後直接對其讀寫可以實現使用者空間的核心操作。

以下是我寫的乙個sample

[cpp]view plain

copy

#include

#include

#include

#include

#include

#include

intmain()  

map_base = mmap(null, 0xff, prot_read|prot_write, map_shared, fd, 0x20000);  

if(map_base == 0)  

else

unsigned long

addr;  

unsigned char

content;  

inti = 0;  

for(;i < 0xff; ++i)  

close(fd);  

munmap(map_base, 0xff);  

return

(1);  

}  

上面的例子將起始位址0x20000(實體地址), 長度為0xff對映出來。 然後就可以像普通陣列一樣操作記憶體。

下面是輸出結果

address: 0x7f3f95391000   content 0x0           updated address: 0x7f3f95391000   content 0x0

address: 0x7f3f95391001   content 0x0           updated address: 0x7f3f95391001   content 0x1

address: 0x7f3f95391002   content 0x0           updated address: 0x7f3f95391002   content 0x2

address: 0x7f3f95391003   content 0x0           updated address: 0x7f3f95391003   content 0x3

address: 0x7f3f95391004   content 0x0           updated address: 0x7f3f95391004   content 0x4

。。。我的測試機器是64位機。 該例子將實體地址0x20000對映到了虛擬位址0x7f3f95391000。

首先將當前位址下的內容輸出, 然後寫入新值。 

可以通過 hexedit /dev/mem 驗證新值已經寫入。

如果想在使用者態處理kernel分配的位址可以這麼做。 首先用virt_addr = get_free_pages(gfp_kernel, order)分配記憶體,通過phy_addr = __pa(virt_addr)得到實體地址,然後在使用者態將/dev/mem用mmap 對映出來, offset就是phy_addr, length設為 2^order。 此時就可以在使用者態讀寫核心分配的記憶體了。

注:該操作需要有root許可權。

利用mmap dev mem 讀寫Linux記憶體

使用 hexedit dev mem 可以顯示所有物理記憶體中的資訊。運用mmap將 dev mem map出來,然後直接對其讀寫可以實現使用者空間的核心操作。以下是我寫的乙個sample include include include include include includeint main...

利用mmap dev mem 讀寫Linux記憶體

使用 hexedit dev mem 可以顯示所有物理記憶體中的資訊。運用mmap將 dev mem map出來,然後直接對其讀寫可以實現使用者空間的核心操作。以下是我寫的乙個sample cpp view plain copy include include include include inc...

利用ElementTree讀寫XML檔案

在python中,對於xml的處理有很多模組,dom,sax,elementtree 或者對應的celementtree 等等,其中使用起來比較快捷方便的,應該算是elementtree了。似乎很多人懶得看e文的manual,呵呵,那我就總結一下個人的使用經驗。在python2.5的版本中,elem...