教學(xué)課件:《操作系統(tǒng)設(shè)計與實現(xiàn)》-2_第1頁
教學(xué)課件:《操作系統(tǒng)設(shè)計與實現(xiàn)》-2_第2頁
教學(xué)課件:《操作系統(tǒng)設(shè)計與實現(xiàn)》-2_第3頁
教學(xué)課件:《操作系統(tǒng)設(shè)計與實現(xiàn)》-2_第4頁
教學(xué)課件:《操作系統(tǒng)設(shè)計與實現(xiàn)》-2_第5頁
已閱讀5頁,還剩187頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第1章 操作系統(tǒng)開發(fā)介紹系統(tǒng)能力培養(yǎng)系列叢書操作系統(tǒng)設(shè)計與實現(xiàn)Outline課程設(shè)計操作系統(tǒng)原理進程、內(nèi)存、文件系統(tǒng)、IO硬件體系架構(gòu)實驗平臺:SWORDQS模擬器開發(fā)環(huán)境搭建課程設(shè)計(硬件篇)階段一擴展重現(xiàn)前導(dǎo)課程的流水線MIPS CPU,支持52條指令(48條普通指令+4條特權(quán)指令)。鼓勵創(chuàng)新,學(xué)生可自行添加非標準MIPS指令。階段二系統(tǒng)總線標準化。將原有的簡單總線系統(tǒng)替換為標準Wishbone總線,支持Burst模式以提高總線效率。階段三協(xié)處理器CP0功能增強,在硬件層支持OS的各項功能。MMU支持分頁機制。外設(shè)IO空間訪問繞過CACHE。階段四添加外存儲及構(gòu)建文件系統(tǒng)。添加Flash、

2、SD卡或U盤外存并選擇合適的文件系統(tǒng)。課程設(shè)計(軟件篇)預(yù)備實驗:熟悉、搭建實驗環(huán)境熟悉實驗平臺體系結(jié)構(gòu),掌握MIPS指令集,了解中斷異常機制,熟悉硬件接口搭建開發(fā)環(huán)境:mips-gcc交叉編譯器、模擬器等Exp01:系統(tǒng)總體規(guī)劃內(nèi)存地址空間分配;內(nèi)存管理機制;進程管理策略;文件系統(tǒng)選擇;外部設(shè)備確定;系統(tǒng)調(diào)用設(shè)計Exp02:系統(tǒng)初始化簡易bootloader:跳轉(zhuǎn)至kernel入口建立初始化框架: 建立堆棧段、編寫內(nèi)核各個子系統(tǒng)初始化框架Exp03:實現(xiàn)VGA顯示功能完成 vga 初始化init_vga實現(xiàn)往屏幕指定位置打印彩色字符的功能put_char實現(xiàn)打印字符串功能,支持可變參數(shù)pri

3、nt_strExp04:添加時鐘中斷完成時鐘初始化init_time編寫動態(tài)顯示運行時間flush_time在中斷處理框架中添加時鐘中斷處理timer_handlerExp05:實現(xiàn)鍵盤輸入功能在中斷處理跨中中添加鍵盤中斷處理keyb_handler解析鍵盤掃描碼get_scancode讀取字符get_ch課程設(shè)計(軟件篇)預(yù)備實驗:熟悉、搭建實驗環(huán)境熟悉實驗平臺體系結(jié)構(gòu),掌握MIPS指令集,了解中斷異常機制,熟悉硬件接口搭建開發(fā)環(huán)境:mips-gcc交叉編譯器、模擬器等Exp06:添加內(nèi)存管理Bootmem內(nèi)存系統(tǒng)管理bootmm_alloc_pagesBuddy內(nèi)存系統(tǒng)管理alloc_pa

4、gesSlub內(nèi)存系統(tǒng)管理kmalloc、kfreeExp07:實現(xiàn)進程管理實現(xiàn)進程切換操作switch_to實現(xiàn)缺頁異常管理do_pg_unpresent實現(xiàn)fork系統(tǒng)調(diào)用do_forkExp08:實現(xiàn)文件系統(tǒng)實現(xiàn)SD卡驅(qū)動sd_init、sd_read_block實現(xiàn)FAT 32文件系統(tǒng)fs_open、fs_read實現(xiàn)exec系統(tǒng)調(diào)用do_execExp09:實現(xiàn)用戶態(tài)庫及shell程序添加系統(tǒng)調(diào)用并封裝,實現(xiàn)用戶態(tài)庫ulib開發(fā)shell,實現(xiàn)基本命令如ls、pwd、ps、kill等Exp10:完善bootloader、燒寫Sword開發(fā)板將kernel寫到ROM中,改寫bootlo

5、ader,將kernel讀入內(nèi)存并跳轉(zhuǎn)在Sword硬件開發(fā)板上運行內(nèi)核并驗證代碼結(jié)構(gòu)代碼類型數(shù)量C文件6478行H文件1189行匯編文件520行Lcore架構(gòu)圖操作系統(tǒng)原理進程管理多任務(wù)進程生命周期系統(tǒng)資源分配進程調(diào)度、同步內(nèi)存管理虛擬內(nèi)存,隔離動態(tài)分配、回收操作系統(tǒng)原理文件管理文件系統(tǒng)存儲空間管理、目錄管理、文件讀寫等I/O設(shè)備管理緩沖機制、設(shè)備分配設(shè)備驅(qū)動、中斷處理用戶接口API系統(tǒng)調(diào)用硬件體系架構(gòu)處理器MIPS coreCP0、MMU、CacheInterrupt controller總線(wishbone)外設(shè)UART、PS/2、VGAROM、RAM、SD附錄A.1 實驗平臺詳細介紹總

6、線連接平臺指令集指令類型(52)Instructions算術(shù)運算(13)ADD、ADDU、SUB、SUBU、SLT、SLTU、ADDI、ADDIU、SLTI、SLTIU、LUI、MOVZ、MOVN邏輯運算(7)AND、ANDI、OR、ORI、XOR、XORI、NOR移位運算(8)SLL、SRL、ROTR、SRA、SLLV、SRLV、ROTRV、SRAV讀寫內(nèi)存(8)LB、LBU、LH、LW、SB、SBU、SH、SW跳轉(zhuǎn)(12)JR、JALR、BLTZ、BGEZ、BLTZAL、BGEZAL、J、JAL、BEQ、BNE、BLEZ、BGTZ特權(quán):自陷(1)SYSCALL特權(quán):CP0(3)MTC0、M

7、FC0、ERET附錄A.2 實驗平臺指令集(物理)實驗平臺:Sword開發(fā)板Sword Kintix-7主頻100MHz6MB SRAM(位寬48bit)512MB DDR3(位寬32bit)32MB NOR FLASH(位寬32bit)UART、PS/2、VGA、SD卡槽、RJ45等接口實驗開發(fā)板詳細參數(shù)核心芯片:Xilinx Kintex-7系列的XC7K160/325T邏輯單元:162,240個;Slice:25350;片內(nèi)存儲:11.7Mb存儲體系:支持32位存儲層次體系結(jié)構(gòu)SRAM靜態(tài)存儲器6MB,支持32位Data,16位TagDDR3動態(tài)存儲器512MB,支持32位DataNOR

8、 Flash存儲32MB,支持32位Data基本接口:支持微機原理、SOC或微處理器簡單應(yīng)用45+1矩陣按鍵;16位滑動開關(guān);16位LED;8個七段數(shù)碼管標準接口:支持基本計算機系統(tǒng)實現(xiàn)12位VGA接口(RGB-656)、USB-HID(鍵盤)通訊接口:支持數(shù)據(jù)傳輸、調(diào)試及網(wǎng)絡(luò)UART接口、10M/100M/1000M以太網(wǎng)、SFP光纖接口擴展接口:支持外存、多媒體和個性化設(shè)備MicroSD(TF)、PMOD、HDMI、Arduino內(nèi)核啟動Shell程序(模擬)實驗平臺:QS模擬器指令集模擬CP0協(xié)處理器模擬MMU模擬中斷模擬外設(shè)模擬調(diào)試功能內(nèi)核啟動(模擬器)Shell程序開發(fā)環(huán)境搭建交叉編

9、譯環(huán)境虛擬機:VirtualBox或者VMWareLinux: Red Hat 5.8 32bitCompiler: MIPSSW-LSDE-v5.03.06.tgz構(gòu)建交叉編譯器mkdir /usr/local/sdelitecp Desktop/MIPSSW-LSDE-v5.03.06.tgz /usr/local/sdelite/cd /usr/local/sdelite/tar zxvf MIPSSW-LSDE-v5.03.06.tgzbin/sdesetup.shbin/sdeenv.shsde-gcc -vQS模擬器QS模擬器使用JAVA 7環(huán)境雙擊mips_sim.jar不能啟動

10、的情況下,使用命令行java -jar mips_sim.jar打開RAM/ROM載入菜單欄File初始PC默認值0 x3000實驗產(chǎn)生的內(nèi)核鏡像載入到該地址第2章 系統(tǒng)設(shè)計與初始化系統(tǒng)能力培養(yǎng)系列叢書操作系統(tǒng)設(shè)計與實現(xiàn)OutlineLcore整體設(shè)計進程管理、調(diào)度內(nèi)存管理(Bootmem、Buddy、Slub)虛擬地址空間分配初始化框架中斷初始化內(nèi)核頁表初始化外設(shè)初始化、內(nèi)存初始化(后續(xù)章節(jié))模擬器運行效果Lcore整體設(shè)計進程管理task_struct硬件上下文信息、進程間繼承關(guān)系、進程線性地址空間信息、進程名、進程號等用戶態(tài)堆棧,內(nèi)核態(tài)堆棧(8KB,2頁)寫時拷貝,Copy-on-Wri

11、te(CoW)按需加載、缺頁異常內(nèi)核堆棧Lcore:進程狀態(tài)調(diào)度算法:時間片輪轉(zhuǎn)(Round Robin)時間片輪轉(zhuǎn)調(diào)度Lcore:物理內(nèi)存管理Bootmem系統(tǒng)初始化初期使用,位圖標記Buddy伙伴系統(tǒng),減少外部碎片,使用鏈表管理大小不同的內(nèi)存塊(2的冪),分配單位為頁Slub小對象分配,減小內(nèi)部碎片,緩存經(jīng)常使用的對象,Lcore:96、192、23、 24 211字節(jié),超過半頁大小直接分配一個頁BootmemBuddySlubLcore:虛擬地址空間中斷處理代碼在第1個頁面第23頁面作為啟動過程的內(nèi)核棧,初始化完畢后充當0號進程的內(nèi)核棧內(nèi)核入口為0 x3000,占用至16M(0 x100

12、0000)用戶進程入口地址為0 x40000000,一直到0 xFF000000,為用戶空間0 xFF000000之后為ROM及IO地址空間Lcore文件系統(tǒng)類FAT32文件系統(tǒng)Lcore之I/O設(shè)備VGA鍵盤SD卡用戶接口系統(tǒng)調(diào)用,syscallShell程序中斷初始化init_exint()將中斷處理程序_exint_handler(目前為空)拷貝到地址0通知硬件,即將中斷異常入口地址寫入?yún)f(xié)處理器CP0的3號寄存器EHBR(Exception Handler Base Register)內(nèi)核頁表初始化init_pgtable()pgd,全局變量,內(nèi)核頁表存放地址初始化第1級頁表(PGD)(

13、4MB地址空間每項)初始化第2級頁表(PTE)(4KB地址空間每項)內(nèi)核常規(guī)內(nèi)存頁表映射(_KERNEL_VIRT_END)ROM、IO地址空間頁表映射(ROM_START)內(nèi)核虛擬地址 = 內(nèi)核物理地址 (無偏移)分頁機制X:可執(zhí)行權(quán)限;W:寫權(quán)限;U:用戶態(tài)訪問;V:有效位開啟分頁enable_paging()開啟分頁設(shè)置協(xié)處理器CP0的6號寄存器的末位disable_paging()禁用分頁清掉協(xié)處理器CP0的6號寄存器的末位PDBRPDB:頁目錄基址高20位PE:分頁使能,默認關(guān)閉模擬器效果雖然一片漆黑,通過調(diào)試觀察,分頁功能是開啟的(PDBR)。第3章 VGA顯示功能系統(tǒng)能力培養(yǎng)系列

14、叢書操作系統(tǒng)設(shè)計與實現(xiàn)Outline實驗平臺VGA介紹圖形模式、文本模式控制寄存器VGA初始化put_char函數(shù)實現(xiàn)printk函數(shù)實現(xiàn)實驗平臺VGA介紹支持文本及圖形模式,多種分辨率及硬件光標。文本模式為8色16*8點陣顯示ASCII字符圖形模式支持256色像素顯示實驗選用文本模式黑底白字字符A:0 x0741VGA控制寄存器VGA控制寄存器基址為0 xFFFF0100模式控制寄存器(0 xFFFF01000 xFFFF0103)M:模式位,0為文本模式,1為圖形模式C:硬件光標使能,1為開啟硬件光標Resolution:分辨率選擇,0為關(guān)閉VGA,1為640*48060Hz顯存基址寄存器

15、位于地址0 xFFFF01040 xFFFF0107文本模式與圖形模式共享文本模式下,需末16位為0(64KB對齊)圖形模式下,需末20位為0(1MB對齊)光標位置寄存器位于地址0 xFFFF1080 xFFFF10B文本模式專用V_POS:硬件光標的行坐標H_POS:硬件光標的列坐標計算單位為字符數(shù)量,從0開始光標閃爍控制寄存器位于地址0 xFFFF010C0 xFFFF010F控制硬件光標的閃爍行為及頻率R:置1時,當光標位置發(fā)生改變時強制點亮光標FLASH_TIME:光標保持亮的時間(毫秒),0表示常亮,一般設(shè)置為500,閃爍周期為1秒。VGA初始化VGA相關(guān)函數(shù)init_vga(),初

16、始化VGAclean_screen(),清屏set_cursor(),設(shè)置光標scroll_screen(),滾屏延伸put_char()printk()put_char流程圖printk函數(shù)輸出格式描述處理函數(shù)整型%x, %X以16進制輸出整數(shù)print_str%b, %B以2進制輸出整數(shù)print_binary字符及字符串%c, %C輸出一個字符print_char%s, %S逐字符輸出,直到遇到NULLprint_str%顯示百分號print_char模擬器運行效果第4章 處理時鐘中斷系統(tǒng)能力培養(yǎng)系列叢書操作系統(tǒng)設(shè)計與實現(xiàn)Outline硬件中斷介紹上下文保存/恢復(fù)中斷處理/任務(wù)的注冊時鐘

17、中斷的實現(xiàn)初始化,init_timetimer_handler外部硬件中斷狀態(tài)寄存器,Status Register,SR異常處理基址寄存器,Exception Handler Base Register,EHBR中斷使能寄存器,Interrupt Enable Register,IER中斷來源寄存器,Interrupt Cause Register,ICR狀態(tài)寄存器SR保存CPU的狀態(tài)信息,該寄存器只讀EX:內(nèi)部異常標志IR:外部中斷標志,ICR保存外部中斷類型SC:軟件自陷標志W(wǎng)D:看門狗復(fù)位標志ExCode:內(nèi)部異常類型,與EX對應(yīng),5位,可表示31種,不包括0ScCode:軟件自陷代碼

18、,與SC對應(yīng),10位,可表示1023種,不包括0UM:CPU模式位,0為內(nèi)核態(tài),1為用戶態(tài)異常處理基址寄存器EHBR保存發(fā)生異常時,CPU應(yīng)跳轉(zhuǎn)的目標地址,該寄存器可讀寫EHB:異常入口地址的高30位(低2位永遠為0)中斷使能寄存器IER保存對可屏蔽中斷的使能控制信息,該寄存器可讀寫GE:全局中斷使能位IE:控制31個中斷使能位,置1表示開啟相應(yīng)位的中斷使能中斷來源寄存器ICR指示相應(yīng)位對應(yīng)的中斷是否發(fā)生,該寄存器可讀寫(特殊處理)IR:與IER的31個中斷使能位對應(yīng),相應(yīng)位置1表示對應(yīng)中斷已產(chǎn)生當全局中斷關(guān)閉或?qū)?yīng)中斷已屏蔽時,不會觸發(fā)中斷。中斷處理程序完成后,應(yīng)手動將相應(yīng)位清0中斷處理注冊

19、機制每類中斷對應(yīng)固定的中斷號每個中斷可對應(yīng)多項處理任務(wù)如時間中斷可更新時間、進程調(diào)度中斷處理注冊機制一類中斷對應(yīng)一個處理程序一個處理程序?qū)?yīng)多項工作以注冊機制添加工作中斷相關(guān)數(shù)據(jù)結(jié)構(gòu)intr_block:對應(yīng)每一類中斷(入口)intr_work:中斷處理的一項任務(wù)intr_block與intr_work關(guān)系intr_block為入口,后面跟著一串處理任務(wù)通過雙向鏈表list_head連接中斷處理入口.macro save_context保存上下文,如通用寄存器、EPC、EAR.macro restore_context恢復(fù)上下文中斷處理入口為_exint_handlersave_context

20、resotre_context_exint_handler硬件自動關(guān)閉中斷保存上下文處理異常處理中斷恢復(fù)上下文開啟中斷中斷返回中斷向量表全局數(shù)組interrupt,每一項對應(yīng)一類中斷中斷向量表在init_exit()中初始化do_interrupt中斷處理注冊中斷任務(wù)注冊時鐘中斷實現(xiàn)時鐘中斷對應(yīng)timer_handler(),遍歷注冊的任務(wù),依次執(zhí)行時鐘中斷初始化注冊timer_handler給timer_handler添加任務(wù)實體info_work(更新系統(tǒng)時間)設(shè)定時鐘中斷頻率初始化系統(tǒng)時間屏幕分割分辨率640*48080行,30列最后一列用來顯示系統(tǒng)信息,包括歡迎信息和系統(tǒng)時鐘模擬器運行

21、效果注意右下角時間變化重要數(shù)據(jù)結(jié)構(gòu):鏈表list第5章 鍵盤輸入功能系統(tǒng)能力培養(yǎng)系列叢書操作系統(tǒng)設(shè)計與實現(xiàn)Outline鍵盤硬件信息控制信息、數(shù)據(jù)收發(fā)接口鍵盤中斷處理注冊及處理函數(shù)鍵盤緩沖區(qū)管理鍵盤掃描碼解析鍵值映射表獲取掃描碼解析掃描碼鍵盤硬件接口0 x000 x03:鍵盤狀態(tài)查詢RX:數(shù)據(jù)接收標志TX:數(shù)據(jù)發(fā)送標志V:數(shù)據(jù)有效位RE:讀取出錯TE:寫入出錯0 x0C0 x0F:用于數(shù)據(jù)收發(fā)鍵盤中斷處理keyb_handler():鍵盤中斷處理函數(shù)get_scancode():具體鍵盤中斷任務(wù),處理鍵盤掃描碼目前為收到鍵盤中斷時,打印字符#init_keyboard():鍵盤中斷初始化注冊流

22、程與時鐘中斷一致keyb_handler流程與timer_handler一致init_keyboardinit_keyboard()register_handler(keyb_handler)register_work(get_scancode, keyb_handler)get_scancode()模擬器運行效果鍵盤緩沖區(qū)buffer:按鍵存儲key_spin:自旋鎖,處理同步互斥wait:等待鍵盤而被掛起的進程隊列head,tail:循環(huán)緩沖區(qū)頭尾count:當前buffer緩存的字符數(shù)量鍵值映射表get_scancodeget_chget_scancode()負責(zé)將鍵值加入緩沖區(qū),get

23、_ch()從緩沖區(qū)取出一個字符模擬器運行效果第6章 物理內(nèi)存管理系統(tǒng)能力培養(yǎng)系列叢書操作系統(tǒng)設(shè)計與實現(xiàn)Outline內(nèi)存管理策略Bootmem位圖管理,系統(tǒng)啟動時使用管理接口:插入、刪除、分配及釋放Buddy伙伴系統(tǒng)原理及初始化管理接口:釋放(free_pages)、分配(alloc_pages)Slub分配器基于伙伴系統(tǒng)實現(xiàn)管理接口:分配(slub_alloc)、釋放(slub_free)內(nèi)存管理虛擬內(nèi)存分頁機制Swap機制內(nèi)存管理策略性能、碎片(內(nèi)部、外部)Bootmem(啟動初期)Buddy(2的冪次,以頁為粒度)減少外部碎片Slub(byte級)減少內(nèi)部碎片對象緩存Bootmem以簡單

24、的bitmap形式管理物理內(nèi)存的使用情況申請內(nèi)存時,在位圖中尋找足夠的連續(xù)空間性能不佳系統(tǒng)啟動初期,過渡作用Bootmem:mm_usage內(nèi)存區(qū)域類型_MM_KERNEL,內(nèi)核使用_MM_MMMAP,內(nèi)存位圖區(qū)_MM_VGABUFF,VGA顯存_MM_PDTABLE、_MM_PTABLE,分頁機制使用,分別為頁目錄(一級)及頁面(二級)。_MM_DYNAMIC,用來動態(tài)分配_MM_COUNT,占位,表示上述內(nèi)存類型數(shù)量bootmm_info描述一塊內(nèi)存區(qū)start_pfn,起始頁框號end_pfn,結(jié)束頁框號type,內(nèi)存區(qū)域類型bootmm管理整個物理內(nèi)存phymm:物理內(nèi)存大小,字節(jié)單位

25、,如16MBmax_pfn:最大物理頁框號bitmaps_map:位圖起始地址e_map:位圖結(jié)束地址last_alloc:最近一次分配的位置,從last_alloc開始更容易找到空閑頁info:所有內(nèi)存區(qū)域類型cnt_infos:有效區(qū)域數(shù)插入內(nèi)存區(qū)域insert_mminfo()插入內(nèi)存區(qū)域時檢查合并情況(類型相同情況下)圖中藍色為已有區(qū)域,綠色為要插入的區(qū)域向前合并,區(qū)域數(shù)不變前后合并,區(qū)域數(shù)減1無法合并,區(qū)域數(shù)加1刪除內(nèi)存區(qū)域remove_mminfo注意info數(shù)組的挪位bootmem初始化init_bootmm()建立兩個內(nèi)存區(qū)KERNEL代碼數(shù)據(jù)bitmap自身存儲位圖緊跟內(nèi)核區(qū)

26、之后bootmap_info()打印內(nèi)存區(qū)域信息需在VGA初始化之后使用VGA初始化需要申請顯存bootmem:尋找連續(xù)空閑頁find_pages(),如圖,灰色為空閑頁,藍色為已分配頁,綠色是要申請的內(nèi)存目標是在s_pfn, e_pfn范圍內(nèi)尋找count個連續(xù)空閑頁首先找到一個空閑頁,然后檢查接下來count個頁是否都是可用的bootmem:內(nèi)存分配bootmm_alloc_pages()第一次從last_alloc開始尋找,調(diào)用find_pages()找不到則繼續(xù)從0開始,調(diào)用find_pages()插入新分配的內(nèi)存區(qū)域,調(diào)用insert_mminfo()bootmem內(nèi)存釋放bootm

27、m_free_pages()清理位圖操作內(nèi)存區(qū)域infosplit_mminfo,內(nèi)存區(qū)域分裂remove_info,移除內(nèi)存區(qū)域注意邊界情況的處理模擬器運行效果Buddy數(shù)據(jù)結(jié)構(gòu)page:描述物理頁框buddy_sys:伙伴系統(tǒng)freelist:物理頁框串聯(lián)buddy關(guān)系圖buddy系統(tǒng)初始化free_pages()將空閑頁從bootmem移交至buddy系統(tǒng)以1頁的粒度釋放,在釋放之前buddy系統(tǒng)已經(jīng)初始化完畢Buddy系統(tǒng)內(nèi)存釋放free_pages()示例Buddy系統(tǒng)內(nèi)存分配alloc_pages(),釋放的逆過程從當前階freelist開始找,若找到,則移出freelist返回若

28、未找到,則到更高階尋找。高階中找到的內(nèi)存塊需分裂,除了需求的塊,其他塊要根據(jù)階放到合適的freelist模擬器運行效果Slub系統(tǒng)為小對象分配內(nèi)存,減少內(nèi)部碎片核心為kmem_cache,slub被組織到paritial鏈表或full鏈表,當前可用slub頁為kmem_cache.cpu。簡化處理,沒有free鏈表,slub頁空閑出來后直接釋放到buddy系統(tǒng)slub_head隱含在物理頁框首部slub頁間關(guān)系圖Slub系統(tǒng)初始化這里只針對一些常用大小的數(shù)據(jù)塊進行分配,如96字節(jié)、192字節(jié)、23字節(jié)、 24字節(jié) 210字節(jié)更一般地,可對常用的內(nèi)核數(shù)據(jù)結(jié)構(gòu)如struct thread分配slu

29、b緩存init_each_slub設(shè)置slub緩存的基本信息,如緩存對象大小init_kmem_cpu初始化時不與任何頁關(guān)聯(lián),所以第一次分配必定missinit_kmem_node初始化partial鏈表初始化full鏈表format_slubpageSlub內(nèi)存分配:slub_allocslub內(nèi)存釋放:slub_free統(tǒng)一分配接口:kmalloc根據(jù)申請大小統(tǒng)一釋放接口:kfree根據(jù)_PAGE_SLUB頁面標志模擬器運行效果第7章 實現(xiàn)進程管理系統(tǒng)能力培養(yǎng)系列叢書操作系統(tǒng)設(shè)計與實現(xiàn)Outline進程管理初始化task_struct用戶地址空間( VMA )管理新建、添加、分裂、刪除添加

30、頁表映射進程創(chuàng)建copy_mem、copy_pagetables頁異常處理寫異常保護、CoW進程調(diào)度sched、switch_to進程上下文EPC:異常返回地址EAR:異常產(chǎn)生時附帶的參數(shù)信息task_structtask_struct用途user_stack用戶堆棧棧頂指針user_code用戶態(tài)代碼的起始線性地址pid進程id號parent父進程state進程狀態(tài)counter時間片pgd頁表的頁目錄(第一級)sched用于調(diào)度鏈表管理node所有進程鏈表stack_vma_head用戶態(tài)堆棧對應(yīng)的VMAuser_vma_head用戶態(tài)代碼區(qū)對應(yīng)的VMAheap_vma_head用戶態(tài)堆對

31、應(yīng)的VMAtask_union進程的內(nèi)核態(tài)堆棧(大小2個頁)與task_struct共用task_union結(jié)構(gòu)體task_struct位于內(nèi)核態(tài)堆棧的底部用戶地址空間管理:VMAVMA代表進程線性地址空間的一塊區(qū)域同類VMA對象以鏈表形式連接(node)start表示線性區(qū)域的起始地址cnt為區(qū)域大小,以頁為單位vend是線性區(qū)域的結(jié)束地址VMA管理new_vma()新建VMA,申請VMA數(shù)據(jù)結(jié)構(gòu)并初始化seprate_vma()將一個VMA分裂成兩個連續(xù)的VMA對象verify_vma()驗證傳入的線性區(qū)間是否合法獲取所屬區(qū)間的鏈表頭add_vmas()向進程的線性地址區(qū)間添加一個VMA對

32、象delete_vmas()從已存在的線性區(qū)間中刪除一段區(qū)間seprate_vmaadd_vmas示例del_vmas示例進程初始化do_one_mapping添加一個頁的映射進程創(chuàng)建copy_memcopy_pagetables缺頁異常處理寫保護異常進程調(diào)度:調(diào)度初始化調(diào)度工作(timer_sched)加入到時鐘中斷處理任務(wù)中進程調(diào)度實現(xiàn)時間片輪轉(zhuǎn)調(diào)度策略每次中斷時間片減1時間片有剩余則繼續(xù)運行時間片耗完則重新分配時間片,然后進行調(diào)度調(diào)度輔助函數(shù)sched_remove_first從進程鏈表中移出第一個進程sched_insert_tail將進程加入鏈表尾部sched模擬器運行效果第8章 實

33、現(xiàn)文件系統(tǒng)系統(tǒng)能力培養(yǎng)系列叢書操作系統(tǒng)設(shè)計與實現(xiàn)OutlineSD卡驅(qū)動程序SD卡接口SD卡讀寫操作文件系統(tǒng)實現(xiàn)文件控制塊文件緩存機制文件系統(tǒng)初始化文件操作(open/read/write/close)SD卡接口0 xFFFF0504:緩沖區(qū)狀態(tài)寄存器高16位為RX_LEFT,緩沖區(qū)內(nèi)已接收但未取走的字節(jié)數(shù)低16位為TX_LEFT,緩沖區(qū)內(nèi)還可以存儲的待發(fā)送數(shù)據(jù)大小0 xFFFF0508:SPI控制器設(shè)置,如波特率0 xFFFF050C:數(shù)據(jù)讀寫地址,發(fā)送及接收都以字節(jié)為單位SD卡命令格式All commands have a fixed code length of 48 bits (6 b

34、ytes)Bit position474645:4039:87:10Width (bits)1163271Value01xxx1DescriptionStart bitTransmission bitCommand indexArgumentCRC7End bitSPI通信:sd_spi_comm向SPI總線發(fā)送一個字節(jié),并從總線讀取一個字節(jié)生成指令發(fā)送指令SD卡讀操作指令功能參數(shù)返回值CMD17讀取單個塊的數(shù)據(jù)起始地址0,以及數(shù)據(jù)CMD18讀取連續(xù)多個塊的數(shù)據(jù)起始地址0,以及數(shù)據(jù)CMD12終止數(shù)據(jù)傳輸/讀取單個塊(512字節(jié))sd_read_single發(fā)送CMD17等待SD卡做好準備(收到

35、0 xFE)SD會發(fā)送一個塊的數(shù)據(jù)(512字節(jié)),后面跟著2個字節(jié)的CRC16校驗碼讀取連續(xù)多個塊sd_read_multiple發(fā)送CMD18數(shù)據(jù)準備讀取數(shù)據(jù)讀取CRC校驗重復(fù)第二步,直到讀取完要求數(shù)量的數(shù)據(jù)塊發(fā)送CMD12等待SD卡空閑下來SD卡寫操作指令功能參數(shù)返回值CMD24寫入單個塊的數(shù)據(jù)起始地址0,以及響應(yīng)值CMD25寫入連續(xù)多個塊的數(shù)據(jù)起始地址0,以及響應(yīng)值寫單個塊sd_write_single發(fā)送CMD24發(fā)送0 xFE表示準備數(shù)據(jù)傳輸發(fā)送512字節(jié)的數(shù)據(jù)發(fā)送2字節(jié)的CRC16讀取1字節(jié)的響應(yīng)(低3位需為101)等待SD卡過了忙碌狀態(tài)寫連續(xù)多個塊sd_write_multipl

36、e與寫單個塊的過程類似,但發(fā)送數(shù)據(jù)前寫入的是0 xFC,所有塊全部發(fā)送后再寫入0 xFDSD卡讀寫塊封裝文件系統(tǒng)實現(xiàn)文件控制塊緩存機制FAT表文件系統(tǒng)初始化openreadwritecreate文件控制塊緩存機制基礎(chǔ):CLOCK算法除了reference bit,還添加了dirty bit第一輪遍歷時,遇到ref bit為1的,清零;遇到ref bit為0的,查看dirty bit是否為0,若是,則選為替換塊第二輪遍歷,選擇dirty bit為0的塊為替換塊緩存相關(guān)數(shù)據(jù)結(jié)構(gòu)及函數(shù)buf為數(shù)據(jù)區(qū)cur為sector號state包含ref bit和dirty bitfs_victim_512()尋

37、找替換塊fs_write_512()將緩存中的臟數(shù)據(jù)刷回SD卡fs_read_512()先檢查是否已經(jīng)在緩存中不在,則通過fs_victim_512()找空閑位置,從SD卡讀取數(shù)據(jù)到緩存FAT表項操作FAT32的每個表項占用4個字節(jié),保存的是下一個cluster的編號fs_clus2fat()通過cluster編號找到對應(yīng)位置的FAT表項fs_get_fat_entry_val()獲取一個表項的內(nèi)容(4字節(jié))fs_modify_fat()修改FAT表項文件系統(tǒng)初始化sector大小為512字節(jié)cluster大小為4096字節(jié)全局變量名含義base_addrFAT32文件系統(tǒng)分區(qū)的偏移量FATS

38、zFAT表的大小,用于在寫FAT表時同時寫備份的FAT表BPB_RsvdSecCntFAT表的起始地址BPB_SecPerClus每個cluster包含幾個sectorFirstDataSector數(shù)據(jù)區(qū)的起始地址CountOfClustersCluster的數(shù)量打開文件fs_find()在FAT32中尋找文件根目錄所在的cluster號為2fs_open()初始化數(shù)據(jù)緩存設(shè)置文件控制塊fs_find()關(guān)閉文件fs_fflush()將全局緩存同步到SD卡meta_bufdir_data_buffs_close()將文件的目錄項內(nèi)容以及局部緩存同步到SD卡fs_fflush()第9章 添加系統(tǒng)

39、調(diào)用系統(tǒng)能力培養(yǎng)系列叢書操作系統(tǒng)設(shè)計與實現(xiàn)Outline系統(tǒng)調(diào)用框架系統(tǒng)調(diào)用入口系統(tǒng)調(diào)用初始化系統(tǒng)調(diào)用定義添加系統(tǒng)調(diào)用進程管理輸入輸出文件系統(tǒng)系統(tǒng)調(diào)用入口在_exint_handler中添加對系統(tǒng)調(diào)用的支持檢查CP0的0號寄存器的第29位,如果是1,表明是軟件自陷,即系統(tǒng)調(diào)用,跳轉(zhuǎn)到is_sys標簽系統(tǒng)調(diào)用號在v0寄存器,通過它索引系統(tǒng)調(diào)用表syscall_table,并通過jalr跳轉(zhuǎn)到對應(yīng)的系統(tǒng)調(diào)用處理函數(shù)跳轉(zhuǎn)之前,a0寄存器設(shè)置為用戶上下文的起始地址系統(tǒng)調(diào)用初始化init_syscall():通過add_syscall()添加系統(tǒng)調(diào)用,初始化系統(tǒng)調(diào)用表系統(tǒng)調(diào)用定義返回值放在v0寄存器添加系統(tǒng)調(diào)用進程管理相關(guān)sys_exit、sys_fork、sys_exec、sys_waitchild、sys_ltask、sys_killtask輸入輸出相關(guān)sys_putchar、sys_cls、sys_getch、sys_putback文件系統(tǒng)相關(guān)sys_fopen、sys_fread、sys_fwrite、sys_fcreate進程相關(guān)系統(tǒng)調(diào)用sys_exitdo_exit尋找下一個待執(zhí)行的進程切換到下一個進程執(zhí)行sys_forkdo_

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論