操作系统真象还原学习笔记(0)

1、应用程序与操作系统的配合

  应用程序是通过系统调用和操作系统配合来完成某项功能的,系统调用便是操作系
统提供好的函数,应用程序所调用的库函数等。

  用户态和内核态是对CPU来讲的,是指CPU运行在用户态(特权3级)还是内核态
(特权0级)。

  用户进程陷入内核态是指由于内部或外部中断发生,当前进程被暂时终止执行,其
上下文被内核的中断程序保存起来后,开始执行一段内核的代码。这段代码是内核的
代码,不是用户程序在内核的代码,用户代码怎么可能在内核中存在,所以“用户态
与内核态”是对 CPU 来说的。

2、内存的分段访问

  分段是内存访问机制,是CPU用的访问内存的方式。若要加载程序运行(不管是内
核程序,还是用户程序),程序中的地址若是绝对的物理地址,那该程序就得放在内
存中的固定位置,但如果有两个编译出来地址相同的用户程序就没办法运行了,所以
CPU采用“段基址+段内偏移地址”的方式去访问任意内存,这样就可以使程序重定位,
就可以同时运行多个程序了。
  重定位就是将程序中的指令的地址改写成另一个地址,但该地址处的内容还是原来
地址的内容,如下图0-3所示。

在这里插入图片描述
CPU采用“段基址+段内偏移地址”的形式访问内存,就需要有段基址寄存器(cs,ds,es等)。两个地址相加便是需要访问的内存地址。

3、代码段与数据段

  代码段是将指令全部排在一起,形成一片连续的指令区域,这是为了使程序内指令
接连不断地执行下去。指令是由操作数与操作码组成的,数据也是一样,数据段便是
把数据连续地并排在一起储存形成的段落。

  只要给CPU第一个指令的起始地址,CPU在执行本指令的同时,就会自动的获取下一
条指令的地址,CPU会一直重复上述过程。

  将数据和代码分开的好处有:可以为它们赋予不同的属性、可以提高CPU内部缓存
的命中率、可以节省内存。

  CPU在保护模式下,有这样一个数据结构,叫全局描述符表(Global Descriptor 
Table,GDT),表中的每一项被称为段描述符,描述符就是描述某种数据的数据结
构,是元信息,属于数据的数据。操作系统在让CPU进入保护模式之前,会准备好
GDT,设置好GDT的相关项,填写好段描述符。

  编译器、操作系统、CPU三个一起配合才能对程序进行保护,检测指令的违规行为:
(1)编译器负责挑出数据具备的属性,从而根据数据将程序片段分类,但是编译器
并没有为代码添加额外的信息。(2)操作系统通过设置GDT来构建段描述符,在段
描述符中指定段的位置、大小以及属性(S字段以及TYPE字段),这里才是给段添加
属性的地方。(3)CPU中的段寄存器提前被操作系统赋予相应的选择子(相当于段
基址),从而确定了指向的段。

  内存分段指的是处理器为访问内存而采用的机制,称为内存分段机制,程序分段是
软件中人为逻辑划分的内存区域,它本身也是内存,所以处理器在访问该区域时,会
采用内存分段机制,用段寄存器指向该区域的起始地址。

4、物理地址、逻辑地址、有效地址、线性地址、虚拟地址的区别

(1)物理地址

  物理地址就是物理内存真正的地址,相当于内存中每个储存单元的门牌号,具有唯
一性,不论在什么模式下,CPU都要以物理地址去访问内存,在实模式下,“段基址+
段内偏移地址”经过段部件的处理,直接输出的就是物理地址。

(2)线性地址

  在保护模式下,“段基址+段内偏移地址”称为线性地址,但此时的段基址不是真正
的地址,而是一个称为选择子的东西。选择子本质是个索引,类似于数组下标,通过
这个索引便能在GDT中找到相应的段描述符,在该段描述符中记录了该段的起始、大
小等信息,这样便得到段基址。
  若CPU没有开启分页功能,此线性地址就被当做物理地址来使用,可以直接访问
内存。

(3)虚拟地址

  若CPU开启了分页功能,此线性地址还被称为虚拟地址,虚拟地址需要经过CPU页
部件转换成具体的物理地址,这样CPU才能将其送到地址总线上去访问内存。

(4)逻辑地址(有效地址)

  无论在实模式下还是保护模式下,段内偏移地址又称为有效地址,也称为逻辑地址,
这是程序员可见的地址。

线性地址或虚拟地址,这都不是真实的地址。它们都是用来描述程序或任务的地址空间。由于分页模式是在保护模式下开启的,32位系统保护模式下的寻址空间是4GB,所以虚拟地址或线性地址就是0~4GB的范围。
在这里插入图片描述

5、平坦模式:

平坦模式是相对于多段模式来说的,所以平坦模式指的是一个段。

6、cs、ds这类sreg段寄存器

CS——代码寄存器,其值为代码段的段基址
DS——数据寄存器,其值为数据段的段基址
ES、FS、GS——附加段寄存器,其值为附加数据段的段基址,称为附加是因为此段寄
存器用途不像其他的serg那样固定,可以额外做他用
SS——堆栈寄存器,其值为堆栈段的段值

在实模式下,CS、DS、ES、SS中的值是段基址,是具体的物理地址,内存单元的逻辑地址仍为“段基址+段内偏移值”,在保护模式下,装入段寄存器中的不再是段地址,而是“段选择子”,段选择子也是数值,为16位频宽。

7、工程、协议

软件中的工程是指开发一套软件所需的全部文件,包括配置环境。
协议是一种大家共同遵守的规约,主要用来通信、共享、协作。

8、Linux系统下的应用程序不能在Windows系统上运行是因为格式不同、系统API不同

  Linux中的API称为系统调用,是通过int 0x80软件中断实现的,而Windows中的
API是存在动态链接库中的,也就是DLL(Dynamic Link Library),LL是一个库,
里面包含代码和数据,可供用户程序调用,DLL不是可执行文件,不能单独运行,
也就是说Linux中的可执行程序获取资源的方式和Windows不一样,所以不能在
Windows中运行。

9、局部变量和函数参数为什么要放在栈中

   堆是程序运行过程中用于动态内存分配的内存空间,是操作系统为每个用户进程
 规划的,属于软件规划。
   栈是处理器运行必备的内存空间,是硬件必须的,但又是软件(操作系统)提供的。
 
   堆就是堆,而堆栈是栈,栈从高地址往低地址发展,堆是从低地址往高地址发展,
   堆和栈早晚会碰头。所以堆和栈的地址空间是接壤的。

10、汇编语言与C语言的速度相比

  在汇编语言中,一个符号对与一个机器指令,所以写汇编代码就相当于直接写机器
指令,汇编语言并不会添加额外的语句,所以汇编代码会直接一些,CPU不会因为执
行额外的代码而浪费时间。
  C编译器在我们编写代码的时候,会加入大量的额外代码来支撑,所以C代码量会变
得很大,经过编译出来的汇编代码也就有许多多余的代码。
  高级语言如C语言,为了通用性、方便性等,会加入一些额外的代码,这样编译出
来的汇编代码也比较多,所以会比汇编语言慢。

11、编译型语言与解释性语言的区别

  在解释型语言中,脚本中的代码其实没有到CPU上去执行,CPU的cs:ip寄存器没
有指向过它们,CPU只能看见脚本解释器,脚本代码被解释器分析,从而做出相应的
行为,如果脚本代码中出现错误,那么先前正确的代码也会被执行,这一点和编译程
序有很大区别。 

  编译型语言编译出来的程序,运行时本身就是一个进程,它是由操作系统直接调用
的,也就是操作系统加载到内存后,操作系统将CS:IP寄存器指向程序的入口,使它
直接在CPU上运行。

  调度器在绪队列中可以看到编译型语言编译出来的程序,而解释型程序是无法被
调度器看到的,调度器只会看到脚本语言的解释器。

12、什么是大端字节序、小端字节序

  小端字节序是数值的低字节放在内存的低地址,高字节放在高地址,大端字节序是
数值的低字节放在内存的高地址,高字节放在低地址。字节序的选择由硬件厂商决定。

  小端优势:因为低位在低字节,在进行强制类型转换是不需要调整字节。
  大端优势:对于有符号的数,较容易判断正负。

  常见CPU的字节序:大端字节序:IBM、Sun、PowerPc,小端字节序:x86、DEC。
ARM体系的CPU对字节序的选择与硬件有关。
  在文件储存和网络传输中,bmp格式的图片属于小端字节序,而jpeg格式的图片则
是大端字节序。网络字节序就是大端字节序。

13、BIOS中断、DOS中断、Linux中断的区别。

  BIOS和DOS都是存在于实模式下的程序,由它们建立的中断调用都是建立在中断
向量表(IVT,Interrupt Vector Table)中的,它们都是通过软件中断指令int
中断号来调用的。

  中断向量表中的中断向量(四字节)描述了一个中断处理程序的段基址和段内偏
移地址。中断向量表总长为1024字节,它是在计算机启动之初由BIOS建立里面的中
断例程,物理地址从0x0000开始初始化。

  BIOS中断调用的主要是操作硬件,该处理程序中包含大量的in/out指令。
  每个外设都有自己的内存(ROM类型,只读储存器),硬件自己的功能调用例程以
及初始化代码就存放在这块ROM中,根据规范,第一个内存单元是0x55,第二个储存
单元是0xAA,第三个储存单元是该ROM中以512字节为单位的代码长度。从第四个储
存单元开始便是实践代码。

  访问外设的两种方式:(1)内存映射:通过内存总线将外设的内存映射到某个内
存区域。(2)端口操作:外设都有自己的控制器,控制器上有寄存器,这些寄存器
就是端口,通过in/out指令读写端口来访问硬件的内存。从内存的物理地址0xA0000
开始到0xFFFFF这部分内存中,一部分用来做映射。

  软件只要执行int中断向量号,CPU便会把向量号当作下标,去中断向量表中定位
中断处理程序并执行。
  DOS是运行在实模式下,故其建立的中断调用也建立在中断向量表中,只不过中断
向量号与BIOS的不能冲突。0x20~0x27是DOS中断,DOS中断只占用0x21这个中断号,
通过往ah寄存器中写好子功能,再执行int 0x21,这是在中断向量表中第0x21表项
(物理地址0x21*4)中的中断处理程序开始根据ah寄存器中的值来调用相应的子功
能。

  Linux内核是在进入保护模式后才建立中断例程的,取而代之的是中断描述符表
(IDT),通过IDT来执行中断例程。
  如果在实模式下执行int指令,会自动访问中断向量表,在保护模式下执行int指
令,则会自动访问中断描述符表。

14、section与segment的区别

   代码运行前大体上要执行4个阶段,预处理阶段:预处理器将高级语言中的宏展
 开,去掉代码注释,为调试器添加行号等。编译阶段:将预处理后的代码进行词法
 分析、语法分析、语义分析、优化,得到最后的汇编代码。汇编阶段:将汇编代码
 编译成目标文件,即转换为机器指令。链接阶段:将目标文件链接成可执行文件。
 
    section称为节,是指在汇编代码中经过关键字section或segment修饰、逻辑
 划分的指令或数据区域,汇编器会将这两个关键字修饰的区域在目标文件中编译成
 节。
 
   segment称为段,是链接器根据目标文件中属性相同的多个section合并后的
 segment集合,这个集合称为segment(段),最后形成可执行文件。所以通常说的
 段是指可执行程序内存空间中的代码段和数据段。

15、魔数

  魔数,是用来为重要的数据定义标签,用独特的数字唯一地标识该数据。
  主引导记录(MBR)最后的两个字节便是0x55、0xAA,代表了这个扇区中有可加载
程序,BIOS便是这样检验该扇区是否可引导。
  操作系统识别文件系统便是通过魔数,每个硬盘上的分区都有超级块,一般位于本
分区的第2个扇区,超级块里面记录了此分区的信息,里面便有魔数,每种文件系统
都有独特的魔数。

16、如何控制CPU的下一条指令

  存放下一条指令地址的寄存器被称为程序计数器PC(program counter)。
  CPU有不同的体系结构,在x86的体系结构中,PC不是单一的某寄存器,它是寄存器
的组合,指的是段寄存器CS和指令寄存器IP。
  CS和IP是CPU待执行的段基址和段内偏移地址,不可以直接用mov指令去改变,有
专门的指令去改变执行流,如jmp、call、int、ret等,这些指令同时修改CS和IP。
(但ARM的CPU可以用mov指令修改执行流)
  PC负责处理器的执行方向,它只是获取下一条指令的方法形式,在不同体系的CPU
中有不同的实现方法。

17、指令集、体系结构、微构架

  指令集由操作码和操作数构成,操作数一般是立即数、寄存器、内存等。
  人为规定操作码和操作数的大小和位置,然后再CPU硬件的电路中写死。
  不同的指令其机器码的长度可能不一致。
  最早的指令集是CISC(complex instruction set cmputer),复杂指令集
计算机。后来精简高效的指令集称为RISC(reduced instruction set computer)。
  CISC和RISC是两种指令体系,也就是两种设计思想。
  指令集是一套指令编码,微架构是指令集的物理实现方式。

18、用户与操作系统沟通的桥梁——库函数

  (1)操作系统有自己支持、加载用户进程的规则,C运行库时便是支持操作系统
规则,支持用户进程的代码库。
  (2)用户进程要和C运行时库的诸多目标文件链接合并为可执行文件(此时用户
进程被加入了大量运行库代码)
  (3)C运行时库提供了运行时所需要的库文件,而且还做了程序运行前的初始化
工作,所以即便没有用到标准库文件,链接阶段也会用到C运行时库。
  (4)尽管系统调用封装在库函数中,但是用户可以直接调用“系统调用”,不过用
库函数可能会更加高效。

19、MBR、EBR、DBR、OBR是什么

  首先,计算机在接电后首先运行的是基本输入输出系BIOS,BIOS只是完成一些简单
的检测和初始化工作,然后将处理器使用权转移给MBR。
  MBR(Master/Main Boot Record,主引导记录),位于整个硬盘最开始的扇区
(MBR引导扇区),里面的内容是:(1)446字节的引导程序及参数(2)64字节的
分区表(3)2字节的结束标识0x55 0xAA。在MBR中储存的是系统引导程序,分区表
中的每个分区占16字节(共4个分区),这四个分区可能包含“次引导程序”,MBR引
导程序会找到次引导程序,并将CPU的使用权交给它。

  次引导程序就是操作系统提供的内核加载器(操作系统引导程序),所以最终CPU
的控制权会被交付给操作系统,如果想在某个分区中安装操作系统,就会利用分区工
具将该分区设置为活动分区(也就是将分区表中该分区所对应的分区表项中的活动标
记为0x80),活动分区标志位于分区表项的最开始的1字节(0x80代表该分区上有引
导程序,0表示没有引导程序)。
  MBR为了找到活动分区上的内核加载器,内核加载器的入口必须是固定的位置(各
分区最开始的扇区,操作系统引导扇区),其中的引导程序称为操作系统引导记录
OBR(OS Boot Record),此扇区也叫OBR引导扇区,OBR引导扇区前三个字节存放
了跳转指令,该指令会将处理器带入操作系统引导程序,从此内核开始控制处理器。

  DBR(DOS Boot Record,DOS操作系统引导记录):(1)跳转指令,使MBR跳转
到引导代码(2)厂商信息、DOS版本信息(3)操作系统引导程序(4)BIOS参数块
BPB(BIOS Parameter Block)(5)结束标志0x55 0xaa。OBR是由DBR传承下来的。

  分区有主分区和扩展分区,EBR是扩展分区中为了兼容MRB才提出的概念,主要是
兼容MBR中的分区表。MBR中有分区表,而扩展分区中有一个个的逻辑分区,因此扩展
分区中也有分区表,为扩展分区储存分区表的扇区称为EBR(Expand Boot Record),
位于各扩展子分区中最开始的扇区,EBR和MBR结构相同,MBR只有一个,而EBR可以
有无数个。

  MBR和EBR是分区工具创建维护的,不属于操作系统管理的范围,而OBR是各分区最
开始的扇区,属于操作系统管理范围。
  MBR、EBR、DBR、OBR都包含引导程序,因此都称为引导扇区。引导扇区都以0x55
0xAA结尾。MBR和EBR中存在分区表,而DBR或OBR中绝对没有分区表。MBR和EBR位于
分区之外的扇区,而OBR属于主分区或逻辑分区最开始的扇区,每个主分区或逻辑分区
中都有OBR引导扇区。

MBR、EBR、OBR关系如下图所示:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值