Linux系統(tǒng)調(diào)用例程system_call和參數(shù)傳遞
發(fā)布時間:2009/2/18 0:00:00 訪問次數(shù):2166
系統(tǒng)調(diào)用接口調(diào)用“int $ox8o”指令進(jìn)入內(nèi)核并準(zhǔn)各了相關(guān)參數(shù)后,剩下的工作就由系統(tǒng)調(diào)用例程來進(jìn)行。linux定義的系統(tǒng)調(diào)用 例程的入口為system_call。下面具體介紹system_call所做的工作。
system_call是用匯編語言編寫的,在i386體系中,其前半部分代碼如下:
這部分代碼的任務(wù)是傳遞系統(tǒng)調(diào)用號和參數(shù)。
前面談到,為了識別具體的內(nèi)核服務(wù)例程,必須用寄存器eax傳遞系統(tǒng)調(diào)用號。除此之外,某些內(nèi)核服務(wù)例程還需要一些由用戶提供 的參數(shù)。例如,內(nèi)核服務(wù)例程mmap()除系統(tǒng)調(diào)用號之外還需要6個參數(shù)。
傳遞參數(shù)的任務(wù)是由處理器的寄存器來完成的。
在ijbo系統(tǒng)中,用來進(jìn)行參數(shù)傳遞工作的寄存器依次為eax、ebx、ecx、edx、est和edi。其中,eax被指定用于系統(tǒng)調(diào)用號的傳遞。 所以,在函數(shù)system_call中,一開始就使用宏save_all把處理器的各寄存器壓棧,以便以后系統(tǒng)調(diào)用服務(wù)例程可從內(nèi)核堆棧中根據(jù) 需要找到相關(guān)的參數(shù)。
可見,為了傳遞參數(shù),在系統(tǒng)調(diào)用接口中就應(yīng)把所有參數(shù)按照規(guī)定事先存入各寄存器。至于參數(shù)多于6個的情況,可采用在內(nèi)存中設(shè) 置一個參數(shù)緩沖區(qū),而讓處理器的寄存器作為指針指向的這個參數(shù)緩沖區(qū)的辦法來解決。
接下來,程序?qū)M(jìn)程傳遞的系統(tǒng)調(diào)用號進(jìn)行有效性檢查。如果無效,則系統(tǒng)調(diào)用中止:
如果有效,則根據(jù)寄存器eax提供的系統(tǒng)調(diào)用號并通過syscall_table來調(diào)用對應(yīng)的內(nèi)核服務(wù)例程:call*sys_call_table(0,% eax,4)
當(dāng)服務(wù)例程結(jié)束時,system_call從eax獲得返回值,然后跳轉(zhuǎn)到返回函數(shù)ret_from_sys_call返回用戶態(tài):
movl % eax,24(% esp)
jmp ret_from_sys_call
歡迎轉(zhuǎn)載,信息來自維庫電子市場網(wǎng)(www.dzsc.com)
系統(tǒng)調(diào)用接口調(diào)用“int $ox8o”指令進(jìn)入內(nèi)核并準(zhǔn)各了相關(guān)參數(shù)后,剩下的工作就由系統(tǒng)調(diào)用例程來進(jìn)行。linux定義的系統(tǒng)調(diào)用 例程的入口為system_call。下面具體介紹system_call所做的工作。
system_call是用匯編語言編寫的,在i386體系中,其前半部分代碼如下:
這部分代碼的任務(wù)是傳遞系統(tǒng)調(diào)用號和參數(shù)。
前面談到,為了識別具體的內(nèi)核服務(wù)例程,必須用寄存器eax傳遞系統(tǒng)調(diào)用號。除此之外,某些內(nèi)核服務(wù)例程還需要一些由用戶提供 的參數(shù)。例如,內(nèi)核服務(wù)例程mmap()除系統(tǒng)調(diào)用號之外還需要6個參數(shù)。
傳遞參數(shù)的任務(wù)是由處理器的寄存器來完成的。
在ijbo系統(tǒng)中,用來進(jìn)行參數(shù)傳遞工作的寄存器依次為eax、ebx、ecx、edx、est和edi。其中,eax被指定用于系統(tǒng)調(diào)用號的傳遞。 所以,在函數(shù)system_call中,一開始就使用宏save_all把處理器的各寄存器壓棧,以便以后系統(tǒng)調(diào)用服務(wù)例程可從內(nèi)核堆棧中根據(jù) 需要找到相關(guān)的參數(shù)。
可見,為了傳遞參數(shù),在系統(tǒng)調(diào)用接口中就應(yīng)把所有參數(shù)按照規(guī)定事先存入各寄存器。至于參數(shù)多于6個的情況,可采用在內(nèi)存中設(shè) 置一個參數(shù)緩沖區(qū),而讓處理器的寄存器作為指針指向的這個參數(shù)緩沖區(qū)的辦法來解決。
接下來,程序?qū)M(jìn)程傳遞的系統(tǒng)調(diào)用號進(jìn)行有效性檢查。如果無效,則系統(tǒng)調(diào)用中止:
如果有效,則根據(jù)寄存器eax提供的系統(tǒng)調(diào)用號并通過syscall_table來調(diào)用對應(yīng)的內(nèi)核服務(wù)例程:call*sys_call_table(0,% eax,4)
當(dāng)服務(wù)例程結(jié)束時,system_call從eax獲得返回值,然后跳轉(zhuǎn)到返回函數(shù)ret_from_sys_call返回用戶態(tài):
movl % eax,24(% esp)
jmp ret_from_sys_call
歡迎轉(zhuǎn)載,信息來自維庫電子市場網(wǎng)(www.dzsc.com)
熱門點(diǎn)擊
- Linux設(shè)備驅(qū)動程序的函數(shù)跳轉(zhuǎn)表
- Linux系統(tǒng)調(diào)用例程system_call
- PIE中斷向量的映射方式
- PIE模塊級中斷
- 什么是Linux內(nèi)核模塊
- Linux系統(tǒng)調(diào)用接口、系統(tǒng)調(diào)用例程和內(nèi)核服
- ARM復(fù)位原理
- Linux系統(tǒng)調(diào)用接口、系統(tǒng)調(diào)用例程和內(nèi)核服
- Linux字符設(shè)備驅(qū)動程序的注冊
- Linux外部設(shè)備的基本概念
推薦技術(shù)資料
- DFRobot—玩的就是
- 如果說新車間的特點(diǎn)是“靈動”,F(xiàn)QPF12N60C那么... [詳細(xì)]
- 車載顯示技術(shù)AR
- 2 納米工藝 A18 Pro 芯片參數(shù)技術(shù)應(yīng)
- 新一代 HBM3/HBM3e
- NAND FLASH控制器芯片
- SoC芯片架構(gòu)設(shè)計
- 嵌入式存儲芯片PPI Nand
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究