版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一、工程設(shè)計(jì)目的 熟習(xí)GeekOS的工程編譯、調(diào)試和運(yùn)轉(zhuǎn)環(huán) 境,掌握GeekOS運(yùn)轉(zhuǎn)任務(wù)過(guò)程。二、工程設(shè)計(jì)要求 1、搭建GeekOS的編譯和調(diào)試平臺(tái),掌握GeekOS的內(nèi)核進(jìn)程任務(wù)原理。 2、熟習(xí)鍵盤操作函數(shù),編程實(shí)現(xiàn)一個(gè)內(nèi)核進(jìn)程。該進(jìn)程的功能是:接納鍵盤輸入的字符并顯示到屏幕上,當(dāng)輸入ctrl+d時(shí),終了進(jìn)程的運(yùn)轉(zhuǎn)。第八章 設(shè)計(jì)工程0 .三、工程0的實(shí)現(xiàn)主要由以下步驟完成在工程0的/src/geekos/main.c中完成:編寫一個(gè)C言語(yǔ)函數(shù),函數(shù)功能是:接納鍵盤輸入的按鍵,并將鍵值在顯示器顯示出來(lái),當(dāng)輸入ctrl+d就退出;在Main函數(shù)體內(nèi)調(diào)用Start_Kernel_Thread函數(shù),
2、將步驟1編寫的函數(shù)地址傳送給參數(shù)startFunc,利用Setup_Kernel_Thread函數(shù)建立一個(gè)待運(yùn)轉(zhuǎn)的線程。 在Linux環(huán)境下編譯系統(tǒng)得到GeekOS鏡像文件。編寫一個(gè)相應(yīng)的bochs配置文件。在bochs中運(yùn)轉(zhuǎn)GeekOS系統(tǒng)顯示結(jié)果。.第九章 設(shè)計(jì)工程1 一、工程設(shè)計(jì)目的 熟習(xí)ELF文件格式,了解GeekOS系統(tǒng)如何將ELF格式的可執(zhí)行程序裝入到內(nèi)存,建立內(nèi)核進(jìn)程并運(yùn)轉(zhuǎn)的實(shí)現(xiàn)技術(shù)。二、工程設(shè)計(jì)要求 1、修正/geekos/elf.c文件:在函數(shù)Parse_ELF_Executable( )中添加代碼,分析ELF格式的可執(zhí)行文件包括分析得出ELF文件頭、程序頭,獲取可執(zhí)行文件長(zhǎng)
3、度,代碼段、數(shù)據(jù)段等信息,并填充Exe_Format數(shù)據(jù)構(gòu)造中的域值。 2、在Linux環(huán)境下編譯系統(tǒng)得到GeekOS鏡像文件。 3、編寫一個(gè)相應(yīng)的bochs配置文件。 4、在bochs中運(yùn)轉(zhuǎn)GeekOS系統(tǒng)顯示結(jié)果。.1、ELF文件格式 三、工程設(shè)計(jì)提示表1 ELF目的文件格式連接程序視圖 執(zhí)行程序視圖 ELF 頭部ELF 頭部 程序頭部表(可選) 程序頭部表 節(jié)區(qū)1 段 1 . 節(jié)區(qū) n 段 2 . . . 節(jié)區(qū)頭部表 節(jié)區(qū)頭部表(可選) .2、內(nèi)存中的可執(zhí)行文件鏡像 .3、內(nèi)核線程的建立流程Spawn_Init_Process() Start_Kernel_Thread()Spawner
4、()Read_Fully()Parse_ELF_Excutable()Spawn_Program().根據(jù)Exe_Format中的Exe_Segment構(gòu)造提供的用戶程序段信息,及用戶進(jìn)程堆棧大小計(jì)算用戶進(jìn)程所需的最大內(nèi)存空間,即要分配給用戶進(jìn)程的內(nèi)存空間; 為用戶程序分配內(nèi)存空間,并全部初始化為零,否那么系統(tǒng)后面運(yùn)轉(zhuǎn)能夠出錯(cuò);根據(jù)段信息將用戶程序中的各段內(nèi)容復(fù)制到分配的用戶內(nèi)存空間。根據(jù)Exe_Segment提供的用戶段信息初始化代碼段、數(shù)據(jù)段以及堆棧段的段描畫符和段選擇子。 4、Spawn_Program函數(shù)的功能.int Parse_ELF_Executable(char *exeFil
5、eData, ulong_t exeFileLength, struct Exe_Format *exeFormat)參數(shù):exeFileData已裝入內(nèi)存的可執(zhí)行文件所占用空間的起始地址 exeFileLength可執(zhí)行文件長(zhǎng)度 exeFormat保管分析得到的elf文件信息的構(gòu)造體指針根據(jù)ELF文件格式,用戶可以從exeFileData指向的內(nèi)容中得到ELF文件頭,繼續(xù)分析可以得到程序頭,程序代碼段等信息。5、Parse_ELF_Excutable函數(shù).第十章 設(shè)計(jì)工程2 一、工程設(shè)計(jì)目的 擴(kuò)展GeekOS操作系統(tǒng)內(nèi)核,使得系統(tǒng)可以支持用戶級(jí)進(jìn)程的動(dòng)態(tài)創(chuàng)建和執(zhí)行。二、工程2要求用戶對(duì)以下幾
6、個(gè)文件進(jìn)展修正:1“src/GeekOS/user.c文件中的函數(shù)Spawn,其功能是生成一個(gè)新的用戶級(jí)進(jìn)程;2“src/GeekOS/user.c文件中的函數(shù)Switch_To_User_Context,調(diào)度程序在執(zhí)行一個(gè)新的進(jìn)程前調(diào)用該函數(shù)以切換用戶地址空間; 3“src/GeekOS/elf.c文件中的函數(shù)Parse_ELF_Executable。該函數(shù)的實(shí)現(xiàn)要求和工程1一樣。.4“src/GeekOS/userseg.c文件中主要是實(shí)現(xiàn)一些為實(shí)現(xiàn)對(duì)“src/GeekOS/user.c中高層操作支持的函數(shù)。 Destroy_User_Context函數(shù)的功能是釋放用戶態(tài)進(jìn)程占用的內(nèi)存資源
7、。 Load_User_Program函數(shù)的功能經(jīng)過(guò)加載可執(zhí)行文件鏡像創(chuàng)建新進(jìn)程的User_Context構(gòu)造。 Copy_From_User和Copy_To_User函數(shù)的功能是在用戶地址空間和內(nèi)核地址空間之間復(fù)制數(shù)據(jù),在分段存儲(chǔ)器管理方式下,只需段有效,調(diào)用memcpy函數(shù)就可以實(shí)現(xiàn)這兩個(gè)函數(shù)的功能。 Switch_To_Address_Space函數(shù)的功能是經(jīng)過(guò)將進(jìn)程的LDT裝入到LDT存放器來(lái)激活用戶的地址空間;.5)“src/GeekOS/kthread.c文件中的Start_User_Thread函數(shù)和Setup_User_Thread函數(shù)。 Setup_User_Thread函數(shù)
8、的功能是為進(jìn)程初始化內(nèi)核堆棧,堆棧中是為進(jìn)程初次進(jìn)入用戶態(tài)運(yùn)轉(zhuǎn)時(shí)設(shè)置處置器形狀要運(yùn)用的數(shù)據(jù)。 Start_User_Thread是一個(gè)高層操作,該函數(shù)運(yùn)用User_Context對(duì)象開(kāi)場(chǎng)一個(gè)新進(jìn)程。6“src/GeekOS/kthread.c文件中主要是實(shí)現(xiàn)用戶程序要求內(nèi)核進(jìn)展效力的一些系統(tǒng)調(diào)用函數(shù)定義。要求用戶實(shí)現(xiàn)的有Sys_Exit函數(shù)、Sys_PrintString函數(shù)、Sys_GetKey、Sys_SetAttr、Sys_GetCursor、Sys_PutCursor、Sys_Spawn函數(shù)、Sys_Wait函數(shù)和Sys_GetPID( )函數(shù)。7在main.c文件中改寫生成第一個(gè)用戶
9、態(tài)進(jìn)程的函數(shù)調(diào)用:Spawn_Init_Process(void) 。.1、 GeekOS進(jìn)程形狀及轉(zhuǎn)換 三、工程設(shè)計(jì)提示currentrunwait出現(xiàn)需求等待的事件等待的事件發(fā)生調(diào)度時(shí)間片到等圖5.1 GeekOS進(jìn)程形狀轉(zhuǎn)換 GeekOS系統(tǒng)最早創(chuàng)建的內(nèi)核進(jìn)程有Idle、Reaper和Main三個(gè)進(jìn)程,它們由Init_Scheduler函數(shù)創(chuàng)建:最先初始化一個(gè)核態(tài)進(jìn)程mainThread,并將該進(jìn)程作為當(dāng)前運(yùn)轉(zhuǎn)進(jìn)程,函數(shù)最后還調(diào)用Start_Kernel_Thread 函數(shù)創(chuàng)建了兩個(gè)系統(tǒng)進(jìn)程Idle和Reaper。 所以,Idle、Reaper和Main三個(gè)進(jìn)程是系統(tǒng)中最早存在的進(jìn)程。新
10、建.GeekOS的內(nèi)核進(jìn)程對(duì)象 include/kthread.h中定義,詳細(xì)構(gòu)造如下:struct Kernel_Thread ulong_t esp; / 進(jìn)程的內(nèi)核堆棧esp指針 volatile ulong_t numTicks; / 計(jì)時(shí)器 int priority; / 進(jìn)程優(yōu)先級(jí) DEFINE_LINK(Thread_Queue, Kernel_Thread);/ 指針指向進(jìn)程隊(duì)列下一進(jìn)程 void* stackPage; / 內(nèi)核堆棧頁(yè)指針 struct User_Context* userContext; / 用戶進(jìn)程上下文 struct Kernel_Thread* own
11、er; / 父進(jìn)程指針 int refCount; / 援用計(jì)數(shù) bool alive; / 能否活潑 struct Thread_Queue joinQueue; / 參與隊(duì)列 int exitCode; / 前往代碼 int pid; / 進(jìn)程ID DEFINE_LINK(All_Thread_List, Kernel_Thread); / 全局進(jìn)程鏈表指針#define MAX_TLOCAL_KEYS 128 const void* tlocalDataMAX_TLOCAL_KEYS;/ 本地信息 int currentReadyQueue; / 進(jìn)程當(dāng)前所在的運(yùn)轉(zhuǎn)隊(duì)列的索引編號(hào) boo
12、l blocked; / 能否被阻塞;.2、GeekOS的用戶態(tài)進(jìn)程 在GeekOS中為了區(qū)分用戶態(tài)進(jìn)程和內(nèi)核進(jìn)程,在Kernel_Thread構(gòu)造體中設(shè)置了一個(gè)字段 userContext,指向用戶態(tài)進(jìn)程上下文。對(duì)于內(nèi)核進(jìn)程來(lái)說(shuō),這個(gè)指針為空,而用戶態(tài)進(jìn)程都擁有本人的用戶上下文User_Context。因此,在GeekOS中要判別一個(gè)進(jìn)程是內(nèi)核進(jìn)程還是用戶態(tài)進(jìn)程,只需經(jīng)過(guò)userContext字段能否為空來(lái)判別就可以了。 圖10.1 用戶態(tài)進(jìn)程構(gòu)造.User_Context構(gòu)造構(gòu)造定義如下在“include/geekos/user.h中定義:struct User_Context #defi
13、ne NUM_USER_LDT_ENTRIES 3 struct Segment_Descriptor ldtNUM_USER_LDT_ENTRIES; / 用戶LDT struct Segment_Descriptor* ldtDescriptor; / LDT描畫符 char* memory; / 指向用戶空間 ulong_t size; / 用戶空間的大小 ushort_t ldtSelector; / ldt選擇子 ushort_t csSelector; / cs選擇子 ushort_t ssSelector; / ss選擇子 ushort_t dsSelector; / ds選擇子
14、 pde_t *pageDir; / 頁(yè)表指針 ulong_t entryAddr; / 用戶程序入口地址 ulong_t argBlockAddr;/ 參數(shù)塊地址 ulong_t stackPointerAddr; / 用戶態(tài)進(jìn)程的堆棧指針 int refCount;/ 援用數(shù) struct File *fileListUSER_MAX_FILES; / 翻開(kāi)文件列表 int fileCount;/ 翻開(kāi)文件計(jì)數(shù);.4、 用戶態(tài)進(jìn)程空間 每個(gè)用戶態(tài)進(jìn)程都擁有屬于本人的內(nèi)存段空間,如:代碼段、數(shù)據(jù)段、堆棧段等,每個(gè)段有一個(gè)段描畫符segment descriptor,并且每個(gè)進(jìn)程有一個(gè)段描畫符
15、表Local Descriptor Table,用于保管該進(jìn)程的一切段描畫符。操作系統(tǒng)中還設(shè)置一個(gè)全局描畫符表GDT,Global Descriptor Table,用于記錄了系統(tǒng)中一切進(jìn)程的ldt描畫符。圖10.2 GDT、LDT和User_Context的關(guān)系.(1)調(diào)用函數(shù)Allocate_Segment_Descriptor()新建一個(gè)LDT描畫符;(2)調(diào)用函數(shù)Selector()新建一個(gè)LDT選擇子;(3)調(diào)用函數(shù)Init_Code_Segment_Descriptor()新建一個(gè)文本段描畫符;(4)調(diào)用函數(shù)Init_Data_Segment_Descriptor()新建一個(gè)數(shù)據(jù)段
16、;(5)調(diào)用函數(shù)Selector新建一個(gè)數(shù)據(jù)段選擇子;(6)調(diào)用函數(shù)Selector新建一個(gè)文本可執(zhí)行代碼段選擇子。5、用戶態(tài)進(jìn)程創(chuàng)建LDT的步驟 .3、用戶態(tài)進(jìn)程創(chuàng)建流程Spawn () Read_Fully()Parse_ELF_Excutable()Start_User_Thread ()Setup_User_Thread ()Load_User_Program ()Attach_User_Context ().4、Spawn函數(shù)的功能int Spawn(const char *program, const char *command, struct Kernel_Thread *pTh
17、read)參數(shù)闡明:Program對(duì)應(yīng)的是要讀入內(nèi)存緩沖區(qū)的可執(zhí)行文件,Command是用戶執(zhí)行程序執(zhí)行時(shí)的命令行字符串,pThread是存放指向剛創(chuàng)建進(jìn)程的指針。Spawn函數(shù)主要完成的主要功能是:1調(diào)用Read_Fully函數(shù)將名為program的可執(zhí)行文件全部讀入內(nèi)存緩沖區(qū)。2 調(diào)用Parse_ELF_Executable函數(shù),分析ELF格式文件。Parse_ELF_Executable函數(shù)功能在工程1中曾經(jīng)實(shí)現(xiàn)。3調(diào)用Load_User_Program將可執(zhí)行程序的程序段和數(shù)據(jù)段等裝入內(nèi)存,初始化User_context數(shù)據(jù)構(gòu)造。4調(diào)用Start_User_Thread函數(shù)創(chuàng)建一個(gè)進(jìn)程
18、并使該進(jìn)程進(jìn)入預(yù)備運(yùn)轉(zhuǎn)隊(duì)列。.5、 Load_User_Program函數(shù)Load_User_Program函數(shù)在“/src/geekos/userseg.c文件中實(shí)現(xiàn),代碼也需求開(kāi)發(fā)人員本人完成,函數(shù)原型如下:int Load_User_Program(char *exeFileData, ulong_t exeFileLength, struct Exe_Format *exeFormat, const char *command, struct User_Context *pUserContext)/* 參數(shù)闡明:exeFileData保管在內(nèi)存緩沖中的用戶程序可執(zhí)行文件;exeFile
19、Length可執(zhí)行文件的長(zhǎng)度;exeFormat調(diào)用Parse_ELF_Executable函數(shù)得到的可執(zhí)行文件格式信息;command用戶輸入的命令行,包括可執(zhí)行文件的稱號(hào)及其他參數(shù);pUserContext指向User_Conetxt的指針,是本函數(shù)完成用戶上下文初始化的對(duì)象 */.Load_User_Program主要實(shí)現(xiàn)功能如下:1根據(jù)Parse_ELF_Executable函數(shù)的執(zhí)行結(jié)果Exe_Format中的Exe_Segment構(gòu)造提供的用戶程序段信息,用戶命令參數(shù)及用戶態(tài)進(jìn)程堆棧大小計(jì)算用戶態(tài)進(jìn)程所需的最大內(nèi)存空間,即要分配給用戶態(tài)進(jìn)程的內(nèi)存空間。2為用戶程序分配內(nèi)存空間,并初
20、始化。3根據(jù)Exe_Segment提供的用戶段信息初始化代碼段、數(shù)據(jù)段以及堆棧段的段描畫符和段選擇子。4根據(jù)段信息將用戶程序中的各段內(nèi)容復(fù)制到分配的用戶內(nèi)存空間。5根據(jù)Exe_Format構(gòu)造初始化User_Context構(gòu)造中的用戶態(tài)進(jìn)程代碼段入口entry字段,并根據(jù)command參數(shù)初始化用戶內(nèi)存空間中的參數(shù)塊。6初始化User_Context構(gòu)造的用戶翻開(kāi)文件列表,并添加規(guī)范輸入輸出文件。7將初始化終了的User_Context指針賦予*pUserContext,前往0表示勝利。.一、工程設(shè)計(jì)目的 研討進(jìn)程調(diào)度算法,掌握用信號(hào)量實(shí)現(xiàn)進(jìn)程間同步的方法。為GeekOS擴(kuò)展進(jìn)程調(diào)度算法基于時(shí)
21、間片輪轉(zhuǎn)的進(jìn)程多級(jí)反響調(diào)度算法,并能用信號(hào)量實(shí)現(xiàn)進(jìn)程協(xié)作。二、工程設(shè)計(jì)要求 (1)實(shí)現(xiàn)src/geekos/syscall.c文件中的Sys_SetSchedulingPolicy系統(tǒng)調(diào)用,它的功能是設(shè)置系統(tǒng)采用的何種進(jìn)程調(diào)度戰(zhàn)略; (2)實(shí)現(xiàn)src/geekos/syscall.c文件中的Sys_GetTimeOfDay系統(tǒng)調(diào)用,它的功能是獲取全局變量g_numTicks的值; (3)實(shí)現(xiàn)函數(shù)Change_Scheduling_Policy(),詳細(xì)實(shí)現(xiàn)不同調(diào)度算法的轉(zhuǎn)換。 (4)實(shí)現(xiàn)syscall.c中信號(hào)量有關(guān)的四個(gè)系統(tǒng)調(diào)用:sys_createsemaphore( )、sys_P( )
22、、sys_V( )和sys_destroysemaphore( )。第11章 設(shè)計(jì)工程3 .1、多級(jí)反響隊(duì)列調(diào)度隊(duì)列模型 三、工程設(shè)計(jì)提示.2、多級(jí)反響隊(duì)列與分時(shí)調(diào)度進(jìn)程隊(duì)列的轉(zhuǎn)換 .1添加函數(shù)Chang_Scheduling_Policy(int policy, int quantum),policy是設(shè)置的調(diào)度戰(zhàn)略,quantum是設(shè)置的時(shí)間片。例如policy為1闡明設(shè)置的是多級(jí)反響隊(duì)列調(diào)度算法,此時(shí)假設(shè)g_SchedPolicy為系統(tǒng)添加的標(biāo)識(shí)算法的變量,初始化為0為0,闡明當(dāng)前的調(diào)度算法為輪轉(zhuǎn)調(diào)度,要變成MLF就必需把空閑線程放入3隊(duì)列,假設(shè)g_SchedPolicy為1,闡明當(dāng)前是
23、多級(jí)反響隊(duì)列調(diào)度算法,那么前往。假設(shè)policy為0,那么闡明設(shè)置的是輪轉(zhuǎn)調(diào)度,此時(shí)假設(shè)g_SchedPolicy為1,那么必需把4個(gè)隊(duì)列變成一個(gè)隊(duì)列,即一切的線程都在隊(duì)列0上了。假設(shè)g_SchedPolicy為0,那么前往。3、函數(shù)設(shè)計(jì)提示.2在系統(tǒng)調(diào)用Sys_GetTimeOfDay中,只需求前往g_numTicks就可以了。在Sys_SetSchedulingPolicy中,假設(shè)state-ebx是1,那么設(shè)置的是MLF算法,調(diào)用Change_Scheduling_Policy(SCHED_RR,quantum),為0那么是RR算法,調(diào)用Change_Scheduling_Policy(
24、SCHED_MLF,quantum)。假設(shè)state-ebx為其他值,那么前往-1。3在Init_Thread中都是把隊(duì)列放在0隊(duì)列上的,并且blocked變量為false。4在Get_Next_Runnable中,從最高級(jí)的隊(duì)列開(kāi)場(chǎng),調(diào)用Find_Best來(lái)找線程優(yōu)先級(jí)最大的線程,直到在某級(jí)隊(duì)列中找到符合條件可以運(yùn)轉(zhuǎn)的線程。5在Wait函數(shù)中,線程被阻塞,所以blocked變量被設(shè)置為true,并且假設(shè)是MLF算法,那么該進(jìn)程的currentReadyQueue加一,下次運(yùn)轉(zhuǎn)的時(shí)候進(jìn)入高一級(jí)的線程隊(duì)列。.GveekOS定義了信號(hào)量的構(gòu)造體:struct Semaphore int semap
25、horeID; /*信號(hào)量的ID*/ char *semaphoreName; /*信號(hào)量的名字*/ int value; /*信號(hào)量的值*/ int registeredThreadCount; /*注冊(cè)該信號(hào)量的線程數(shù)量*/ struct Kernel_Thread *registeredThreadsMAX_REGISTERED_THREADS;/*注冊(cè)的線程*/ struct Thread_Queue waitingThreads; /*等待該信號(hào)的線程隊(duì)列*/ DEFINE_LINK(Semaphore_List,Semaphore); /*銜接信號(hào)鏈表的域*/ 4、信號(hào)量定義 .信
26、號(hào)量操作:Semaphore_Create( )Semaphore_AcquireP操作Semaphore_ReleaseV操作Semaphore_Destroy( )Create_Semaphore函數(shù)首先檢查懇求創(chuàng)建的這個(gè)信號(hào)量的名字能否存在,假設(shè)存在,那么就把這個(gè)線程參與到這個(gè)信號(hào)量所注冊(cè)的線程鏈表上;假設(shè)不存在,那么分配內(nèi)存給新的信號(hào)量,清空它的線程隊(duì)列,把當(dāng)前的這個(gè)線程參與到它的線程隊(duì)列中,設(shè)置注冊(cè)線程數(shù)量為1,初始化信號(hào)量的名字,值和信號(hào)量的ID,并把這個(gè)信號(hào)量添加到信號(hào)量鏈表上,最后前往信號(hào)量的ID。5、信號(hào)量PV操作 .P操作Semaphore_Acquire中,首先檢查傳入的
27、信號(hào)量ID能否存在,假設(shè)存在,接著檢查當(dāng)前線程能否注冊(cè)運(yùn)用了這個(gè)信號(hào)量,假設(shè)這兩項(xiàng)檢查恣意一項(xiàng)失敗了,那么就前往-1。假設(shè)勝利了,就把信號(hào)量的值減去1,假設(shè)減去1后信號(hào)量的值小于0,那么就把當(dāng)前線程放入這個(gè)信號(hào)量的等待隊(duì)列上。V操作Semaphore_Release中,首先也是檢查傳入的信號(hào)量ID能否存在,假設(shè)存在,接著檢查當(dāng)前線程能否注冊(cè)運(yùn)用了這個(gè)信號(hào)量,假設(shè)這兩項(xiàng)檢查恣意一項(xiàng)失敗了,那么就前往-1。假設(shè)勝利了,那就把信號(hào)量的值加上1,假設(shè)加上1后信號(hào)量的值小于或等于0,那么要把該信號(hào)量里等待隊(duì)列上的一個(gè)線程喚醒。Semaphore_Destroy中,首先也是檢查傳入的信號(hào)量ID能否存在,假
28、設(shè)存在,接著檢查當(dāng)前線程能否注冊(cè)運(yùn)用了這個(gè)信號(hào)量,假設(shè)這兩項(xiàng)檢查恣意一項(xiàng)失敗了,那么就前往-1。假設(shè)勝利了,就把該線程從這個(gè)信號(hào)量的注冊(cè)的線程數(shù)組中刪除,并把注冊(cè)的線程數(shù)量減去1。假設(shè)這個(gè)信號(hào)量的注冊(cè)線程為0了,那么把這個(gè)信號(hào)量從信號(hào)量鏈表中刪除,并釋放它的內(nèi)存。.第12章 設(shè)計(jì)工程4 一、工程設(shè)計(jì)目的 了解虛擬存儲(chǔ)器管理設(shè)計(jì)原理,掌握懇求分頁(yè)虛擬存儲(chǔ)管理的詳細(xì)實(shí)現(xiàn)技術(shù)。二、工程設(shè)計(jì)要求1在文件中編寫代碼完成以下函數(shù):Init_VM()(defined in )函數(shù)將建立一個(gè)初始的內(nèi)存頁(yè)目錄和頁(yè)表,并且安裝一個(gè)頁(yè)面出錯(cuò)處置函數(shù)。Init_Paging()函數(shù)(定義在src/geekos/pag
29、ing.c)初始化操作頁(yè)面調(diào)度文件所需的一切數(shù)據(jù)構(gòu)造。就如前面說(shuō)到的,Get_Paging_Device()函數(shù)指定分頁(yè)調(diào)度文件定位在哪一個(gè)設(shè)備和占用磁盤塊的地址范圍。Find_Space_On_Paging_File()函數(shù)應(yīng)該在分頁(yè)調(diào)度文件里面找到一個(gè)空閑的足夠大的頁(yè)空間。它將前往這個(gè)大塊的索引,或者當(dāng)沒(méi)有適宜的空間就前往-1。.Free_Space_On_Paging_File()函數(shù)將釋放由Find_Space_On_Paging_File()函數(shù)在分頁(yè)調(diào)度文件里所分配的的磁盤塊。Write_To_Paging_File()函數(shù)將把存儲(chǔ)在內(nèi)存的一頁(yè)數(shù)據(jù)寫出到分頁(yè)調(diào)度文件里。Read_F
30、rom_Paging_File()函數(shù)將讀取分頁(yè)調(diào)度文件里的一頁(yè)數(shù)據(jù)到內(nèi)存空間。2在文件中編寫代碼完成以下函數(shù):Destroy_User_Context()釋放進(jìn)程所占用的一切內(nèi)存和其它資源。Load_User_Program()裝載可執(zhí)行文件到內(nèi)存里,創(chuàng)建一個(gè)就緒的用戶地址空間,功能類似于分段系統(tǒng)的實(shí)現(xiàn)。Copy_From_User()從一個(gè)用戶緩沖區(qū)復(fù)制數(shù)據(jù)到一個(gè)內(nèi)核緩沖區(qū)。Copy_To_User()從一個(gè)內(nèi)核緩沖區(qū)復(fù)制數(shù)據(jù)到一個(gè)用戶緩沖區(qū)。Switch_To_Address_Space()利用它裝載相應(yīng)頁(yè)目錄和LDT來(lái)切換到一個(gè)用戶地址空間。.1、地址轉(zhuǎn)換三、工程設(shè)計(jì)提示 .線性地址到
31、物理地址的轉(zhuǎn)換過(guò)程.2、用戶進(jìn)程的線性地址空間.3、懇求分頁(yè)系統(tǒng)實(shí)現(xiàn)操作系統(tǒng)將需求在磁盤設(shè)備上創(chuàng)建一個(gè)page file文件暫時(shí)保管從內(nèi)存中交換出去的頁(yè), 實(shí)現(xiàn)一個(gè)類LRU算法在內(nèi)存中選取一個(gè)交換頁(yè)把它寫到磁盤的page file文件中。缺頁(yè)中斷處置 表12-1 缺頁(yè)處置表缺頁(yè)情況標(biāo)識(shí)相應(yīng)處理堆棧生長(zhǎng)到新頁(yè)超出原來(lái)分配一頁(yè)的限制分配一個(gè)新頁(yè)進(jìn)程繼續(xù)此頁(yè)保存在磁盤上數(shù)據(jù)標(biāo)識(shí)這一頁(yè)在page file中存在從page file讀入需要的頁(yè)繼續(xù)因?yàn)闊o(wú)效地址缺頁(yè)非法地址訪問(wèn)終止用戶進(jìn)程.在“/src/geekos/mem.c文件中,曾經(jīng)定義了一個(gè)函數(shù)Alloc_Pageable_Page實(shí)現(xiàn)交換一頁(yè)到
32、磁盤的操作,詳細(xì)執(zhí)行步驟如下:調(diào)用mem.c文件中曾經(jīng)實(shí)現(xiàn)的Find_Page_To_Page_Out函數(shù)來(lái)確定要交換的頁(yè)這個(gè)函數(shù)依賴于頁(yè)數(shù)據(jù)構(gòu)造中的clock域。調(diào)用paging.c文件中曾經(jīng)實(shí)現(xiàn)的Find_Space_On_Paging_File函數(shù)在page file中找到空閑的存儲(chǔ)空間。調(diào)用paging.c文件中曾經(jīng)實(shí)現(xiàn)的Write_To_Paging_File函數(shù)把被交換的頁(yè)寫到page file文件中。修正頁(yè)表的相應(yīng)表項(xiàng),去除頁(yè)存在的標(biāo)志,標(biāo)識(shí)為此頁(yè)在內(nèi)存為不存在。修正頁(yè)表項(xiàng)的頁(yè)基地址為包含這一頁(yè)的第一個(gè)磁盤塊號(hào)。修正頁(yè)表項(xiàng)的kernelInfo位標(biāo)識(shí)為KINFO_PAGE_ON_
33、DISK形狀標(biāo)識(shí)這一頁(yè)是在磁盤上存在,而不是沒(méi)有效。調(diào)用lowlevel.asm文件中曾經(jīng)實(shí)現(xiàn)的Flush_TLB來(lái)刷新TLB。.第13章 設(shè)計(jì)工程5 一、工程設(shè)計(jì)目的 了解文件系統(tǒng)的設(shè)計(jì)原理。掌握操作系統(tǒng)文件系統(tǒng)的詳細(xì)實(shí)現(xiàn)技術(shù)。二、工程設(shè)計(jì)要求1為實(shí)現(xiàn)GOSFS文件系統(tǒng),用戶在“/src/geeekos /gosfs.c 中添加代碼,實(shí)現(xiàn)以下函數(shù)。 GOSFS_Fstat( )函數(shù):為給定的文件得到元數(shù)據(jù)。 GOSFS_Read( )函數(shù):從給定文件的當(dāng)前位置讀數(shù)據(jù)。 GOSFS_Write( )函數(shù):從給定文件的當(dāng)前位置寫數(shù)據(jù)。 GOSFS_Seek( )函數(shù):在給定文件中定位。 GOSF
34、S_Close( )函數(shù):封鎖給定文件。 .工程設(shè)計(jì)要求 GOSFS_Fstat_Directory( )函數(shù):為一個(gè)翻開(kāi)的目錄得到元數(shù)據(jù)。 GOSFS_Close_Directory( )函數(shù):封鎖給定目錄。 GOSFS_Read_Entry( )函數(shù):從翻開(kāi)的目錄表讀一個(gè)目錄項(xiàng)。 GOSFS_Open( )函數(shù):為給定的途徑名翻開(kāi)一個(gè)文件。 GOSFS_Create_Directory( )函數(shù):為給定的途徑創(chuàng)建一個(gè)目錄。 GOSFS_Open_Directory( )函數(shù):為給定的途徑翻開(kāi)一個(gè)目錄。 GOSFS_Delete( )函數(shù):為給定的途徑名刪除一個(gè)文件。 GOSFS_stat(
35、 )函數(shù):為給定的途徑得到元數(shù)據(jù)大小,權(quán)限等信息。 GOSFS_Sync( )函數(shù):對(duì)磁盤上的文件系統(tǒng)數(shù)據(jù)實(shí)現(xiàn)同步操作。 GOSFS_Format( )函數(shù):格式化GOSFS文件系統(tǒng)操作。 GOSFS_Mount( )函數(shù):掛載文件系統(tǒng)操作。 .1、 GeekOS文件系統(tǒng)框架 三、工程設(shè)計(jì)提示.2、GOSFS讀文件處置流程 用戶進(jìn)程調(diào)用C言語(yǔ)庫(kù)函數(shù)Read函數(shù)軟件中斷,內(nèi)核調(diào)用Sys_Read()函數(shù)虛擬文件系統(tǒng)層的Read()函數(shù)讀出文件的數(shù)據(jù)Sys_Read()函數(shù)將數(shù)據(jù)拷貝到用戶緩沖區(qū)GOSFS讀文件過(guò)程系統(tǒng)曾經(jīng)實(shí)現(xiàn)PFAT文件系統(tǒng),用戶要實(shí)現(xiàn)的是GOSFS文件系統(tǒng),可按照PFAT文件的
36、實(shí)現(xiàn)原理.User_Context構(gòu)造構(gòu)造定義如下在“include/geekos/user.h中定義:struct User_Context #define NUM_USER_LDT_ENTRIES 3 struct Segment_Descriptor ldtNUM_USER_LDT_ENTRIES; / 用戶LDT struct Segment_Descriptor* ldtDescriptor; / LDT描畫符 char* memory; / 指向用戶空間 ulong_t size; / 用戶空間的大小 ushort_t ldtSelector; / ldt選擇子 ushort_t
37、csSelector; / cs選擇子 ushort_t ssSelector; / ss選擇子 ushort_t dsSelector; / ds選擇子 pde_t *pageDir; / 頁(yè)表指針 ulong_t entryAddr; / 用戶程序入口地址 ulong_t argBlockAddr;/ 參數(shù)塊地址 ulong_t stackPointerAddr; / 用戶態(tài)進(jìn)程的堆棧指針 int refCount;/ 援用數(shù) struct File *fileListUSER_MAX_FILES; / 翻開(kāi)文件列表 int fileCount;/ 翻開(kāi)文件計(jì)數(shù);2、GOSFS文件系統(tǒng)構(gòu)造 .1)磁盤邏輯構(gòu)造2、GOSFS文件系統(tǒng)構(gòu)造 .MAX_FILES_PER_DIR GOSFS_Dir_Entryfilename128flagssizeacl10blockList10目錄項(xiàng)GOSFS_Dir_EntryGOSFS_Dir_EntryGOSFS_Dir_EntryGOSFS_Dir_EntryGOSFS_Dir_EntryGOSFS_Dir_EntryGOSFS_Dir_Entry目錄塊文件目錄 數(shù)據(jù)塊數(shù)據(jù)塊.數(shù)據(jù)存
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合并同類項(xiàng)解元次方程說(shuō)課稿
- 電商項(xiàng)目規(guī)劃
- 美術(shù)館黃金屋租賃合同
- 休閑娛樂(lè)場(chǎng)所消火栓施工合同
- 會(huì)計(jì)師事務(wù)所出納人員聘用協(xié)議
- 老年大學(xué)教師勞動(dòng)合同范本
- 羽絨制品維修工聘用合同模板
- 農(nóng)藥采購(gòu)合同管理
- 電梯工程師招聘協(xié)議
- 房地產(chǎn)開(kāi)發(fā)招標(biāo)廉政責(zé)任
- GB/T 10001.4-2021公共信息圖形符號(hào)第4部分:運(yùn)動(dòng)健身符號(hào)
- 我最喜歡的建筑
- 《競(jìng)爭(zhēng)法學(xué)》課程教學(xué)大綱
- 疼痛的評(píng)估方法課件
- 修剪指甲培智五年級(jí)上冊(cè)生活適應(yīng)教案
- 計(jì)算機(jī)信息系統(tǒng)災(zāi)難恢復(fù)計(jì)劃(完整版)資料
- 煙花爆竹安全管理?xiàng)l例課件
- 大學(xué)C語(yǔ)言設(shè)計(jì)冒泡排序和選擇排序課件
- 一些液體的導(dǎo)熱系數(shù)
- 高毒力肺炎克雷伯菌感染
- 篆刻學(xué)ppt精品課件
評(píng)論
0/150
提交評(píng)論