2019年8月8日 星期四

自製64位元作業系統20──核心分頁Part 2

之前,我們製作了一個處理核心分頁的程式,不過我們以2MiB為單位分配,實在是太浪費了,我們準備要把這個問題解決,利用4KiB為單位分配。

  pushq %rax

  leaq 0x2000(%rax), %rax
  movl 28(%rax), %eax
  movq %rax, %rbx
  andq $7, %rbx
  shrq $3, %rax
  test %rbx, %rbx
  jz .pte
  incq %rax
  .pte:
  pushq %rdx
  movq %rax, %rdx
  movq %rax, %rcx
  andq $511, %rdx
  shrq $9, %rcx
  .pde:
  pushq %rcx
  movq $0x200003, %rbx
  movq $0x1C2008, %rsi
  movq $0x1C5000, %rdi
  test %rcx, %rcx
  jz .pde_loop_end
  .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
.pde_loop_end:
  test %rdx, %rdx
  jz .no_last_page

  movq %rdi, %rax
  addq $3, %rax
  movq %rax, (%rsi)
  addq $8, %rsi
  movq %rdx, %rcx

  .last_pte_loop:
    movq %rbx, (%rdi)
    addq $0x1000, %rbx
    addq $8, %rdi
    loop .last_pte_loop

.no_last_page:
  popq %rcx
  shlq $9, %rcx
  orq %rdx, %rcx
  popq %rdx
  popq %rax