Я пытаюсь написать маленькое ядро. Этот код выполняется в 32-битном защищенном режиме с отключенной подкачкой и прерываниями.
Как видно из заголовка, когда я пытаюсь получить доступ к 0x00
из своего ядра, компилятор генерирует ud2
(неопределенная инструкция), вызывая тройная ошибка.
Это разборка функции, когда я пытаюсь получить доступ к 0x00
void SetupX64Paging()
{
100070: 31 c0 xor %eax,%eax
100072: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi
100079: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi
// The paging directory will be at 0x00h
uint64_t *pageDirBase = (uint64_t *)0x00;
//uint64_t *pageDirBase = (uint64_t *)0x00007BFF;
// clear area for 4 tables (16KB)
for(uint64_t i = 0; i < 512 * 4; i++)
pageDirBase[i] = 0;
100080: c7 00 00 00 00 00 movl $0x0,(%eax)
100086: 83 c0 04 add $0x4,%eax
for(uint64_t i = 0; i < 512 * 4; i++)
100089: 3d 00 20 00 00 cmp $0x2000,%eax
10008e: 75 f0 jne 100080 <_Z14SetupX64Pagingv+0x10>
PDPT = (uint64_t *)PML4 + 0x1000; // 4KB
PDT = (uint64_t *)PML4 + 0x2000; // 8KB
PT = (uint64_t *)PML4 + 0x3000; // 12KB
// Map each table entry into its parent and set the r/w and present flags
PML4[0] = (uint64_t)PDPT | 0x3;
100090: c7 05 00 00 00 00 00 movl $0x0,0x0
100097: 00 00 00
10009a: 0f 0b ud2
10009c: 66 90 xchg %ax,%ax
10009e: 66 90 xchg %ax,%ax
Хотя это не отображается при разборке, PML4
инициализируется как pageDirBase
В этой настройке ядро только что перешло в защищенный режим. Прерывания отключены, разбиение по страницам отключено.
Код в этом файле скомпилирован следующим образом:
i686-elf-g++ -c Paging.cpp -ffreestanding -O2 -Wall -Wextra -fno-exceptions -fno-rtti -g -I../Common -I../Include
Существует ли директива компилятора, которую следует использовать, чтобы компилятор не генерировал неопределенную инструкцию.
Следует отметить одну особенность: l oop, который обнуляет память на %eip = 100080
, прекрасно работает