2016-08-19 53 views
2

我正在使用x86體系結構。據我瞭解(並已告知),以獲得分配的內存的物理地址,我需要做到以下幾點:爲什麼物理地址值根據打印方式的不同而不同

struct SizeAddr { 
    size_t size; 
    u64 addr_uint64; 
    void* addr_voidp; 
    unsigned long addr_ul; 
}; 

struct SizeAddr sa; 

virtAddr = kmalloc(<some size>, GFP_KERNEL); 
physAddr = virt_to_phys(virtAddr); 

sa.addr_uint64 = (uint64_t)physAddr; 
sa.addr_voidp = (void *)physAddr; 
sa.addr_ul = (unsigned long)physAddr; 

我決定把打印出來的物理地址的值,所以我做到了以下內容:

printk(MODULE_NAME " virtAddr(%%p) = %p\n", virtAddr); 
    printk(MODULE_NAME " physAddr(%%pap) = %pap\n", &physAddr); 
    printk(MODULE_NAME " physAddr(%%llx) = %llx\n", sa.addr_uint64); 
    printk(MODULE_NAME " physAddr(%%p) = %p\n", sa.addr_voidp); 
    printk(MODULE_NAME " physAddr(%%lx) = %lx\n", sa.addr_ul); 

以下是我在日誌中有:

[63898.990593] my_kmodule virtAddr(%p) = 0000000000000010 
[63898.990652] my_kmodule physAddr(%pap) = ffff88020d783eb0 
[63898.990711] my_kmodule physAddr(%llx) = 780000000010 
[63898.990768] my_kmodule physAddr(%p) = 0000780000000010 
[63898.990827] my_kmodule physAddr(%lx) = 780000000010 

而這正是我真的很困惑。不應該所有這些值都一樣嗎?爲什麼physAddr(%pap)與其餘的值不同(虛擬地址除外,我明白這一點)。

+1

您沒有顯示指定'sa'的代碼。 –

+4

'printk'#2是錯誤的。你想要'physAddr'和_not_'&physAddr'。另外,'phys_addr_t'可以是'u32'或'u64',所以轉換爲'u64'並嘗試'%llx'。 –

+0

我不知道'pap'是什麼,但打印指針值的方式是使用'printf(「%p」,(void *)virtAddr);' –

回答

-2

來自kmalloc的虛擬地址(virtAddr)的值爲0x10是沒有意義的。那麼,在那之後,所有的賭注都沒有了?

您確定您有phys_addr_t physAddr(與(例如)phys_addr_t *)?在我認爲的堆棧上?

%pap的輸出看起來像一個[stack]虛擬地址,而不是物理地址。所以,我的關於&physAddr/physAddr的評論可能會取決於您的完整代碼。

printk("%p\n",&physAddr);是什麼意思?或者,printk("%llx\n",(u64) &physAddr);?或者,其他組合(例如&virtAddr

儘管文檔中說%pap沒問題,但它也表示默認爲phys_addr_t(即%pa)。無論應該工作[和我的printk代碼似乎的檢查,以確認這一點],只有大約5用法%pap和數以百計的%pa

用法我已經研究了printk源[複查,實際上,因爲我之前不得不這麼做]。目前,我沒有發現任何差異。但是,消息來源有點複雜,所以我會繼續這樣做。


旁註:這是原來的職位編輯[一些澄清]之前[這是得到downvoted],但它仍然是一些嘗試。

現在您已加入sa代碼...

變化:

struct SizeAddr 

分爲:

union SizeAddr 

添加phys_addr_t成員,只能設置[與工會] 。這是更常見的成語。然後,你會看到哪些被截斷,哪些不被截斷。否則,對於struct %llx,您會得到與%pap匹配的結果。

+0

我爲什麼要這麼做?那隻會將所有內容存儲在一個位置。 – flashburn

+2

這並不回答這個問題,甚至作爲對OP代碼的評論,它的質量也是有問題的。 – 2016-08-19 19:05:05

相關問題