2017-03-07 6 views
0

Suite à la question this. J'écris ma propre bibliothèque standard (très basique) (compilant avec l'option -nostdlib gcc). Il semble que la base de presque tout est write, read, creat, open, close, etc.Mettre en œuvre mes propres appels système

Je crois comprendre que glibc utilise simplement les talons, SYSCALL_INTERNAL macros, etc. pour fournir ces fonctions. Je n'utilise pas la glibc et je ne veux pas devenir très compliqué.

Ma question. Comment puis-je appeler les fonctions de bas niveau Unix telles que write et read sans glibc?

+1

Tous les appels système Linux sont implémentés via 'syscall()'. Vous pouvez l'utiliser directement ou regarder dans son code source. Question un peu utile: http://stackoverflow.com/questions/10149621/where-can-i-find-system-call-source-code – DyZ

Répondre

1

Vous pouvez rendre le système des appels directement depuis le langage d'assemblage, par exemple, pour 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 

avec sortie:

[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$ 

De toute évidence, cette implémentation ne définit pas errno ou quoi que ce soit de ce type, mais cela n'a rien à voir avec les appels système. Il sera plus facile d'implémenter une seule fonction syscall() dans l'assemblage, puis d'avoir des fonctions C régulières pour l'appeler.