




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
嵌入式操作系統(tǒng)Spring2007上周一嵌入式Linux開發(fā)技術(shù)嵌入式Linux開發(fā)綜述Linux的配置和編譯根文件系統(tǒng)及其制作2上周二基于i386體系結(jié)構(gòu)的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體系結(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ù)備知識聲明本課內(nèi)容涉及到的Linux的內(nèi)核分析,是基于Linux2.4.18內(nèi)核源代碼的,具有一定的典型性,但不一定適用于所有其他的Linux內(nèi)核版本6操作系統(tǒng)的基本概念任何計(jì)算機(jī)系統(tǒng)都包含一個(gè)基本的程序集合,稱為操作系統(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ù)庫,shell程序等等)操作系統(tǒng)的目的與硬件交互,管理所有的硬件資源為用戶程序(應(yīng)用程序)提供一個(gè)良好的執(zhí)行環(huán)境7一個(gè)典型的Linux操作系統(tǒng)的結(jié)構(gòu)用戶應(yīng)用程序Systemcall對硬件資源的管理Shell,libKernelimplementation8最簡單也是最復(fù)雜的操作在控制臺下輸入ls命令Shell程序分析輸入?yún)?shù),確定這是ls命令調(diào)用系統(tǒng)調(diào)用fork生成一個(gè)shell本身的拷貝什么是系統(tǒng)調(diào)用?為什么我們敲擊鍵盤就會在終端上顯示?fork是什么?為什么要調(diào)用fork?中斷的概念,終端控制臺設(shè)備驅(qū)動的概念保護(hù)模式和實(shí)模式,內(nèi)存保護(hù),內(nèi)核態(tài)用戶態(tài)相關(guān)問題進(jìn)程的描述,進(jìn)程的創(chuàng)建。COW技術(shù)系統(tǒng)調(diào)用是怎么實(shí)現(xiàn)的?軟中斷、異常的概念。陷阱門,系統(tǒng)門調(diào)用exec系統(tǒng)調(diào)用將ls的可執(zhí)行文件裝入內(nèi)存內(nèi)存管理模塊,進(jìn)程的地址空間,分頁機(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ùn)行時(shí)必須的一個(gè)記錄調(diào)用路徑和參數(shù)的空間函數(shù)調(diào)用框架傳遞參數(shù)保存返回地址提供局部變量空間等等C語言編譯器對堆棧的使用有一套的規(guī)則了解堆棧存在的目的和編譯器對堆棧使用的規(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語言中用作記錄當(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的值會根據(jù)程序需要被修改call:將當(dāng)前cs:eip的值壓入棧頂,cs:eip指向被調(diào)用函數(shù)的入口地址ret:從棧頂彈出原來保存在這里的cs:eip的值,放入cs:eip中發(fā)生中斷時(shí)???????13//調(diào)用者…calltarget…//建立被調(diào)用者函數(shù)的堆棧框架
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)用程序代碼開始處將地址A恢復(fù)到eip中14函數(shù)堆棧框架的形成
callxxx執(zhí)行call之前執(zhí)行call時(shí),cs:eip原來的值
指向call下一條指令,該值被
保存到棧頂,然后cs:eip的值
指向xxx的入口地址進(jìn)入xxx第一條指令:pushl%ebp第二條指令:movl%esp,%ebp函數(shù)體中的常規(guī)操作,可能會壓棧、出棧退出xxxmovl%ebp,%esppopl%ebpretespebp高地址低地址cs:eipespebpespebpesp15C語言中還使用堆棧進(jìn)行參數(shù)的傳遞局部變量的使用16一段小程序
源文件:test.c這是一個(gè)很簡單的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)用者堆棧框架espebpy的值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í)行過程中又調(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ù)是怎么傳遞過來的,最后我們可以發(fā)現(xiàn)最源頭的函數(shù)使用了這樣的參數(shù)structpt_regsregs 比如voiddo_IRQ(structpt_regsregs) 如果再進(jìn)一步尋找是誰調(diào)用了這個(gè)do_IRQ,我們會發(fā)現(xiàn)只是一條簡單的匯編語句
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指令會在堆棧上保存一些寄存器的值如:用戶態(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不通過堆棧而通過寄存器傳。
x是參數(shù)個(gè)數(shù),寄存器依此使用EAX,EDX,ECX…而asmlinkage則使得編譯器不通過寄存器(x=0)而使用堆棧傳遞參數(shù)因此,do_IRQ將棧頂?shù)膬?nèi)容看成pt_regs結(jié)構(gòu)的參數(shù),在必要時(shí)可以通過訪問這里的內(nèi)容獲得信息29用戶態(tài)和內(nèi)核態(tài)的概念Why?假定不區(qū)分用戶直接修改操作系統(tǒng)的數(shù)據(jù)用戶直接調(diào)用操作系統(tǒng)的內(nèi)部函數(shù)用戶直接操作外設(shè)用戶任意讀/寫物理內(nèi)存30因此,要區(qū)分用戶態(tài)和內(nèi)核態(tài):禁止用戶程序和底層硬件直接打交道 (最簡單的例子,如果用戶程序往硬件控制寄存器寫入不恰當(dāng)?shù)闹?,可能?dǎo)致硬件無法正常工作)禁止用戶程序訪問任意的物理內(nèi)存 (否則可能會破壞其他程序的正常執(zhí)行,如果對核心內(nèi)核所在的地址空間寫入數(shù)據(jù)的話,會導(dǎo)致系統(tǒng)崩潰)31什么是用戶態(tài)和內(nèi)核態(tài)?一般現(xiàn)代CPU都有幾種不同的指令執(zhí)行級別在高執(zhí)行級別下,代碼可以執(zhí)行特權(quán)指令,訪問任意的物理地址,這種CPU執(zhí)行級別就對應(yīng)著內(nèi)核態(tài)而在相應(yīng)的低級別執(zhí)行狀態(tài)下,代碼的掌控范圍會受到限制。只能在對應(yīng)級別允許的范圍內(nèi)活動舉例:
intelx86CPU有四種不同的執(zhí)行級別0-3,Linux只使用了其中的0級和3級分別來表示內(nèi)核態(tài)和用戶態(tài)32如何區(qū)分一段代碼是核心態(tài)還是用戶態(tài)cs寄存器的最低兩位表明了當(dāng)前代碼的特權(quán)級CPU每條指令的讀取都是通過cs:eip這兩個(gè)寄存器:
其中cs是代碼段選擇寄存器,eip是偏移量寄存器。上述判斷由硬件完成一般來說在Linux中,地址空間是一個(gè)顯著的標(biāo)志:0xc0000000以上的地址空間只能在內(nèi)核態(tài)下訪問,0x00000000-0xbfffffff的地址空間在兩種狀態(tài)下都可以訪問注意:這里所說的地址空間是邏輯地址而不是物理地址33虛擬內(nèi)存物理內(nèi)存有限,是一種稀缺資源局部性原理空間局部性時(shí)間局部性按需調(diào)頁頁框利用磁盤上的交換空間34進(jìn)程的虛擬地址空間獨(dú)立的地址空間(32位,4GB),每個(gè)進(jìn)程一個(gè)在Linux中,3G以上是內(nèi)核空間,3G以下是用戶空間4G的進(jìn)程地址空間使用進(jìn)程私有的二級頁表進(jìn)行地址轉(zhuǎn)換(虛擬地址物理地址)頁面大?。?KB頁目錄、頁表若對應(yīng)的內(nèi)容在內(nèi)存中,則對應(yīng)的二級頁表項(xiàng)記錄相應(yīng)的物理頁框信息否則根據(jù)需要進(jìn)行裝載或者出錯(cuò)處理35進(jìn)程調(diào)度后,執(zhí)行一個(gè)新的被調(diào)度的進(jìn)程之前,要先進(jìn)行頁表切換Linux中的內(nèi)核空間每個(gè)進(jìn)程3G以上的空間用作內(nèi)核空間從用戶地址空間進(jìn)入內(nèi)核地址空間不經(jīng)過頁表切換而是通過中斷/異常/系統(tǒng)調(diào)用入口(也只能如此)36站在CPU執(zhí)行指令的角度CPUeipesp0xc0000000c=gets()main…someaction進(jìn)程管理waitkeyboradqueue進(jìn)程x進(jìn)程xidleintr8259keyboard中斷處理Wakeupprogr
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 西南交通大學(xué)希望學(xué)院《全科醫(yī)療中的醫(yī)患關(guān)系與溝通技巧》2023-2024學(xué)年第二學(xué)期期末試卷
- 蓬溪縣2025年數(shù)學(xué)四下期末監(jiān)測模擬試題含解析
- 天津?yàn)I海汽車工程職業(yè)學(xué)院《復(fù)變函數(shù)與常微分方程》2023-2024學(xué)年第一學(xué)期期末試卷
- 山東省東營市勝利第二中學(xué)2024-2025學(xué)年高三下學(xué)期第一次階段測試語文試題含解析
- 江蘇百校大聯(lián)考2025年高三下學(xué)期起點(diǎn)調(diào)研測試英語試題含解析
- 內(nèi)蒙古自治區(qū)鄂爾多斯市2024-2025學(xué)年初三下學(xué)期1月月考試題化學(xué)試題試卷含解析
- 山東省德州市武城縣2024-2025學(xué)年三年級數(shù)學(xué)第二學(xué)期期末檢測試題含解析
- 嵊州市2024-2025學(xué)年數(shù)學(xué)三下期末質(zhì)量跟蹤監(jiān)視試題含解析
- 遼寧省大連經(jīng)濟(jì)技術(shù)開發(fā)區(qū)得勝高級中學(xué)2025屆高三“零診”考試生物試題含解析
- 山東交通學(xué)院《現(xiàn)代食品微生物學(xué)1》2023-2024學(xué)年第二學(xué)期期末試卷
- 創(chuàng)傷性休克患者的護(hù)理
- 初中學(xué)業(yè)水平考試的“一核二融三層四維”命題理論探析
- 心理咨詢記錄表10篇
- 數(shù)字經(jīng)濟(jì)學(xué)試題答案
- 創(chuàng)傷急救知識課件
- 專題13 統(tǒng)計(jì)與概率-【好題匯編】五年(2020-2024)高考數(shù)學(xué)真題分類匯編(含答案解析)
- 國家開放大學(xué)本科(非英語專業(yè))學(xué)士學(xué)位英語統(tǒng)一考試樣題
- GB/T 44273-2024水力發(fā)電工程運(yùn)行管理規(guī)范
- DB65-T 4765-2024 農(nóng)牧區(qū)標(biāo)準(zhǔn)化羊場建設(shè)規(guī)范
- 城軌行車課程設(shè)計(jì)
- 2024年南京市中考?xì)v史試題及答案
評論
0/150
提交評論