Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Linux內核系列—12.b.操作系統開發之從Loader跳入保護模式,12.bloader

Linux內核系列—12.b.操作系統開發之從Loader跳入保護模式,12.bloader

編輯:關於android開發

Linux內核系列—12.b.操作系統開發之從Loader跳入保護模式,12.bloader


現在,內核已經被我們加載進內存了,該是跳入保護模式的時候了。

首先是GDT以及對應的選擇子,我們只定義三個描述符,分別是一個0~4GB的可執行段、一個0~4GB的可讀寫段和一個指向顯存開始地址的段:

; GDT
;                            段基址     段界限, 屬性
LABEL_GDT:	    Descriptor 0,            0, 0              ; 空描述符
LABEL_DESC_FLAT_C:  Descriptor 0,      0fffffh, DA_CR|DA_32|DA_LIMIT_4K ;0-4G
LABEL_DESC_FLAT_RW: Descriptor 0,      0fffffh, DA_DRW|DA_32|DA_LIMIT_4K;0-4G
LABEL_DESC_VIDEO:   Descriptor 0B8000h, 0ffffh, DA_DRW|DA_DPL3 ; 顯存首地址

GdtLen		equ	$ - LABEL_GDT
GdtPtr		dw	GdtLen - 1				; 段界限
		dd	BaseOfLoaderPhyAddr + LABEL_GDT		; 基地址

; GDT 選擇子
SelectorFlatC		equ	LABEL_DESC_FLAT_C	- LABEL_GDT
SelectorFlatRW		equ	LABEL_DESC_FLAT_RW	- LABEL_GDT
SelectorVideo		equ	LABEL_DESC_VIDEO	- LABEL_GDT + SA_RPL3

在之前學習保護模式時,大部分描述符的段基址都是運行時計算後填入相應位置的,因為那時我們的程序是由BIOS或者DOS加載的,我們不知道段地址,於是也就不知道程序運行時在內存中的位置。

如今,Loader是由我們自己加載的,段地址已經被確定為BaseOfLoader,所以在Loader中出現的標號(變量)的物理地址可以用下面的公式來表示:

標號(變量)的物理地址=BaseOfLoader*10h+標號(變量)的偏移

我們把它以及相應的聲明放在load.inc中。

BaseOfLoader	    equ	 09000h	; LOADER.BIN 被加載到的位置 ----  段地址
OffsetOfLoader	    equ	  0100h	; LOADER.BIN 被加載到的位置 ---- 偏移地址

BaseOfLoaderPhyAddr equ	BaseOfLoader*10h ; LOADER.BIN 被加載到的位置 ---- 物理地址

BaseOfKernelFile    equ	 08000h	; KERNEL.BIN 被加載到的位置 ----  段地址
OffsetOfKernelFile  equ	     0h	; KERNEL.BIN 被加載到的位置 ---- 偏移地址

我們定義了一個宏BaseOfLoaderPhyAddr用以代替BaseOfLoader*10h,它在loader.asm中被用到一次,用來計算GDT的基址。

運行結果如下:

 

一個碼農的日常 

源碼

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved