Ich arbeite mit einer x86-Architektur. Soweit ich verstehe (und gesagt worden) eine physikalische Adresse des zugeordneten Speichers erhalten muß ich folgendes tun:Warum der Wert der physischen Adresse hängt davon ab, wie es gedruckt wurde
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;
Ich habe beschlossen, aus dem Wert der physikalischen Adresse zu drucken, also tat ich die folgenden:
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);
Hier ist, was ich im Protokoll bekam:
[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
Und das ist, wo ich wirklich verwirrt bin. Sollten nicht alle diese Werte gleich sein? Warum physAddr(%pap)
ist anders als der Rest der Werte (mit Ausnahme der virtuellen Adresse, die ich verstehe).
Sie haben den Code, der 'sa' zuweist, nicht angezeigt. –
'printk' # 2 ist falsch. Sie wollen 'physAddr' und _not_' & physAddr'. Außerdem ist 'phys_addr_t' entweder' u32' oder 'u64', also wird auf' u64' gewandelt und auch '% llx' versucht. –
Ich weiß nicht, was 'pap' ist, aber die Art einen Zeigerwert zu drucken ist mit' printf ("% p", (void *) virtAddr) '' –