g ++ генерирует неопределенную инструкцию (ud2) при попытке доступа к 0x00 из ядра - PullRequest
1 голос
/ 29 марта 2020

Я пытаюсь написать маленькое ядро. Этот код выполняется в 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, прекрасно работает

...