嵌入式操作系統_第1頁
嵌入式操作系統_第2頁
嵌入式操作系統_第3頁
嵌入式操作系統_第4頁
嵌入式操作系統_第5頁
已閱讀5頁,還剩34頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、嵌入式操作系統嵌入式操作系統陳香蘭http:/ 2007中國科學技術大學計算機系xlanchen2007.6.11Embedded Operating Systems2上周一上周一l嵌入式Linux開發技術l嵌入式Linux開發綜述lLinux的配置和編譯l根文件系統及其制作xlanchen2007.6.11Embedded Operating Systems3上周二上周二l基于i386體系結構的Linux啟動代碼分析llinux/arch/i386/boot/bootsect.Sllinux/arch/i386/boot/setup.Sllinux/arch/i386/boot/compre

2、ssed/head.Sllinux/arch/i386/kernel/head.Sllinux/arch/init/main.cxlanchen2007.6.11Embedded Operating Systems4本次課本次課l基于i386體系結構的Linux操作系統內核分析l一些基本概念l堆棧l用戶態/內核態l虛擬內存l內存尋址基于基于i386體系結構的體系結構的Linux內核分析:內核分析:一些預備知識一些預備知識xlanchen2007.6.11xlanchen2007.6.11Embedded Operating Systems6聲明聲明l本課內容涉及到的Linux的內核分析,是基于

3、Linux2.4.18內核源代碼的,具有一定的典型性,但不一定適用于所有其他的Linux內核版本xlanchen2007.6.11Embedded Operating Systems7操作系統的基本概念操作系統的基本概念l任何計算機系統都包含一個基本的程序集合,稱為操作系統。l內核(進程管理,進程調度,進程間通訊機制,內存管理,中斷異常處理,文件系統,I/O系統,網絡部分)l其他程序(例如函數庫,shell程序等等)l操作系統的目的l與硬件交互,管理所有的硬件資源l為用戶程序(應用程序)提供一個良好的執行環境xlanchen2007.6.11Embedded Operating Systems

4、8一個典型的一個典型的Linux操作系統的結構操作系統的結構 (the users) Shells and commands Compilers and interpreters System libraries System-call interface to the kernel Signals terminal handling character I/O system terminal drivers File system swapping block I/O system disk and tape driver CPU scheduling page replacement de

5、mand paging virtual memoryr Kernel interface to the hardware Terminal controllers terminals Device controllers disks and tapes Memory controllers physical memory 用戶應用程序用戶應用程序System call對硬件資對硬件資源的管理源的管理Shell,libKernel implementationxlanchen2007.6.11Embedded Operating Systems9最簡單也是最復雜的操作最簡單也是最復雜的操作在控制

6、臺下輸入在控制臺下輸入ls命令命令Shell程序分析輸入參程序分析輸入參數,確定這是數,確定這是ls命令命令調用系統調用調用系統調用fork生成生成一個一個shell本身的拷貝本身的拷貝什么是系統調用?為什么我們敲擊鍵盤就會在終端上顯示?fork是什么?為什么要調用fork?中斷的概念,終端控制臺設備驅動的概念保護模式和實模式,內存保護,內核態用戶態相關問題進程的描述,進程的創建。COW技術系統調用是怎么實現的?軟中斷、異常的概念。陷阱門,系統門調用調用exec系統調用將系統調用將ls的可執行文件裝入內存的可執行文件裝入內存內存管理模塊,進程的地址空間,分頁機制,文件系統從系統調用返回從系統調

7、用返回如何做到正確的返回?堆棧的維護,寄存器的保存與恢復Shell和和ls都得以執行都得以執行進程的調度,運行隊列等待隊列的維護xlanchen2007.6.11Embedded Operating Systems10一些基本但很重要的概念一些基本但很重要的概念l堆棧l內核態 vs 用戶態l虛擬內存xlanchen2007.6.11Embedded Operating Systems11堆棧堆棧l堆棧是C語言程序運行時必須的一個記錄調用路徑和參數的空間l函數調用框架l傳遞參數l保存返回地址l提供局部變量空間l等等lC語言編譯器對堆棧的使用有一套的規則l了解堆棧存在的目的和編譯器對堆棧使用的規則

8、是理解操作系統一些關鍵性代碼的基礎xlanchen2007.6.11Embedded Operating Systems12堆棧寄存器和堆棧操作堆棧寄存器和堆棧操作l堆棧相關的寄存器lesp,堆棧指針(stack pointer)lebp,基址指針(base pointer)l堆棧操作lpush棧頂地址減少4個字節(32位)lpop棧頂地址增加4個字節lebp在C語言中用作記錄當前函數調用基址espebp高地址低地址espxlanchen2007.6.11Embedded Operating Systems13利用堆棧實現函數調用和返回利用堆棧實現函數調用和返回l其他關鍵寄存器lcs : ei

9、p:總是指向下一條的指令地址l順序執行:總是指向地址連續的下一條指令l跳轉/分支:執行這樣的指令的時候,cs : eip的值會根據程序需要被修改lcall:將當前cs : eip的值壓入棧頂,cs : eip指向被調用函數的入口地址lret:從棧頂彈出原來保存在這里的cs : eip的值,放入cs : eip中l發生中斷時?l?xlanchen2007.6.11Embedded Operating Systems14/ 調用者call target/建立被調用者函數的堆棧框架pushl %ebpmovl %esp, %ebp/拆除被調用者函數的堆棧框架movl %ebp,%esppopl %e

10、bp ret/被調用者函數體/do sth.call指令:1)將下一條指令的地址A保存在棧頂2)設置eip指向被調用程序代碼開始處將地址A恢復到eip中xlanchen2007.6.11Embedded Operating Systems15函數堆棧框架的形成函數堆棧框架的形成lcall xxxl執行call之前l執行call時,cs : eip原來的值指向call下一條指令,該值被保存到棧頂,然后cs : eip的值指向xxx的入口地址l進入xxxl第一條指令: pushl %ebpl第二條指令: movl %esp, %ebpl函數體中的常規操作,可能會壓棧、出棧l退出xxxlmovl %

11、ebp,%esplpopl %ebplretespebp高地址低地址cs : eipespebpespebpespxlanchen2007.6.11Embedded Operating Systems16lC語言中還使用堆棧進行l參數的傳遞l局部變量的使用xlanchen2007.6.11Embedded Operating Systems17一段小程序一段小程序源文件:test.c這是一個很簡單的C程序 main函數中調用了函數p1和p2首先使用gcc生成test.c的可執行文件test然后使用objdump S獲得test的反匯編文件xlanchen2007.6.11Embedded Op

12、erating Systems18觀察觀察p2的堆棧框架的堆棧框架l從test的反匯編文件中找到p2的反匯編代碼int p2(int x,int y)push %ebpmov %esp,%ebpreturn x+y;mov 0 xc(%ebp),%eaxadd 0 x8(%ebp),%eaxpop %ebpret建立框架拆除框架ebpespebp調用者堆棧框架espebpyx高地址低地址xlanchen2007.6.11Embedded Operating Systems19觀察觀察main函數是如何傳遞參數給函數是如何傳遞參數給p2的的z=p2(x,y); pushl 0 xfffffff8

13、(%ebp) pushl 0 xfffffff4(%ebp) call 804839b add $0 x8,%esp mov %eax,0 xfffffffc(%ebp)printf(%d=%d+%dn,z,x,y); pushl 0 xfffffff8(%ebp) pushl 0 xfffffff4(%ebp) pushl 0 xfffffffc(%ebp) push $0 x8048510 call 80482b0 p2的返回值是如何返回給main的?調用者堆棧框架espebpy的值x的值高地址低地址被調用者堆棧框架ebpcs:eipespebpespespxlanchen2007.6.1

14、1Embedded Operating Systems20ebp觀察觀察main中的局部變量中的局部變量int main(void)push %ebpmov %esp,%ebpsub $0 x18,%esp char c=a; movb $0 x61,0 xfffffff3(%ebp)int x,y,z;x=1; movl $0 x1,0 xfffffff4(%ebp)y=2; movl $0 x2,0 xfffffff8(%ebp)調用者ebpespebpespespc=ax=1y=2高地址低地址xlanchen2007.6.11Embedded Operating Systems21eip

15、eipeipeip觀察程序運行時堆棧的變化觀察程序運行時堆棧的變化mainp1(c)p2(x,y)p1p2mainp2p1程序的代碼段堆棧eipespmain堆棧ceipeipeipp1的堆棧espeipeipeipx,yeipp2堆棧eipxlanchen2007.6.11Embedded Operating Systems22另一段小程序另一段小程序和前一段小程序稍有不同和前一段小程序稍有不同在這個小程序中,在這個小程序中,main函數中調用了函數函數中調用了函數p2,而在,而在p2的執行過程中又調用了函數的執行過程中又調用了函數p1xlanchen2007.6.11Embedded Op

16、erating Systems23觀察程序運行時堆棧的變化觀察程序運行時堆棧的變化eipeipeipeipmainp2(x,y)p1p2p1(c)mainp2p1程序的代碼段堆棧eipespmain堆棧espeipeipx,yeipp2堆棧eipeipeipeipceipp1堆棧espxlanchen2007.6.11Embedded Operating Systems24觀察堆棧在內核中的使用觀察堆棧在內核中的使用l在內核代碼中經常有這樣的函數,它的參數是struct pt_regs *regs可以往回一層層的尋找這個參數是怎么傳遞過來的,最后我們可以發現最源頭的函數使用了這樣的參數stru

17、ct pt_regs regs比如void do_IRQ(struct pt_regs regs)如果再進一步尋找是誰調用了這個do_IRQ,我們會發現只是一條簡單的匯編語句call do_IRQxlanchen2007.6.11Embedded Operating Systems25為什么要有為什么要有pt_regs結構結構l用戶態 vs 內核態l寄存器上下文l從用戶態切換到內核態時l必須保存用戶態的寄存器上下文l要保存哪些?l保存在哪里?l中斷/int指令會在堆棧上保存一些寄存器的值l如:用戶態棧頂地址、當時的狀態字、當時的cs:eip的值xlanchen2007.6.11Embedded

18、 Operating Systems26pt_regs結構結構 struct pt_regs long ebx; long ecx; long edx; long esi; long edi; long ebp; long eax; int xds; int xes; long orig_eax; long eip; int xcs; long eflags; long esp; int xss; ; 1 SAVE_ALL 和 RESTORE_ALL 保存和恢復的寄存器 2 異常處理函數中的 Error_code為保持一致而保存的數 CPU在進入中斷或者異常前自動保存的寄存器 1. 中斷(狹)

19、和系統調用保存的中斷號和系統調用號 2. 或者,CPU 為產生硬件錯誤碼的異常保存的硬件錯誤碼 3. 或者,為保持一致,在異常處理函數中,隨便保存的一個無效的數 xlanchen2007.6.11Embedded Operating Systems27SAVE_ALL和和RESTORE_ALLxlanchen2007.6.11Embedded Operating Systems28do_IRQ的調用方式的調用方式l仔細閱讀一下與之相連的匯編碼pushl $n-256SAVE_ALLcall do_IRQjmp ret_from_intrxlanchen2007.6.11Embedded Ope

20、rating Systems29do_IRQ的函數定義方式的函數定義方式regparm(x) x!=0:告訴gcc不通過堆棧而通過寄存器傳。x是參數個數,寄存器依此使用EAX,EDX,ECX而asmlinkage則使得編譯器不通過寄存器(x=0)而使用堆棧傳遞參數因此,do_IRQ將棧頂的內容看成pt_regs結構的參數,在必要時可以通過訪問這里的內容獲得信息xlanchen2007.6.11Embedded Operating Systems30用戶態和內核態的概念用戶態和內核態的概念lWhy?l假定不區分l用戶直接修改操作系統的數據l用戶直接調用操作系統的內部函數l用戶直接操作外設l用戶任

21、意讀/寫物理內存xlanchen2007.6.11Embedded Operating Systems31l因此,要區分用戶態和內核態:l禁止用戶程序和底層硬件直接打交道(最簡單的例子,如果用戶程序往硬件控制寄存器寫入不恰當的值,可能導致硬件無法正常工作)l禁止用戶程序訪問任意的物理內存(否則可能會破壞其他程序的正常執行,如果對核心內核所在的地址空間寫入數據的話,會導致系統崩潰)xlanchen2007.6.11Embedded Operating Systems32l什么是用戶態和內核態?l一般現代CPU都有幾種不同的指令執行級別l在高執行級別下,代碼可以執行特權指令,訪問任意的物理地址,這

22、種CPU執行級別就對應著內核態l而在相應的低級別執行狀態下,代碼的掌控范圍會受到限制。只能在對應級別允許的范圍內活動l舉例:intel x86 CPU有四種不同的執行級別0-3,Linux只使用了其中的0級和3級分別來表示內核態和用戶態xlanchen2007.6.11Embedded Operating Systems33l如何區分一段代碼是核心態還是用戶態lcs寄存器的最低兩位表明了當前代碼的特權級lCPU每條指令的讀取都是通過cs:eip這兩個寄存器:其中cs是代碼段選擇寄存器,eip是偏移量寄存器。l上述判斷由硬件完成l一般來說在Linux中,地址空間是一個顯著的標志:0 xc0000000以上的地址空間只能在內核態下訪問,0 x000000000 xbfffffff的地址空間在兩種狀態下都可以訪問注意:這里所說的地址空間是邏輯地址而不是物理地址xlanchen2007.6.11Embedded Operating Systems34虛擬內存虛擬內存l物理內存有限,是一種稀缺資源l局部性原理l空間局部性l時間局部性l按需調頁l頁框l利用磁盤上的交換空間xlanchen2007.6.11Embedded Operating Systems35l進程的虛擬地址空間l獨立的地址空間(32位,4GB),每個進程一個l在Linux中,3G以上是內核空間,3G以下是用戶空間l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論