2019年7月30日 星期二

自製64位元作業系統16──進入64位元長模式

  我們終於要呼應標題了,進入64位元的長模式。從此以後,我們就是名副其實的64位元作業系統了。不過在開始之前,先跟大家說,我們的程式常常會有一些設計上的問題,所以時常會變動,建議大家去我的GitHub隨時找尋最新版本。進入64位元的主要工作已經在上一篇文章處理好了,現在我們只要做出一個64位元的GDT就可以了。我們可以參考AMD64 Architecture Programmer’s Manual, Volume 2: System Programming的4.8.1來設定。

GDT64:
  .quad 0
GDT64_CODE:
  .long 0x0000FFFF
  .long 0x00AF9A00
GDT64_DATA:
  .long 0
  .long 0x9200
GDT64_END:
GDT64_PTR:
  .word GDT64_END - GDT64 - 1
  .quad GDT64
然後我們可以直接用以前進入保護模式的方法,跳進長模式。最後,再把所有的段暫存器輸入正確的值。
# Load new GDT
  lgdt GDT64_PTR

# jmp
  ljmp $0x8,$LMODE
.code64
LMODE:
  movw $0x10, %ax
  movw %ax, %ds
  movw %ax, %es
  movw %ax, %ss
  movw %ax, %fs
  movw %ax, %gs
  jmp .