linux system函数传参,Linux系统调用例程system_call和参数传递
系統調用接口調用“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
:
總結
以上是生活随笔為你收集整理的linux system函数传参,Linux系统调用例程system_call和参数传递的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谷歌浏览器手势_分享一些日常手势[狗头]
- 下一篇: linux安装DNS服务命令,Linux