ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2022-08-17 10:01:23  阅读:203  来源: 互联网

标签:count struct open dev current fd mode tty0 inode


第二部分,(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这个文件填充值了,相关信息的赋值

标签:count,struct,open,dev,current,fd,mode,tty0,inode
来源: https://www.cnblogs.com/shuisanya/p/16593933.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有