操作系统真象还原 7.31 章节0(PART1)

本文探讨了学习时间管理中的问题,以及程序设计中的应用程序与操作系统配合、用户态与内核态、内存分段机制、段寄存器如GDT的作用,还解释了Linux与Windows系统差异及局部变量和函数参数为何放在栈中。
摘要由CSDN通过智能技术生成

学习时间记录

总计:4h
失眠导致作息不规律,下午补交,晚上又因为处理杂事,没有空余时间学习,今天仅学习了4h
凌晨0:30-1:30
早上5:38-6:30
晚上19:30-20:30
晚上23:54-0:50

学习笔记 P1-P15

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

应用程序与操作系统配合

1.完整的程序,需要应用程序、编译器、操作系统共同完成。
2.应用程序通过语言编写,编译器通过编程语言规定的关键字、语法,翻译成对应的机器指令。
3.而编译器已经封装了一套库函数,库函数中封装操作系统的系统调用,这样的代码集合称为运行库。
4.只有我们的应用程序通过编译器的编译,调用运行库的函数,才能完整做好一件事。
在这里插入图片描述

用户态与内核态

1.用户进程陷入内核态指的是用户进程遭到外部或内部终端,当前的上下文执行环境被内核的中断程序保存起来,转而运行内核的代码。
2.错误理解:用户进程在内核里有代码

0.7 内存为什么要分段

重定向

1.内存的分段属于历史遗留问题,一开始访问CPU中的内存地址我们都需要直接使用直接物理地址,这也就意味着我们的机器指令中的地址应当是固定的。
2.这样就会出现一个问题,当我们同时运行两次程序的时候,就会有一块内存地址同时被访问,这显然不可能,只能运行一个。
3.基址寻址的方式就这样产生了,我们可以通过段基地址+段内偏移地址的方式访问内存。
4.我们将需要运行的程段序复制到新的内存块,赋予新的段基地址,而段内偏移地址保持不变,就可以准确访问。

通过16位的寄存器访问20位的地址空间

1.段基地址的位置是任意的,可以访问64MB的内存空间
2.段基地址寄存器16bit*16(左移四位)+段内偏移地址16bit

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

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

1.对于代码中是否需要分段,一般取决于操作系统是否在平坦模式下(如果不在平坦模式下,我们就不用来回切换段基地址)。
2.我们的编译器按照平坦模型编译,但x86处理器支持具有分页机制的虚拟内存,操作系统也使用了分页模型,且我们必须使用分段机制访问内存,从而人为将程序分成很多段,采用分段模型编程。
3.数据与代码分开,可以为他们赋予不同的属性(可修改与只读),提高CPU缓存的命中率,节省内存(部分代码没必要多次执行)

GDT 全局描述符表

1.GDT是全局描述符表,表中的每一项是段描述符,用于描述段的信息。在段描述符中有段的属性位,S字段和TYPE字段,通过这两个字段的配合可以指出段的功能,如向下扩展、只执行等。
2.GDT的产生:(1)编译器将代码段和数据段分类(2)操作系统是真正对段描述符进行编写的地方,编写对应段的位置、大小、属性(S/TYPE)(3)CPU中的段寄存器寄存(可理解为段基址),并根据对应GDT判断所进行的操作是否有误。

内存分段和程序分段是一件事情吗

1.内存分段是处理器为了访问内存而采用的机制,程序分段是人为划分的区域,但本身也是内存,在访问时,我们通过段基地址+段内地址的方式访问程序。
2.高级语言中编译器帮助我们为代码段和数据段进行分段,汇编语言中我们可以自己指定各段寄存器中的内容。

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

1.物理地址是物理内存真正的地址,是进行内存访问的终点站。
2.逻辑地址和有效地址都指的是段内偏移地址。
3.保护模式下,线性地址和虚拟地址指的是段基址+段内偏移地址,但此时段基址其实指的是段选择子寄存器,其中保存段描述符,可获取段基地址,段的大小等信息。
4.段部件,在实模式下,自动处理将段基址16。
5.页部件,在保护模式下,若开启分页模式,通过虚拟地址查找页表,获取真正的物理地址。
6.实模式下,我们通过段基址
16+段内偏移地址得到物理地址;保护模式下,我们通过段描述符中的段基址+段内偏移地址,得到物理地址或查找页表得到物理地址。

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

1.cpu内部的段寄存器如下,CS(代码段寄存器),DS(数据段寄存器),ES/FS/GS(附加段寄存器),SS(堆栈段寄存器)。
2.无论是在实模式还是保护模式下,sreg的位宽都是16位。

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

1.格式不同,Linux系统下的文件格式是elf,文件头包含节信息、段信息等;Windows下的文件格式是PE,可执行文件。
2.系统API不同,Linux下的API称为系统调用,是通过int 0x80软中断实现的;Windows系统的系统调用是通过一个动态链接库文件实现的,该文件中的代码和数据可供用户调用。

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

1.不同于全局变量,随时随地可以被全局访问,因此放在数据段中,而局部变量仅局部使用。
2.无法预测函数被调用的次数,为避免浪费内存,在每次调用函数的时候才为它在栈中分配内存。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值