二十一. elf文件格式解析 发表于 2018-05-15 | 更新于 2018-12-09 | 分类于 kernel elf文件格式我们的程序是通过gcc编译的,在linux下,gcc编译出来的可执行文件是elf格式的二进制文件。那么肯定要elf文件进行解析才能正确的得到进程可执行数据的位置。 下面介绍一下elf格式的几个基本概念 一个程序中最重要的部分是段和节,他们是真正的程序体,存储程序执行所需要的数据,程序中 ... 阅读全文 »
二十. 内建shell的实现 发表于 2018-05-15 | 更新于 2018-12-09 | 分类于 kernel 路径解析转换路径有绝对路径和相对路径之分,在平常使用linux的过程中,我们在输入命令和参数的时候,往往使用的都是相对路径。相对路径是基于当前的工作路径的出的。 当前工作路径 + 相对路径 = 绝对路径 比如说当前工作路径为 /home/work 此时输入 ls file,那么file所在的绝对路径 ... 阅读全文 »
十九. fork的原理及实现 发表于 2018-05-15 | 更新于 2018-12-09 | 分类于 kernel fork的原理先通过下面这段代码简单的介绍一下fork这个函数,了解一下它的功能 123456789101112131415161718192021#include <unistd.h>#include <stdio.h>int main(){ int pid ... 阅读全文 »
十八. 文件系统四(文件的读写与删除) 发表于 2018-05-14 | 更新于 2018-12-09 | 分类于 kernel 写入文件文件的数据都是记录在inode中的文件块中,在该文件系统的设计中,只用了12个直接块和一个间接块来存储文件,所以一个文件最大可以存放 140 * 512字节的数据。 写文件的过程对文件块和扇区的分配过程,根据当前要写入的数据量大小,来判断是否需要分配新的数据块。如果12个直接块不够存储该数据 ... 阅读全文 »
十七. 文件系统三(文件的创建) 发表于 2018-05-13 | 更新于 2018-12-09 | 分类于 kernel 文件描述符在之前介绍的概念中,inode是用来表示一个文件的,用于描述文件的存储信息,文件的权限等。但这个inode结构是操作系统为自己的文件系统准备的数据结构,仅供其内部使用,与用户的关系不大,接下来要介绍的文件描述符才是用户能够使用的结构。 在linux系统中,读写文件的本质是先通过文件的ino ... 阅读全文 »
十六. 文件系统二(创建文件系统) 发表于 2018-05-12 | 更新于 2018-12-09 | 分类于 kernel 在前面一节中介绍了文件系统的基本概念,接下来就要准备开始实现我们的文件系统,下面是为管理文件系统提供的几个基础数据结构。 超级块的结构1234567891011121314151617181920212223/* 超级块 */struct super_block{ uint32_t ... 阅读全文 »
十五. 文件系统一(文件系统的基本概念) 发表于 2018-05-08 | 更新于 2018-12-09 | 分类于 kernel 磁盘的基础概念扇区:它是磁盘读写的基本单位。在我们个人的pc上,他的大小通常为512byte 块:在windows中,称为簇。一个块由多个扇区组成,磁盘在进行读写数据的时候,不可能有一扇区的数据就读或写一次,而是等数据累计到一定量后,在统一进行读写,而这个数据量就叫块。在对磁盘进行格式化分区的时候可 ... 阅读全文 »
十四. malloc&free的实现 发表于 2018-05-07 | 更新于 2018-12-09 | 分类于 kernel 之前的内容中已经实现过内存分配的功能,但之前的内存管理模块中只是实现了内核空间的内存分配,而且每次分配的空间都是已页为单位,也就是只能分配页的整数倍的空间。已页为单位的内存确实是最利于操作系统管理的,但是当只需要小块内存区域的时候,之前的内存管理模块就无法完成了。所以在这里要完善之前的内存管理模块, ... 阅读全文 »
十三. 实现系统调用 发表于 2018-05-01 | 更新于 2018-12-09 | 分类于 kernel 系统调用简介关于系统调用前面有过简单的介绍,这里将真正实现系统调用 现代的操作系统中,用户的权限是有限的,它不能随意的访问系统中的资源。操作系统屏蔽了用户直接访问硬件的能力,这样做的原因主要是为了安全考虑。 但是如果我们想控制显卡打印字符怎么呢,那就需要通过操作系统提供的接口来完成了,我们调用操作系 ... 阅读全文 »
十二. 实现用户进程 发表于 2018-04-30 | 更新于 2018-12-09 | 分类于 kernel TSS单核CPU想要实现多任务,唯一的方案就是多个任务共享同一个CPU,也就是让CPU在多个任务间轮转。 CPU执行任务时,需要把任务运行所需要的数据加载到寄存器、栈和内存中,因为CPU只能直接处理这些数据,这是CPU在设计上就直接决定的。任务的数据和指令是CPU的处理对象,任务的执行会占用寄存器和 ... 阅读全文 »