le morceau de code suivant fait partie du programme présent à ce lien http://dune.scs.stanford.edu/. Je suis/nous ne sommes pas en mesure de comprendre son fichier dune.S spécifiquement pièce suivante. J'espère que cette pièce appelle la commande ioctl DUNE_ENTER définie commecompréhension de l'appel ioctl de l'assemblage
#define DUNE_ENTER _IOR(DUNE_MINOR, 0x01, struct dune_config)
Ai-je raison?
.globl __dune_enter
__dune_enter://called in entry.c::do_dune_enter
pushfq
subq $REG_END, %rsp
SAVE_REGS 1, 0
SAVE_REST
movq %rsp, DUNE_CFG_RSP(%rsi)
movq %rsi, %rdx
movq $0x8020e901, %rsi /* XXX DUNE_ENTER */ //me: how does he in advance knows the address of dune_enter
movq $16, %rax /* __NR_ioctl */
syscall //me:is instruction just like sysenter or int 80 for x86_64
cmpq $0, %rax
jnz __dune_ret
movq DUNE_CFG_RET(%rdx), %rdi
movq $60, %rax /* __NR_exit */
syscall
.globl __dune_ret
__dune_ret:
RESTORE_REST
RESTORE_REGS 1, 0
addq $REG_END, %rsp
popfq
retq
Tout commentaire ou aider même vous sentir simple et déjà compris sera très appréciée
merci beaucoup pour votre réponse. Je frappe ma tête avec le concept que vous avez fourni à partir du pilote de périphérique Linux, mais pas d'utilisation. Mais je pense maintenant que le problème se résume à mon niveau (je l'espère) pourquoi% RAX a 16 $ alors que ioctl a le numéro 54? – shami
Les numéros 'ioctl' ne sont pas les mêmes sur 32 et 64 bits. '54' est le nombre de 32 bits,' 16' est le nombre de 64 bits. – Jester