mapeamento de ioctl para sua definição

0

O protótipo do ioctl nos módulos do driver linux é

int ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg);

ou

long ioctl(struct file *f, unsigned int cmd, unsigned long arg);

mas dentro de sys / ioctl.h é

int ioctl(int fd, int request, void *argp);

O primeiro tipo de argumento é diferente, existe algum módulo entre o programa de chamada ioctl e o driver que converte este argumento (do descritor de arquivo para o ponteiro da estrutura de arquivos)?

Como esse mapeamento funciona? (Do descritor de arquivo para o arquivo).

    
por Xter 02.05.2018 / 15:27

1 resposta

0

Em ${kernel_root}/fs/ioctl.c (em 4.13), há:

SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)

Esse SYSCALL_DEFINE3 é uma macro que pega esses parâmetros e os expande para a assinatura apropriada para a chamada do sistema. Essa função é o ponto de entrada lógico para a chamada do sistema ioctl do espaço do usuário. Essa função, por sua vez, procura o struct fd correspondente ao descritor de arquivo fornecido e chama do_vfs_ioctl passando o struct file associado ao struct fd . A chamada passará pela camada VFS antes de chegar ao driver, mas isso deve dar a você um lugar para começar a procurar.

    
por 02.05.2018 / 16:01