freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

操作系統(tǒng)課程設(shè)計---geekos操作系統(tǒng)的研究與實現(xiàn)-在線瀏覽

2025-03-05 15:52本頁面
  

【正文】 able( )中添加代碼,分析 ELF格式的可執(zhí)行文件(包括分析得出ELF文件頭、程序頭,獲取可執(zhí)行文 件長度,代碼段、數(shù)據(jù)段等信息),并填充Exe_Format數(shù)據(jù)結(jié)構(gòu)中的域值:將ELF格式的可執(zhí)行程序裝入到內(nèi)存,建立內(nèi)核進程并運行.================== ==================== int Parse_ELF_Executable(char *exeFileData, ulong_t exeFileLength, struct Exe_Format *exeFormat){ int i。 programHeader *proHeader=(programHeader *)(exeFileData+headphoff)。 KASSERT(exeFileLengthheadehsize+headphentsize*headphnum)。 exeFormatnumSegments=headphnum。 for(i=0。i++){ exeFormatsegmentList[i].offsetInFile=proHeaderoffset。 exeFormatsegmentList[i].startAddress=proHeadervaddr。 exeFormatsegmentList[i].protFlags=proHeaderflags。}return 0。其中, 。啟動bochs在build目錄中執(zhí)行成功后,運行結(jié)果:3.3 project2擴充GeekOS操作系統(tǒng)內(nèi)核,使得系統(tǒng)能夠支持用戶級進程的動態(tài)創(chuàng)建和執(zhí)行。本項目要求用戶對以下幾個文件進行修改:1)“src/GeekOS/”文件中的函數(shù)Spawn(),其功能是生成一個新的用戶級進程;2)“src/GeekOS/”文件中的函數(shù)Switch_To_User_Context(),調(diào)度程序在執(zhí)行一個新的進程前調(diào)用該函數(shù)以切換用戶地址空間;3)“src/GeekOS/”文件中的函數(shù)Parse_ELF_Executable()。4)“src/GeekOS/”文件中主要是實現(xiàn)一些為實現(xiàn)對“src/GeekOS/”中高層操作支持的函數(shù)。 Load_User_Program()函數(shù)的功能通過加載可執(zhí)行文件鏡像創(chuàng)建新進程的User_Context結(jié)構(gòu)。 Switch_To_Address_Space()函數(shù)的功能是通過將進程的LDT裝入到LDT寄存器來激活用戶的地址空間;5)“src/GeekOS/”文件中的Start_User_Thread函數(shù)和Setup_User_Thread函數(shù)。 Start_User_Thread()是一個高層操作,該函數(shù)使用User_Context對象開始一個新進程。要求用戶實現(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ù)。Geekos的初始系統(tǒng)不支持用戶態(tài)進程,但提供了用戶態(tài)進程上下文接口和實現(xiàn)用戶態(tài)進程需要用到的數(shù)據(jù)結(jié)構(gòu)。在Geekos中為了區(qū)分用戶態(tài)進程和內(nèi)核進程,在Kernel_Thread結(jié)構(gòu)體中設(shè)置了一個字段userContext,指向用戶態(tài)進程上下文。因此在Geekos中要判斷一個進程是內(nèi)核進程還是用戶態(tài)進程,只要通過userContext字段是否為空來判斷就可以了。操作系統(tǒng)中還設(shè)置一個全局描述符表(GDT,Global Descriptor Table),用于記錄了系統(tǒng)中所有進程的ldt描述符。添加代碼================== ===============//產(chǎn)生一個進程(用戶態(tài))int Spawn(const char *program, const char *mand, struct Kernel_Thread **pThread){ //TODO(Spawn a process by reading an executable from a filesystem)。 //標(biāo)記各函數(shù)的返回值,為0則表示成功,否則失敗 char *exeFileData = 0。//可執(zhí)行文件的長度 struct User_Context *userContext = 0。//指向Kernel_Thread *pThread的指針 struct Exe_Format exeFormat。exeFileData, amp。 goto fail。exeFormat)) != 0 ) {//調(diào)用Parse_ELF_Executable函數(shù)分析ELF格式文件 Print(Failed to Parse ELF File!\n)。 } if((rc = Load_User_Program(exeFileData, exeFileLength, amp。userContext)) != 0) {//調(diào)用Load_User_Program將可執(zhí)行程序的程序段和數(shù)據(jù)段裝入內(nèi)存 Print(Failed to Load User Program!\n)。 }//在堆分配方式下釋放內(nèi)存并再次初始化exeFileData Free(exeFileData)。/* 開始用戶進程,調(diào)用Start_User_Thread函數(shù)創(chuàng)建一個進程并使其進入準(zhǔn)備運行隊列*/ process = Start_User_Thread(userContext, false)。/* 返回核心進程的指針 */ *pThread = process。//記錄當(dāng)前進程的ID } else//超出內(nèi)存 project2\include\geekos\ rc = ENOMEM。fail: //如果新進程創(chuàng)建失敗則注銷User_Context對象 if (exeFileData != 0) Free(exeFileData)。//銷毀進程對象 return rc。 static struct User_Context* s_currentUserContext。 struct User_Context* userContext = kthreaduserContext。 if (userContext == 0) { //userContext為0表示此進程為核心態(tài)進程就不用切換地址空間 return。 //if (userDebug) Print(A[%p]\n, kthread)。//為用戶態(tài)進程時則切換地址空間 esp0 = ((ulong_t) kthreadstackPage) + PAGE_SIZE。/* 新進程的核心棧. */ Set_Kernel_Stack_Pointer(esp0)。 }} ================== ====================同 project1=================== ===================//需在此文件各函數(shù)前增加一個函數(shù),此函數(shù)的功能是按給定的大小創(chuàng)建一個用戶級進程上下文,具體實現(xiàn)如下://函數(shù)功能:按給定的大小創(chuàng)建一個用戶級進程上下文static struct User_Context* Create_User_Context(ulong_t size){ struct User_Context * UserContext。 UserContext = (struct User_Context *)Malloc(sizeof(struct User_Context))。 //為核心態(tài)進程 else goto fail。 memset(UserContextmemory, 39。, size)。 //以下為用戶態(tài)進程創(chuàng)建LDT(段描述符表) //新建一個LDT描述符 UserContextldtDescriptor = Allocate_Segment_Descriptor()。 //初始化段描述符 Init_LDT_Descriptor(UserContextldtDescriptor, UserContextldt, NUM_USER_LDT_ENTRIES)。 //新建一個文本段描述符 Init_Code_Segment_Descriptor( amp。 //新建一個數(shù)據(jù)段 Init_Data_Segment_Descriptor( amp。 //新建數(shù)據(jù)段和文本段選擇子 UserContextcsSelector = Selector(USER_PRIVILEGE, false, 0)。 //將引用數(shù)清0 UserContextrefCount = 0。fail: if (UserContext != 0){ if (UserContextmemory != 0){ Free(UserContextmemory)。 } return 0。 //釋放占用的LDT Free_Segment_Descriptor(userContextldtDescriptor)。 //釋放內(nèi)存空間 Free(userContextmemory)。 //釋放userContext本身占用的內(nèi)存 Free(userContext)。}int Load_User_Program(char *exeFileData, ulong_t exeFileLength,struct Exe_Format *exeFormat, const char *mand, struct User_Context **pUserContext){ //TODO(Load a user executable into a user memory space using segmentation)。 ulong_t maxva = 0。//進程數(shù)目 ulong_t argBlockSize。//參數(shù)塊地址 struct User_Context *userContext =
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1