我們終於要呼應標題了,進入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 .