![](https://csdnimg.cn/release/download_crawler_static/9314961/bg1.jpg)
linux 应用程序中的 open 操作与硬件驱动之间的联系浅析
----针对 串口设备 /dev/ttySPx
内核:linux-2.6.35.3 版本
硬件:IMX287
第一节
open 函数的系统操作过程,在 fs/open.c 文件中
read、write 函数的系统操作过程,在 fs/read_write.c 文件中
对于 linux 下所有的系统调用函数,均可找到与其对应的内核函数 sys_xxx().比如此处的 open
函数,对应内核函数就是 sys_open。只不过,在此内核版本中,它的定义是如下这种形式
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int,mode)。
这个 SYSCALL_DEFINE3 就是个宏定义,如果展开,到最后,其实上面这个函数就是
asmlinkage long sys_open(const char __user filename,int flags,int mode)。
那么,就是上面说过的,open 函数,对应的内核函数,就是 sys_open,这种形式。
好了,下面就 open 函数的实现过程做一个说明,如下:
Open---sys_open 即 SYSCALL_DEFINE3(open, const char __user *, filename, int, flags,
int,mode)---do_sys_open---do_filp_open---do_last---nameidata_to_filp---__
dentry_open---f->f_op = fops_get(inode->i_fop);与 open = f->f_op->open;与 error =
open(inode, f);
到这里的时候,我们先理解一下。f->f_op = fops_get(inode->i_fop) 的作用,是根据需要打
开的文件的文件名,找到 inode。然后将 inode 中的操作集合赋值给目前的文件描述符。然后调
用操作集中的 open 函数来打开设备。
例如,我们应用程序这么写
fd = open ("/dev/ttySP0", O_RDWR | O_NOCTTY | O_NONBLOCK);//打开串口驱动文件,获得文
件描述符。
这里的,"/dev/ttySP0" 就是文件名。根据"/dev/ttySP0"这个文件名,找到对应的 inode,就
可以找到对应的操作集合。
第一个问题:为什么根据 "/dev/ttySP0",就能找到 inode 呢?
第二个问题:找到 inode 就得到了文件操作集合了吗?
答:第一个问题,我们注册了设备驱动,才会在 dev/目录下生成一个文件名。这个文件名,是
注册设备的时候,我们自己起的名字。使用注册函数注册设备驱动时,注册函数完成的工作之一,
就是在/dev 目录下创建一个文件名,并且从系统中取得一个 inode 与这个文件名对应。
第二个问题:注册设备的时候,系统就记录了 inode 号与操作集合的对应。所以,找到 inode
号,就得到了操作集合的地址。
文件名相当于序号,inode 才是真正存储驱动相关信息的实体。
qintm_tomorrow@163.com