一, 啟動流程
- 計算機體系結構

- 啟動時的計算機記憶體和磁盤分布圖
CS:IP = 0XF000:FFF0 (CS:代碼段寄存器; IP:指令指針寄存器)
系統處于實模式 (剛剛通電情況下)
PC = 16 * CS + IP
20位位址空間:1MB (可用)
BIOS固件提供功能:
- 基本輸入輸出的程式
- 系統設定資訊
- 開機後自檢程式
- 系統自啟動程式等
流程:
- BIOS:
BIOS将加載程式從磁盤的引導扇區(512位元組)加載到0X7C00位址處, 跳轉到CS:IP = 0000:7C00處 (控制權轉加載程式)
- 加載程式
- 将作業系統的代碼和資料從硬碟加載到記憶體中
- 跳轉到作業系統的起始位址
BIOS系統調用
BIOS以中斷調用的方式,提供了基本的I/O功能
- INT 10h: 字元顯示
- INT 13h: 磁盤扇區讀寫
- INT 15h: 檢測記憶體大小
- INT 16h: 鍵盤輸入
1, 計算機的啟動流程
- CPU初始化
- CPU加電穩定後從0XFFFF0讀第一條指令
- CS:IP = 0XF000:FFF0
- 第一條指令是跳轉指令
- CPU初始狀态為16位實模式
- CS: IP是16位寄存器
- 指令指針PC = 16 * CS + IP
- 最大位址空間是1MB 段寄存器
- BIOS初始化過程
- 硬體自檢POST
- 檢測血糖中記憶體和顯示卡等關鍵部件的存在和工作狀态
- 查找并執行顯示卡等接口卡BIOS,進行裝置初始化
- 執行系統BIOS,進行系統檢測
- 檢測和配置系統中安裝的即插即用裝置
- 更新CMOS中的擴充系統配置資料ESCD
- 按指定啟動順序從軟碟,硬碟或光驅啟動
2, 主引導記錄MBR格式
- 啟動代碼:446位元組
- 檢查分區表正确性
- 加載并跳轉到磁盤上的引導程式
- 硬碟分區表:64位元組
- 描述分區狀态和位置
- 每個分區描述資訊占據16位元組
- 結束标志字:2位元組(55AA)
- 主引導記錄的有效标志
3, 分區引導扇區格式
- 跳轉指令:跳轉到啟動代碼
- 與平台相關代碼
- 檔案卷頭:檔案系統描述資訊
- 啟動代碼:跳轉到加載程式
- 結束标志:55AA
4, 加載程式(bootloader)
5, 系統啟動規範
BIOS
- 固化到計算機主機闆上的程式
- 包含系統設定,自檢程式和系統自啟動程式
- BIOS-MBR, BIOS-GPT, PXE
UEFI - 接口标準 - 在所有平台上一緻的作業系統啟動服務
二, 中斷,異常與系統調用
為什麼需要中斷,異常和系統調用
- 在計算機運作中,核心是被信任的第三方
- 隻有核心可以執行特權指令
- 友善應用程式
中斷和異常希望解決的問題
- 當外設連接配接計算機時,會出現什麼現象?
- 當應用程式處理意想不到的行為時,會出現什麼現象?
系統調用希望解決的問題
- 使用者應用程式是如何得到系統服務?
- 系統調用和功能調用的不同之處是什麼?
1,核心的進入與退出
系統調用(system_call)
- 應用程式主動向作業系統發出的服務請求
異常
- 非法指令或者其他原因導緻目前指令執行失敗(如:記憶體出錯)後的處理請求
中斷
- 來自硬體裝置的處理請求
2. 中斷,異常和系統調用的比較
源頭
- 中斷:外設
- 異常: 應用程式意想不到的行為
- 系統調用: 應用程式請求操作提供服務
響應方式
- 中斷: 異步
- 異常: 同步
- 系統調用: 異常或者同步
處理機制
- 中斷: 持續,對使用者應用程式是透明的
- 異常: 殺死或者重新執行意想不到的應用程式指令
- 系統調用: 得到和持續
3. 中斷處理機制
硬體處理
- 在CPU初始化時設定中斷使能标志
- 依據内部或外部事件設定中斷标志
- 依據中斷向量調用相應中斷服務例程
軟體 - 現場儲存(編譯器) - 中斷服務處理(服務例程) - 清除中斷标記(服務例程) - 現場恢複(編譯器)
4. 中斷嵌套
- 硬體中斷服務例程可被打斷
- 不同硬體中斷源可能硬體中斷處理時出現
- 硬體中斷服務例程中需要臨時禁止中斷請求
- 中斷請求會保持到CPU做出響應
- 異常服務例程可被打斷
- 異常服務例程執行時可能出現硬體中斷
- 異常服務例程可嵌套
- 異常服務例程可能出現缺頁
三, bootloader啟動ucore流程
1. 了解X86-32平台的啟動過程
2. 了解X86-32的實模式、保護模式
3. 了解段機制
1, X86啟動順序 - 寄存器初始值
①, X86啟動順序 - 第一條指令
1. CS = F000H、EIP = 0000FFF0H (CS是段寄存器)
2. 實際位址是:
Base + EIP = FFFF0000H + 0000FFF0H = FFFFFFF0H (Base相容老版本的位址)
隻是BIOS的EPROM(Erasable Programmable Read Only memory)所在位址
3. 當CS被新值加載、則位址轉換規則将開始起作用
4. 通常第一條指令是一條長跳轉指令(這樣CS和EIP都會更新)到BIOS代碼中執行
②, X86啟動順序 - 從BIOS到Bootloader
1. BIOS加載儲存設備(比如軟碟、硬碟、CD光牒、USB盤)上的第一個扇區(主引導扇區、Master Boot Record or MBR)的512位元組到記憶體的0X7C00處
2. 然後跳轉到 @0X7C00的第一條指令考試執行
③, X86啟動順序 - 從bootloader到OS系統
實模式切換到保護模式
16位元組到32位元組
1. bootloader做的事情
使能保護模式(protection mode) &段機制(segment-level protection)
從磁盤上讀取kernel in ELF 格式的ucore kernel(跟在MBR後面的扇區)并放到記憶體中固定位置跳轉到ucore OS的入口點(entry point)執行這時控制權到了ucore OS中
④, X86啟動順序 - 段控制
⑤, X86啟動順序 - 加載ELF格式的ucore OS kernel
kernel 檔案讀取ELF格式
/* file header */
struct elfhdr {
uint32_t e_magic; // must equal ELF_MAGIC
uint8_t e_elf[12];
uint16_t e_type; // 1=relocatable, 2=executable, 3=shared object, 4=core image
uint16_t e_machine; // 3=x86, 4=68K, etc.
uint32_t e_version; // file version, always 1
uint32_t e_entry; // entry point if executable
uint32_t e_phoff; // file position of program header or 0
uint32_t e_shoff; // file position of section header or 0
uint32_t e_flags; // architecture-specific flags, usually 0
uint16_t e_ehsize; // size of this elf header
uint16_t e_phentsize; // size of an entry in program header
uint16_t e_phnum; // number of entries in program header or 0
uint16_t e_shentsize; // size of an entry in section header
uint16_t e_shnum; // number of entries in section header or 0
uint16_t e_shstrndx; // section number that contains section name strings
};
/* program section header */
struct proghdr {
uint32_t p_type; // loadable code or data, dynamic linking info,etc.
uint32_t p_offset; // file offset of segment
uint32_t p_va; // virtual address to map segment
uint32_t p_pa; // physical address, not used
uint32_t p_filesz; // size of segment in file
uint32_t p_memsz; // size of segment in memory (bigger if contains bss)
uint32_t p_flags; // read/write/execute bits
uint32_t p_align; // required alignment, invariably hardware page size
};
2, C函數調用的實作
3, GCC内聯彙編
1. 什麼是内聯彙編(Inline assembly)
- 這是GCC對C語言的擴張
- 可直接在C語言中插入彙編
2. 有何用處
- 調用C語言不支援的指令
- 用彙編在C語言中手動優化
3. 如何工作?
- 用給定的模本和限制來生成彙編指令
- 在C函數内形成彙編源碼
彙編代碼
mov1 $0XFFFF, %eax
内聯彙編
inline assembly
asm ("mov1 $0XFFFF, %%eaxn")
内聯彙編的文法:
asm (assembler template # 字元串
:output operands (optional) #限制
:input operands (optional)#限制
:clobbers (optional)#限制
);
4, X86中的中斷處理
1. 了解X86中的中斷源
2. 了解CPU與作業系統如何進行中斷
3. 能夠對中斷向量表(中斷描述符表,簡稱IDT)初始化
① X86中的中斷處理 - 中斷源
1. 中斷 Interrupts
- 外部中斷 Exteranl (hardware generated) interrupts
序列槽、硬碟、網卡、時鐘 、...
- 軟體産生的中斷 Software generated interrupts
The INT n 指令、通常用于系統調用
2. 異常 Exceptions
- 程式錯誤
- 軟體産生的異常 Software generated exceptions
INTO, INT 3 and BOUND
- 機器檢查出的異常S
② X86中斷處理 - 确定中斷服務例程(ISR)
1. 每個中斷或異常與一個中斷服務例程(Interrupt Service Routine,簡稱ISR)關聯,其關聯關系儲存在中斷描述符表(Interrupt Descripor Table,簡稱IDT)。
2. IDT的起始位址和大小儲存在中斷描述符表寄存器IDTR中
硬體完成的工作