天天看點

au加載預設的輸入和輸出裝置失敗_一, 加載系統的流程, 中斷,異常和系統調用...

一, 啟動流程

  1. 計算機體系結構
au加載預設的輸入和輸出裝置失敗_一, 加載系統的流程, 中斷,異常和系統調用...
  1. 啟動時的計算機記憶體和磁盤分布圖
au加載預設的輸入和輸出裝置失敗_一, 加載系統的流程, 中斷,異常和系統調用...

CS:IP = 0XF000:FFF0 (CS:代碼段寄存器; IP:指令指針寄存器)

系統處于實模式 (剛剛通電情況下)

PC = 16 * CS + IP

20位位址空間:1MB (可用)

BIOS固件提供功能:

  1. 基本輸入輸出的程式
  2. 系統設定資訊
  3. 開機後自檢程式
  4. 系統自啟動程式等

流程:

au加載預設的輸入和輸出裝置失敗_一, 加載系統的流程, 中斷,異常和系統調用...
  1. BIOS:

BIOS将加載程式從磁盤的引導扇區(512位元組)加載到0X7C00位址處, 跳轉到CS:IP = 0000:7C00處 (控制權轉加載程式)

  1. 加載程式
  2. 将作業系統的代碼和資料從硬碟加載到記憶體中
  3. 跳轉到作業系統的起始位址

BIOS系統調用

BIOS以中斷調用的方式,提供了基本的I/O功能

  • INT 10h: 字元顯示
  • INT 13h: 磁盤扇區讀寫
  • INT 15h: 檢測記憶體大小
  • INT 16h: 鍵盤輸入

1, 計算機的啟動流程

au加載預設的輸入和輸出裝置失敗_一, 加載系統的流程, 中斷,異常和系統調用...
  1. CPU初始化
  2. CPU加電穩定後從0XFFFF0讀第一條指令
  3. CS:IP = 0XF000:FFF0
  4. 第一條指令是跳轉指令
  5. CPU初始狀态為16位實模式
  6. CS: IP是16位寄存器
  7. 指令指針PC = 16 * CS + IP
  8. 最大位址空間是1MB 段寄存器
  9. BIOS初始化過程
  10. 硬體自檢POST
  11. 檢測血糖中記憶體和顯示卡等關鍵部件的存在和工作狀态
  12. 查找并執行顯示卡等接口卡BIOS,進行裝置初始化
  13. 執行系統BIOS,進行系統檢測
  14. 檢測和配置系統中安裝的即插即用裝置
  15. 更新CMOS中的擴充系統配置資料ESCD
  16. 按指定啟動順序從軟碟,硬碟或光驅啟動

2, 主引導記錄MBR格式

au加載預設的輸入和輸出裝置失敗_一, 加載系統的流程, 中斷,異常和系統調用...
  1. 啟動代碼:446位元組
  2. 檢查分區表正确性
  3. 加載并跳轉到磁盤上的引導程式
  4. 硬碟分區表:64位元組
  5. 描述分區狀态和位置
  6. 每個分區描述資訊占據16位元組
  7. 結束标志字:2位元組(55AA)
  8. 主引導記錄的有效标志

3, 分區引導扇區格式

au加載預設的輸入和輸出裝置失敗_一, 加載系統的流程, 中斷,異常和系統調用...
  1. 跳轉指令:跳轉到啟動代碼
  2. 與平台相關代碼
  3. 檔案卷頭:檔案系統描述資訊
  4. 啟動代碼:跳轉到加載程式
  5. 結束标志:55AA

4, 加載程式(bootloader)

au加載預設的輸入和輸出裝置失敗_一, 加載系統的流程, 中斷,異常和系統調用...

5, 系統啟動規範

BIOS

  • 固化到計算機主機闆上的程式
  • 包含系統設定,自檢程式和系統自啟動程式
  • BIOS-MBR, BIOS-GPT, PXE

UEFI - 接口标準 - 在所有平台上一緻的作業系統啟動服務

二, 中斷,異常與系統調用

為什麼需要中斷,異常和系統調用

  • 在計算機運作中,核心是被信任的第三方
  • 隻有核心可以執行特權指令
  • 友善應用程式

中斷和異常希望解決的問題

  • 當外設連接配接計算機時,會出現什麼現象?
  • 當應用程式處理意想不到的行為時,會出現什麼現象?

系統調用希望解決的問題

  • 使用者應用程式是如何得到系統服務?
  • 系統調用和功能調用的不同之處是什麼?

1,核心的進入與退出

au加載預設的輸入和輸出裝置失敗_一, 加載系統的流程, 中斷,異常和系統調用...

系統調用(system_call)

  • 應用程式主動向作業系統發出的服務請求

異常

  • 非法指令或者其他原因導緻目前指令執行失敗(如:記憶體出錯)後的處理請求

中斷

  • 來自硬體裝置的處理請求

2. 中斷,異常和系統調用的比較

源頭

  • 中斷:外設
  • 異常: 應用程式意想不到的行為
  • 系統調用: 應用程式請求操作提供服務

響應方式

  • 中斷: 異步
  • 異常: 同步
  • 系統調用: 異常或者同步

處理機制

  • 中斷: 持續,對使用者應用程式是透明的
  • 異常: 殺死或者重新執行意想不到的應用程式指令
  • 系統調用: 得到和持續

3. 中斷處理機制

硬體處理

  • 在CPU初始化時設定中斷使能标志
  • 依據内部或外部事件設定中斷标志
  • 依據中斷向量調用相應中斷服務例程

軟體 - 現場儲存(編譯器) - 中斷服務處理(服務例程) - 清除中斷标記(服務例程) - 現場恢複(編譯器)

4. 中斷嵌套

  1. 硬體中斷服務例程可被打斷
  2. 不同硬體中斷源可能硬體中斷處理時出現
  3. 硬體中斷服務例程中需要臨時禁止中斷請求
  4. 中斷請求會保持到CPU做出響應
  5. 異常服務例程可被打斷
  6. 異常服務例程執行時可能出現硬體中斷
  7. 異常服務例程可嵌套
  8. 異常服務例程可能出現缺頁

三, 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啟動順序 - 段控制

au加載預設的輸入和輸出裝置失敗_一, 加載系統的流程, 中斷,異常和系統調用...
au加載預設的輸入和輸出裝置失敗_一, 加載系統的流程, 中斷,異常和系統調用...

⑤, 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中

硬體完成的工作

au加載預設的輸入和輸出裝置失敗_一, 加載系統的流程, 中斷,異常和系統調用...

繼續閱讀