熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

自己動手寫操作系統(三)

2013-11-13 12:45:04  來源: Oracle 

  
  在上兩期中(自己動手寫操作系統我向大家講述了如何使用Linux提供的開發工具在軟盤的啟動扇區寫一些代碼以及如何調用BIOS的問題現在這個操作系統已經越來越接近當年Linus Torvalds的那個具有歷史意義的Linux內核了因此要馬上把這個系統切換到保護模式之下
  
  什麼是保護模式
  
  自從年推出第一個微處理器以來Intel處理器就在不斷地更新換代奔騰奔騰Ⅱ奔騰其體系結構也在不斷變化以後提供了一些新的功能彌補了的一些缺陷這其中包括內存保護多任務及使用KB以上的內存等並仍然保持和家族的兼容性也就是說仍然具備了的所有功能但是在功能上有了很大的增強早期的處理器是工作在實模式之下的以後引入了保護模式而在以後保護模式又進行了很大的改進保護模式為程序員提供了更好的保護提供了更多的內存事實上保護模式的目的不是為了保護程序而是要保護程序以外的所有程序(包括操作系統)
  
  簡言之保護模式是處理器的一種最自然的模式在這種模式下處理器的所有指令及體系結構的所有特色都是可用的並且能夠達到最高的性能
  
  保護模式和實模式
  
  從表面上看保護模式和實模式並沒有太大的區別二者都使用了內存段中斷和設備驅動來處理硬件但二者有很多不同之處我們知道在實模式中內存被劃分成段每個段的大小為KB而這樣的段地址可以用位來表示內存段的處理是通過和段寄存器相關聯的內部機制來處理的這些段寄存器(CSDSSS和ES)的內容形成了物理地址的一部分具體來說最終的物理地址是由位的段地址和位的段內偏移地址組成的用公式表示為
  
  物理地址=左移位的段地址+偏移地址
  
  在保護模式下段是通過一系列被稱之為描述符表的表所定義的段寄存器存儲的是指向這些表的指針用於定義內存段的表有兩種全局描述符表(GDT)和局部描述符表(LDT)GDT是一個段描述符數組其中包含所有應用程序都可以使用的基本描述符在實模式中段長是固定的(為KB)而在保護模式中段長是可變的其最大可達GBLDT也是段描述符的一個數組與GDT不同LDT是一個段其中存放的是局部的不需要全局共享的段描述符每一個操作系統都必須定義一個GDT而每一個正在運行的任務都會有一個相應的LDT每一個描述符的長度是個字節格式如圖所示當段寄存器被加載的時候段基地址就會從相應的表入口獲得描述符的內容會被存儲在一個程序員不可見的影像寄存器(shadow register)之中以便下一次同一個段可以使用該信息而不用每次都到表中提取物理地址由位或者位的偏移加上影像寄存器中的基址組成實模式和保護模式的不同可以從圖和圖中很清楚地看出來
   
  圖 實模式的尋址
   
  圖 保護模式下的尋址
  
  圖 段描述俯的格式
  
  此外還有一個中斷描述符表(IDT)這些中斷描述符會告訴處理器到那裡可以找到中斷處理程序和實模式一樣每一個中斷都有一個入口但是這些入口的格式卻完全不同因為在切換到保護模式的過程中沒有使用到IDT所以在此就不多做介紹了
  
  進入保護模式
  
  位控制寄存器名字分別為CRCRCR和CRCR是保留在未來處理器中使用的中沒有定義CR包含系統的控制標志用於控制處理器的操作模式和狀態CR和CR是用於控制分頁機制的在此我們關注的是CR寄存器的PE位控制它負責實模式和保護模式之間的切換當PE=說明處理器運行於保護模式之下其采用的段機制和前面所述的相應內容對應如果PE=那麼處理器就工作在實模式之下
  
  切換到保護模式實際就是把PE位置為為了把系統切換到保護模式還要做一些其它的事情程序必須要對系統的段寄存器和控制寄存器進行初始化把PE位置還要執行跳轉指令過程簡述如下
  
  創建GDT表;
  
  通過置PE位為進入保護模式;
  
  執行跳轉以清除在實模式下讀取的任何指令
  
  下面使用代碼來實現這個切換過程
  
  需要的東西
  
  ◆ 一張空白軟盤
  
  ◆ NASM編譯器
  
  下面是整個程序的源代碼
  
  org xc; 起始地址是:c
  jmp short begin_boot  ; 跳過其它的數據跳轉到引導程序的開始處
  bootmesg db Our OS boot sector loading
  pm_mesg db Switching to protected mode
  dw  ; 每一扇區的字節數
  db  ; 每一簇的扇區數
  dw  ; 保留的扇區號
  db   
  dw xe   
  dw xb   
  db xf   
  dw   
  dw   
  dw  ; 讀寫扇區號
  dw  ; 隱藏扇區號
  print_mesg :
  mov ahx ; 使用中斷h的功能在屏幕上寫一個字符串
  mov alx ; 決定調用函數後光標所處的位置
  mov bxx  ; 設置顯示屬性
  mov cxx ; 在此字符串長度為
  mov dxx  ; 光標的起始行和列
  int x ; 調用BIOS的中斷h
  ret ; 返回調用程序
  get_key :
  mov ahx  
  int x ; Get_key使用中斷h的功能讀取下一個字符
  ret
  clrscr :
  mov axx ; 使用中斷h的功能實現卷屏如果al=則清屏
  mov cxx ; 清屏
  mov dxxf ; 卷屏至
  mov bh ; 使用顏色來填充
  int x ; 調用h中斷
  ret
  begin_boot :
  call clrscr  ; 先清屏
  mov bpbootmesg ; 提供串地址
  call print_mesg ; 輸出信息
  call get_key  ; 等待用戶按下任一鍵
  bits
  call clrscr ; 清屏
  mov axxb ; 使gs指向顯示內存
  mov gsax ; 在實模式下顯示一個棕色的A
  mov word [gs:]x ; 顯示
  call get_key ; 調用Get_key等待用戶按下任一鍵
  mov bppm_mesg ; 設置串指針
  call print_mesg ; 調用print_mesg子程序
  call get_key ; 等待按鍵
  call clrscr ; 清屏
  cli ; 關中斷
  lgdt[gdtr] ; 加載GDT
  mov eaxcr   
  or alx ; 設置保護模式位
  mov creax ; 將更改後的字送至控制寄存器中
  jmp codesel:go_pm
  bits
  go_pm :
  mov axdatasel 
  mov dsax ; 初始化ds和es使其指向數據段
  mov esax
  mov axvideosel ; 初始化gs使其指向顯示內存
  mov gsax
  mov word [gs:]x ; 在保護模式下顯示一個白色的字符A
  spin : jmp spin ; 循環
  bits
  gdtr :
  dw gdt_endgdt ; gdt的長度
  dd gdt ; gdt的物理地址
  gdt
  nullsel equ $gdt ; $指向當前位置所以nullsel = h
  gdt ; 空描述符
  dd    
  dd  ; 所有的段描述符都是位的
  codesel equ $gdt ; 這是h也就是gdt的第二個描述符
  code_gdt    
  dw xffff ; 段描述符的界限是Gb
  dw x    
  db x      
  db xa  
  db xcf  
  db x  
  datasel equ $gdt  
  data_gdt    
  dw xffff    
  dw x    
  db x      
  db x
  db xcf
  db x
  videosel equ $gdt   
  dw    
  dw x ; 基址是xb
  db xb
  db x    
  db x    
  db x
  gdt_end
  times ($$$) db  
  dw xaa
  
  把上面的代碼存在一個名為abcasm的文件之中使用命令nasm abcasm將得出一個名為abc的文件然後插入軟盤輸入命令dd if=abc of=/dev/fd該命令將把文件abc寫入到軟盤的第一扇區之中然後重新啟動系統就會看到如下的信息
  
  *Our os booting
  * A (棕色)
  * Switching to protected mode
  * A (白色)
  
  對代碼的解釋
  
  上面給出了所有的代碼下面我對上述代碼做一些解釋
  
  ◆ 使用的函數
  
  下面是代碼中一些函數的說明
  
  print_mesg 該子程序使用了BIOS中斷h的功能h即向屏幕寫一字符串屬性控制是通過向一些寄存器中送入不同的值來實現的中斷h是用於各種字符串操作我們把子功能號h送到ah中用於指明要打印一個字符串al寄存器中的說明了光標返回的起始位置表示調用函數後光標返回到下一行的行首如果al為則表示光標位於最後一個字符處
  
  顯存被分成了幾頁在同一時
From:http://tw.wingwit.com/Article/program/Oracle/201311/16515.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.