一、线程的实现
先在内核空间中申请一页内存(4KB),用线程 PCB 结构的指针,指向这块内存。
我们先来看看 PCB 结构都有哪些字段:
1 | struct task_struct { |
然后初始化 PCB,包括:
先在内核空间中申请一页内存(4KB),用线程 PCB 结构的指针,指向这块内存。
我们先来看看 PCB 结构都有哪些字段:
1 | struct task_struct { |
然后初始化 PCB,包括:
虚拟地址和物理地址是乱序映射的。
在开启分页后,我们可以使用 info tab
命令看到页表中虚拟地址到物理地址的映射关系。
1 | cr3: 0x000000100000 |
cr3 寄存器显示的是页目录表的物理地址。左边的虚拟地址,右边的是物理地址。
为了计算机安全,用户进程必须运行在低特权级,当用户进程需要访问硬件相关的资源时,需要向操作系统申请,由操作系统去做,之后将结果返回给用户进程。进程可以有无限多个,而操作系统只有一个,所以操作系统必须共享给所有用户进程。
也就是,用户的代码加上所需要的操作系统中的部分代码才算完整的程序。
用户进程要共享操作系统,如何共享呢?只要操作系统属于用户进程的虚拟地址空间即可。
我们学习 Linux 操作系统,在用户进程 4GB 虚拟地址空间中。3GB-4GB
划分给操作系统;0-3GB
是用户进程自己的虚拟空间。因此,为了实现操作系统,让所有用户进程的 3GB-4GB
的虚拟地址空间都指向同一个操作系统,指向同一片物理页地址,这片物理页地址是操作系统的实体代码。
分页机制有页目录表,页目录表中是页目录项,其中记录的是页表的物理地址以及相关属性。
在保护模式下,CPU 引用一个段时,都要先查看段描述符。很多时候,段描述符存在于描述符表(GDT 或 LDT),但与此对应的段并不在内存中,也就是说,CPU 允许在描述符中已注册的段不在内存中存在。这就是它提供给软件使用的策略,我们利用它实现段式内存管理。
在物理地址 0x475
处存储着主机上安装的硬盘的数量,它是由 BIOS 检测并写入的。因此当我们使用 bochs 配置好磁盘,准备调试的时候,可以先看看此处内存存储的磁盘数。如下即可查看
1 | xp/b 0x475 |
文件系统是运行在操作系统中的软件模块,是操作系统提供的一套管理磁盘文件读写的方法和数据组织、存储形式。他的管理对象是文件,管辖范围是分区,因此他建立在分区的基础上,每个分区都可以有不同的文件系统。
分区:是由多个编号连续的柱面组成,因此分区在物理上的表现是由某段范围内的所有柱面组成的通心环。分区不能垮柱面,一个柱面只属于一个分区,分区的起始和终止都落在完整的柱面上。分区大小等于“每柱面上的扇区数”乘以“柱面数”。