




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、4 系統(tǒng)調(diào)用,沈峰,為什么采用系統(tǒng)調(diào)用?,有時(shí)用戶(hù)程序需要與系統(tǒng)進(jìn)行交互,如需要存取其它內(nèi)存空間或執(zhí)行其它特權(quán)操作等。 例如,如果用戶(hù)程序想寫(xiě)屏幕,它就需要存取顯示存儲(chǔ)器,而顯示存儲(chǔ)器是位于用戶(hù)進(jìn)程的存儲(chǔ)空間之外的; 如果用戶(hù)程序想執(zhí)行特權(quán)操作,如I/O指令(I/O指令需要OS內(nèi)核來(lái)執(zhí)行,用戶(hù)程序是無(wú)權(quán)操作的)。,系統(tǒng)調(diào)用是什么?,操作系統(tǒng)因此提供了一系列的系統(tǒng)調(diào)用,這些調(diào)用是一些用于實(shí)現(xiàn)用戶(hù)程序需求的例程。但是,這些例程是運(yùn)行在受保護(hù)的內(nèi)存中的,因此需要OS提供特殊的機(jī)制來(lái)使用它們。,GeekOS中的系統(tǒng)調(diào)用,INT90 在應(yīng)用程序端把參數(shù)放置到寄存器中 在內(nèi)核端重新獲取應(yīng)用程序端傳遞進(jìn)來(lái)的
2、參數(shù) 調(diào)用對(duì)應(yīng)的函數(shù): Sys_xxx 返回結(jié)果或錯(cuò)誤代碼 使用 g_CurrentThread 獲取當(dāng)前運(yùn)行的進(jìn)程,GeekOS中的系統(tǒng)調(diào)用,在GeekOS中為了使用系統(tǒng)調(diào)用,用戶(hù)程序需要使用int指令發(fā)送一個(gè)處理器中斷。GeekOS提供了一個(gè)中斷號(hào)0X90的中斷處理者(參見(jiàn)trap.c line41),這個(gè)中斷處理者例程就是Syscall_Handler trap.c 中static void Syscall_Handler(struct Interrupt_State* state),Trap.c,System call handler. Syscall_Handler uint_t s
3、yscallNum = state-eax; state-eax = g_syscallTablesyscallNum(state); Initialize handlers for processor traps. void Init_Traps(void) Install_Interrupt_Handler(0X90, ,Syscall_Handler(struct Interrupt_State* state),此函數(shù)檢查寄存器eax中的當(dāng)前值,然后調(diào)用適當(dāng)?shù)南到y(tǒng)例程來(lái)響應(yīng)系統(tǒng)調(diào)用請(qǐng)求.eax中的值稱(chēng)為系統(tǒng)調(diào)用號(hào)。 接受系統(tǒng)請(qǐng)求的例程接收到了調(diào)用者傳遞過(guò)來(lái)的保存在結(jié)構(gòu)體Interrupt
4、_State中的調(diào)用者的上下文,因此通用寄存器(ebx,ecx,edx)可用于用戶(hù)程序與中斷處理者例程之間相互傳遞數(shù)據(jù)。,系統(tǒng)調(diào)用的例程,所有系統(tǒng)調(diào)用的例程都定義在 src/geekos/syscall.c中: Sys_Null, Sys_Exit, 等. 通常系統(tǒng)調(diào)用的例程都執(zhí)行如下工作: (1)抽取用戶(hù)程序傳遞過(guò)來(lái)的所有參數(shù)。這些參數(shù)保存在寄存器中,并由用戶(hù)程序的上下文傳遞給系統(tǒng)調(diào)用例程。這些參數(shù)可以通過(guò)如下方式獲得:state-ebx, state-ecx等。 (2)實(shí)現(xiàn)特定系統(tǒng)調(diào)用的邏輯功能 (3) 返回結(jié)果或適當(dāng)?shù)腻e(cuò)誤代碼,在從系統(tǒng)調(diào)用例程返回之前,必須使用恢復(fù)用戶(hù)進(jìn)程上下文使得用戶(hù)
5、程序能夠繼續(xù)從它離開(kāi)處繼續(xù)執(zhí)行。指向用戶(hù)程序上下文(保存在內(nèi)核堆棧中)的指針實(shí)際上就是傳遞給Syscall_Handler的參數(shù)。 Syscall_Handler(struct Interrupt_State* state),從用戶(hù)線(xiàn)程引發(fā)系統(tǒng)調(diào)用的流程:,在Src/user/shell.c 輸入用戶(hù)程序名稱(chēng)時(shí)的調(diào)用流程: Spawn_Single_Command() process.c中的函數(shù)Spawn_With_Path Process.c中的Spawn_Program,而Spawn_Program是通過(guò)Syscall.h中的宏DEF_SYSCALL定義的。 在Shell中輸入shell命
6、令時(shí)的調(diào)用流程 如輸入pid時(shí):Get_PID- Process.c中Get_PID也是通過(guò)DEF_SYSCALL定義的。,Process.c,/* System call wrappers */ DEF_SYSCALL(Exit, SYS_EXIT,int,(int exitCode), int arg0 = exitCode;, SYSCALL_REGS_1) DEF_SYSCALL(Get_PID,SYS_GETPID,int,(void),SYSCALL_REGS_0),Syscall.h 系統(tǒng)調(diào)用功能號(hào),enum SYS_NULL, /* Null (no-op) system ca
7、ll */ SYS_EXIT, /* Exit system call */ SYS_PRINTSTRING, /* Print string system call */ SYS_GETKEY, /* Get key system call */ SYS_SETATTR, /* Set screen attribute system call */ SYS_GETCURSOR, /* Get current cursor position */ SYS_PUTCURSOR, /* Put current cursor position */ SYS_SPAWN, /* Spawn proce
8、ss system call */ SYS_WAIT, SYS_GETPID, /* Get pid (process id) system call */ SYS_KILL, /* Kill a process */ SYS_PS, ;,Syscall.c的主要功能,system call handler functions 各類(lèi)系統(tǒng)調(diào)用函數(shù)的具體實(shí)現(xiàn)代碼。 Global table of system call handler functions 各類(lèi)系統(tǒng)調(diào)用函數(shù)名稱(chēng)組成的一個(gè)全局?jǐn)?shù)組。 Number of system calls implemented. 已經(jīng)實(shí)現(xiàn)了的系統(tǒng)調(diào)用個(gè)數(shù)。,各
9、類(lèi)系統(tǒng)調(diào)用函數(shù)名稱(chēng)組成的一個(gè)全局?jǐn)?shù)組,const Syscall g_syscallTable = Sys_Null, Sys_Exit, Sys_PrintString, Sys_GetKey, Sys_SetAttr, Sys_GetCursor, Sys_PutCursor, Sys_Spawn, Sys_Wait, Sys_GetPID, Sys_Kill, Sys_PS, ;,添加新的系統(tǒng)調(diào)用命令需要修改如下文件,SrcuserShell.c (如果增加shell命令,需要修改此文件)。 IncludelibsProcess.h ,srclibc process.c includeGeekosSyscall.h ,srcGeekos Syscall.c,SrcGeekosSys_GetPID函數(shù)的功能,返回當(dāng)前正在運(yùn)行進(jìn)程的 PID,用戶(hù)應(yīng)用程序的編寫(xiě),應(yīng)用程序保存在srcuser目錄下。 編寫(xiě)應(yīng)用程序之后,在Makefile文件第112行添加上自己的應(yīng)用程序文件名 示例: src/user/hello.c #include #include #include int main( int argc , char * argv ) Print (Hello wor
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 軍品訂購(gòu)項(xiàng)目管理辦法
- 北京車(chē)位產(chǎn)權(quán)管理辦法
- 資本驅(qū)動(dòng)下人工智能產(chǎn)業(yè)化的倫理挑戰(zhàn)與應(yīng)對(duì)策略
- 睡眠剝奪對(duì)小鼠色氨酸代謝及行為影響機(jī)制研究
- 體檢機(jī)構(gòu)備案管理辦法
- 佛山酒店宿舍管理辦法
- 西部地區(qū)經(jīng)濟(jì)韌性對(duì)經(jīng)濟(jì)高質(zhì)量發(fā)展的影響研究
- 基于機(jī)器視覺(jué)的鋼板表面缺陷自動(dòng)檢測(cè)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
- 未發(fā)生較大及以上生產(chǎn)安全事故
- 智慧醫(yī)院建設(shè)管理辦法
- 井蓋巡查管理制度
- GB/T 33490-2025展覽展示工程服務(wù)基本要求
- 2024年國(guó)能榆林化工有限公司招聘真題
- 消防總隊(duì)面試題目及答案
- 《低鈉血癥中國(guó)專(zhuān)家共識(shí)(2023年版)》解讀課件
- 公司法期末考試卷及答案
- GB/T 45604-2025船舶與海洋技術(shù)大抓力平衡錨
- 國(guó)家中小學(xué)智慧教育平臺(tái)與人工智能融合應(yīng)用指南(試行)
- 混凝土攪拌站企業(yè)管理規(guī)范與要求
- 物業(yè)公司接管寫(xiě)字樓項(xiàng)目工作時(shí)間倒推計(jì)劃表(T日為入駐日)
- 重點(diǎn)人口管理工作規(guī)定
評(píng)論
0/150
提交評(píng)論