《操作系统真象还原》-阅读笔记(上)

第一章

配置bochs,进入bochs simulator后一直是黑屏,原来默认是调试模式,需要输入C(continue)来让调试继续。

第二章

主讲MBR及进入MBR前的步骤
1.实模式只能访问1MB的内存空间。
2.BIOS在ROM中。
3.开机上电后CS:IP指向内存0xfff0,这里有个跳转语句,转到fe05b才是真正的BIOS程序,之后检测内存,显卡灯,建立数据结构,中断向量表和填写中断例程。

第三章

主讲实模式
段的大小统一64KB,段基址代表内存的起始,偏移地址代表段内偏移量。
section:节,只是为了让程序员在逻辑上将程序划分为几个部分,伪指令
vstart:告诉编译器以新的数字作为后面数据的地址的起始值

第四章

进入保护模式
段描述符:专门用来描述一个内存段,大小为8字节


全局描述符(GDT):


1.相当于描述符的数组,可以用选择子中提供的下标在全局描述符表中索引描述符。
2.位于内存中,需要GDTR寄存器指向他CPU才知道在哪。通过lgdt加载GDTR,指令格式是:lgdt48位内存数据,48位前16位是以字节为单位的界限值,后32位是GDT的起始地址。2^16=65536,65536/8=8192,所以最多存储8192个段或门。
3.在保护模式下由于段基址已经存入段描述符,段寄存器没必要再存段基址了,所以段寄存器存入选择子,通过选择子在GDT中找到段描述符从而得到内存段起始地址和段界限值。选择子低2位存储了RPL(可以表示0、1、2、3四种特权级),第2位是TI位用来选择是GDT还是LDT索引描述符。而选择子的索引部分有13位,所以最多索引8192个段,和GDT存储的数量相同

 

注意:GDT中第0个段描述符是不可用的,原因是如果选择子忘记初始化则值为0,为避免误操作如果访问第0个描述符处理器将发出异常。


局部描述符(LDT)


现代操作系统中很少使用LDT
CPU厂商建议每个任务的私有内存段都应该放到自己的段描述符表中,该表就是LDT,即每个任务都有自己的LDT,随着任务切换,也要切换相应任务的LDT。下面是Linux0.11内核中描述符的关系


从相应的内核代码中,我们看到在task_struct的声明中,有如下内容:

struct task_struct {
    ...
    struct desc_struct ldt[3];
    struct tss_struct tss;
};

 

这说明ldt是和每个task有关。每当需要创建新的process时,就需要在内存中把一块相应的区域划分给这个process的LDT。
(部分参考自http://blog.csdn.net/aotony_1988/article/details/50935897)

第五章

先回忆下上章内容并解释一些不清楚的地方。
一个进程的地址空间,从用户的角度看,是由若干的段(segment)组成的,这些段可以分为两种:私有段(private)、共享段(shared)。cpu也是按照用户的逻辑进行内存管理的(分段),Intel Pentium规定了每种段最多有8K个,每个segment最大4G。一个cpu对应有一个GDT(global descriptor table),该表详细描述了shared segment,这个表为所有进程共享的;一个process对应有一个LDT(local),该表详细描述了该process的private segment,这个表是进程私有的。
我们的程序是处在一个个的Segment中的,无论是指令还是数据。我们在程序中打印出一个变量的地址其实是段内的偏移地址(32位),程序的16bit段号由操作系统分配管理,我们是看不见的,但是的确存在。
注意注意注意:以上的解释中,为简单,没有说明分页!

总之,SegmentSelector(16bit) + 段内Offset(32bit) = 一个32bit的地址值
其实这个就是虚拟地址。将这个地址转换为物理地址就需要用他到页目录表中找到页表的地址,再到页表中找到真实物理地址。
(部分参考自http://blog.csdn.net/yleek/article/details/8204393)

        如果存储器采用基本分页机制,那么操作系统会为每个进程或任务建立一个页表(这个页表可能是一级的也可能是多级的)。整个操作系统中有多个进程在运行,那么系统就会有多个页表。页表在内存中的存储位置由寄存器CR3给出。
        如果存储器采用基本分段机制,那么操作系统会为每个进程或任务建立一个段表(一般不用多级),用于记录数据段、代码段等各类段在内存中的具体位置。
        如果采用段页式结合的机制,那么一般一个进程或任务,操作系统会给其建立一个段表,而段表中的每个段又会对应一个页表,也就是说,段页式机制的每个进程有一个段表,有多个页表。
        对于典型的Linux系统而言,操作系统会维护一个全局描述符表(相当于系统的段表),全局描述符表中用于记录系统任务和用户任务的描述符,其中用户任务的描述符又指向用户任务的局部描述符表(相当于用户任务的段表)。因此要说linux中的分段机制用的是一张大表,我个人认为也是有道理的。

这本书里采用的是第一种方案,一个进程一个页表,这个页表是二级的。将页目录表和页表紧挨在一起,如下图所示
 

这里将两个表都存在内核空间的低端内存处,这样通过cr3的物理地址可以马上找到页表(因为内核空间是真实线性的,即虚拟地址和物理地址一样)。每一个进程的页表都放在一起,其实还有其他的放置方法可见此贴http://bbs.csdn.net/topics/390956135?page=1

快表

虚拟地址到物理地址转换有一个缓存器,快表,存储少量的转换关系,能加快转换速度。转换时一般先查快表查不到再查页表项。

启动分页流程

1:准备好目录表和页表
2:将页表地址写入控制寄存器cr3 (又称为页目录基址寄存器)
3:寄存器cr0的PG位置1
tips
在64位的Linux下,gcc 编译 32 位程序需要添加参数 -m32 ,ld需要添加参数是 -m elf_i386。

第六章

本章讲了一些函数调用 ,汇编和C语言混合编程等知识
1.cdecl调用,由调用者清理栈空间,即将栈顶往上加。
2.LINUX系统调用入口只有一个 0X80 中断描述符表中的一项 具体调用子功能由eax指定。
3.调用函数,当输入的参数小于等于 5 个时, Linux 用寄存器传递参数。当参数个数大于 5 个时,把参数按照顺序放入连续的内存区域,并将该区域的首地址放到 ebx 寄存器。
tips
fatal error: sys/cdefs.h: No such file or directory|
Try these:
sudo apt-get purge libc6-dev
sudo apt-get install libc6-dev

In case of -m32:
sudo apt-get install libc6-dev-i386

源码中LOADER_STRAT_SELECTOR一直在boot.inc里定义位0x2 所以Loader.bin应放到硬盘第二个扇区
---------------------  
作者:月黑风高云游诗人  
来源:CSDN  
原文:https://blog.csdn.net/lqygame/article/details/73801091  
版权声明:本文为博主原创文章,转载请附上博文链接!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apollo进阶课程㉟丨Apollo ROS原理—4

原文链接:进阶课程㉟丨Apollo ROS原理—4 ROS是一个强大而灵活的机器人编程框架,从软件构架的角度说,它是一种基于消息传递通信的分布式多进程框架。 ROS本身是基于消息机制的,可以根据功能把软件拆分成为各个模块,每…

《操作系统真象还原》-阅读笔记(中)

第七章 操作系统是由中断驱动的。 中断分为外部中断和内部中断。 外部中断分为可屏蔽中断和不可屏蔽中断,内部中断分为软中断和异常。 外部中断 来自CPU外部的中断。可屏蔽中断:通过INTR引脚进入CPU,外部设备如硬盘、网卡、打印机等发出的…

动手学无人驾驶(2):车辆检测

上一篇博客介绍了无人驾驶中深度学习在交通标志识别中的应用(动手学无人驾驶(1):交通标志识别)。 本文介绍如何使用深度学习进行车辆检测,使用到的模型是YOLO模型,关于YOLO模型的具体检测原理&a…

《操作系统真象还原》-阅读笔记(下)

第十一章 任意进程的页目录表第0~767个页目录项属于用户空间,指向用户页表。第768~1023个页目录项指向内核页表。每创建一个新的用户进程,就将内核页目录项复制到用户进程的页目录表,其次需要把用户页目录表中最后一个页目录项更新为用户进程自己的页目…

Apollo进阶课程㊱丨Apollo ROS深入介绍

原文链接:进阶课程㊱丨Apollo ROS深入介绍 ROS是一个强大而灵活的机器人编程框架,从软件构架的角度说,它是一种基于消息传递通信的分布式多进程框架。ROS本身是基于消息机制的,可以根据功能把软件拆分成为各个模块,每…

一步步编写操作系统 31 cpu的分支预测 下

让我们说说预测的算法吧。 对于无条件跳转,没啥可犹豫的,直接跳过去就是了。所谓的预测是针对有条件跳转来说的,因为不知道条件成不成立。最简单的统计是根据上一次跳转的结果来预测本次,如果上一次跳转啦,这一次也预…

Apollo进阶课程㊲丨Apollo自动驾驶架构介绍

原文链接:进阶课程㊲丨Apollo自动驾驶架构介绍 自动驾驶硬件架构:一般采用激光雷达作为主要感知传感器,同时结合摄像头、GPS/IMU、毫米波雷达、超声波雷达等,以NVIDIA Drive PX2 或 Xavier作为主要计算平台,在工业PC机…

Apollo进阶课程㊳丨Apollo平台的快速入门

原文链接:进阶课程㊳丨Apollo平台的快速入门 Apollo是向汽车行业及自动驾驶领域的合作伙伴提供一个开放、完整、安全的软件平台,帮助他们结合车辆和硬件系统,快速搭建一套属于自己的完整的自动驾驶系统。 上周阿波君为大家详细介绍了「进阶课…

一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存

咱们先介绍0xE820子功能,这是最灵活的内存获取方式。 bios中断 0x15的子功能0xE820能够获取系统的内存布局,由于系统内存各部分的类型属性不同,bios就按照类型属性来划分这片系统内存,所以这种查询则呈迭代式,每次bio…

16.深度学习练习:Building your Recurrent Neural Network - Step by Step

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。课程链接:https://www.deeplearning.ai/deep-learning-specialization/Building your Recurrent Neural Network - Step by Step1 - Forward propagation for the basic Recurrent Neur…

【2019icpc徐州站】Random Access Iterator(概率dp,有坑,tricks)

题干: Recently Kumiko learns to use containers in C standard template library. She likes to use the std::vector very much. It is very convenient for her to do operations like an ordinary array. However, she is concerned about the random-access…

一步步编写操作系统 34 内核利用bios中断获取物理内存大小

接上文,另一个获取内存容量的方法是bios 0x15中断的子功能0xE801。 此方法虽然简单,但功能也不强大,最大只能识别4G内存,不过这对咱们32位地址总线足够了。稍微有点不便的是,此方法检测到的内存是分别存放到两组寄存器…

17.深度学习练习:Character level language model - Dinosaurus land

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ 文章目录1 - Problem Statement1.1 - Dataset and Preprocessing1.2 - Overview of the model2 - Building blo…

Apollo进阶课程㊴丨Apollo安装过程概述

原文链接:进阶课程㊴丨Apollo安装过程概述 Apollo是一个自动驾驶的平台,推荐的参考运行环境为:ThinkPAD X240、CPU:i5 、四核 、内存 8G、 硬盘容量40G以上。 上周阿波君为大家详细介绍了「进阶课程㊳丨Apollo平台的快速入门」。 …

UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

继承、实现、依赖、关联、聚合、组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继…

CS231n(1):图片分类笔记与KNN编程作业

声明:本博客笔记部分为CS231n官网笔记,这里对其进行引用,在此表示感谢。 课程官网地址为:http://vision.stanford.edu/teaching/cs231n/syllabus.html 本次课程对应B站教学视频为: https://www.bilibili.com/video/av5…

【HDU - 6557】Justice(思维,模拟,套路,SETset)

题干: On the table there are n weights. On the body of the i-th weight carved a positive integer kiki , indicating that its weight is 12ki12ki gram. Is it possible to divide the n weights into two groups and make sure that the sum of the weight…

Apollo进阶课程㊵丨Azure仿真平台使用

原文链接:进阶课程㊵丨Azure仿真平台使用 Azure是一种灵活和支持互操作的平台,它可以被用来创建云中运行的应用或者通过基于云的特性来加强现有应用。它开放式的架构给开发者提供了Web应用、互联设备的应用、个人电脑、服务器、或者提供最优在线复杂解决…

java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下。本文参考java 泛型详解、Java中的泛型方法、 java泛型详解 1. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式…

动手学无人驾驶(3):基于激光雷达3D多目标追踪

上一篇博客介绍了无人驾驶中的车辆检测算法(YOLO模型),该检测是基于图像进行的2D目标检测。在无人驾驶环境感知传感器中还有另一种重要的传感器:激光雷达。今天就介绍一篇无人驾驶中基于激光雷达目标检测的3D多目标追踪论文&#…