資源描述:
《linux內(nèi)核源代碼導(dǎo)讀》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、Linux內(nèi)核源代碼導(dǎo)讀中國科學(xué)技術(shù)大學(xué)計算機系陳香蘭(0551-3606864)xlanchen@ustc.edu.cnSpring2009序一些基本概念操作系統(tǒng)的基本概念I(lǐng)386系統(tǒng)的基本概念Linux簡介源碼閱讀和project環(huán)境Linux2.6.26源碼簡介操作系統(tǒng)的基本概念任何計算機系統(tǒng)都包含一個基本的程序集合,稱為操作系統(tǒng)。內(nèi)核(進程管理,進程調(diào)度,進程間通訊機制,內(nèi)存管理,中斷異常處理,文件系統(tǒng),I/O系統(tǒng),網(wǎng)絡(luò)部分)其他程序(例如函數(shù)庫,shell程序等等)操作系統(tǒng)的目的與硬件交互,管理所有的硬件資源為用戶程序(應(yīng)用程序)提供一
2、個良好的執(zhí)行環(huán)境I386系統(tǒng)的基本概念代碼的運行堆棧的概念內(nèi)核態(tài)與用戶態(tài)中斷/異常/系統(tǒng)調(diào)用虛擬內(nèi)存代碼的運行關(guān)鍵寄存器cs:eip:總是指向下一條的指令地址順序執(zhí)行:總是指向地址連續(xù)的下一條指令跳轉(zhuǎn)/分支:執(zhí)行這樣的指令的時候,cs:eip的值會根據(jù)程序需要被修改call:將當(dāng)前cs:eip的值壓入棧頂,cs:eip指向被調(diào)用函數(shù)的入口地址ret:從棧頂彈出原來保存在這里的cs:eip的值,放入cs:eip中發(fā)生中斷時???????I386系統(tǒng)的基本概念代碼的運行堆棧的概念內(nèi)核態(tài)與用戶態(tài)中斷/異常/系統(tǒng)調(diào)用虛擬內(nèi)存堆棧的概念堆棧是C語言程序運行
3、時必須的一個記錄調(diào)用路徑和參數(shù)的空間函數(shù)調(diào)用框架傳遞參數(shù)保存返回地址提供局部變量空間等等C語言編譯器對堆棧的使用有一套的規(guī)則了解堆棧存在的目的和編譯器對堆棧使用的規(guī)則是理解操作系統(tǒng)一些關(guān)鍵性代碼的基礎(chǔ)以x86體系結(jié)構(gòu)為例堆棧寄存器和堆棧操作堆棧相關(guān)的寄存器esp,堆棧指針(stackpointer)ebp,基址指針(basepointer)堆棧操作push棧頂?shù)刂窚p少4個字節(jié)(32位)pop棧頂?shù)刂吩黾?個字節(jié)ebp在C語言中用作記錄當(dāng)前函數(shù)調(diào)用基址espebp高地址低地址esp//調(diào)用者…calltarget…利用堆棧實現(xiàn)函數(shù)調(diào)用和返回//建立
4、被調(diào)用者函數(shù)的堆??蚣躳ushl%ebpmovl%esp,%ebp//拆除被調(diào)用者函數(shù)的堆??蚣躮ovl%ebp,%esppopl%ebpret//被調(diào)用者函數(shù)體//dosth.…call指令:1)將下一條指令的地址A保存在棧頂2)設(shè)置eip指向被調(diào)用程序代碼開始處將地址A恢復(fù)到eip中函數(shù)堆棧框架的形成callxxx執(zhí)行call之前執(zhí)行call時,cs:eip原來的值指向call下一條指令,該值被保存到棧頂,然后cs:eip的值指向xxx的入口地址進入xxx第一條指令:pushl%ebp第二條指令:movl%esp,%ebp函數(shù)體中的常規(guī)
5、操作,可能會壓棧、出棧退出xxxmovl%ebp,%esppopl%ebpretespebp高地址低地址cs:eipespebpespebpespC語言中還使用堆棧進行參數(shù)的傳遞局部變量的使用一段小程序源文件:test.c這是一個很簡單的C程序main函數(shù)中調(diào)用了函數(shù)p1和p2首先使用gcc生成test.c的可執(zhí)行文件test然后使用objdump–S獲得test的反匯編文件eipeipeipeip觀察程序運行時堆棧的變化main…p1(c)…p2(x,y)…p1p2mainp2p1程序的代碼段堆棧eipespmain堆棧ceipeipeipp1
6、的堆棧espeipeipeipx,yeipp2堆棧eip另一段小程序和前一段小程序稍有不同在這個小程序中,main函數(shù)中調(diào)用了函數(shù)p2,而在p2的執(zhí)行過程中又調(diào)用了函數(shù)p1觀察程序運行時堆棧的變化eipeipeipeipmain…p2(x,y)…p1p2…p1(c)…mainp2p1程序的代碼段堆棧eipespmain堆棧espeipeipx,yeipp2堆棧eipeipeipeipceipp1堆棧espI386系統(tǒng)的基本概念代碼的運行堆棧的概念內(nèi)核態(tài)與用戶態(tài)中斷/異常/系統(tǒng)調(diào)用虛擬內(nèi)存用戶態(tài)和內(nèi)核態(tài)的概念Why?假定不區(qū)分用戶直接修改操作系統(tǒng)
7、的數(shù)據(jù)用戶直接調(diào)用操作系統(tǒng)的內(nèi)部函數(shù)用戶直接操作外設(shè)用戶任意讀/寫物理內(nèi)存因此,要區(qū)分用戶態(tài)和內(nèi)核態(tài):禁止用戶程序和底層硬件直接打交道(最簡單的例子,如果用戶程序往硬件控制寄存器寫入不恰當(dāng)?shù)闹?,可能?dǎo)致硬件無法正常工作)禁止用戶程序訪問任意的物理內(nèi)存(否則可能會破壞其他程序的正常執(zhí)行,如果對核心內(nèi)核所在的地址空間寫入數(shù)據(jù)的話,會導(dǎo)致系統(tǒng)崩潰)什么是用戶態(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)下,代碼的掌控范圍會受到限制。只
8、能在對應(yīng)級別允許的范圍內(nèi)活動舉例:intelx86CPU有四種不同的執(zhí)行級別0-3,Linux只使用了其中的0級和3級分別來表示內(nèi)核態(tài)和