2017-03-07 109 views
0

跟進this的問題。我正在編寫自己的(非常基本的)標準庫(用-nostdlib gcc選項編譯)。看來,幾乎所有的基礎是writereadcreatopenclose執行我自己的系統調用

這是我的理解是,glibc的只是使用存根,SYSCALL_INTERNAL宏等來提供這些功能。我沒有使用glibc,我也不想變得非常複雜。

我的問題。如何在沒有glibc的情況下調用Unix低級函數,如writeread

+1

所有的Linux系統調用都是通過'syscall()'來實現的。您可以直接使用它或查看其源代碼。有點有用的問題:http://stackoverflow.com/questions/10149621/where-can-i-find-system-call-source-code – DyZ

回答

1

可以使系統直接從彙編語言要求,例如,對於Linux的x86_64的:

main.c

long mywrite(int, const void *, unsigned long); 

int main(void) 
{ 
    char buffer[] = "Hello, world!\n"; 
    mywrite(1, buffer, 14); 
    return 0; 
} 

write.S

.global mywrite 

.text 

mywrite: 
     push %rbp 
     mov  %rsp, %rbp 
     mov  $1, %rax 
     syscall 
     leave 
     ret 

與輸出:

[email protected]:~/src/sandbox/syscall$ gcc -o sc main.c write.S 
[email protected]:~/src/sandbox/syscall$ ./sc 
Hello, world! 
[email protected]:~/src/sandbox/syscall$ 

很明顯,這個實現並沒有設置errno或類似的東西,但這與實際進行系統調用無關。在彙編中實現一個syscall()函數會更容易,然後使用常規的C函數來調用它。

相關問題