Имам известен напредък с PAE paging-а, но от вчера ударих на камък. Това е вариант за 4KB paging. Ето какво съм направил:
__asm__ __volatile__ ( "movl %%cr3, %%eax\n\t"
"addl $0xc0000000, %%eax\n\t"
"movl %2, %%ebx\n\t"
"shrl $30, %%ebx\n\t"
"movl (%%eax,%%ebx,0x8),%%ecx\n\t"
"movl 0x4(%%eax,%%ebx,0x8),%%edx\n\t"
"shrl $12, %%ecx \n\t"
"movl %%edx, %%eax \n\t"
"andl $0xfff, %%eax \n\t"
"shll $20, %%eax \n\t"
"addl %%eax, %%ecx \n\t"
"movl %%ecx, %0 \n\t"
"shrl $12, %%edx \n\t"
"andl $0xff, %%edx \n\t"
"movl %%edx, %1 \n\t"
:"=r"(bits_low), "=r"(bits_high)
:"r" (addr)
:"%eax", "%ebx", "%ecx", "%edx"
);
Тук addr е адреса, чиято PTE трябва да се намери. Понеже от PDPTEi се вземат 40 бита (битове 51:12) аз ги съхранявам в две променливи - bits_low и bits_high. Първата съдържа ниските 32 бита, а втората високите 8. До тук изглежда, че всичко e наред. bits_high е нула при мен, но аз имам само 2GB RAM и това ми изглежда нормално. За ниските битове получавам стойност A8C.
Тази стойност използвам след това, за да прочета PDE-то на адреса.
__asm__ __volatile__ ( "movl %2, %%eax\n\t"
"addl $0xc0000000, %%eax\n\t"
"movl %1, %%ebx\n\t"
"shrl $21, %%ebx\n\t"
"andl $0x1ff, %%ebx\n\t"
"movl (%%eax,%%ebx, 0x8),%%ecx\n\t"
"movl %%ecx, %0\n\t"
:"=r"(pde_low_bits)
:"r" (addr), "r"(bits_low)
:"%eax", "%ebx", "%ecx"
);
bits_low сочи към началото на 4KB структура от 512 64-биови записа. Битове 29:21 от адреса оказват точния PDE запис. Би трябвало в pde_low_bits да имам първите 32 бита от PDE, но стойността е нула. Ако добавя отместване от 0x4, за да взема вторите 32 бита резултата пак е нула.
Не виждам грешка нито вгода, нито в логиката.