当前位置:   article > 正文

第0章 一些你可能正感到迷惑的问题

第0章 一些你可能正感到迷惑的问题

操作系统是什么

操作系统是控制管理计算机系统的硬软件,分配调度资源的系统软件。
由操作系统把资源获取到后台给用户进程,但为了保护计算机系统不被损坏,不允许用户进程直接访问硬件资源。
操作系统相当于是一个分配资源的机构,用户进程的资源需要通过操作系统来分配,不同的事交给不同的资源进行工作。
系统事各种功能组合到一起后,产生最终输出的组合物。

软件是如何访问硬件的

硬件在输入输出上大体分为串行和并行,相应的接口也就是串行接口和并行接口。串行硬件通过串行接口与CPU通信,CPU通过串行接口与串行设备数据传输。并行设备访问类似。
访问IO接口的本质就是访问IO接口上面的寄存器。

在这里插入图片描述

应用程序是什么,和操作系统是如何配合到一起的

应用程序是通过系统调用来和操作系统配合完成某项功能的
应用程序是软件,操作系统也是软件,对于CPU来说它们没有区别。操作系统只是一种管理计算机的管理办法。
应用程序要用某种语言编写,编译器将语言翻译成某种机器指令。
应用程序加上操作系统提供功能才算是完整的程序,这个程序中的一部分是操作系统已经完成的,需要调用操作系统中提供好的函数才能完成,这个函数便是系统调用。

用户态与内核态是对CPU来讲的,是指CPU运行在用户态(特权3级)还是内核态(特权0级)
用户态是CPU运行应用程序,内核态是CPU运行操作系统的内核程序
在这里插入图片描述

为什么称为“陷入”内核

最外圈是应用程序,里面是操作系统。应用程序处于特权级3,操作系统内核处于特权级0.当用户程序要访问系统资源,它需要进行系统调用。这样CPU便进入了内核态,也称管态。
在这里插入图片描述

内存访问为什么要分段

内存按访问方式看,其结构就如同下图的长方形带子,地址依次升高。内存是随机读写设备,即访问其内部任何一处,不需要从头开始找,只要直接给出其地址便可。
在这里插入图片描述

分段是内存访问机制,是给CPU用的访问内存的方式,只有CPU才关注段。若加载程序运行,不管其是内核程序还是用户程序,程序中的地址若都是绝对物理地址,那该程序必须放在内存中固定的地方,两个编译出来地址相同的用户程序无法同时运行,于是,让CPU采用“段基址+段内偏移地址”的方式来访问任意内存。程序中需要用到哪块内存,只要先加载合适的段到段基址寄存器中,再给出相对于该段基址的偏移地址即可,CPU中的地址单元会将这两个地址相加后的结果用于内存访问,送上地址总线。
在这里插入图片描述
只要程序分了段,把整个段平移到任何位置后,段内的地址相对于段基址是不变的,无论段基址是多少,只要给出段内偏移地址,CPU就能访问到正确的指令。于是加载用户程序时,只要将整个段的内容复制到新的位置,再将段基址寄存器中的地址改成该地址,程序便可准确无误地运行,因为程序中用的是段内偏移,相对于新的段基址,该偏移地址处的内存内容还是一样的。
除此以外,程序分段可以将大内存分成可以访问的小段,通过在内存中来回挪位置的方式可以访问到任意内存位置。
在这里插入图片描述
在这里插入图片描述

代码中为什么分为代码段、数据段?这和内存访问机制中的段是一回事吗?

代码中为什么分为代码段、数据段?

在硬件的内存访问机制中,处理器要用硬件(段寄存器)指向以软件形式所定义的内存段。
在平坦模式下,硬件寄存器中指向的内存段为最大的4GB,而在多段模式下编程,硬件段寄存器中指向的内存段大小不一。在多段模型下的程序划分是程序员人为划分的。如果是在平坦模式下编程,操作系统将整个4GB内存都放在同一个段中。对于代码是否要分段,这取决于操作系统是否在平坦模型下。

一般的高级语言使用的编译器针对采用平坦模式的操作系统,因此不支持程序与自己分段,由于处理器的分页机制,编译器会将程序按内容自动划分为代码段和数据段。
在这里插入图片描述
在这里插入图片描述

CPU在执行当前指令时,可以获得下一条指令的地址,因为程序中的指令是挨着的不存在空隙,下一条指令的地址是按照前面指令的尺寸大小排下来的。
**为了让程序内指令接连不断地执行,要把指令全部排在一起,形成一片连续的指令区域,这就是代码段。**把数据连续地并排在一起存储形成的段落就称为数据段。
指令在物理上是连续的。不过对于CPU来说,指令在逻辑上是连续的就可以,即使数据和代码在物理上混在一起,只要程序中有指令能够跨过这些数据就行。(jmp
在这里插入图片描述

将数据和代码分开的好处:
在这里插入图片描述

在这里插入图片描述

这和内存访问机制中的段是一回事吗?

编译出来的代码段是指一片连续的内存区域,这个段有自己的起始地址和大小范围。
用户进程的段只是为了便于管理,而编译器或程序员在“美学方面”做出的规划。
内存分段指的是处理器访问内存而采用的机制,称之为内存分段机制。程序分段是软件人为逻辑划分的内存区域,用于不同数据的归类,它本身也是内存,所以处理器在访问该区域时,也会采用内存分段机制,用段寄存器指向该区域的起始地址。
内存分段时为了能够访问内存,程序分段是为了更好的分配内存。

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

物理地址就是物理内存真正的地址,相当于内存中每个存储单元的门牌号,具有唯一性。
在实模式下,“段基址+段内偏移地址”经过段部件的处理,直接输出的就是物理地址,CPU可以直接用此地址访问内存。
在保护模式下,“段基址+段内偏移地址”称为线性地址。这里的段基址不是真正的地址,而是类似索引的选择子,通过这个索引便能在GDT中找到相应的段描述符。
若开启了分页功能,此线性地址又可称为虚拟地址,虚拟地址、线性地址在分页机制下是一回事,线性地址或称为虚拟地址,都不是真实的内存地址,它们都是用来描述程序或任务的地址空间。
段内偏移地址又称为有效地址,也称为逻辑地址
在这里插入图片描述

什么是段重叠

不同段访问到相同的内存
在这里插入图片描述

什么是平坦模型

平坦模型指的就是一个段,用一个段就能够访问到硬件所支持的所有内存,段的大小可以是地址总线能够到达的范围。

cs、ds这类sreg段寄存器,位宽是多少

在这里插入图片描述
32位CPU有两种工作模式:实模式和保护模式
在实模式下,段寄存器中的值为段基址,是具体的物理地址,内存单元的逻辑地址仍为“段基址:段内偏移量”。在保护模式下,装入段寄存器的是段选择子。
sreg不管是工作在16位的实模式还是32位的保护模式,都是16位宽

什么是工程,什么是协议

软件中的工程是指开发一套软件所需的全部文件,包括配置环境。
在这里插入图片描述
协议是一种大家共同遵守的规约,主要用来实现通信、共享、协作,给大家统一一种接口、一组数据调用或者分析的约定。

为什么Linux系统下的应用程序不能在Windows系统下运行

首先,格式不同。Linux下的可执行程序格式是elf,Windows下的可执行文件是PE格式。
其次,系统API不同,即应用程序编程接口。Linux中的API称为系统调用,是通过int 0x80这个软中断实现的。而Windows中的API是存放在动态链接库文件中,也就是DLL。

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

是程序运行过程中用于动态内存分配的内存空间,是操作系统为每个用户进程规划的,属于软件范畴。
处理器运行必备的内存空间,是硬件必须的,但又是有软件(操作系统)提供的。堆栈指的是栈。
局部变量只有自己在用,没必要放在数据段中浪费空间,将其放在自己的栈中可以随时清理,真正体现了局部的意义。

函数参数之所以会放到栈中,第一也是其局部性导致的,第二是因为函数是在程序执行过程中调用的,属于动态的调用,编译时无法预测会何时调用及被调用的次数,函数的参数及返回值都需要内存来存储,如果是递归调用的话,参数及返回值需要的内存空间也就不确定了,这取决于递归的次数。这些运行中产生的中间数据也没有必要放在数据段中。

为什么总说汇编语言比C语言快

在这里插入图片描述
在这里插入图片描述

编译型程序与解释型程序的区别

在这里插入图片描述
解释型程序相当于是一个文本,它需要通过编译器才能被执行。编译型语言编译出来的程序,运行时本身就是一个进程,它是由操作系统直接调用的。
在这里插入图片描述
在这里插入图片描述

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

由内存的低地址到高地址,小端与实际数值位置顺序相反,大端与实际数值位置顺序相同,因为实际是从高到低排列的。
实际:0x12345678
小端:0x78,0x65,0x34,0x12
大端:0x12,0x34,0x56,0x78
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

BIOS中断调用的主要功能是提供了硬件访问方法,该方法使对硬件的操作变得简单易行。它和DOS建立的中断调用都是建立在中断向量表中的。它们都是通过软中断指令int中断号来调用的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Section和Segment的区别

在这里插入图片描述

什么是魔数

有特定的表达方式,局外人不知道。
在这里插入图片描述

指令集、体系结构、微架构、编程语言

指令集是具体的一套指令编码。
微架构是指令集的物理实现方式。
体系结构是能使编译出的程序直接运行的平台。

库函数是用户进程与内核的桥梁

在这里插入图片描述

MBR、EBR、DBR、OBR

在这里插入图片描述

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号