linux-0.11分析:进程初始化函数init(),第二部分(void) open("/dev/tty0",O_RDWR,0),第十三篇随笔

第二部分,(void) open("/dev/tty0",O_RDWR,0);

参考 [github这个博主的 厉害][ https://github.com/sunym1993/flash-linux0.11-talk ]

它会触发一个int 0x80中断,会找的sys_open的函数执行

看看这个函数吧

fs文件 -> open.c

int sys_open(const char * filename,int flag,int mode)
{
struct m_inode * inode;
struct file * f;
int i,fd;
mode &= 0777 & ~current->umask;
for(fd=0 ; fd<NR_OPEN ; fd++)
if (!current->filp[fd])
break;
if (fd>=NR_OPEN)
return -EINVAL;
current->close_on_exec &= ~(1<<fd);
f=0+file_table;
for (i=0 ; i<NR_FILE ; i++,f++)
if (!f->f_count) break;
if (i>=NR_FILE)
return -EINVAL;
(current->filp[fd]=f)->f_count++;
if ((i=open_namei(filename,flag,mode,&inode))<0) {
current->filp[fd]=NULL;
f->f_count=0;
return i;
}
/* ttys are somewhat special (ttyxx major==4, tty major==5) */
if (S_ISCHR(inode->i_mode))
if (MAJOR(inode->i_zone[0])==4) {
if (current->leader && current->tty<0) {
current->tty = MINOR(inode->i_zone[0]);
tty_table[current->tty].pgrp = current->pgrp;
}
} else if (MAJOR(inode->i_zone[0])==5)
if (current->tty<0) {
iput(inode);
current->filp[fd]=NULL;
f->f_count=0;
return -EPERM;
}
/* Likewise with block-devices: check for floppy_change */
if (S_ISBLK(inode->i_mode))
check_disk_change(inode->i_zone[0]);
f->f_mode = inode->i_mode;
f->f_flags = flag;
f->f_count = 1;
f->f_inode = inode;
f->f_pos = 0;
return (fd);
}

一部分一部分看吧

  • 第一部分

    #define NR_OPEN 20
    struct task_struct {
    .....
    struct file * filp[NR_OPEN];
    unsigned long close_on_exec;
    ......
    struct tss_struct tss;
    };
    {
    ......
    mode &= 0777 & ~current->umask;
    for(fd=0 ; fd<NR_OPEN ; fd++)
    if (!current->filp[fd])
    break;
    .....

    在寻找当前线程filp数组空闲的位置,current就是结构体task_struct的实例,空位置的索引为fd

  • 第二部分

    #define NR_FILE 64
    {
    ...
    current->close_on_exec &= ~(1<<fd);
    f=0+file_table;
    for (i=0 ; i<NR_FILE ; i++,f++)
    if (!f->f_count) break;
    (current->filp[fd]=f)->f_count++;
    ...
    }

    寻找file_tablef_count的空闲为,记录了f和i,把当前线程的找到的空闲位置fd赋值为这个f

  • 第三部分

    f->f_mode = inode->i_mode;
    f->f_flags = flag;
    f->f_count = 1;
    f->f_inode = inode;
    f->f_pos = 0;
    return (fd);

    把中间那部分省略了,这部分很简单了,就是在给f这个文件填充值了,相关信息的赋值

posted @   水三丫  阅读(171)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示