Mon professeur m'a demandé d'écrire une fonction C qui n'effectue aucun système SysCalls. Peu importe que la fonction ne réalise rien.
Est-ce que la fonction suivante effectue n'importe quel système SYSCALL? P>
int func() { return 0; }
3 Réponses :
Oui ce qui précède a des appels système. Vous pouvez utiliser pTrace () pour arrêter chaque fois qu'il existe un appel système et vous verrez qu'il y a des appels système. Comment le programme serait-il chargé et déchargé de la mémoire sans le système d'exploitation? p>
La question originale avait une fonction vide code> code>. At-il un appel système? Cela dépend de ce que vous entendez par "avoir". L'environnement d'appel effectue sans aucun doute des appels système, mais la fonction elle-même ne le fait pas. La question révisée a une fonction vide appelée func code>. Cette fonction ne fait clairement pas explicitement aucun appels de système - mais pour tout ce que nous savons, la mise en œuvre pourrait nécessiter un appel système pour allouer un enregistrement d'activation d'appel de la fonction. S'il est possible de disposer d'une fonction qui n'a pas "d'avoir" des appels système, une fonction vide vide est certainement qualifiée.
Non, votre exemple fonction ne fait pas d'appels système. Vous pouvez simplement compiler et démonter cela pour être sûr:
$ cc -c example.c $ objdump -d example.o example.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <func>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: b8 00 00 00 00 mov $0x0,%eax 9: 5d pop %rbp a: c3 retq
Je suis curieux de cette réponse, car je pense qu'un programme ne peut pas fonctionner sans SysCalls. Avez-vous vu les autres réponses?
Même si le code lui-même ne contient pas d'appels système (ce qui pourrait répondre aux exigences), il existe des appels système implicites pour initialiser, exécuter, arrêter et nettoyer le processus, même s'ils ne font pas partie de votre binaire. Quels appels système sont effectués est à charge de la plate-forme. De plus, au moins l'état de sortie sera défini en fonction de la fermeture de votre processus: déclaration de retour vs Quitter () dans Main () < / a> p>
Je suppose que votre enseignant sera satisfait de ce code, il n'utilise pas la bibliothèque standard, qui contient lui-même de nombreux appels de système à des fins différentes (comme la plupart des autres bibliothèques). Vous ne pourrez pas lire / écrire de / à STDIN / OUT et fichiers / sockets, etc. Vous ne pouvez donc pas faire IO, création de processus et multithreading, synchronisation, etc. puisque tout ce qui nécessite des appels système (des choses comme Les threads d'utilisateur et les spinlocks peuvent être une exception notable ici).
On ne peut pas écrire des programmes utiles de zone utilisateur sans appels système, à l'exception des programmes qui prennent des arguments, avec un résultat renvoyé sous forme d'un int code> (E.G. Outils de ligne de commande). Vous pouvez également implémenter des trucs de chauffage CPU 'entièrement calme'. P>
Oui, il n'utilise pas libc. Je vais vérifier demain et répondre. Thx pour votre réponse ;-)
Ce n'est pas clair; Vous demandez si ce code, qui ne fait rien, fait quelque chose?
Est-ce une sorte de question piège? En fin de compte, oui, votre code va appeler _exit (0).
Mon professeur me demande d'écrire Func sans SysCall. Peu importe que cela ne fait rien.
Ou de mettre d'une autre manière, tout programme qui se termine doit avoir un système SYSCALL, car il n'y a pas d'instruction un programme (non indéfini) peut utiliser pour rendre le processeur arrêter d'exécuter des instructions!
@nikita_em ajoutez cette ligne dans votre question en premier, expliquez toujours votre question bien que vous pouvez comprendre et réagir.
Il a dit "Je sais comment écrire Func, cela n'a pas d'appel SYS", alors je suis en difficulté :(
Une fonction? Ou un programme entier?
La première ligne dit Func i>.
Bien sûr, mais l'exemple est
principal code>, qui est spécial, et tous les autres commentaires semblent parler des programmes entiers de Baout.
Une fonction! Mon erreur :( fixe