




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
嵌入式操作系統(tǒng)Spring2007上周一嵌入式Linux開(kāi)發(fā)技術(shù)嵌入式Linux開(kāi)發(fā)綜述Linux的配置和編譯根文件系統(tǒng)及其制作2上周二基于i386體系結(jié)構(gòu)的Linux啟動(dòng)代碼分析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體系結(jié)構(gòu)的Linux操作系統(tǒng)內(nèi)核分析一些基本概念堆棧用戶態(tài)/內(nèi)核態(tài)虛擬內(nèi)存內(nèi)存尋址4基于i386體系結(jié)構(gòu)的
Linux內(nèi)核分析:
一些預(yù)備知識(shí)聲明本課內(nèi)容涉及到的Linux的內(nèi)核分析,是基于Linux2.4.18內(nèi)核源代碼的,具有一定的典型性,但不一定適用于所有其他的Linux內(nèi)核版本6操作系統(tǒng)的基本概念任何計(jì)算機(jī)系統(tǒng)都包含一個(gè)基本的程序集合,稱(chēng)為操作系統(tǒng)。內(nèi)核(進(jìn)程管理,進(jìn)程調(diào)度,進(jìn)程間通訊機(jī)制,內(nèi)存管理,中斷異常處理,文件系統(tǒng),I/O系統(tǒng),網(wǎng)絡(luò)部分)其他程序(例如函數(shù)庫(kù),shell程序等等)操作系統(tǒng)的目的與硬件交互,管理所有的硬件資源為用戶程序(應(yīng)用程序)提供一個(gè)良好的執(zhí)行環(huán)境7一個(gè)典型的Linux操作系統(tǒng)的結(jié)構(gòu)用戶應(yīng)用程序Systemcall對(duì)硬件資源的管理Shell,libKernelimplementation8最簡(jiǎn)單也是最復(fù)雜的操作在控制臺(tái)下輸入ls命令Shell程序分析輸入?yún)?shù),確定這是ls命令調(diào)用系統(tǒng)調(diào)用fork生成一個(gè)shell本身的拷貝什么是系統(tǒng)調(diào)用?為什么我們敲擊鍵盤(pán)就會(huì)在終端上顯示?fork是什么?為什么要調(diào)用fork?中斷的概念,終端控制臺(tái)設(shè)備驅(qū)動(dòng)的概念保護(hù)模式和實(shí)模式,內(nèi)存保護(hù),內(nèi)核態(tài)用戶態(tài)相關(guān)問(wèn)題進(jìn)程的描述,進(jìn)程的創(chuàng)建。COW技術(shù)系統(tǒng)調(diào)用是怎么實(shí)現(xiàn)的?軟中斷、異常的概念。陷阱門(mén),系統(tǒng)門(mén)調(diào)用exec系統(tǒng)調(diào)用將ls的可執(zhí)行文件裝入內(nèi)存內(nèi)存管理模塊,進(jìn)程的地址空間,分頁(yè)機(jī)制,文件系統(tǒng)從系統(tǒng)調(diào)用返回如何做到正確的返回?堆棧的維護(hù),寄存器的保存與恢復(fù)Shell和ls都得以執(zhí)行進(jìn)程的調(diào)度,運(yùn)行隊(duì)列等待隊(duì)列的維護(hù)9一些基本但很重要的概念堆棧內(nèi)核態(tài)vs用戶態(tài)虛擬內(nèi)存10堆棧堆棧是C語(yǔ)言程序運(yùn)行時(shí)必須的一個(gè)記錄調(diào)用路徑和參數(shù)的空間函數(shù)調(diào)用框架傳遞參數(shù)保存返回地址提供局部變量空間等等C語(yǔ)言編譯器對(duì)堆棧的使用有一套的規(guī)則了解堆棧存在的目的和編譯器對(duì)堆棧使用的規(guī)則是理解操作系統(tǒng)一些關(guān)鍵性代碼的基礎(chǔ)11堆棧寄存器和堆棧操作堆棧相關(guān)的寄存器esp,堆棧指針(stackpointer)ebp,基址指針(basepointer)堆棧操作push
棧頂?shù)刂窚p少4個(gè)字節(jié)(32位)pop
棧頂?shù)刂吩黾?個(gè)字節(jié)ebp在C語(yǔ)言中用作記錄當(dāng)前函數(shù)調(diào)用基址espebp高地址低地址esp12利用堆棧實(shí)現(xiàn)函數(shù)調(diào)用和返回其他關(guān)鍵寄存器cs:eip:總是指向下一條的指令地址順序執(zhí)行:總是指向地址連續(xù)的下一條指令跳轉(zhuǎn)/分支:執(zhí)行這樣的指令的時(shí)候,cs:eip的值會(huì)根據(jù)程序需要被修改call:將當(dāng)前cs:eip的值壓入棧頂,cs:eip指向被調(diào)用函數(shù)的入口地址ret:從棧頂彈出原來(lái)保存在這里的cs:eip的值,放入cs:eip中發(fā)生中斷時(shí)???????13//調(diào)用者…calltarget…//建立被調(diào)用者函數(shù)的堆??蚣?/p>
pushl%ebp
movl%esp,%ebp//拆除被調(diào)用者函數(shù)的堆??蚣?/p>
movl%ebp,%esp
popl%ebp
ret//被調(diào)用者函數(shù)體
//dosth.…call指令:1)將下一條指令的地址A保存在棧頂2)設(shè)置eip指向被調(diào)用程序代碼開(kāi)始處將地址A恢復(fù)到eip中14函數(shù)堆棧框架的形成
callxxx執(zhí)行call之前執(zhí)行call時(shí),cs:eip原來(lái)的值
指向call下一條指令,該值被
保存到棧頂,然后cs:eip的值
指向xxx的入口地址進(jìn)入xxx第一條指令:pushl%ebp第二條指令:movl%esp,%ebp函數(shù)體中的常規(guī)操作,可能會(huì)壓棧、出棧退出xxxmovl%ebp,%esppopl%ebpretespebp高地址低地址cs:eipespebpespebpesp15C語(yǔ)言中還使用堆棧進(jìn)行參數(shù)的傳遞局部變量的使用16一段小程序
源文件:test.c這是一個(gè)很簡(jiǎn)單的C程序main函數(shù)中調(diào)用了函數(shù)p1和p2首先使用gcc生成test.c的可執(zhí)行文件test然后使用objdump–S獲得test的反匯編文件17觀察p2的堆??蚣軓膖est的反匯編文件中找到p2的反匯編代碼intp2(intx,inty){ push%ebp mov%esp,%ebp
returnx+y; mov0xc(%ebp),%eax add0x8(%ebp),%eax} pop%ebp ret建立框架拆除框架ebpespebp調(diào)用者堆棧框架espebpyx高地址低地址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觀察程序運(yùn)行時(shí)堆棧的變化main…p1(c)…p2(x,y)…p1p2mainp2p1程序的代碼段堆棧eipespmain堆棧ceipeipeipp1的堆棧espeipeipeipx,yeipp2堆棧eip21另一段小程序
和前一段小程序稍有不同在這個(gè)小程序中,main函數(shù)中調(diào)用了函數(shù)p2,而在p2的執(zhí)行過(guò)程中又調(diào)用了函數(shù)p122觀察程序運(yùn)行時(shí)堆棧的變化eipeipeipeipmain…p2(x,y)…p1p2…p1(c)…mainp2p1程序的代碼段堆棧eipespmain堆棧espeipeipx,yeipp2堆棧eipeipeipeipceipp1堆棧esp23觀察堆棧在內(nèi)核中的使用在內(nèi)核代碼中經(jīng)常有這樣的函數(shù),它的參數(shù)是structpt_regs*regs 可以往回一層層的尋找這個(gè)參數(shù)是怎么傳遞過(guò)來(lái)的,最后我們可以發(fā)現(xiàn)最源頭的函數(shù)使用了這樣的參數(shù)structpt_regsregs 比如voiddo_IRQ(structpt_regsregs) 如果再進(jìn)一步尋找是誰(shuí)調(diào)用了這個(gè)do_IRQ,我們會(huì)發(fā)現(xiàn)只是一條簡(jiǎn)單的匯編語(yǔ)句
calldo_IRQ
24為什么要有pt_regs結(jié)構(gòu)用戶態(tài)vs內(nèi)核態(tài)寄存器上下文從用戶態(tài)切換到內(nèi)核態(tài)時(shí)必須保存用戶態(tài)的寄存器上下文要保存哪些?保存在哪里?中斷/int指令會(huì)在堆棧上保存一些寄存器的值如:用戶態(tài)棧頂?shù)刂?、?dāng)時(shí)的狀態(tài)字、當(dāng)時(shí)的cs:eip的值25pt_regs結(jié)構(gòu)26SAVE_ALL和RESTORE_ALL27do_IRQ的調(diào)用方式仔細(xì)閱讀一下與之相連的匯編碼pushl$n-256SAVE_ALLcalldo_IRQjmpret_from_intr28do_IRQ的函數(shù)定義方式
regparm(x)x!=0:告訴gcc不通過(guò)堆棧而通過(guò)寄存器傳。
x是參數(shù)個(gè)數(shù),寄存器依此使用EAX,EDX,ECX…而asmlinkage則使得編譯器不通過(guò)寄存器(x=0)而使用堆棧傳遞參數(shù)因此,do_IRQ將棧頂?shù)膬?nèi)容看成pt_regs結(jié)構(gòu)的參數(shù),在必要時(shí)可以通過(guò)訪問(wèn)這里的內(nèi)容獲得信息29用戶態(tài)和內(nèi)核態(tài)的概念Why?假定不區(qū)分用戶直接修改操作系統(tǒng)的數(shù)據(jù)用戶直接調(diào)用操作系統(tǒng)的內(nèi)部函數(shù)用戶直接操作外設(shè)用戶任意讀/寫(xiě)物理內(nèi)存30因此,要區(qū)分用戶態(tài)和內(nèi)核態(tài):禁止用戶程序和底層硬件直接打交道 (最簡(jiǎn)單的例子,如果用戶程序往硬件控制寄存器寫(xiě)入不恰當(dāng)?shù)闹?,可能?dǎo)致硬件無(wú)法正常工作)禁止用戶程序訪問(wèn)任意的物理內(nèi)存 (否則可能會(huì)破壞其他程序的正常執(zhí)行,如果對(duì)核心內(nèi)核所在的地址空間寫(xiě)入數(shù)據(jù)的話,會(huì)導(dǎo)致系統(tǒng)崩潰)31什么是用戶態(tài)和內(nèi)核態(tài)?一般現(xiàn)代CPU都有幾種不同的指令執(zhí)行級(jí)別在高執(zhí)行級(jí)別下,代碼可以執(zhí)行特權(quán)指令,訪問(wèn)任意的物理地址,這種CPU執(zhí)行級(jí)別就對(duì)應(yīng)著內(nèi)核態(tài)而在相應(yīng)的低級(jí)別執(zhí)行狀態(tài)下,代碼的掌控范圍會(huì)受到限制。只能在對(duì)應(yīng)級(jí)別允許的范圍內(nèi)活動(dòng)舉例:
intelx86CPU有四種不同的執(zhí)行級(jí)別0-3,Linux只使用了其中的0級(jí)和3級(jí)分別來(lái)表示內(nèi)核態(tài)和用戶態(tài)32如何區(qū)分一段代碼是核心態(tài)還是用戶態(tài)cs寄存器的最低兩位表明了當(dāng)前代碼的特權(quán)級(jí)CPU每條指令的讀取都是通過(guò)cs:eip這兩個(gè)寄存器:
其中cs是代碼段選擇寄存器,eip是偏移量寄存器。上述判斷由硬件完成一般來(lái)說(shuō)在Linux中,地址空間是一個(gè)顯著的標(biāo)志:0xc0000000以上的地址空間只能在內(nèi)核態(tài)下訪問(wèn),0x00000000-0xbfffffff的地址空間在兩種狀態(tài)下都可以訪問(wèn)注意:這里所說(shuō)的地址空間是邏輯地址而不是物理地址33虛擬內(nèi)存物理內(nèi)存有限,是一種稀缺資源局部性原理空間局部性時(shí)間局部性按需調(diào)頁(yè)頁(yè)框利用磁盤(pán)上的交換空間34進(jìn)程的虛擬地址空間獨(dú)立的地址空間(32位,4GB),每個(gè)進(jìn)程一個(gè)在Linux中,3G以上是內(nèi)核空間,3G以下是用戶空間4G的進(jìn)程地址空間使用進(jìn)程私有的二級(jí)頁(yè)表進(jìn)行地址轉(zhuǎn)換(虛擬地址物理地址)頁(yè)面大?。?KB頁(yè)目錄、頁(yè)表若對(duì)應(yīng)的內(nèi)容在內(nèi)存中,則對(duì)應(yīng)的二級(jí)頁(yè)表項(xiàng)記錄相應(yīng)的物理頁(yè)框信息否則根據(jù)需要進(jìn)行裝載或者出錯(cuò)處理35進(jìn)程調(diào)度后,執(zhí)行一個(gè)新的被調(diào)度的進(jìn)程之前,要先進(jìn)行頁(yè)表切換Linux中的內(nèi)核空間每個(gè)進(jìn)程3G以上的空間用作內(nèi)核空間從用戶地址空間進(jìn)入內(nèi)核地址空間不經(jīng)過(guò)頁(yè)表切換而是通過(guò)中斷/異常/系統(tǒng)調(diào)用入口(也只能如此)36站在CPU執(zhí)行指令的角度CPUeipesp0xc0000000c=gets()main…someaction進(jìn)程管理waitkeyboradqueue進(jìn)程x進(jìn)程xidleintr8259keyboard中斷處理Wakeupprogr
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 海洋氣象觀測(cè)數(shù)據(jù)的質(zhì)量控制與保障考核試卷
- 罐頭食品企業(yè)環(huán)境保護(hù)與綠色生產(chǎn)考核試卷
- 煤炭市場(chǎng)結(jié)構(gòu)優(yōu)化與產(chǎn)業(yè)發(fā)展考核試卷
- 煤炭洗選工藝設(shè)計(jì)與實(shí)踐考核試卷
- 吉林省遼源市第五中學(xué)2024-2025學(xué)年高三下期末質(zhì)量檢查生物試題理試題含解析
- 山東省樂(lè)陵市花園鎮(zhèn)達(dá)標(biāo)名校2025屆初三實(shí)驗(yàn)班第一次質(zhì)檢數(shù)學(xué)試題試卷含解析
- 江蘇省淮安市洪澤縣2024-2025學(xué)年初三下學(xué)期第二次模擬考試語(yǔ)文試題試卷含解析
- 內(nèi)蒙古呼和浩特市2024-2025學(xué)年高三第二學(xué)期期終學(xué)習(xí)質(zhì)量調(diào)研測(cè)試歷史試題含解析
- 吉林省長(zhǎng)春市榆樹(shù)市2024-2025學(xué)年高三第五次模擬考試數(shù)學(xué)試題試卷含解析
- 西藏拉薩市墨竹工卡縣2025屆小升初全真模擬數(shù)學(xué)檢測(cè)卷含解析
- GCP培訓(xùn)考試題庫(kù)及參考答案(完整版)
- 乒乓球社團(tuán)活動(dòng)記錄
- 新時(shí)代中小學(xué)教師職業(yè)行為十項(xiàng)準(zhǔn)則考核試題及答案
- 數(shù)據(jù)結(jié)構(gòu)-第6章-圖課件
- 《變態(tài)心理學(xué)與健康心理學(xué)》考試復(fù)習(xí)題庫(kù)150題(含答案)
- DB15T 489-2019 石油化學(xué)工業(yè)建設(shè)工程技術(shù)資料管理規(guī)范
- 保潔服務(wù)崗位檢查考核評(píng)分標(biāo)準(zhǔn)
- 皮內(nèi)針講課課件
- 村衛(wèi)生室靜脈輸液準(zhǔn)入申請(qǐng)審批表
- 提高鋼柱安裝垂直度合格率QC成果PPT
- 計(jì)算機(jī)網(wǎng)絡(luò)故障的診斷與解決方法論文
評(píng)論
0/150
提交評(píng)論