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

下載本文檔

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

文檔簡介

嵌入式操作系統(tǒng)Spring2007上周一嵌入式Linux開發(fā)技術嵌入式Linux開發(fā)綜述Linux的配置和編譯根文件系統(tǒng)及其制作2上周二基于i386體系結構的Linux啟動代碼分析linux/arch/i386/boot/bootsect.Slinux/arch/i386/boot/setup.Slinux/arch/i386/boot/compressed/head.Slinux/arch/i386/kernel/head.Slinux/arch/init/main.c3本次課基于i386體系結構的Linux操作系統(tǒng)內(nèi)核分析一些基本概念堆棧用戶態(tài)/內(nèi)核態(tài)虛擬內(nèi)存內(nèi)存尋址4基于i386體系結構的

Linux內(nèi)核分析:

一些預備知識聲明本課內(nèi)容涉及到的Linux的內(nèi)核分析,是基于Linux2.4.18內(nèi)核源代碼的,具有一定的典型性,但不一定適用于所有其他的Linux內(nèi)核版本6操作系統(tǒng)的基本概念任何計算機系統(tǒng)都包含一個基本的程序集合,稱為操作系統(tǒng)。內(nèi)核(進程管理,進程調(diào)度,進程間通訊機制,內(nèi)存管理,中斷異常處理,文件系統(tǒng),I/O系統(tǒng),網(wǎng)絡部分)其他程序(例如函數(shù)庫,shell程序等等)操作系統(tǒng)的目的與硬件交互,管理所有的硬件資源為用戶程序(應用程序)提供一個良好的執(zhí)行環(huán)境7一個典型的Linux操作系統(tǒng)的結構用戶應用程序Systemcall對硬件資源的管理Shell,libKernelimplementation8最簡單也是最復雜的操作在控制臺下輸入ls命令Shell程序分析輸入?yún)?shù),確定這是ls命令調(diào)用系統(tǒng)調(diào)用fork生成一個shell本身的拷貝什么是系統(tǒng)調(diào)用?為什么我們敲擊鍵盤就會在終端上顯示?fork是什么?為什么要調(diào)用fork?中斷的概念,終端控制臺設備驅(qū)動的概念保護模式和實模式,內(nèi)存保護,內(nèi)核態(tài)用戶態(tài)相關問題進程的描述,進程的創(chuàng)建。COW技術系統(tǒng)調(diào)用是怎么實現(xiàn)的?軟中斷、異常的概念。陷阱門,系統(tǒng)門調(diào)用exec系統(tǒng)調(diào)用將ls的可執(zhí)行文件裝入內(nèi)存內(nèi)存管理模塊,進程的地址空間,分頁機制,文件系統(tǒng)從系統(tǒng)調(diào)用返回如何做到正確的返回?堆棧的維護,寄存器的保存與恢復Shell和ls都得以執(zhí)行進程的調(diào)度,運行隊列等待隊列的維護9一些基本但很重要的概念堆棧內(nèi)核態(tài)vs用戶態(tài)虛擬內(nèi)存10堆棧堆棧是C語言程序運行時必須的一個記錄調(diào)用路徑和參數(shù)的空間函數(shù)調(diào)用框架傳遞參數(shù)保存返回地址提供局部變量空間等等C語言編譯器對堆棧的使用有一套的規(guī)則了解堆棧存在的目的和編譯器對堆棧使用的規(guī)則是理解操作系統(tǒng)一些關鍵性代碼的基礎11堆棧寄存器和堆棧操作堆棧相關的寄存器esp,堆棧指針(stackpointer)ebp,基址指針(basepointer)堆棧操作push

棧頂?shù)刂窚p少4個字節(jié)(32位)pop

棧頂?shù)刂吩黾?個字節(jié)ebp在C語言中用作記錄當前函數(shù)調(diào)用基址espebp高地址低地址esp12利用堆棧實現(xiàn)函數(shù)調(diào)用和返回其他關鍵寄存器cs:eip:總是指向下一條的指令地址順序執(zhí)行:總是指向地址連續(xù)的下一條指令跳轉(zhuǎn)/分支:執(zhí)行這樣的指令的時候,cs:eip的值會根據(jù)程序需要被修改call:將當前cs:eip的值壓入棧頂,cs:eip指向被調(diào)用函數(shù)的入口地址ret:從棧頂彈出原來保存在這里的cs:eip的值,放入cs:eip中發(fā)生中斷時???????13//調(diào)用者…calltarget…//建立被調(diào)用者函數(shù)的堆??蚣?/p>

pushl%ebp

movl%esp,%ebp//拆除被調(diào)用者函數(shù)的堆棧框架

movl%ebp,%esp

popl%ebp

ret//被調(diào)用者函數(shù)體

//dosth.…call指令:1)將下一條指令的地址A保存在棧頂2)設置eip指向被調(diào)用程序代碼開始處將地址A恢復到eip中14函數(shù)堆??蚣艿男纬?/p>

callxxx執(zhí)行call之前執(zhí)行call時,cs:eip原來的值

指向call下一條指令,該值被

保存到棧頂,然后cs:eip的值

指向xxx的入口地址進入xxx第一條指令:pushl%ebp第二條指令:movl%esp,%ebp函數(shù)體中的常規(guī)操作,可能會壓棧、出棧退出xxxmovl%ebp,%esppopl%ebpretespebp高地址低地址cs:eipespebpespebpesp15C語言中還使用堆棧進行參數(shù)的傳遞局部變量的使用16一段小程序

源文件:test.c這是一個很簡單的C程序main函數(shù)中調(diào)用了函數(shù)p1和p2首先使用gcc生成test.c的可執(zhí)行文件test然后使用objdump–S獲得test的反匯編文件17觀察p2的堆棧框架從test的反匯編文件中找到p2的反匯編代碼intp2(intx,inty){ push%ebp mov%esp,%ebp

returnx+y; mov0xc(%ebp),%eax add0x8(%ebp),%eax} pop%ebp ret建立框架拆除框架ebpespebp調(diào)用者堆??蚣躤spebpyx高地址低地址18觀察main函數(shù)是如何傳遞參數(shù)給p2的 …z=p2(x,y); pushl0xfffffff8(%ebp) pushl0xfffffff4(%ebp) call804839b<p2> add$0x8,%esp mov%eax,0xfffffffc(%ebp)printf("%d=%d+%d\n",z,x,y); pushl0xfffffff8(%ebp) pushl0xfffffff4(%ebp) pushl0xfffffffc(%ebp) push$0x8048510 call80482b0<printf@plt> …p2的返回值是如何返回給main的?調(diào)用者堆??蚣躤spebpy的值x的值高地址低地址被調(diào)用者堆??蚣躤bpcs:eipespebpespesp19ebp觀察main中的局部變量intmain(void){ push%ebp mov%esp,%ebp sub$0x18,%esp … charc='a'; movb$0x61,0xfffffff3(%ebp) intx,y,z; x=1; movl$0x1,0xfffffff4(%ebp) y=2; movl$0x2,0xfffffff8(%ebp) …調(diào)用者ebpespebpespespc=‘a(chǎn)’x=1y=2高地址低地址20eipeipeipeip觀察程序運行時堆棧的變化main…p1(c)…p2(x,y)…p1p2mainp2p1程序的代碼段堆棧eipespmain堆棧ceipeipeipp1的堆棧espeipeipeipx,yeipp2堆棧eip21另一段小程序

和前一段小程序稍有不同在這個小程序中,main函數(shù)中調(diào)用了函數(shù)p2,而在p2的執(zhí)行過程中又調(diào)用了函數(shù)p122觀察程序運行時堆棧的變化eipeipeipeipmain…p2(x,y)…p1p2…p1(c)…mainp2p1程序的代碼段堆棧eipespmain堆棧espeipeipx,yeipp2堆棧eipeipeipeipceipp1堆棧esp23觀察堆棧在內(nèi)核中的使用在內(nèi)核代碼中經(jīng)常有這樣的函數(shù),它的參數(shù)是structpt_regs*regs 可以往回一層層的尋找這個參數(shù)是怎么傳遞過來的,最后我們可以發(fā)現(xiàn)最源頭的函數(shù)使用了這樣的參數(shù)structpt_regsregs 比如voiddo_IRQ(structpt_regsregs) 如果再進一步尋找是誰調(diào)用了這個do_IRQ,我們會發(fā)現(xiàn)只是一條簡單的匯編語句

calldo_IRQ

24為什么要有pt_regs結構用戶態(tài)vs內(nèi)核態(tài)寄存器上下文從用戶態(tài)切換到內(nèi)核態(tài)時必須保存用戶態(tài)的寄存器上下文要保存哪些?保存在哪里?中斷/int指令會在堆棧上保存一些寄存器的值如:用戶態(tài)棧頂?shù)刂?、當時的狀態(tài)字、當時的cs:eip的值25pt_regs結構26SAVE_ALL和RESTORE_ALL27do_IRQ的調(diào)用方式仔細閱讀一下與之相連的匯編碼pushl$n-256SAVE_ALLcalldo_IRQjmpret_from_intr28do_IRQ的函數(shù)定義方式

regparm(x)x!=0:告訴gcc不通過堆棧而通過寄存器傳。

x是參數(shù)個數(shù),寄存器依此使用EAX,EDX,ECX…而asmlinkage則使得編譯器不通過寄存器(x=0)而使用堆棧傳遞參數(shù)因此,do_IRQ將棧頂?shù)膬?nèi)容看成pt_regs結構的參數(shù),在必要時可以通過訪問這里的內(nèi)容獲得信息29用戶態(tài)和內(nèi)核態(tài)的概念Why?假定不區(qū)分用戶直接修改操作系統(tǒng)的數(shù)據(jù)用戶直接調(diào)用操作系統(tǒng)的內(nèi)部函數(shù)用戶直接操作外設用戶任意讀/寫物理內(nèi)存30因此,要區(qū)分用戶態(tài)和內(nèi)核態(tài):禁止用戶程序和底層硬件直接打交道 (最簡單的例子,如果用戶程序往硬件控制寄存器寫入不恰當?shù)闹担赡軐е掠布o法正常工作)禁止用戶程序訪問任意的物理內(nèi)存 (否則可能會破壞其他程序的正常執(zhí)行,如果對核心內(nèi)核所在的地址空間寫入數(shù)據(jù)的話,會導致系統(tǒng)崩潰)31什么是用戶態(tài)和內(nèi)核態(tài)?一般現(xiàn)代CPU都有幾種不同的指令執(zhí)行級別在高執(zhí)行級別下,代碼可以執(zhí)行特權指令,訪問任意的物理地址,這種CPU執(zhí)行級別就對應著內(nèi)核態(tài)而在相應的低級別執(zhí)行狀態(tài)下,代碼的掌控范圍會受到限制。只能在對應級別允許的范圍內(nèi)活動舉例:

intelx86CPU有四種不同的執(zhí)行級別0-3,Linux只使用了其中的0級和3級分別來表示內(nèi)核態(tài)和用戶態(tài)32如何區(qū)分一段代碼是核心態(tài)還是用戶態(tài)cs寄存器的最低兩位表明了當前代碼的特權級CPU每條指令的讀取都是通過cs:eip這兩個寄存器:

其中cs是代碼段選擇寄存器,eip是偏移量寄存器。上述判斷由硬件完成一般來說在Linux中,地址空間是一個顯著的標志:0xc0000000以上的地址空間只能在內(nèi)核態(tài)下訪問,0x00000000-0xbfffffff的地址空間在兩種狀態(tài)下都可以訪問注意:這里所說的地址空間是邏輯地址而不是物理地址33虛擬內(nèi)存物理內(nèi)存有限,是一種稀缺資源局部性原理空間局部性時間局部性按需調(diào)頁頁框利用磁盤上的交換空間34進程的虛擬地址空間獨立的地址空間(32位,4GB),每個進程一個在Linux中,3G以上是內(nèi)核空間,3G以下是用戶空間4G的進程地址空間使用進程私有的二級頁表進行地址轉(zhuǎn)換(虛擬地址物理地址)頁面大小:4KB頁目錄、頁表若對應的內(nèi)容在內(nèi)存中,則對應的二級頁表項記錄相應的物理頁框信息否則根據(jù)需要進行裝載或者出錯處理35進程調(diào)度后,執(zhí)行一個新的被調(diào)度的進程之前,要先進行頁表切換Linux中的內(nèi)核空間每個進程3G以上的空間用作內(nèi)核空間從用戶地址空間進入內(nèi)核地址空間不經(jīng)過頁表切換而是通過中斷/異常/系統(tǒng)調(diào)用入口(也只能如此)36站在CPU執(zhí)行指令的角度CPUeipesp0xc0000000c=gets()main…someaction進程管理waitkeyboradqueue進程x進程xidleintr8259keyboard中斷處理Wakeupprogr

溫馨提示

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

評論

0/150

提交評論