看板 LinuxDev 關於我們 聯絡資訊
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
alongalone:有分享有推~~ 02/14 23:16
darkangel:有分享有推! 02/15 23:14
Gway:分享就要推一下 02/18 11:36
mimi0213:很不錯 02/18 22:13
guestone:推精神可佳 03/07 11:24