第一章

配置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  
版权声明:本文为博主原创文章,转载请附上博文链接!

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

  1. 操作系统 真象还原 读书笔记

    文章目录 环境配置 1.虚拟机virtualBox和centos 2.最小化虚拟机安装后需要配置的基本软件 2.1虚拟机连网 2.2 虚拟机软件安装 3.共享文件设置 3.1安装virtualBox增 ...

  2. 《操作系统真象还原》第十四章 ---- 实现文件系统 任务繁多 饭得一口口吃路得一步步走啊(上一)

    文章目录 专栏博客链接 相关查阅博客链接 本书中错误勘误 部分缩写熟知 闲聊时刻 实现文件系统的原理 inode构建原理 目录构建原理 超级块构建思路 创建文件系统 编写完的super_block.h ...

  3. 《操作系统真象还原》第十四章 ---- 实现文件系统 任务繁多 饭得一口口吃路得一步步走啊(上二)

    文章目录 专栏博客链接 相关查阅博客链接 本书中错误勘误 闲聊时刻 部分缩写熟知 实现文件描述符的原理 文件描述符的介绍 文件描述符与inode的介绍 文件描述符与PCB的描述符数组的介绍 实现文件操 ...

  4. 《操作系统真象还原》第十五章 ---- 实现系统交互 操作系统最终章 四十五天的不易与坚持终完结撒花(上)

    文章目录 专栏博客链接 相关查阅博客链接 本书中错误勘误 闲聊时刻 实现fork 实现fork的介绍 实现fork的原理 编写完的thread.c(fork_pid) 编写完的thread.h(str ...

  5. [操作系统真象还原3]cpu的8086实模式、显卡、硬盘

    本文为读书笔记,是对书中自己认为重要的点进行简要摘录和总结,如需要更进一步了解,还是推荐看原书,作者讲的非常详细. 原书:郑钢 操作系统真象还原 文章目录 1:cpu8086实模式 1.1:cpu工作 ...

  6. 《操作系统真象还原》——0.7 内存访问为什么要分段

    本节书摘来自异步社区<操作系统真象还原>一书中的第0章,第0.7节,作者:郑钢著,更多章节内容可以访问云栖社区"异步社区"公众号查看 0.7 内存访问为什么要分段 按理 ...

  7. 《操作系统真象还原》——0.23 操作系统是如何识别文件系统的

    本节书摘来自异步社区<操作系统真象还原>一书中的第0章,第0.23节,作者:郑钢著,更多章节内容可以访问云栖社区"异步社区"公众号查看 0.23 操作系统是如何识别文件 ...

  8. 《操作系统真象还原》第九章 ---- 终进入线程动斧开刀 豁然开朗拨云见日 还需解决同步机制才能长舒气

    文章目录 专栏博客链接 相关查阅博客链接 本书中错误勘误 进程 线程的自我小理解 线程 进程的状态 内核级线程 & 用户级线程 初步实现内核级线程 浪费两三个小时调试的辛酸史 编写thread ...

  9. 《操作系统真象还原》第十三章 ---- 编写硬盘驱动软件 行百里者半九十终成时喜悦溢于言表

    文章目录 专栏博客链接 相关查阅博客链接 本书中错误勘误 部分缩写熟知 闲聊时刻 提前需要准备编写的函数 实现printk 实现sprintf函数 创建从盘 创建从盘的步骤 修改后的bochsrc.d ...

  10. 《操作系统真象还原》第十四章 ---- 实现文件系统 任务繁多 饭得一口口吃路得一步步走啊(总结篇)

    文章目录 专栏博客链接 闲聊时刻 第十四章代码总览 编写完的fs.c(fs/fs.c) 编写完的fs.h(fs/fs.h) 编写完的dir.c(fs/dir.c) 编写完的dir.h(fs/dir.h ...

最新文章

  1. linux命令:ln 使用方法
  2. R方差分析(anova)以及Tukey检验
  3. oracle10G导入导出数据文件
  4. 汉仪尚巍手书_官宣,汉仪字库入选“十大著作权合作伙伴”啦!
  5. C和指针之字符串总结
  6. typeahead有什么作用_typeahead使用配置参数。
  7. php 函数命名 特殊字符,php 特殊字符处理函数
  8. 如何查看本机安装的python支持哪种.whl文件
  9. java避免活锁.死锁的解决,java并发编程(九): 避免活跃性危险
  10. 介绍PS大局观很不错的转文
  11. 一个app管理平台-app-host的搭建
  12. 用python处理excel视频教程_从零基础开始用Python处理Excel数据(第一季)课件+资料...
  13. mysql计算同比和环比的区别_SQL 求同比 环比
  14. 怎么修改html后缀名,在win7系统下如何修改文件后缀名?win7修改文件后缀名html方法...
  15. ROI Pooling和ROI Align、ROI Warp解析
  16. 电脑上有office,但不能新建word文档怎么办?
  17. 03-图像分割效果评估
  18. nasm ces纠正性训练 nsca-cpt体能训练 pes cscs 体能训练 acsm
  19. android 短视频编辑,短视频编辑制作大师
  20. 讯飞语音转文字_录音实时转文字就是如此简单 讯飞智能录音笔SR701评测

热门文章

  1. Python入门基础之迭代和列表生成式
  2. 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...
  3. VSTO 得到Office文档的选中内容(Word、Excel、PPT、Outlook)
  4. No projects are found to import
  5. [安全模型][Cambria Math][A][]敌手A-> 怎么打出来?
  6. Hihocoer 1336 - Matrix Sum 二维树状数组
  7. java ajax 获取headers_Ajax获取Response头信息
  8. C符号之逻辑运算符 左移与右移 自增自减
  9. python中restful接口开发实例_Python RESTful接口开发02
  10. mysql一个表几亿数据_如何在mysql 造1亿条记录的大容量数据表?