(2) 文件系统VFS处理过程
在此需要进一步分析函数:
看到函数传入的三个参数 , 其中 node 是根目录 “/” 所对应的 inode 节点;path 是文件的绝对路径(例如 “/test/?le”) , 而是经过查找获得的?le所对应的inode节点 。
函数以 “/” 为分割符 , 从左至右逐—分解path获得各个子目录和最终文件对应的 inode 节点 。在本例中是分解出 “test” 子目录 , 并调用函数获得“test”子目录对应的 inode 节点 , 然后循环进—步调用查找以 “test” 子目录下的文件 “test?le1” 所对应的 inode 节点 。当无法分解 path 后 , 就意昧着找到了 test?le1 对应的 inode 节点 , 就可顺利返回了 。
而函数就调用了我们需要补充的函数 , 下面对它进行分析填充;
(3) 函数填充
每次通过函数获取文件索引编号 , 然后调用完成实际的文件读写操作 。blkno 就是文件开始块的位置 , nblks 是文件的大小 。
4. 问题简述
给出设计实现”UNIX的PIPE机制“的概要设方案 , 鼓励给出详细设计方案
管道(pipe):
管道可用于具有亲缘关系进程间的通信 , 有名管道克服了管道没有名字的限制 , 因此 , 除具有管道所具有的功能外 , 它还允许无亲缘关系进程间的通信;
管道机制:
管道是由内核管理的一个缓冲区 , 相当于我们放入内存中的一个纸条 。管道的一端连接一个进程的输出 。这个进程会向管道中放入信息 。管道的另一端连接一个进程的输入 , 这个进程取出被放入管道的信息 。一个缓冲区不需要很大 , 它被设计成为环形的数据结构 , 以便管道可以被循环利用 。当管道中没有信息的话 , 从管道中读取的进程会等待 , 直到另一端的进程放入信息 。当管道被放满信息的时候 , 尝试放入信息的进程会等待 , 直到另一端的进程取出信息 。当两个进程都终结的时候 , 管道也自动消失 。
主要函数:
管道读函数()和管道写函数()
管道写函数通过将字节复制到 VFS 索引节点指向的物理内存而写入数据 , 而管道读函数则通过复制物理内存中的字节而读出数据 。当然 , 内核必须利用一定的机制同步对管道的访问 , 为此 , 内核需要使用锁、等待队列和信号 。
实现:
管道的实现并没有使用专门的数据结构 , 而是借助了文件系统的file结构和VFS的索引节点inode 。通过将两个 file 结构指向同一个临时的 VFS 索引节点 , 而这个 VFS 索引节点又指向一个物理页面而实现 , 如下图:
文章插图
当写进程向管道中写入时 , 它利用标准的库函数write() , 系统根据库函数传递的文件描述符 , 可找到该文件的 file 结构 。file 结构中指定了用来进行写操作的函数(即写入函数)地址 , 于是 , 内核调用该函数完成写操作 。写入函数在向内存中写入数据之前 , 必须首先检查 VFS 索引节点中的信息 , 进行实际的内存复制工作;
写入函数首先锁定内存 , 然后从写进程的地址空间中复制数据到内存 。否则 , 写入进程就休眠在 VFS 索引节点的等待队列中 , 接下来 , 内核将调用调度程序 , 而调度程序会选择其他进程运行 。写入进程实际处于可中断的等待状态 , 当内存中有足够的空间可以容纳写入数据 , 或内存被解锁时 , 读取进程会唤醒写入进程 , 这时 , 写入进程将接收到信号 。当数据写入内存之后 , 内存被解锁 , 而所有休眠在索引节点的读取进程会被唤醒 。
- 按键控制LED闪烁实验
- 设置取消自动关机操作步骤 如何取消自动关机
- STM32的DMA模块及Protues仿真实验
- 八角丝瓜和普通丝瓜的区别是什么
- 项目经理,请打造和升级你的操作系统
- nop sled空操作雪橇 CTFshow-pwn入门-pwn67
- Java多线程之原子操作类
- 以下是完整的Kubernetes架构师课程教学大纲,包括实验和参考资料
- 你是选择25k的996还是18k的八小时工作日?
- 无线龙感知RF2-V210物联网教学实验箱