2019年8月3日 星期六

自製64位元作業系統18──核心分頁

我們今天要把核心正式讀入系統,在此之前,我們要先處理核心的記憶體位置。我們為了要讓其他的程式擁有完整的空間,並且所有的程式都要享有一樣的核心位置,所以我們決定把核心放在全部記憶體的最上面2GB(其實是學Linux核心的),也就是0xFFFFFFFF80000000的位置。
我們先用以下方法將最底下的2MB映射到那個位置
# Setup Page Table low 2mb at 0xffffffff80000000 (-2GB)
  movl $0x1C4003, 0x1C0ff8
  movl $0x1C2003, 0x1C4ff0

再來我們透過讀取kernel的第一個區塊,得到kernel64.elf的大小,並且分配剛好(以2MiB為單位)的記憶體給他。
  call searchKernel

  pushq %rax
  leaq 0x2000(%rax), %rax
  movl 28(%rax), %eax
  movq %rax, %rbx
  andq $255, %rbx
  shrq $8, %rax
  test %rbx, %rbx
  jz .pte
  incq %rax
  .pte:
  movq %rax, %rbx
  movq %rax, %rcx
  andq $511, %rbx
  shrq $9, %rcx
  test %rbx, %rbx
  jz .pde
  incq %rcx
  .pde:
  movq $0x200003, %rbx
  movq $0x1C2008, %rsi
  movq $0x1C5000, %rdi
  .pde_loop:
    movq %rdi, %rax
    addq $3, %rax
    movq %rax, (%rsi)
    addq $8, %rsi
    pushq %rcx
    movq $512, %rcx
    .pte_loop:
      movq %rbx, (%rdi)
      addq $0x1000, %rbx
      addq $8, %rdi
      loop .pte_loop
    popq %rcx
    loop .pde_loop

  popq %rax
我們這樣就會分配好這些分頁,再來就是讀取核心到目標位置。
  movq %rax, %rdx
  call readAllKernel

  jmp *%rax
最後的jmp指令可以讓我們跳到kernel64.elf的程式碼位置。



👉【幫我們一個忙!】👈

👋如果您喜歡這篇文章,請在下方按5個Like!
 ❤您的支持是我們最大的動力!

您只要登入帳號(Facebook、Google),在下方按5個Like,我們就會收到來自LikeCoin基金會的贊助。
您只需要支持我們,完全不會花到錢!