1.概述
我们知道,Linux把设备看成特殊的文件,称为设备文件。在操作文件之前,首先必须打开文件,打开文件的函数是通过open系统调用来实现的。而简单的文件打开操作,在Linux内核实现却是非常的复杂。open函数打开原理就是将进程files_struct结构体和文件对象file相关联。那么具体是怎么实现的呢?让我们一起走进Linux内核文件打开流程。
2. 首先,通过系统调用sys_open函数:
//打开文件的系统调用
asmlinkage long sys_open(const char __user *filename, int flags, int mode)
{
long ret;
if (force_o_largefile())
flags |= O_LARGEFILE;
//调用do_sys_open函数
ret = do_sys_open(AT_FDCWD, filename, flags, mode);
/* avoid REGPARM breakage on x86: */
prevent_tail_call(ret);
return ret;
}
这个函数进行了简单的处理,调用do_sys_open函数:
long do_sys_open(int dfd, const char __user *filename, int flags, int mode)
{
/*将从用户空间传入的路径名复制到内核空间*/
char *tmp = getname(filename);
int fd = PTR_ERR(tmp);
if (!IS_ERR(tmp)) {
/*得到一个没有使用的文件描述符*/
fd = get_unused_fd();
if (fd >= 0) {
/*file对象是文件对象,存在于内存,所以没有回写,f_op被赋值*/
struct file *f = do_filp_o