отображение ioctl в его определение

Нестандартный ход: использование буферов сокетов.

Пример:

# echo 2000000000 > /proc/sys/net/core/wmem_max
$ socat -u system:'pv -c -N i /dev/zero',sndbuf=1000000000 - | pv -L 100k -c -N o > /dev/null
        i:  468MB 0:00:16 [ 129kB/s] [  <=>                        ]
        o: 1.56MB 0:00:16 [ 101kB/s] [       <=>                   ]

Для этого реализованы два дополнительных инструмента: buffered_pipeline и mapopentounixsocket

$ ./buffered_pipeline ! pv -i 10 -c -N 1 /dev/zero ! $((20*1000*1000)) ! pv -i 10 -L 100k -c -N 2 ! > /dev/zero
        1: 13.4MB 0:00:40 [ 103kB/s] [         <=>      ]
        2: 3.91MB 0:00:40 [ 100kB/s] [         <=>      ]

0
02.05.2018, 16:27
1 ответ

В${kernel_root}/fs/ioctl.c(в 4.13 )есть:

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

Это SYSCALL_DEFINE3— это макрос, который принимает эти параметры и расширяет их до соответствующей подписи для системного вызова. Эта функция является логической точкой входа для системного вызова ioctlиз пространства пользователя. Эта функция, в свою очередь, ищет struct fd, соответствующий данному дескриптору файла, и вызывает do_vfs_ioctl, передавая struct file, связанный с struct fd. Вызов пройдет через уровень VFS, прежде чем достигнет драйвера, но это должно дать вам место для начала поиска.

1
28.01.2020, 04:23

Теги

Похожие вопросы