嵌入式操作系統(tǒng)_第1頁
嵌入式操作系統(tǒng)_第2頁
嵌入式操作系統(tǒng)_第3頁
嵌入式操作系統(tǒng)_第4頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)陳香蘭http:/ 2006中國科學(xué)技術(shù)大學(xué)計算機系xlanchen2006.6.7Embedded Operating Systems2上周三上周三l嵌入式Linux開發(fā)技術(shù)l嵌入式Linux開發(fā)綜述lLinux的配置和編譯l根文件系統(tǒng)及其制作xlanchen2006.6.7Embedded Operating Systems3上周四上周四l基于i386體系結(jié)構(gòu)的Linux啟動代碼分析llinux/arch/i386/boot/bootsect.Sllinux/arch/i386/boot/setup.Sllinux/arch/i386/boot/compress

2、ed/head.Sllinux/arch/i386/kernel/head.Sllinux/arch/init/main.cxlanchen2006.6.7Embedded Operating Systems4本次課本次課l課程第二部分:Linux操作系統(tǒng)內(nèi)核分析l一些基本概念l內(nèi)存尋址Linux內(nèi)核分析:內(nèi)核分析:一些預(yù)備知識一些預(yù)備知識xlanchen2006.6.7xlanchen2006.6.7Embedded Operating Systems6操作系統(tǒng)的基本概念操作系統(tǒng)的基本概念l任何計算機系統(tǒng)都包含一個基本的程序集合,稱為操作系統(tǒng)。l內(nèi)核(進程管理,進程調(diào)度,進程間通訊機制,內(nèi)存

3、管理,中斷異常處理,文件系統(tǒng),I/O系統(tǒng),網(wǎng)絡(luò)部分)l其他程序(例如函數(shù)庫,shell程序等等)l操作系統(tǒng)的目的l與硬件交互,管理所有的硬件資源l為用戶程序(應(yīng)用程序)提供一個良好的執(zhí)行環(huán)境xlanchen2006.6.7Embedded Operating Systems7一個典型的一個典型的Linux操作系統(tǒng)的結(jié)構(gòu)操作系統(tǒng)的結(jié)構(gòu) (the users) Shells and commands Compilers and interpreters System libraries System-call interface to the kernel Signals terminal han

4、dling character I/O system terminal drivers File system swapping block I/O system disk and tape driver CPU scheduling page replacement demand paging virtual memoryr Kernel interface to the hardware Terminal controllers terminals Device controllers disks and tapes Memory controllers physical memory 用

5、戶應(yīng)用程序用戶應(yīng)用程序System call對硬件資對硬件資源的管理源的管理Shell,libKernel implementationxlanchen2006.6.7Embedded Operating Systems8最簡單也是最復(fù)雜的操作最簡單也是最復(fù)雜的操作在控制臺下輸入在控制臺下輸入ls命令命令Shell程序分析輸入?yún)⒊绦蚍治鲚斎雲(yún)?shù),確定這是數(shù),確定這是ls命令命令調(diào)用系統(tǒng)調(diào)用調(diào)用系統(tǒng)調(diào)用fork生成生成一個一個shell本身的拷貝本身的拷貝什么是系統(tǒng)調(diào)用?為什么我們敲擊鍵盤就會在終端上顯示?fork是什么?為什么要調(diào)用fork?中斷的概念,終端控制臺設(shè)備驅(qū)動的概念保護模式和實模式

6、,內(nèi)存保護,內(nèi)核態(tài)用戶態(tài)相關(guān)問題進程的描述,進程的創(chuàng)建。COW技術(shù)系統(tǒng)調(diào)用是怎么實現(xiàn)的?軟中斷、異常的概念。陷阱門,系統(tǒng)門調(diào)用調(diào)用exec系統(tǒng)調(diào)用將系統(tǒng)調(diào)用將ls的可執(zhí)行文件裝入內(nèi)存的可執(zhí)行文件裝入內(nèi)存內(nèi)存管理模塊,進程的地址空間,分頁機制,文件系統(tǒng)從系統(tǒng)調(diào)用返回從系統(tǒng)調(diào)用返回如何做到正確的返回?堆棧的維護,寄存器的保存與恢復(fù)Shell和和ls都得以執(zhí)行都得以執(zhí)行進程的調(diào)度,運行隊列等待隊列的維護xlanchen2006.6.7Embedded Operating Systems9一些基本但很重要的概念一些基本但很重要的概念l堆棧l內(nèi)核態(tài) vs 用戶態(tài)xlanchen2006.6.7Embed

7、ded Operating Systems10堆棧堆棧l堆棧是C語言程序運行時必須的一個記錄調(diào)用路徑和參數(shù)的空間l函數(shù)調(diào)用框架l傳遞參數(shù)l保存返回地址l提供局部變量空間l等等lC語言編譯器對堆棧的使用有一套的規(guī)則l了解堆棧存在的目的和編譯器對堆棧使用的規(guī)則是理解操作系統(tǒng)一些關(guān)鍵性代碼的基礎(chǔ)xlanchen2006.6.7Embedded Operating Systems11/ 調(diào)用者call target函數(shù)調(diào)用和返回函數(shù)調(diào)用和返回/建立函數(shù)框架pushl %ebpmovl %esp, %ebp/拆除函數(shù)框架movl %ebp,%esppopl %ebp ret/被調(diào)用者函數(shù)體/do sth

8、.保存返回地址設(shè)置eip指向被調(diào)用程序?qū)⒎祷氐刂坊謴?fù)到eip中xlanchen2006.6.7Embedded Operating Systems12l堆棧相關(guān)的寄存器lesp,堆棧指針(stack pointer)lebp,基址指針(base pointer)lebp在C語言中用作記錄當(dāng)前函數(shù)調(diào)用基址l舉例說明l參數(shù)的傳遞l局部變量的使用l函數(shù)調(diào)用框架的形成xlanchen2006.6.7Embedded Operating Systems13一段小程序一段小程序這是一個很簡單的C程序的結(jié)構(gòu)main函數(shù)中調(diào)用了函數(shù)p1和p2源文件:test.c首先使用gcc獲得test.c的可執(zhí)行文件tes

9、t然后使用objdump S獲得test的反匯編文件xlanchen2006.6.7Embedded Operating Systems14觀察觀察p2的函數(shù)調(diào)用框架的函數(shù)調(diào)用框架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調(diào)用者函數(shù)框架espebpyxxlanchen2006.6.7Embedded Operating Systems15觀察觀察main函數(shù)

10、是如何傳遞參數(shù)給函數(shù)是如何傳遞參數(shù)給p2的的z=p2(x,y); pushl 0 xfffffff8(%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的?xlanchen2006.6.7Embe

11、dded Operating Systems16ebp觀察觀察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)調(diào)用者ebpespebpespespcxyxlanchen2006.6.7Embedded Operating Systems17eipeipeipeip觀察程序運行時堆棧

12、的變化觀察程序運行時堆棧的變化mainp1(c)p2(x,y)p1p2mainp2p1程序的代碼段堆棧eipespmain堆棧ceipeipeipp1的堆棧espeipeipeipx,yeipp2堆棧eipxlanchen2006.6.7Embedded Operating Systems18另一段小程序另一段小程序和前一段小程序稍有不同和前一段小程序稍有不同在這個小程序中,在這個小程序中,main函數(shù)中調(diào)用了函數(shù)函數(shù)中調(diào)用了函數(shù)p2,而在,而在p2的執(zhí)行過程中又調(diào)用了函數(shù)的執(zhí)行過程中又調(diào)用了函數(shù)p1xlanchen2006.6.7Embedded Operating Systems19觀察程

13、序運行時堆棧的變化觀察程序運行時堆棧的變化eipeipeipeipmainp2(x,y)p1p2p1(c)mainp2p1程序的代碼段堆棧eipespmain堆棧espeipeipx,yeipp2堆棧eipeipeipeipceipp1堆棧espxlanchen2006.6.7Embedded Operating Systems20觀察堆棧在內(nèi)核中的使用觀察堆棧在內(nèi)核中的使用l在內(nèi)核代碼中經(jīng)常有這樣的函數(shù),它的參數(shù)是struct pt_regs *regs可以往回一層層的尋找這個參數(shù)是怎么傳遞過來的,最后我們可以發(fā)現(xiàn)最源頭的函數(shù)使用了這樣的參數(shù)struct pt_regs regs比如void

14、 do_IRQ(struct pt_regs regs)如果再進一步尋找是誰調(diào)用了這個do_IRQ,我們會發(fā)現(xiàn)只是一條簡單的匯編語句call do_IRQxlanchen2006.6.7Embedded Operating Systems21pt_regs結(jié)構(gòu)結(jié)構(gòu) 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

15、; ; 1 SAVE_ALL 和 RESTORE_ALL 保存和恢復(fù)的寄存器 2 異常處理函數(shù)中的 Error_code為保持一致而保存的數(shù) CPU在進入中斷或者異常前自動保存的寄存器 1. 中斷(狹)和系統(tǒng)調(diào)用保存的中斷號和系統(tǒng)調(diào)用號 2. 或者,CPU 為產(chǎn)生硬件錯誤碼的異常保存的硬件錯誤碼 3. 或者,為保持一致,在異常處理函數(shù)中,隨便保存的一個無效的數(shù) xlanchen2006.6.7Embedded Operating Systems22SAVE_ALL和和RESTORE_ALLxlanchen2006.6.7Embedded Operating Systems23do_IRQ的調(diào)用

16、方式的調(diào)用方式l仔細閱讀一下與之相連的匯編碼pushl $n-256SAVE_ALLcall do_IRQjmp ret_from_intrxlanchen2006.6.7Embedded Operating Systems24do_IRQ的函數(shù)定義方式的函數(shù)定義方式regparm(x) x!=0:告訴gcc不通過堆棧而通過寄存器傳。x是參數(shù)個數(shù),寄存器依此使用EAX,EDX,ECX而asmlinkage則使得編譯器不通過寄存器(x=0)而使用堆棧傳遞參數(shù)xlanchen2006.6.7Embedded Operating Systems25用戶態(tài)和內(nèi)核態(tài)的概念用戶態(tài)和內(nèi)核態(tài)的概念l什么是用戶

17、態(tài)和內(nèi)核態(tài)?l一般現(xiàn)代CPU都有幾種不同的指令執(zhí)行級別l在高執(zhí)行級別下,代碼可以執(zhí)行特權(quán)指令,訪問任意的物理地址,這種CPU執(zhí)行級別就對應(yīng)著內(nèi)核態(tài)l而在相應(yīng)的低級別執(zhí)行狀態(tài)下,代碼的掌控范圍會受到限制。只能在對應(yīng)級別允許的范圍內(nèi)活動l舉例:intel x86 CPU有四種不同的執(zhí)行級別0-3,Linux只使用了其中的0級和3級分別來表示內(nèi)核態(tài)和用戶態(tài)xlanchen2006.6.7Embedded Operating Systems26l為什么要區(qū)分用戶態(tài)和內(nèi)核態(tài)?l禁止用戶程序和底層硬件直接打交道(最簡單的例子,如果用戶程序往硬件控制寄存器寫入不恰當(dāng)?shù)闹?,可能?dǎo)致硬件無法正常工作)l禁止用戶

18、程序訪問任意的物理內(nèi)存(否則可能會破壞其他程序的正常執(zhí)行,如果對核心內(nèi)核所在的地址空間寫入數(shù)據(jù)的話,會導(dǎo)致系統(tǒng)崩潰)xlanchen2006.6.7Embedded Operating Systems27l如何區(qū)分一段代碼是核心態(tài)還是用戶態(tài)lcs寄存器的最低兩位表明了當(dāng)前代碼的特權(quán)級lCPU每條指令的讀取都是通過cs:eip這兩個寄存器:其中cs是代碼段選擇寄存器,eip是偏移量寄存器。l上述判斷由硬件完成l一般來說在Linux中,地址空間是一個顯著的標志:0 xc0000000以上的地址空間只能在內(nèi)核態(tài)下訪問,0 x000000000 xbfffffff的地址空間在兩種狀態(tài)下都可以訪問注意:這里所說的地址空間是邏輯地址而不是物理地址xlanchen2006.6.7Embedded Operating Systems28站在站在CPU執(zhí)行指令的角度執(zhí)行指令的角度CPUeipesp0 xc0000000c=gets()mainsome action進程管理wait keyboradqueue進程進程x進程進程xidleintr8259keyboard中斷處理Wakeup

溫馨提示

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

最新文檔

評論

0/150

提交評論