Linux系統調用例程system_call和參數傳遞
發布時間:2009/2/18 0:00:00 訪問次數:2162
系統調用接口調用“int $ox8o”指令進入內核并準各了相關參數后,剩下的工作就由系統調用例程來進行。linux定義的系統調用 例程的入口為system_call。下面具體介紹system_call所做的工作。
system_call是用匯編語言編寫的,在i386體系中,其前半部分代碼如下:
這部分代碼的任務是傳遞系統調用號和參數。
前面談到,為了識別具體的內核服務例程,必須用寄存器eax傳遞系統調用號。除此之外,某些內核服務例程還需要一些由用戶提供 的參數。例如,內核服務例程mmap()除系統調用號之外還需要6個參數。
傳遞參數的任務是由處理器的寄存器來完成的。
在ijbo系統中,用來進行參數傳遞工作的寄存器依次為eax、ebx、ecx、edx、est和edi。其中,eax被指定用于系統調用號的傳遞。 所以,在函數system_call中,一開始就使用宏save_all把處理器的各寄存器壓棧,以便以后系統調用服務例程可從內核堆棧中根據 需要找到相關的參數。
可見,為了傳遞參數,在系統調用接口中就應把所有參數按照規定事先存入各寄存器。至于參數多于6個的情況,可采用在內存中設 置一個參數緩沖區,而讓處理器的寄存器作為指針指向的這個參數緩沖區的辦法來解決。
接下來,程序對進程傳遞的系統調用號進行有效性檢查。如果無效,則系統調用中止:
如果有效,則根據寄存器eax提供的系統調用號并通過syscall_table來調用對應的內核服務例程:call*sys_call_table(0,% eax,4)
當服務例程結束時,system_call從eax獲得返回值,然后跳轉到返回函數ret_from_sys_call返回用戶態:
movl % eax,24(% esp)
jmp ret_from_sys_call
歡迎轉載,信息來自維庫電子市場網(www.dzsc.com)
系統調用接口調用“int $ox8o”指令進入內核并準各了相關參數后,剩下的工作就由系統調用例程來進行。linux定義的系統調用 例程的入口為system_call。下面具體介紹system_call所做的工作。
system_call是用匯編語言編寫的,在i386體系中,其前半部分代碼如下:
這部分代碼的任務是傳遞系統調用號和參數。
前面談到,為了識別具體的內核服務例程,必須用寄存器eax傳遞系統調用號。除此之外,某些內核服務例程還需要一些由用戶提供 的參數。例如,內核服務例程mmap()除系統調用號之外還需要6個參數。
傳遞參數的任務是由處理器的寄存器來完成的。
在ijbo系統中,用來進行參數傳遞工作的寄存器依次為eax、ebx、ecx、edx、est和edi。其中,eax被指定用于系統調用號的傳遞。 所以,在函數system_call中,一開始就使用宏save_all把處理器的各寄存器壓棧,以便以后系統調用服務例程可從內核堆棧中根據 需要找到相關的參數。
可見,為了傳遞參數,在系統調用接口中就應把所有參數按照規定事先存入各寄存器。至于參數多于6個的情況,可采用在內存中設 置一個參數緩沖區,而讓處理器的寄存器作為指針指向的這個參數緩沖區的辦法來解決。
接下來,程序對進程傳遞的系統調用號進行有效性檢查。如果無效,則系統調用中止:
如果有效,則根據寄存器eax提供的系統調用號并通過syscall_table來調用對應的內核服務例程:call*sys_call_table(0,% eax,4)
當服務例程結束時,system_call從eax獲得返回值,然后跳轉到返回函數ret_from_sys_call返回用戶態:
movl % eax,24(% esp)
jmp ret_from_sys_call
歡迎轉載,信息來自維庫電子市場網(www.dzsc.com)
熱門點擊
- Linux設備驅動程序的函數跳轉表
- Linux系統調用例程system_call
- PIE中斷向量的映射方式
- 什么是Linux內核模塊
- PIE模塊級中斷
- Linux系統調用接口、系統調用例程和內核服
- ARM復位原理
- Linux系統調用接口、系統調用例程和內核服
- Linux字符設備驅動程序的注冊
- Linux外部設備的基本概念
推薦技術資料
- DFRobot—玩的就是
- 如果說新車間的特點是“靈動”,FQPF12N60C那么... [詳細]