11-15用户进程

参考书籍:《操作系统 真象还原》 作者:郑钢

本书的11~15章代码,我没有细看。故没有具体的细节。只有大体的思路。


第十一章:用户进程

来自:https://zhuanlan.zhihu.com/p/36291290

  1. Linux为了提高任务切换的速度,所有任务共享一个TSS。通过TR寄存器保存这个TSS,使用ltr指令加载TSS。Linux的任务切换方式只需要修改TSS中的SS0和esp0。
  2. 进程与线程最大的区别就每个进程都拥有单独的4GB虚拟地址空间,所以,需要单独为每个进程维护一个虚拟地址池,用来标记该进程中哪些地址被分配了,哪些地址没有被分配
  3. 一般情况下,CPU不允许从高特权级转向低特权级,只有从中断返回或者从调用门返回的情况下才可以。制造从中断返回的条件,执行iretd指令了。
  4. 当初创建线程的时候是将栈的返回地址指向了kernel_thread函数,通过该函数调用线程函数实现的。这里我们只需要把执行线程的函数换成(创建进程的函数就可以了)。

第十二章:系统调用&&内存管理

来自:十三. 实现系统调用十四. malloc&free的实现   作者:主旋律

系统资源的调用

之前,我们直接在系统中使用内核函数进行打印。
我们肯定不希望,用户进程可以直接使用内核函数。所以,我们使用中断门。用户进程,通过中断,调用内核资源。
实现系统调用

  1. 用中断门实现系统调用,通过0x80中断作为系统调用的入口。
  2. 在IDT中安装0x80号中断对应的描述符,在该描述符中注册系统调用对应的中断处理例程。
  3. 建立系统调用子功能表,利用eax寄存器中的子功能号在该表中索引相应的处理函数
  4. 用宏实现用户空间系统调用接口_syscall,最大只支持3个参数,ebx保存第一个参数,ecx保存第二个参数,edx保存第三个参数
    注:由于使用中断,权限发生变化。中间使用了不同权限的栈。如果使用栈进行参数传递,则需要将3级栈中的参数穿入0级栈中。但是,由于我们使用的是寄存器,所以可以不用考虑。

内存管理

之前使用位图,直接分配,每次分配总是划出4KB的大小,有点浪费。
所以,我们将一页,划分成大小相同的内存块。我们把这种方式称之为arena。
arena是一大块的内存被划分的多个小的内存块的内存仓库。
按照内存块的大小,可以划分成不同规格的arena。

一块arena大小的内存总有分配完的时候,也就是该arena中的所有mem_block都分配出去了,那么肯定需要新增一个与之前arena规格相同的arena来满足内存的需求,那么这些相同规格arena之前同样需要一个结构来进行管理,这个结构用来记录arena的规格以及同规格arena中所有空闲内存块链表。

内存块描述符中会将所有同规格arena的空间内存块进行汇总,它相当于所有内存块的大仓库,分配内存的时候经过这个大仓库,找到里面的某个arena,也就是小仓库,最后从这个arena中找到某个空闲的内存块,将其分配出去。

第十三章:磁盘分区

理解:主分区,扩展分区,子扩展分区,逻辑分区。
详细内容见书上。《真象还原》在磁盘这里的介绍,比鸟哥的好些。当然,是侧重点不同。
(下图为,为一个磁盘分成一个主分区和一个扩展分区。扩展分区又被分成四个子扩展分区。)
在这里插入图片描述

第十四章:文件系统

首先,我们的系统暂时采用索引结构------inode的文件组织形式。

索引结点,用来索引、跟踪一个文件的所有块。

此分区最大创建的文件数是有限制的。,正如 Linux 中每分区的 inode 数量是固定的
目录也是文件。目录文件和普通文件在inode看来,没有区别。
我们是通过文件名来访问文件。文件系统通过inode来访问文件。
文件系统如何把文件名和inode关联起来?——通过目录项。

目录也是文件。根目录会被固定,每次开始进入根目录(或者借此进入其他目录)。(Think why ?)
最后所有的东西合在一起,便是超级块。用来保存系统元信息的元信息。

好了。现在,假设,文件系统的基础有了(上面内容)。

但是文件系统,光有内容不行,还得有管理操作。(不再是,简单的理解:不同的文件系统就像是划分不同的格格这样简单了。)

磁盘里面存储的是文件内容。使用的时候,我们得将他们加载进入内存。好,加载进入内存,这和什么有关系?answer是进程(文件操作(系统)和前面的进程结合)。不同的进程,可以打开相同的文件。为了相互之间不影响,所以每次打开,我们会产生一个“文件结构“。它可以用来记录文件的偏移量,inode的指针等。为了避免PCB臃肿,我们只在PCB中存入文件描述符的下标。如文件描述符0,表示标准输入,1表示标准输出,2表示标准错误。

[外链图片转存失败(img-3FTWM2UH-1565965970851)(11用户进程.assets/文件描述符和inode的关联关系.png)]

现在从左到右梳理一下图 14-16 ,某进程把文件描述符作为参数提交给文件系统时,文件系统用此文件描述符在该进程的 PCB 中的文件描述符数组中索引对应的元素,从该元素中获取对应的文件结构的下标,用该下标在文件表中索引相应的文件结构,从该文件结构中获取文件的 inode ,最终找到了文件的数据块 。提示 ,若该 inode 队列中不存在,此时会多一个处理过程 文件系统会从硬盘上将该 inode 加载到 inode 队列中,并使文件结构中的“ inode 指向它,将来介绍 inode 操作相关的函数时会再次提到。

之后在此基础上,实现文件及目录的创建、打开、读写、路径解析、权限读取等操作(这里面有个前提是磁盘驱动。这样硬盘中的内容才能调入内存)。一个简单的文件系统便完成。

第十五章

这一章,不想看了。

放暑假,明后两天进城里,吃香的,喝辣的。
在这里插入图片描述
在这里插入图片描述



总结

这本书是很好的。

1~10章的代码,我一点一点的看明白哈。

11~14章,不好意思得捞捞头,代码没咋看。只是看了下文字的概念。

至于落下的内容,以后遇到,在慢慢打磨。。。

  • 从实模式进入了保护模式。(这是一步大跨越。)
  • 将所学的汇编©,微机原理,操作系统串起来了.(虽然还是不能理解进程和线程的区别。上次有人说现在linux中线程和进程一样。我问了下~。他也没告诉我原因。当然,我也google到)。
  • 简单学了点makefile。我不要再写“玩具”代码。看这本书,会看到大量的C代码,看的脑袋疼。当然,突然就意识到,数据结构和函数声明放在头文件中。头文件!!! 从头到尾写在一个文件中的长程序,就是垃圾,中学生都不屑于干的事情,我t大三(快大四)才意识到?。
  • 代码:https://github.com/da1234cao/tiny-os (我从网上fork过来的。在doc目录下面,放了我的笔记)

  • 笔记1:https://blog.csdn.net/sinat_38816924/article/category/9093369 (这也是我的博客,可以关注一下:?)

  • 笔记2:https://zhuanlan.zhihu.com/c_177480196 (带哥知乎专栏整理的内容?)

  • 操作系统讨论群1:BookOS开发技术交流群:913813452 (我当时因为进入这个群,才开始看操作系统)

  • 《真象还原》1群:748933138

  • 我的QQ号:2714144035 (欢迎讨论)

发布了104 篇原创文章 · 获赞 134 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/99686634