open系统调用
程序员文章站
2022-03-22 20:51:22
...
1.应用层出发
调用open函数 --->>> 在进程里调用的
在创建进程的时候,内核会为该进程创建一个结构体来描述当前进程的所有信息
struct task_struct{
pid_t pid;
pid_t tgid;
...
/* open file information */
struct files_struct *files;
};
struct files_struct {
struct file * fd_array[NR_OPEN_DEFAULT];
}
创建文件的时候,内核会为该文件创建一个结构体来描述创建的文件信息
struct inode{
uid_t i_uid;
gid_t i_gid;
dev_t i_rdev; //设备号
union {
struct pipe_inode_info *i_pipe;
struct block_device *i_bdev;
struct cdev *i_cdev;
};
...
}
在进程中调用open函数,经过系统调用,陷入内核态,内核代替应用层进程执行,为打开的
这个文件创建一个结构体,来描述该打开的文件的所有信息。
struct file{
const struct file_operations *f_op;
unsigned int f_flags; //模式
};
应用层打开设备文件cdev_demo0、cdev_demo1、cdev_demo2在驱动代码中如何区分?
根据驱动中的open接口形参中的inode结构体指针里面的i_rdev来区分
MINOR(i_rdev)
int demo_open(struct inode *inode, struct file *filp)
{
printk("---devfile_minor:%d---\n",MINOR(inode->i_rdev));
printk(KERN_DEBUG "---%s---%s---%d---\n",__FILE__,__func__,__LINE__);
return 0;
}
//open系统调用过程
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
--->>> do_sys_open(dfd, filename, flags, mode);
--->>>do_filp_open(dfd, tmp, &op, lookup);
--->>>path_openat(dfd, pathname, &nd, op, flags | LOOKUP_RCU);
--->>>do_last(nd, &path, op, pathname);
--->>>filp = nameidata_to_filp(nd);
--->>>__dentry_open(nd->path.dentry, nd->path.mnt, filp,
NULL, cred);
--->>>if (!open && f->f_op)
open = f->f_op->open;
if (open) {
error = open(inode, f);
上一篇: wireshark 提取H264码流方法
下一篇: 字符设备驱动接口——read、write
推荐阅读
-
在Debian系统下配置LNMP的教程,debianlnmp_PHP教程
-
PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 如何解决,mcryptmoduleopen
-
DEDE列表页调用TAG标签
-
Android调用系统默认浏览器访问的方法
-
jQuery AJAX 调用 WebService 的实例_PHP教程
-
CentOS下安装启动MySQL及调用QT
-
Oracle 最简单的随系统自动启动
-
javascript - 求推荐:可以使用markdown写文章的PHP博客系统
-
dedecoms 用织梦广告标签 调用的广告 都被其他浏览器给屏蔽了,该如何解决
-
require中使用绝对路径的有关问题:常量重定义,变量覆盖,重调用增加开销