这篇文章讲的是文件系统树,我们知道,文件系统的数据是存在硬盘里的,这里来看一下,这些数据是怎么组织成一棵树,又是怎么进行遍历的。下面就是这棵树。 ?...下面我们以读取文件为线索,看一下过程是怎么样的。 1 我们要先根据文件路径找到文件对应的inode节点。假设是个绝对路径。文件路径是/a/b/c.txt。...从inode的结构体结构中,我们知道inode有一个字段保存了文件的内容。所以这时候就把根目录文件的文件内容读进来,是一系列的dir_entry结构体。...发现他是一个普通文件。至此,我们找到了这个文件对应的inode节点。完成fd->file结构体->inode结构体的赋值。 4 然后我们开始读取文件的内容。根据fd我们找到对应的inode节点。...5 至此,完成了文件的查找和读取。
看完文件系统的基础数据结构。我们接着解析的根文件系统的挂载,因为这是文件系统被使用的起点。根文件系统的挂载是在操作系统初始化的时候进行的。对应的函数是mount_root。...// 系统初始化时挂载根文件系统 void mount_root(void) { int i,free; struct super_block * p; struct m_inode * mi...(p=read_super(ROOT_DEV))) panic("Unable to mount root"); // 获取根文件系统的第一个inode节点,里面存的是根目录的数据 if...>s_imount = mi; // 设置当前进程的根文件目录和当前工作目录 current->pwd = mi; current->root = mi; free=0; // 文件系统的逻辑数据块和...后续的对文件系统的使用都是基于这个根文件系统的根节点的。
task[1] is always init */ (void) send_sig(SIGCHLD, task[1], 1); } // 关闭文件
比如距离2块的距离,则 需要读取的块是第三块 */ block = 1 + tmp/BLOCK_SIZE; // 查找文件前4块对应的硬盘号 for (i=0...page | 7; /* no need for invalidate */ // 返回线性地址 return page; } 2 否则先判断是否有另一个进程和当前进程使用了同一个执行文件...* It should be >1 if there are other tasks sharing this inode. */ // 判断有没有多个进程执行了同一个可执行文件 static int...current->executable) return 0; // 只有当前进程使用这个可执行文件则返回 if (current->executable->i_count...= current->executable) continue; // 找到一个不是当前进程,但都执行了同一个可执行文件的进程 if (try_to_share
具体的分析可以看linux0.11系统调用过程和fork源码解析这篇文章。下面贴一下代码。...p || sig32) return -EINVAL; // 这里使用euid,即进程设置了suid位的话,可以扩大权限,即拥有文件属主的权限 if (priv ||
每个进程有一个执行的时间,每次时钟中断会减少一个单位的时间。如果时间用完则直接重新调度,否则进程可以继续执行。进程调度的时候,系统会选择时间最长的进程,防止有的...
Linux0.11)。...ld86,命令如下: apt-cache search as86 ld86 然后,安装bin86,命令如下: sudo apt install bin86 由于是64位系统,还需要安装32位系统的兼容库,...sudo apt install libsm6:i386 sudo apt install libx11-6:i386 sudo apt install libxpm4:i386 安装完上面的这些依赖库之后.../run,就会看到bochs加载Linux0.11成功,界面如下: ? Ubuntu与Linux-0.11之间的文件交换 在oslab目录下,运行mount-hdc脚本,挂载linux0.11。...挂载以后就可以在hdc目录下和Ubuntu进行文件交换。挂载以后可以在hdc目录下看到如下文件。 ? 不要在0.11内核运行的时候mount镜像文件,否则可能会损坏文件系统。
进程的睡眠是通过调用sleep_on函数,该函数修改了进程的状态并且通过schedule函数切换到其他进程执行,从而实现进程的挂起,TASK_UNINTERRU...
linux0.11分为中断、系统、陷阱门。系统在启动的时候设置idt。...具体的处理可以见内存管理分析那篇文件。
2 流程分析 2.1 引导内核阶段 2.2 内核启动阶段 2.3 init 进程启动 2.4 shell 命令执行 Linux0.11 考古笔记 最近读完《Linux 内核完全注释》和《品读 Linux0.11...核心代码》,大致理解下 Linux0.11 内核的全貌。...程序是一个可执行的文件,而进程是一个执行中的程序实例。关于 Linux0.11 操作系统的进程设计,这里仅侧重理解几个比较重要的概念。...2 流程分析 根据《品读 Linux0.11 核心代码》这个专栏,它是按照系统启动到运行的时间顺序结合 Linux0.11 源码来展开的,我根据专栏的内容进行二次整理。...2)bootsect.s 程序 存放在硬盘引导扇区里的 bootsect 程序,是由 bootsect.s 源文件编译成的。
想写一个系列的文章,逐步介绍文件系统的实现原理。采用的是linux0.11版本。这是第一篇文章。首先介绍一下文件系统的基础数据结构。这是后面的基础,需要先熟悉。所谓数据结构决定算法。...下面是文件系统在硬盘的结构图。 ?...,即文件系统的个数 #define NR_SUPER 8 #define NR_HASH 307 // 缓存文件系统数据的buffer个数,操作系统启动的时候初始化该变量 #define NR_BUFFERS...short i_uid; // 文件大小 unsigned long i_size; unsigned long i_time; // 文件的用户组id unsigned char...2 的s_log_zone_size次方等于文件系统的块大小(硬盘块的 大小和文件系统块的大小不是一回事,比如硬盘块的大小是1kb, 文件系统是4kb) */ unsigned
库文件-百度百科 库、动态库和静态库(.dll,.so,.lib,.a)知乎 浅谈静态库和动态库_知乎
task[nr] = NULL; free_page((long) p); return -EAGAIN; } // 父子进程都有同样的文件描述符
buf,count); printk("(Write)inode->i_mode=%06o\n\r",inode->i_mode); return -EINVAL; } 这里我们只分析一般文件的写...That way leads to madness anyway. */ // 如果设置了追加标记位,则更新当前位置指针到文件最后一个字节 if (filp->f_flags & O_APPEND...i:-1); } file_write的大概逻辑就是根据inode中记录的文件信息,根据需要写入的位置算出,硬盘的位置或者说块号。如果对应的块已经存在,则直接返回对应的块号,否则需要新建块。...{ struct buffer_head * bh; int i; if (block<0) panic("_bmap: block<0"); // 文件的大小最大值...所以我们看到,我们写文件的时候,数据不是直接到硬盘的,只是在缓存里,系统会有线程定期更新缓存到硬盘。
写时复制是有一块内存,由多个进程共享,属性是只读的,当有一个进程对这块内存进行写的时候,系统会先申请一块新的内存给他写。比如进程fork的时候,父子进程对应的物...
该函数把inode table里的,即进程打开的文件对应的inode节点,写入到buffer里。
文件查找和操作函数见之前的文章。这里就不贴了。...oldinode, * dir; struct buffer_head * bh; const char * basename; int namelen; // 根据路径名找到文件的...dir) { iput(oldinode); return -EACCES; } // 路径是一个目录,所以文件名是空 if (!...namelen) { iput(oldinode); iput(dir); return -EPERM; } // 不能跨文件系统创建硬链接...basename的项 bh = find_entry(&dir,basename,namelen,&de); // 找到的话说明文件名已经存在,则不能再创建 if (bh) {
领取专属 10元无门槛券
手把手带您无忧上云