操作系统学习随笔

Q1:gdt表的作用是什么?

GDT 表(Global Descriptor Table)是 x86 架构中用于实现分段机制的数据结构之一。它是在保护模式下用于管理内存分段的重要组成部分。GDT 表定义了一组段描述符,每个段描述符描述了一个内存段的属性和位置。

在 x86 体系结构中,内存分段允许操作系统和处理器通过段选择子(Segment Selector)来访问不同的内存段,每个内存段可以有不同的属性,例如访问权限、段基址、段大小等。GDT 表的作用如下:

  1. 内存分段管理:GDT 表为操作系统提供了一种灵活的内存管理方式。它允许操作系统将整个虚拟地址空间划分为多个不同的段,从而简化了内存管理。

  2. 内存保护:通过在 GDT 表中设置不同的段描述符,操作系统可以实现内存保护机制。每个段描述符定义了段的权限,例如可读、可写、可执行等,从而确保进程只能访问其拥有权限的内存段,防止进程之间的干扰和非法访问。

  3. 特权级别控制:在 GDT 表中定义的段描述符包含一个特权级别字段,称为段特权级别(Segment Privilege Level),简称 DPL。这个字段用于控制进程对不同段的访问权限。操作系统可以通过调整 DPL 来实现特权级别控制,从而限制进程对不同段的访问。

  4. 全局描述符:GDT 表中的一些段描述符可以用于定义全局数据段和代码段。这些全局描述符在整个操作系统和所有进程中都是共享的,从而实现了全局内存共享。

总体来说,GDT 表在保护模式下是实现内存分段和内存保护的关键数据结构。在现代操作系统中,GDT 表一般由操作系统初始化,并由处理器使用以实现内存寻址和保护机制。随着新的处理器架构的发展,x86-64 架构引入了长模式(Long Mode)和平坦模式(Flat Mode),逐渐减少了对分段机制的依赖,但 GDT 表仍然在某些情况下扮演着重要的角色。

Q2:保护模式是什么?

保护模式是x86架构(以及一些其他体系结构)中的一种工作模式,它是在现代操作系统中运行的主要模式。保护模式允许操作系统对计算机的硬件资源和内存进行更加灵活和精细的控制,从而实现了多任务、多用户和更高级的内存管理功能。

保护模式相对于实模式(Real Mode)而言,是一种更复杂和强大的工作模式。实模式是早期x86计算机的默认模式,其特点包括:

  1. 20位地址总线:实模式下,内存地址总线只有20位,最大支持1MB的物理内存寻址。

  2. 缺乏内存保护:在实模式下,程序可以直接访问整个物理内存,没有内存保护机制,一个程序的错误可以影响整个系统的稳定性。

  3. 单任务:实模式下只能运行一个程序,要切换到另一个程序,需要重新启动计算机。

而保护模式具有以下特点:

  1. 32位或64位地址总线:保护模式下,可以使用32位或64位地址总线,因此支持更大的物理内存寻址。

  2. 内存保护:保护模式引入了内存分段和分页机制,允许操作系统将内存划分为多个段或页,并为每个段或页设置访问权限,从而实现内存保护和隔离。

  3. 多任务和多用户:保护模式允许操作系统同时运行多个程序,并为每个程序分配独立的虚拟地址空间,实现多任务和多用户环境。

  4. 特权级别:保护模式引入了特权级别(特权级)的概念,通过特权级别可以控制程序对系统资源的访问权限。操作系统运行在高特权级别(Ring 0)下,用户程序运行在低特权级别(Ring 3)下,从而确保操作系统具有更高的权限。

保护模式的引入使得操作系统能够更好地管理和保护计算机的资源,同时实现了更高级别的多任务和多用户环境,是现代操作系统的基础工作模式。在x86体系结构下,保护模式由Intel引入,后续的64位扩展(x86-64或AMD64)进一步扩展了保护模式的功能,提供了更大的虚拟地址空间和更多的寄存器等优势。

Q3:内存地址总线只有20位,最大支持1MB的物理内存寻址。这个20位是怎么对应到1mb的?

在实模式下,x86架构使用20位地址总线,因此能够寻址的物理内存地址范围为2^20个地址,即1,048,576个地址。每个地址对应一个字节(8位),所以实模式下最大支持1,048,576个字节,也就是1 MB 的物理内存寻址。

在实模式下,内存寻址是通过“段地址 + 偏移地址”的方式来进行的。段地址由段寄存器提供,偏移地址由程序中的指令和数据给出。这两部分地址的组合可以生成一个20位的物理地址。

例如,如果段地址为0x0000,偏移地址为0xFFFF,则生成的物理地址为:

物理地址 = 段地址 x 16 + 偏移地址 = 0x0000 x 16 + 0xFFFF = 0xFFFFF

这个物理地址表示的是物理内存中的一个字节(byte)。通过逐步增加偏移地址,可以访问整个1 MB 的物理内存。

需要注意的是,由于实模式的地址寻址方式比较简单,不提供内存保护和虚拟内存等特性,因此在现代操作系统和应用程序中很少使用实模式。保护模式和虚拟内存机制提供了更灵活和安全的内存管理方式,支持更大的内存容量和多任务环境。

Q4:mem_init()函数是干什么的?

mem_init() 函数通常是在操作系统的启动阶段调用的,用于初始化内存管理子系统。这个函数的主要目的是完成以下任务:

  1. 设置页表:在保护模式下,内存管理采用分页机制。mem_init() 函数会设置页表,建立虚拟地址到物理地址的映射关系,以便操作系统和应用程序能够访问和管理内存。

  2. 启用分页机制:为了让分页机制生效,需要设置 CR0 寄存器的相应位(PG 位)为 1,启用分页机制。mem_init() 函数会执行这个操作。

  3. 建立内核地址空间:内核是操作系统的核心部分,需要有独立的内存空间。mem_init() 函数会设置内核的页表,确保内核能够独立运行在自己的地址空间中。

  4. 分配内存池:通常,mem_init() 函数会初始化内存池,将物理内存划分为不同的块,方便之后的内存分配和释放。

  5. 初始化其他内存管理相关的数据结构:mem_init() 函数可能还会初始化其他与内存管理相关的数据结构,如空闲内存链表、内存映射表等,以便操作系统能够高效地管理内存。

  6. 配置内存保护:在一些系统中,mem_init() 函数可能还会配置内存保护机制,设置不同区域的访问权限,防止进程之间相互干扰和非法访问。

总的来说,mem_init() 函数是在操作系统启动时执行的一个重要函数,用于初始化内存管理子系统,建立地址映射,为操作系统和应用程序提供内存管理和保护机制。这个函数的具体实现会根据操作系统的设计和目标平台的不同而有所不同。

Q5:操作系统怎么进入保护模式?

操作系统进入保护模式的过程是由处理器执行的一系列步骤。以下是进入保护模式的主要步骤:

  1. 设置全局描述符表 (GDT):GDT 是一种数据结构,用于在保护模式下进行内存分段和访问权限的管理。操作系统需要首先设置好 GDT,其中包含段描述符,每个段描述符用于描述一个内存段的属性和位置。

  2. 加载 GDT 寄存器:在处理器中有专门的寄存器用于存储 GDT 的地址。操作系统需要将 GDT 的地址加载到 GDTR 寄存器中。

  3. 设置控制寄存器 CR0:CR0 是一个控制寄存器,其中包含了很多控制处理器行为的位字段。在进入保护模式前,操作系统需要设置 CR0 的某些位,以便开启保护模式。

    • 将 CR0 寄存器的 PE (Protection Enable) 位设置为 1,表示启用保护模式。

    • 将 CR0 寄存器的 PG (Paging) 位设置为 0,表示暂时禁用分页机制(在进入保护模式后再启用分页)。

  4. 使用汇编指令进入保护模式:在汇编语言中,有一条特殊的指令 lgdt 用于加载 GDT 寄存器,将 GDT 的地址加载到 GDTR 寄存器中。然后,使用 mov 指令将 CR0 设置为正确的值。接下来,使用 jmp 指令跳转到新的代码段,此代码段中的代码将是保护模式下的代码。

  5. 编写保护模式代码:在进入保护模式后,处理器会转到一个新的代码段中执行,此时操作系统需要编写相应的保护模式代码,完成内存分段、页表设置、中断处理等功能。

Q6:应用程序和操作系统都在内存中,为什么不能直接访问? 

应用程序和操作系统都运行在内存中,但它们不能直接访问对方的内存空间,这是由操作系统设计的保护机制所决定的。以下是一些主要原因:

  1. 内存隔离和保护:操作系统将内存分为多个不同的区域,每个区域分配给不同的应用程序。这样做的目的是为了实现内存隔离和保护,确保一个应用程序无法访问或修改其他应用程序的内存空间。如果应用程序能够直接访问操作系统的内存,或者其他应用程序的内存,就可能导致数据混乱、安全漏洞和系统崩溃。

  2. 虚拟内存:现代操作系统使用虚拟内存机制,将每个应用程序看作独立的虚拟地址空间。这样每个应用程序都有自己的虚拟内存地址空间,而不需要担心与其他应用程序冲突。操作系统通过硬件支持的内存管理单元(MMU)将虚拟地址转换为物理地址。

  3. 特权级别:操作系统和应用程序运行在不同的特权级别下。在x86架构中,通常有4个特权级别,从最高特权级别(Ring 0,也称为内核态)到最低特权级别(Ring 3,也称为用户态)。操作系统运行在最高特权级别下,拥有对硬件资源和内核数据结构的完全控制。应用程序运行在较低的特权级别下,只能通过系统调用等受限的方式访问操作系统功能。

  4. 系统调用:应用程序可以通过系统调用的方式请求操作系统提供特定的服务,例如文件读写、网络通信等。通过系统调用,应用程序可以通过操作系统提供的接口访问硬件资源和其他共享资源,但访问受到严格的控制和限制,确保安全和稳定性。

总的来说,通过将应用程序和操作系统分开运行在不同的特权级别和虚拟地址空间下,操作系统实现了内存隔离和保护,从而保证了系统的稳定性、安全性和可靠性。应用程序通过系统调用等受限的方式与操作系统进行交互,确保了系统的整体安全性和运行效率。

注意!!!内核态可以访问任何数据,用户态不能访问内核数据

学习任务:1、多进程图谱      2、文件操作图谱

 chapter2:CPU的工作原理

程序向内存中发送一个地址,内存返回指令给cpu,cpu解释执行

程序存放在内存中,CPU根据PC寄存器在地址总线上发出取址命令,内存就会把对应的指令返回给CPU,然后CPU就会执行

给一段程序,操作系统执行这一段程序,CPU开始工作就是分布执行多个进程

Q7:PC寄存器的作用? 

PC(Program Counter)寄存器,也被称为指令指针寄存器(Instruction Pointer Register),是计算机体系结构中的一个重要寄存器。PC 寄存器用于存储下一条要执行的指令的内存地址。它指示了处理器正在执行的程序中的位置。

在执行程序时,处理器从内存中读取指令并按照顺序执行。PC 寄存器的值指示了下一条要执行的指令在内存中的地址。一旦一条指令被执行,PC 寄存器会自动递增,使其指向下一条指令的地址,从而实现指令的顺序执行。

当处理器遇到分支指令(如条件分支、循环等)时,PC 寄存器的值会根据分支条件来修改,从而跳转到不同的地址执行相应的指令。分支指令可以使 PC 寄存器的值变化,从而改变程序的控制流。

多进程的组织:PCB+状态+队列

进程交替的三部分:队列操作+调度+切换

进程=资源+指令执行序列

将资源和指令执行分开;一个资源+多个指令执行序列

线程的实质是映射表不变而PC指针变

 两个线程的样子:两个TCP、两个栈、切换的PC在栈中

内核级线程是两套栈,用户级线程是两个栈

用户栈进入内核栈的方式是INT中断,内核栈进入用户栈的方式是IRET

内核级线程切换五段论

1、由中断将内核栈与用户栈并联起来进入内核

2、进行中断处理,中断处理过程中产生阻塞或时钟中断

3、找到目标TCB

4、根据TCB切换到内核栈

5、IRET中断返回,内核栈再切回用户栈

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值