![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
操作系统真象还原
文章平均质量分 80
Adward.xi
上下索取
展开
-
操作系统真相还原:Shell进程,fork实现
fork函数的原型是,父进程返回子进程的PID,子进程返回0。原创 2024-08-10 16:41:59 · 888 阅读 · 0 评论 -
操作系统真相还原:获取文件属性
中填充文件结构相关信息,成功时返回 0,失败返回-1。很简单,只有 3 个成员,因此只能获得 3 个属性。用于把信息输出到屏幕,即标准输出。:接受 2 个参数,待获取属性的文件路径。首先判断是不是根目录,然后在调用。命令中调用了大量的系统调用。用于获得文件的属性信息,表示 64 位版本的。调入内存,将属性直接写在。原创 2024-08-08 15:34:38 · 123 阅读 · 0 评论 -
操作系统真象还原:更改任务的工作目录
无论我们身处任何一级的子目录,都可以“顺藤摸瓜”找到根目录。”获取当前目录的父目录,在父目录中搜索当前目录的目录项,从目录项中获取当前目录名称,然后再向上找父目录的父目录,再从中获得父目录的名称……沿着目录树层层而上,就能构建出当前目录的绝对路径。:把当前工作目录绝对路径写入buf,size是buf的大小,当buf为NULL时,由操作系统分配存储工作路径的空间并返回地址,失败返回NULL。:更改当前工作目录为绝对路径path,成功则返回0,失败返回-1。命令来改变工作目录,咱们要实现类似的功能。原创 2024-08-07 14:45:33 · 407 阅读 · 0 评论 -
操作系统真象还原:删除目录
这两个目录项,空目录中只剩下这两个目录项,因此若目录的大小等于 2 个目录项的大小,就表示该目录为空。来删除非空目录,但这是采用递归( recursive)的方式,先删除目录中的文件后再删除目录,因此我们在删除目录的时候先判断目录是否为空,不允许删除非空目录。原理就是我们要删除的。,都会打印类似这样的提示:“删除失败,目录非空”。目录能创建就得能删除, Linux 下删除目录的函数是。当删除目录时,如果目录中有文件或子目录,无论是。判断这个目录是否是非空目录,最后在调用。:接受 1 个参数,待删除的目录。原创 2024-08-05 10:44:51 · 517 阅读 · 0 评论 -
操作系统真象还原:遍历目录
比如该目录文件下目录项分布:a,空,b,空,c,第一次调用返回a,第二次调用返回b,第三次调用返回c…功能类似,只不过是针对目录的,避免了将目录先关闭再重新打开的繁琐。遍历目录就是读取目录中所有的目录项,在遍历之前必须要先把目录打开,之后还需要把目录关闭。遍历目录的操作中,经常会用到目录回绕的功能,也就是使目录的“游标”,成功后返回目录指针,失败返回 NULL。:接受 1 个参数,目录指针曲,功能是读取目录。读取目录实际上就是读取目录中的目录项。,成功返回 1 个目录项,失败返回。我们也按照此形式实现。原创 2024-08-05 10:42:44 · 403 阅读 · 0 评论 -
操作系统真象还原:进一步完善内核
系统调用就是让用户进程申请操作系统的帮助,让操作系统帮其完成某项工作,也就是相当于用户进程调用了操作系统的功能,因此“系统调用”准确地来说应该被称为“操作系统功能调用”。Linux 系统调用是用中断门来实现的,通过软中断指令 int 来主动发起中断信号Linux 只占用一个中断向量号,即 0x80 ,处理器执行指令 int 0x80 时便触发了系统调用。原创 2024-07-01 16:05:32 · 720 阅读 · 0 评论 -
操作系统真象还原:完善MBR
关键字 section 并没有对程序中的地址产生任何影响,即在默认情况下,有没有 section 都一个样, section 中数据的地址依然是相对于整个文件的顺延,仅仅是在逻辑上让开发人员梳理程序之用。访问内存就要用“段:段内偏移”的形式,所以 cs 寄存器用来存代码段段基址, IP寄存器用来存储代码段段内偏移地址,同 cs 寄存器一样都是 16 位宽。数据段和代码段类似,只是这段区域中的内容不是指令,而是纯粹的数据,也就是说里面存储的是程序运行所需要的数据,属于指令的操作数。原创 2024-05-29 20:42:08 · 911 阅读 · 0 评论 -
操作系统真象还原:实现文件写入
写入count字节前,先计算该文件已经占用的块数;5.将写文件所用到的块地址收集到all_blocks,共分为三种情况讨论;本节要实现的 sys_write 是系统调用 write 的内核实现,咱们之前的 write 是个简易版,它是为了临时完成输出打印的功能,不支持文件描述符。如今要让 write 支持文件描述符的话,还要修改下周边与此系统调用相关的内容。先将文件已有数据的最后一块数据读出来并与将要写入的数据在缓冲区中共同拼凑成一个完整的块,然后写入磁盘。,成功则返回写入的字节数,失败则返回-1。原创 2024-07-16 18:20:17 · 364 阅读 · 0 评论 -
操作系统真象还原:输入输出系统
键盘是个独立的设备,在它内部有个叫作键盘编码器的芯片,通常是 Intel8048或兼容芯片,它的作用是:每当键盘上发生按键操作,它就向键盘控制器报告哪个键被按下,按键是否弹起。这个键盘控制器可并不在键盘内部,它在主机内部的主板上,通常是 Intel 8042 或兼容芯片,它的作用是接收来自键盘编码器的按键信息,将其解码后保存,然后向中断代理发中断,之后处理器执行相应的中断处理程序读入 8042 处理保存过的按键信息。一个键的状态要么是按下,要么是弹起,因此一个键便有两个编码,按键被按下时的编码叫通码。原创 2024-06-19 20:56:11 · 937 阅读 · 0 评论 -
操作系统真象还原:创建文件系统
Linux 内核所在的分区是默认分区,自系统启动后就以该分区为默认分区,该分区的根目录是固定存在的,要想使用其他新分区的话,需要用 mount 命令手动把新的分区挂载到默认分区的某个目录下,这就是上面所说的“拿”出来。尽管其他分区都有自己的根目录,但是默认分区的根目录才是所有分区的父目录,因此挂载分区之后,整个路径树就像一串葡萄。只会存在于内存之中,因为它管理的是对一个目录文件的操作(比如打开一个目录文件,就会在内存中创建这样一个结构体)。遍历所有分区,如果该分区没有文件系统就调用。原创 2024-07-14 12:11:45 · 525 阅读 · 0 评论 -
操作系统真象还原:部署工作环境
配置bochs的config文件(–prefix这后面填的是你想要安装bochs的目录),编译,安装。后面路径信息的前部分为自己的bochs安装路径)环境vmware + ubuntu 22.04。然后在输入框依次输入以下,输入一个,按一次回车。启动虚拟机查看效果(在bochs目录下)为即将要安装的bochs创建一个空目录。进入安装好bochs的目录。启动之后,输入c即可看见。原创 2024-05-29 20:34:59 · 219 阅读 · 0 评论 -
操作系统真象还原:内存管理系统
make 给咱们提供了方法,可以在命令之前加个字符’@’,这样就不会输出命令本身信息了变量定义的格式:变量名=值(字符串),多个值之间用空格分开。make 程序在处理时会用空格将值打散,然后遍历每一个值。另外,值仅支持字符串类型,即使是数字也被当作字符串来处理。变量引用的格式:$(变量名)。这样,每次引用变量时,变量名就会被其值(宇符串)替换。/*原创 2024-06-10 19:16:53 · 979 阅读 · 0 评论 -
操作系统真象还原:创建文件
从查找是否存在,到最后创建之间,要排除以下情况:1、找到了,但是找到的是个目录;4.创建目录项,这里是会标记为普通文件的;加入打开的当前分区的根目录,初始化全局打开文件结构数组。3、在最后一个路径上没找到,但是没有传入表示创建文件的标志;此新增加的文件对应的目录项需要写入该目录的。中的某个扇区,原有扇区可能己满,所以有可能要申请新扇区来存储目录项。新增加的文件必然是存储在某一个目录中,所以该目录的。:函数功能是打开或创建文件成功后,返回文件描述符,即。,这些位于内存中已经被改变的数据要同步到硬盘。原创 2024-07-15 09:37:27 · 267 阅读 · 0 评论 -
操作系统真象还原:文件系统概述
这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件硬盘是低速设备,其读写单位是扇区,为了避免频繁访问硬盘,操作系统不会有了一扇区数据就去读写一次磁盘,往往等数据积攒到“足够大小”时才一次性访问硬盘,这足够大小的数据就是块,硬盘读写单位是扇区,因此一个块是由多个扇区组成的,块大小是扇区大小的整数倍。块是文件系统的读写单位,因此文件至少要占据一个块,当文件体积大于1个块时,文件肯定被拆分成多个块来存储,那么问题来了,这多个块该如何组织到一起?原创 2024-07-13 14:20:57 · 1310 阅读 · 0 评论 -
操作系统真象还原:实现文件的读取
流程:1.还是先判断这个读取的数据长度是否超过了文件的可读剩余量,若要读取的字节数超过了文件可读的剩余量,就用剩余量作为待读取的字节数。由于我们操作单位是块,所以对于起始位置,我们要抛弃这个块前面的无用数据,对于结束位置,我们要抛弃这个块后面的无用数据。表示当前操作的文件内容位置,其实就是要读取的内容在文件中的起始位置,比如1个1KB大小的文本文件,,那么就是表示读取当前文件中偏移500字节的这个字符开始的内容。,我们可以确定要读取的内容相对于整个文件的字节偏移量。接受3个参数,读取的文件。原创 2024-07-30 13:52:31 · 167 阅读 · 0 评论 -
操作系统真象还原:编写硬盘驱动程序
这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件要实现文件系统,必须先有个磁盘介质,虽然咱们己经有个虚拟磁盘 ,但它只充当了启动盘的作用,仅用来存储内核,是个没有文件系统的裸盘( raw disk)如同我们之前第一章创建主盘时一样,在bochs目录下:创建磁盘然后在输入框依次输入以下,输入一个,按一次回车接下来,我们在文件中,写入这样,bochs虚拟机启动时,就会识别这个磁盘并且自动挂载。:用来查看物理地址处的值,eg:查看0x475处一个字节的值。这个0x475处存储的是主机上安装的硬盘数原创 2024-07-02 15:26:36 · 337 阅读 · 0 评论 -
操作系统真象还原:创建目录
创建目录也是由多个步骤完成的,因此创建目录的工作是个事务,具有原子性,即要么所有步骤都完成,要么一个都不做,若其中某个步骤失败,必须将之前完成的操作回漆到之前的状态。来确认待创建的新目录文件在文件系统是否存在,若未找到,也要判断是在最终目录没找到还是某个中间目录不存在,如果是中间目录不存在我们则模拟Linux一样给出提示然后退出;Linux用mkdir函数创建目 录,还有一个同名的 mkdir命令也用来创建目录,原理上都是一回事 ,只是一个是系统调用,另一个是利用此系统调用实现的可执行程序。原创 2024-08-01 13:23:44 · 243 阅读 · 0 评论 -
操作系统真象还原:保护模式进阶,向内核迈进
特权级转移分为两类, 一类是由中断门、调用门等手段实现低特权级转向高特权级,另一类则相反,是由调用返回指令从高特权级返回到低特权级,这是唯一种能让处理器降低特权级的情况。原创 2024-06-03 15:50:26 · 1055 阅读 · 1 评论 -
操作系统真象还原:编写MBR主引导记录,让我们开始掌权
另外,因为 BIOS 进入 mbr 是通过 jmp 0: 7c00 来实现的,故此时 cs 己经变成 0,相当于“平坦模型”了,只不过此“平坦模型”大小只是 65536 字节,而不是 4GB。是编译器 NASM 预留的关键字,用来表示当前行和本 section 的地址,起到了标号的作用,它是 NASM 提供的,并不是 CPU 原生支持的。,它们的功能是告诉编译器:“嘿,老兄,你帮我把后面所有数据〈指令和变量 )的地址以 xxxx 为起始开始编吧”道 1 扇区的内容。,随后跳转到此地址,继续执行。原创 2024-05-29 20:36:24 · 408 阅读 · 0 评论 -
操作系统真象还原:完善内核
首先,每个进程都有自己的栈,这就是每个内存自己的专用内存空间。其次,保存参数的内存地址不用再花精力维护,己经有战机制来维护地址变化了,参数在战中的位置可以通过楼顶的偏移量来得到。调用者将所有参数从右向左入栈调用者清理参数所占的栈空间调用者将所有参数从右向左入栈被调用者清理参数所占的栈空间。原创 2024-06-05 15:13:05 · 747 阅读 · 0 评论 -
操作系统真象还原:用户进程
** @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE。原创 2024-06-23 16:44:46 · 1131 阅读 · 1 评论 -
操作系统真象还原:实现文件读写指针定位功能
将文件描述符转换成指定的全局打开文件结构数组索引,然后switch case对传入的参照物情况进行选择,以对。的参照物是文件尺寸大小,即文件最后一个字节的下一个字节,也就是将读写位置指针设置为文件尺寸+用于根据传入的参照物与偏移,重置传入的文件描述符对应的全局打开文件结构中的。的参照物是文件开始处,也就是将读写位置指针设置为距文件开头偏移。为参照物+偏移量的值,也就是说,文件指针具体的位置不仅取决于。的参照物是当前读写位置,也就是将读写位置指针设置为当前位置+的“参照物",函数功能是设置文件读写指针。原创 2024-07-30 13:57:48 · 322 阅读 · 0 评论 -
操作系统真象还原:保护模式入门
CPU 是按照程序中指令顺序来填充流水线的,也就是说按照程序计数器 PC(x86中是 CS: ip)中的值来装载流水线的,当前指令和下一条指令在空间上是挨着的。如果当前执行的指令是jmp,下一条指令已经被送上流水线译码了,第三条指令已经被送上流水线取指啦 仔细想想看,其实这个流水线没用了,因为 CPU 早已经跳到别处去执行了,第二、三条指令用不上了,所以 CPU 在遇到无条件转移指令 jmp 时,会清空流水线。原创 2024-06-02 19:15:09 · 944 阅读 · 0 评论 -
操作系统真象还原:一些你可能正感到迷惑的问题
平坦模型是相对于多段模型来说的,所以说平坦模型指的就是一个段。原创 2024-05-29 20:28:57 · 798 阅读 · 0 评论 -
操作系统真象还原:中断
为了使所有设备之间的通信井然有序,各通信设备间必须有统一的节奏,不能各干各的,这个节奏就称为定时或时钟。时钟只是一种时间的度量,只是一种节奏。计算机中的时钟,大致上可分为两大类:内部时钟和外部时钟。内部时钟是指处理器中内部元件,如运算器、控制器的工作时序,主要用于控制、同步内部工作过程的步调。内部时钟是由晶体振荡器产生的,简称晶振,它位于主板上,其频率经过分频之后就是主板的外频,处理器和南北桥之间的通信就基于外频。Intel 处理器将此外频乘以某个倍数(也称为倍频)之后便称为主频。原创 2024-06-10 16:41:11 · 1084 阅读 · 0 评论 -
操作系统真象还原:文件描述符简介
inode 是操作系统为自己的文件系统准备的数据结构,它用于文件存储的管理,与用户关系不大,咱们要介绍的文件描述符才是与用户息息相关的。文件描述符即 file descriptor,但凡叫“描述符”的数据结构都用于描述一个对象,文件描述符所描述的对象是文件的操作。原创 2024-07-14 12:13:57 · 442 阅读 · 0 评论 -
操作系统真象还原:实现文件删除功能
记录着这个目录文件的存储位置,我们自然可以以块为单位从磁盘中把父目录文件读取到缓冲区中,然后遍历找到要删除的目录项,删除缓冲区内对应的目录项,然后写回缓冲区数据。是否对应某个打开全局文件结构,如果是,则说明此文件正在被使用,那么就不应该被删除。即可知道占用了哪些块,然后去清除对应的块位图中的位即可,也就是并没有真正删除文件数据;是文件系统的灵魂,删除文件最重要的就是回收文件对应的。清除,再将内存缓冲区中的数据写回磁盘中即可。数组中的索引,然后删除磁盘中的这个。删除这个文件在磁盘中的目录项,调用。原创 2024-08-01 13:09:52 · 1021 阅读 · 0 评论 -
操作系统真象还原:文件操作相关的基础函数
任何有关文件及目录的操作都了不开对inode的操作,因为我们需要通过inode知道文件的存储位置,所以操作文件,总是意味着要找到该文件的inode。涉及:找到一个inode在磁盘中的位置,初始化一个inode,加载该inode到内存中,修改内存中的inode之后同步到磁盘中,从内存中删除一个inode。接下来实现一堆与目录相关的函数,涉及目录打开、关闭,在一个目录文件中寻找指定目录项,初始化一个目录项,将目录项写入父目录中。同时一个目录中存储的是文件或者文件夹,在Linux下它又是一个文件,是文件就有。原创 2024-07-15 09:35:38 · 1244 阅读 · 0 评论 -
操作系统真象还原:文件的打开与关闭代码实现
函数功能是打开编号为inode_no的inode对应的文件,若成功则返回文件描述符,否则返回-1。3.关于写文件,判断是否有其他进程正在写此文件,我们要保持互斥,读文件则不需要考虑;4.在创建文件进程或线程的。移除内存中的inode,并解除文件结构与inode的关系。:功能是将文件描述符转化为文件表的下标。先是获取一个空的fd描述符;函数就可以处理打开文件的命令了。:将文件正在写标志关闭,调用。,这样就可以顺利的摸到。原创 2024-07-16 18:18:48 · 232 阅读 · 0 评论 -
操作系统真象还原:线程
我们软件中所做的任务切换,本质上就是改变了处理器中程序计数器的指向,即改变了处理器的“执行流”。原创 2024-06-19 14:50:38 · 999 阅读 · 0 评论