文件打开和读取的过程:在调用open之后,在内核全局区域生成一条文件表的项,并填写了相关的运行时参数,然后,在进程的u区中在文件描述符表中也新生成了一个项,他的索引作为fd的值,返回给用户态,一般来看所有的系统调用如果失败的话,返回的值恒为-1,。所以open实际上是初始化两张表中的两条记录(当然这中间还包括一个iname的逻辑,即通过文件的文件名对应到inode索引节点的记录,找到这个inode的地址之后,才能够建立上层的两张表的数据),read调的过程就会比较简单,其实就是将想要读多少字节放到用户态在那个内存中告诉内核,内核会根据用户的“需求”,调用从磁盘-内核缓冲区-用户态内存的顺序将数据放到用户态内存中。而这里从磁盘-内核缓冲区,这个内核本来自己有很多地方就需要做,内核有很多东西自己都放在磁盘上存储的,经常需要进行磁盘和内存之间的数据交换,比如inode的结构的数据,比如空闲磁盘索引节点的数据,所以这个算法内核本来就是自带的,读取的操作仅仅就是多了一个步骤,将数据从内核缓冲区拷贝到用户态而已(当然,由于用户数据作为内核的调用的输入,所以还会有数据检查,以及一些较为完备的重试和报错机制,能够cover一些用户态常见的异常场景等等。
[LINUX]文件的读取过程
最新推荐文章于 2022-10-16 14:05:07 发布