[問題] 驅動程式 ioctl機制

看板LinuxDev作者 (大鳥)時間14年前 (2012/02/14 20:13), 編輯推噓5(500)
留言5則, 5人參與, 最新討論串1/1
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
文章代碼(AID): #1FEa_D6M (LinuxDev)
文章代碼(AID): #1FEa_D6M (LinuxDev)