我們先用以下方法將最底下的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基金會的贊助。
您只需要支持我們,完全不會花到錢!