目录
9. 物理地址、逻辑地址、有效地址、线性地址、虚拟地址的区别
14. 为什么Linux系统下的应用程序不能在Windows系统下运行
1. 操作系统是什么
初步印象:统一管理计算机资源,避免用户重复造轮子
2. 你想研究到什么程度
基于某一公设,朝着自己的目标去学习、推导;
至于对该公设以下的疑问,不在目前目标的范畴之内,所以要学会不求甚解,专门的事有专门的人做,术业有专攻,可以了解,但不要本末倒置,不要忘记自己的初衷。
学无止境。。。
3. 写操作系统,哪些需要我来做
系统:就是各种功能组合到一起后,产生最终输出的组合物;
操作系统是管理资源的软件,能做什么要取决于主机上硬件的功能;
参考硬件手册,知道如何通过计算机指令来控制硬件。
4. 软件是如何访问硬件的
各种硬件适配设备,即IO接口,接口其实就是标准,只要大家生产的硬件遵循这个标准就能实现通用,操作系统也就不用为每一个新出现的硬件更新其驱动方法。(驱动是什么?)
CPU 访问外部硬件的两种方式:(1) 将某个外设的内存 (如,显卡的内存——显存) 映射到一定范围内的地址空间中,(2) 通过IO接口 (内部有寄存器,也就是端口) 与外设通信。
5. 应用程序是什么,和OS是如何配合到一起的
应用程序和操作系统都是软件,CPU只负责去 cs:ip 寄存器指向的内存中取指令并执行;
某种编程语言的运行库:其编译器提供的一套库函数(其中有封装的系统调用)—代码集合;
完整的程序:应用程序+操作系统提供的功能;
系统调用:调用操作系统提供好的函数;
用户态:CPU运行在用户态(特权3级),执行用户程序代码;
内核态:CPU运行在内核态(特权0级),执行OS内核代码;
用户进程/应用程序 陷入内核态(指的是CPU的状态)是指:由于内部或外部中断发生,当前进程被暂时终止执行,其上下文被内核的中断程序保存起来后,开始执行一段内核的代码。
6. 为什么称为“陷入”内核
当用户程序欲访问系统资源时(无论是硬件,还是内核数据结构),它需要进行系统调用,这样 CPU 便进入了内核态,也称管态,开始执行内核代码—具有最高的特权级0。
7. 内存访问为什么要分段
内存按访问方式来看,其结构就如同下图的长方形带子,地址依次升高。
内存是随机读写RAM设备,即访问其内部任何处,不需要从头开始找,只要直接给出其地址便可。
分段是内存访问机制,是给 CPU 用的访问内存的方式,只有 CPU 才关注段,因为最终定位内存还是需要实际的物理地址。
重定位:简单来说就是将程序中指令的地址改成另外一个地址,但该地址处的内容还是原地址处的内容。
CPU的地址处理单元:计算最终的物理内存地址。
8. 代码中的代码段和数据段?和内存访问中的段有什么关系?
代码段:为了让程序内指令接连不断地执行,要把指令全部排在一起,形成一片连续的指令区域;
指令:由操作码和操作数组成,操作数就是指程序中的数据;
数据段:把程序中的数据连续地排在一起存储形成的段落;
内存分段:指的是CPU为访问内存而采用的机制,称之为内存分段机制;
程序分段:是软件中人为逻辑划分的内存区域,它本身也是内存,所以处理器在访问该区域时,也会采用内存分段机制,用段寄存器指向该区域的起始地址。
9. 物理地址、逻辑地址、有效地址、线性地址、虚拟地址的区别
物理地址:即物理内存真正的地址,具有唯一性,不管在什么情况下,CPU最终都要以物理地址的形式去访问内存;
在保护模式下,最开始提供的 “段基址” 是一个称为选择子的东西,其本质是个索引,通过它能在GDT中找到对应的段描述符,该描述符记录了该段的起始、大小等信息,这样便得到了真正的段基址;通过段部件的计算,得到一个线性地址;若没有开启地址分页功能,此线性地址就被当作物理地址来用,可直接访问内存; 若开启了分页功能,此线性地址又多了一个名字,就是虚拟地址,(虚拟地址、线性地址在分页机制下都是一回事) ,虚拟地址要经过页部件转换成具体的物理地址,这样 CPU 才能将其送上地址总线去访问内存。(它们都用来描述程序或任务的地址空间)
无论在实模式(段基址在默认的段寄存器中)或是保护模式下(段基址在默认的段选择子寄存器指向的段描述符中),段内偏移地址又称为有效地址,也称为逻辑地址,这是程序员可见的地址。
10. 什么是段重叠
CPU 的内存寻址方式是:给我一个段基址,再给我一个相对于该段起始位置的偏移地址,我就能访问到相应内存(它并不要求一个内存地址只隶属于某一个段,或许在保护模式下会有相关访问限制?)。
11. 什么是平坦模型
平坦模型是相对于多段模型来说的,其本质就是指的一个段,并且用这一个段就能够访问到硬件所支持的所有内存(其实就是把整个物理内存当成一个段)。
12. cs、ds这类sreg段寄存器,位宽是多少
在段寄存器中所表达的都是指向的段在哪里;
32位CPU中:
16位实模式—CS、DS、ES、SS中的值为段基址;
32位保护模式—装入段寄存器的不再是段地址,而是“段选择子” Selector),选择子也是数值,其依然为16 位宽度。
所以,在 32位 CPU 中, sreg 无论是工作在 16 位的实模式,还是 32 位的保护模式,用的段寄存器都是同一组,并且在 32 位下的段选择子是 16 位宽度,综上所述,sreg 都是 16 位宽。
(16位,32位,64位)
13. 什么是工程,什么是协议
软件中的工程是指开发一套软件所需要的全部文件,包括实际代码和配置环境。
协议是一种大家共同遵守的规约,主要用来实现通信、共享、协作:起初是为避免大家各干各的,无法彼此调用对方成果的情况,从而给大家统一一种接口,一组数据调用或者分析的约定;从而实现了彼此兼容。
14. 为什么Linux系统下的应用程序不能在Windows系统下运行
可执行文件的格式、系统API等不同。
读完半章,深刻体会到还是需要一些汇编基础的~