[問題] 驅動程式 ioctl機制
hi 大家好,
我又讀了平田豐那本LDD Programming驅動設計, 第六章, 關於ioctl
有一些心得, 跟大家分享, 當然也希望大家指出我錯的地方
ioctl在2.6.36版以後有一些變動, 這邊的說法仍然以舊版的為主
==
其實我在讀這邊的時候, 最主要的疑惑是是(不知道會不會很蠢)
為什麼user space 呼叫ioctl的時候只有帶入三個參數?
EX: ioctl(fd, IOCTL_VALGET, &cmd);(平田豐P.160)
但是我看ioctl的原型是四個參數
EX: int devone_ioctl(struct inode *inode, struct file *filp, unsigned int
cmd, unsigned long arg)(平田豐P.155)
經過了反覆的推敲, 以及下去追原始碼, 我想user space 的 ioctl()(平田豐P.160)與
file_operations中的ioctl()方法, 並不是同一個函式, 所以從來就沒有三個或四個參數
的問題
user space呼叫了 ioctl()之後,
ioctl() 透過unistd.h中的定義(但是這邊我還不太清楚怎麼定義的, 有人可以告訴我
嗎?)
------------unistd.h------------
/* fs/ioctl.c */
#define __NR_ioctl 29
__SYSCALL(__NR_ioctl, sys_ioctl)
--------------------------------
定義了 ioctl() 其實就是呼叫system call, sys_ioctl(),
而/fs/ioctl.c中的 SYSCALL_DEFINE3() 就是sys_ioctl(),
這個 SYSCALL_DEFINE3() 會透過一些#define(寫在syscalls.h中), 定義為sys_ioctl(),
裡面描述了user space中呼叫了ioctl()之後應該要做哪一些處理, 以及ioctl()的"三"個
參數
然後sys_ioctl()(也就是SYSCALL_DEFINE3())裡面呼叫do_vfs_ioctl(),
do_vfs_ioctl()再呼叫vfs_ioctl()
最後vfs_ioctl()裡面會呼叫file_operations中的ioctl()(2.6.36以後是呼叫
unlock_ioctl()),
在這邊才是送"四"個參數給file_operations中的ioctl()
然後就做你的驅動程式裡面的.ioctl = your_ioctl
以上是我的心得, 寫得很亂, 見笑了.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.12.226
推
02/14 23:16, , 1F
02/14 23:16, 1F
推
02/15 23:14, , 2F
02/15 23:14, 2F
推
02/18 11:36, , 3F
02/18 11:36, 3F
推
02/18 22:13, , 4F
02/18 22:13, 4F
推
03/07 11:24, , 5F
03/07 11:24, 5F
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章