2015-11-29 2 views
-1

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

Répondre

3

$0x8020e901 est pas l'adresse de quoi que ce soit. Il s'agit d'informations codées sur le type, la fonction, la direction et la taille de l'argument. Il est créé par la macro _IOR par d'autres macros:

#define _IOC_NRBITS  8 
#define _IOC_TYPEBITS 8 

/* 
* Let any architecture override either of the following before 
* including this file. 
*/ 

#ifndef _IOC_SIZEBITS 
# define _IOC_SIZEBITS 14 
#endif 

#ifndef _IOC_DIRBITS 
# define _IOC_DIRBITS 2 
#endif 

#define _IOC_NRSHIFT 0 
#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) 
#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) 
#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) 

#ifndef _IOC_READ 
# define _IOC_READ  2U 
#endif 

#define _IOC(dir,type,nr,size) \ 
     (((dir) << _IOC_DIRSHIFT) | \ 
     ((type) << _IOC_TYPESHIFT) | \ 
     ((nr) << _IOC_NRSHIFT) | \ 
     ((size) << _IOC_SIZESHIFT)) 

#define _IOR(type,nr,size) 
    _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size))) 

Alors, que tout cela se résume par défaut est la suivante:

Bits 
0- 7 function number 
8-15 type 
16-29 size 
30-31 direction 

L'ingénierie inverse du nombre, nous pouvons voir que DUNE_MINOR est 0xe9 et sizeof(struct dune_config) devrait être 0x20.

+0

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

+1

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