




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
嵌入式操作系統Spring2007上周一嵌入式Linux開發技術嵌入式Linux開發綜述Linux的配置和編譯根文件系統及其制作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操作系統內核分析一些基本概念堆棧用戶態/內核態虛擬內存內存尋址4基于i386體系結構的
Linux內核分析:
一些預備知識聲明本課內容涉及到的Linux的內核分析,是基于Linux2.4.18內核源代碼的,具有一定的典型性,但不一定適用于所有其他的Linux內核版本6操作系統的基本概念任何計算機系統都包含一個基本的程序集合,稱為操作系統。內核(進程管理,進程調度,進程間通訊機制,內存管理,中斷異常處理,文件系統,I/O系統,網絡部分)其他程序(例如函數庫,shell程序等等)操作系統的目的與硬件交互,管理所有的硬件資源為用戶程序(應用程序)提供一個良好的執行環境7一個典型的Linux操作系統的結構用戶應用程序Systemcall對硬件資源的管理Shell,libKernelimplementation8最簡單也是最復雜的操作在控制臺下輸入ls命令Shell程序分析輸入參數,確定這是ls命令調用系統調用fork生成一個shell本身的拷貝什么是系統調用?為什么我們敲擊鍵盤就會在終端上顯示?fork是什么?為什么要調用fork?中斷的概念,終端控制臺設備驅動的概念保護模式和實模式,內存保護,內核態用戶態相關問題進程的描述,進程的創建。COW技術系統調用是怎么實現的?軟中斷、異常的概念。陷阱門,系統門調用exec系統調用將ls的可執行文件裝入內存內存管理模塊,進程的地址空間,分頁機制,文件系統從系統調用返回如何做到正確的返回?堆棧的維護,寄存器的保存與恢復Shell和ls都得以執行進程的調度,運行隊列等待隊列的維護9一些基本但很重要的概念堆棧內核態vs用戶態虛擬內存10堆棧堆棧是C語言程序運行時必須的一個記錄調用路徑和參數的空間函數調用框架傳遞參數保存返回地址提供局部變量空間等等C語言編譯器對堆棧的使用有一套的規則了解堆棧存在的目的和編譯器對堆棧使用的規則是理解操作系統一些關鍵性代碼的基礎11堆棧寄存器和堆棧操作堆棧相關的寄存器esp,堆棧指針(stackpointer)ebp,基址指針(basepointer)堆棧操作push
棧頂地址減少4個字節(32位)pop
棧頂地址增加4個字節ebp在C語言中用作記錄當前函數調用基址espebp高地址低地址esp12利用堆棧實現函數調用和返回其他關鍵寄存器cs:eip:總是指向下一條的指令地址順序執行:總是指向地址連續的下一條指令跳轉/分支:執行這樣的指令的時候,cs:eip的值會根據程序需要被修改call:將當前cs:eip的值壓入棧頂,cs:eip指向被調用函數的入口地址ret:從棧頂彈出原來保存在這里的cs:eip的值,放入cs:eip中發生中斷時???????13//調用者…calltarget…//建立被調用者函數的堆棧框架
pushl%ebp
movl%esp,%ebp//拆除被調用者函數的堆棧框架
movl%ebp,%esp
popl%ebp
ret//被調用者函數體
//dosth.…call指令:1)將下一條指令的地址A保存在棧頂2)設置eip指向被調用程序代碼開始處將地址A恢復到eip中14函數堆棧框架的形成
callxxx執行call之前執行call時,cs:eip原來的值
指向call下一條指令,該值被
保存到棧頂,然后cs:eip的值
指向xxx的入口地址進入xxx第一條指令:pushl%ebp第二條指令:movl%esp,%ebp函數體中的常規操作,可能會壓棧、出棧退出xxxmovl%ebp,%esppopl%ebpretespebp高地址低地址cs:eipespebpespebpesp15C語言中還使用堆棧進行參數的傳遞局部變量的使用16一段小程序
源文件:test.c這是一個很簡單的C程序main函數中調用了函數p1和p2首先使用gcc生成test.c的可執行文件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調用者堆棧框架espebpyx高地址低地址18觀察main函數是如何傳遞參數給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的?調用者堆棧框架espebpy的值x的值高地址低地址被調用者堆棧框架ebpcs: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) …調用者ebpespebpespespc=‘a’x=1y=2高地址低地址20eipeipeipeip觀察程序運行時堆棧的變化main…p1(c)…p2(x,y)…p1p2mainp2p1程序的代碼段堆棧eipespmain堆棧ceipeipeipp1的堆棧espeipeipeipx,yeipp2堆棧eip21另一段小程序
和前一段小程序稍有不同在這個小程序中,main函數中調用了函數p2,而在p2的執行過程中又調用了函數p122觀察程序運行時堆棧的變化eipeipeipeipmain…p2(x,y)…p1p2…p1(c)…mainp2p1程序的代碼段堆棧eipespmain堆棧espeipeipx,yeipp2堆棧eipeipeipeipceipp1堆棧esp23觀察堆棧在內核中的使用在內核代碼中經常有這樣的函數,它的參數是structpt_regs*regs 可以往回一層層的尋找這個參數是怎么傳遞過來的,最后我們可以發現最源頭的函數使用了這樣的參數structpt_regsregs 比如voiddo_IRQ(structpt_regsregs) 如果再進一步尋找是誰調用了這個do_IRQ,我們會發現只是一條簡單的匯編語句
calldo_IRQ
24為什么要有pt_regs結構用戶態vs內核態寄存器上下文從用戶態切換到內核態時必須保存用戶態的寄存器上下文要保存哪些?保存在哪里?中斷/int指令會在堆棧上保存一些寄存器的值如:用戶態棧頂地址、當時的狀態字、當時的cs:eip的值25pt_regs結構26SAVE_ALL和RESTORE_ALL27do_IRQ的調用方式仔細閱讀一下與之相連的匯編碼pushl$n-256SAVE_ALLcalldo_IRQjmpret_from_intr28do_IRQ的函數定義方式
regparm(x)x!=0:告訴gcc不通過堆棧而通過寄存器傳。
x是參數個數,寄存器依此使用EAX,EDX,ECX…而asmlinkage則使得編譯器不通過寄存器(x=0)而使用堆棧傳遞參數因此,do_IRQ將棧頂的內容看成pt_regs結構的參數,在必要時可以通過訪問這里的內容獲得信息29用戶態和內核態的概念Why?假定不區分用戶直接修改操作系統的數據用戶直接調用操作系統的內部函數用戶直接操作外設用戶任意讀/寫物理內存30因此,要區分用戶態和內核態:禁止用戶程序和底層硬件直接打交道 (最簡單的例子,如果用戶程序往硬件控制寄存器寫入不恰當的值,可能導致硬件無法正常工作)禁止用戶程序訪問任意的物理內存 (否則可能會破壞其他程序的正常執行,如果對核心內核所在的地址空間寫入數據的話,會導致系統崩潰)31什么是用戶態和內核態?一般現代CPU都有幾種不同的指令執行級別在高執行級別下,代碼可以執行特權指令,訪問任意的物理地址,這種CPU執行級別就對應著內核態而在相應的低級別執行狀態下,代碼的掌控范圍會受到限制。只能在對應級別允許的范圍內活動舉例:
intelx86CPU有四種不同的執行級別0-3,Linux只使用了其中的0級和3級分別來表示內核態和用戶態32如何區分一段代碼是核心態還是用戶態cs寄存器的最低兩位表明了當前代碼的特權級CPU每條指令的讀取都是通過cs:eip這兩個寄存器:
其中cs是代碼段選擇寄存器,eip是偏移量寄存器。上述判斷由硬件完成一般來說在Linux中,地址空間是一個顯著的標志:0xc0000000以上的地址空間只能在內核態下訪問,0x00000000-0xbfffffff的地址空間在兩種狀態下都可以訪問注意:這里所說的地址空間是邏輯地址而不是物理地址33虛擬內存物理內存有限,是一種稀缺資源局部性原理空間局部性時間局部性按需調頁頁框利用磁盤上的交換空間34進程的虛擬地址空間獨立的地址空間(32位,4GB),每個進程一個在Linux中,3G以上是內核空間,3G以下是用戶空間4G的進程地址空間使用進程私有的二級頁表進行地址轉換(虛擬地址物理地址)頁面大小:4KB頁目錄、頁表若對應的內容在內存中,則對應的二級頁表項記錄相應的物理頁框信息否則根據需要進行裝載或者出錯處理35進程調度后,執行一個新的被調度的進程之前,要先進行頁表切換Linux中的內核空間每個進程3G以上的空間用作內核空間從用戶地址空間進入內核地址空間不經過頁表切換而是通過中斷/異常/系統調用入口(也只能如此)36站在CPU執行指令的角度CPUeipesp0xc0000000c=gets()main…someaction進程管理waitkeyboradqueue進程x進程xidleintr8259keyboard中斷處理Wakeupprogr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公共關系學網絡公關試題及答案
- 生物醫學新技術研究進展試題
- 社區景觀設計案例分析
- 商業合作推廣活動策劃協議
- 安保服務合同終止協議書
- 歷史學世界近現代史試題匯編
- 行政管理公共關系學資源配置試題及答案
- 辯論社團技能提升計劃
- 蛋糕模型設計軟件介紹
- 廈門春招考試試題及答案
- 2024船用電氣電子產品型式認可試驗指南
- 融資融券指南
- 【9物二模】深圳市2025年4月份九年級中考第二次模擬測試物理試卷(含答案)
- 糞便DNA檢測研究-全面剖析
- 2024年度云南省二級造價工程師之安裝工程建設工程計量與計價實務題庫檢測試卷A卷附答案
- 裝車安全協議合同
- 大型商業綜合體火災事故處置桌面推演1105
- 萬科施工組織設計
- 明天控股經營性子公司運營監控管理制度有用
- 2025年遼寧省大連市中山區中考一模道德與法治試題(原卷版+解析版)
- 施工管理人員、專職安全員 年度安全培訓及考核記錄
評論
0/150
提交評論