Если вы не работаете в привилегированном режиме ЦП, что обычно означает, что вы в ядре , вы не можете. Процессор OS + объединяется, чтобы предотвратить доступ к таблицам страниц, и единственный способ сделать это - получить доступ к таблицам страниц.
Если у вас был доступ к ним, и вы были 32-битным 386программа, запущенная без PAE, будет выглядеть примерно так:
extern void *mapphys(unsigned pa);
extern unsigned getcr3(void);
unsigned vtop(unsigned va) {
unsigned *pt, t;
pt = mapphys(getcr3());
t = pdir[va>>22];
unmapphys(pt);
if (t & 1) {
pt = mapphys(t & ~ 0xfff);
t = pt[(va >> 12) & 0x3ff];
unmapphys(pt);
if (t & 1) {
return (t &~ 0xfff) | (va & 0xfff);
}
error("page table entry undefined for %#x\n", va);
return -1;
} else {
error("page directory entry undefined for %#x\n", va);
return -2;
}
}
, где maphys, unmapphys предоставляют и удаляют пригодный для использования указатель на заданный физический адрес, а getcr3 () возвращает базовый регистр таблицы страниц из 386Тем не менее, существуют способы построения таких таблиц страниц, чтобы вы могли косвенно обращаться к ним. Например, если вы сделали последнюю запись (индекс 1023) в таблице каталогов страниц, указав на таблицу каталогов страниц, то вы можете использовать высокое адресное пространство 4M-4K в качестве своего рода таблицы таблиц страниц;и последние 4K адресного пространства - это карта самого каталога страниц. С помощью этой настройки я могу вместо этого:
unsigned vtop(unsigned va) {
unsigned *pmap = (unsigned *)0xff800000;
unsigned *pdmap = (unsigned *)0xfffff000;
if (pdmap[va>>22] & 1) {
if (pmap[va>>12] & 1) {
return (pmap[va>>12]&~0xfff) | (va & 0xfff);
}
error("page table entry undefined for %#x\n, va);
return -1;
}
error("page dir entry undefined for %#x\n", va);
return -2;
}
Стоит отметить, что в этой рекурсивной таблице страниц выбранный вами индекс не важен, и механизм обычно применим к любымОпределение таблицы страниц, которое является внутренним и конечным узлами, имеет совместимые макеты.