2012-06-09 80 views
7

我在內核中查找地址時遇到問題。我插入一個hello模塊在內核中,該模塊中,我把這些東西:內核中的地址

char mystring[]="this is my address"; 
printk("<1>The address of mystring is %p",virt_to_phys(mystring)); 

我想我可以得到MyString的物理地址,但我發現的是,在系統日誌,它的打印地址0x38dd0000。但是,我傾倒了內存,發現它的真實地址是dcd2a000,與前者完全不同。如何解釋這一點?我做錯事情了?謝謝

PS:我用一個工具來轉儲整個內存,物理地址。

+0

當你「傾倒記憶」,你沒有得到的虛擬地址呢? –

+0

我轉儲的內存是物理地址,我用了一個工具 – Alex

+2

什麼是硬件平臺? – shodanex

回答

7

按照Man page of VIRT_TO_PHYS

返回的物理地址是對給定的存儲器地址的物理(CPU)的映射。 只有在通過kmalloc直接映射或分配的地址上使用此函數纔有效。

此函數不會爲DMA傳輸提供總線映射。在幾乎所有可能的情況下,設備驅動程序不應該使用這個功能

嘗試使用kmalloc首先爲mystring分配內存;

char *mystring = kmalloc(19, GFP_KERNEL); 
strcpy(mystring, "this is my address"); //use kernel implementation of strcpy 
printk("<1>The address of mystring is %p", virt_to_phys(mystring)); 
kfree(mystring); 

這裏是strcpy在執行中發現here

char *strcpy(char *dest, const char *src) 
{ 
    char *tmp = dest; 

    while ((*dest++ = *src++) != '\0') 
      /* nothing */; 
    return tmp; 
} 
+0

我用過這樣但有錯誤,首先是kmalloc應該有兩個參數,所以我加了GEL_KERNEL,第二個是在strcpy行,我覺得'strcpy'沒有被接受......所以我該如何解決呢,謝謝 – Alex

+1

哈哈,woops!對不起,我已經觸摸了內核已經有6個月了。就strcpy而言,如果你的內核源代碼提供了'#include ',你應該能夠。或者你可以自己寫。 – Anthony

+0

非常感謝!但是,當我做到這一點,還有兩個錯誤,一個是'char * mystring = kmalloc(19,GFP_KERNEL);'錯誤是'初始化元素不是常量',另一個是'strcpy(mystring,「這是我的地址) '命令,錯誤是'預期')'在字符串常量之前'我已經添加了你在這裏寫的strcpy函數,謝謝! – Alex

相關問題