我正在使用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)
與其餘的值不同(虛擬地址除外,我明白這一點)。
您沒有顯示指定'sa'的代碼。 –
'printk'#2是錯誤的。你想要'physAddr'和_not_'&physAddr'。另外,'phys_addr_t'可以是'u32'或'u64',所以轉換爲'u64'並嘗試'%llx'。 –
我不知道'pap'是什麼,但打印指針值的方式是使用'printf(「%p」,(void *)virtAddr);' –