linux系统调用open()分析

这篇博客分析了Linux系统调用open()的过程,从入口函数sys_open()开始,详细阐述了do_sys_open()、build_open_flags、getname()、get_unused_fd_flags和do_filp_open等关键步骤,解释了它们在文件打开过程中的作用,涉及到文件描述符的分配、路径名复制和文件结构的初始化。虽然并未深入讨论文件系统细节,但展示了操作系统设计的复杂性和精妙之处。
摘要由CSDN通过智能技术生成

当打开一个文件时,需要进行系统调用,通过0x80中断进入内核空间,然后通过系统调用表(sys_call_table)进入系统调用的open主程序sys_open()

 static inline long open(const char * name, int mode, int flags)
 {
         return sys_open(name, mode, flags);
 }

现对系统调用open进行分析

入口函数sys_open()

需要用到定义系统调用的宏
SYSCALL_DEFINE3
展开后

long sys_open(const char__user *filename, int flags, umode_tlinux系统调用open()分析linux系统调用open()分析 mode)

filename路径名,flags打开模式(flags 为 O_CREAT 或 O_TMPFILE表示新建文件),mode新建文件权限
由于系统中有很多文件系统,每一个文件系统都有自己打开文件的方式,内核需要根据他们的类型来调用函数。


SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{    
    long ret;     
    if (force_o_largefile()) //是否设置大文件标识      
    flags |= O_LARGEFILE;     //flags 会在 64 位 Kernel 的情况下强制加上 O_LARGEFILE 标志位
    ret = do_sys_open(AT_FDCWD, filename, flags, mode);    /* avoid REGPARM breakage on x86: */    
    asmlinkage_protect(3, ret, filename, flags, mode);    
    return ret;//准备进入do_sys_open主函数
 }

主函数do_sys_open()

dfd:
找到第一个为0的位,返回这个位在位图表里面的下标,这个下标就是将用分配的未使用的文件描述符fd


long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
       
    struct open_flags op;   //传递进来的标志位
    int fd = build_open_flags(flags, mode, &op);//检查并包装 标志位,这些标志位大多涉及到对最终目标文件的操作
    struct filename *tmp;  //内核空间的路径名  
    if (fd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值