学习笔记

《操作系统真象还原》的一些笔记

终于有时间开始搞我的OS Demo了。
希望能在元旦之前搞完。
这里不定时更新记录我在《操作系统真象还原》的一些笔记。以此督促和勉励自己。
很早之前就想看这本书了,之前在一个腾讯员工的书单上看到的,虽然貌似没什么名气,但看了一部分觉得还是挺有趣的,是我能非常乐意看下去的类型。那种带着程序员的幽默而不乏真实技术的书籍。

2017-10-24 23:50:14 星期二

  1. 编译器提供库函数,库函数封装了系统调用,这样的代码集合称之为运行库。
  2. 用户进程永远不会因为进入了内核态而变身为操作系统。
  3. cs: ip。 汇编指令,表示当前执行的指令。cs是代码段寄存器,ip是指令指针寄存器,指令指针计算为 cs \times 16 + ip
  4. DRAM,动态随机访问内存。物理内存,也就是内存条就属于DRAM。其动态并不是内容变化的意思,而是保存时间短,需要顶起的刷新。
  5. 地址总线宽度决定可以访问的内存空间容量。书中所说是决定内存空间大小,我觉得应该是容量,或者说是上限,更为合适。yy 总线先分配外设地址,最后才将其余可用地址分配给DRAM。所以说,内存空间存在一个上限。
  6. 在8086中,内存空间中最前面的 1KB 地址为中断向量表。可以通过使用 int 中断号来实现相关的系统调用。
  7. 魔数。约定的含有具体意义但不说明的数字。在Linux中就是通过魔数来辨别文件系统。
  8. 尽管所有语言都会被转化成机器码,但中间存在效率,也许一个意思,Java语句有100条机器码,而汇编只有10条不到。
  9. 编译器的自我进化真的是非常神奇。内容太多,以后有机会可以再读p16。

2017-10-26 00:46:57 星期四

  1. CHS方式中扇区的编号是从1开始的
  2. 判别是否是主引导记录mbr的方式为文件末尾的两个魔数0x55和0xaa
  3. mbr固定会被加载到内存的 0x7c00 地址
  4. $ 是编译器给当前行安排的地址,$$则是本section的起始地址
  5. section 只是用于给程序员在逻辑上规划代码用的,并没有什么实质意义
  6. 编译器有一个重要的工作是给程序中各符号编址。很重要,符号包括数据类型,数据。编译器只负责编址,它只会将数据相对于文件开头的偏移量作为该数据的地址。
  7. vstart。虚拟起始地址。告知编译器在当前section之后的所有数据都编在这个vstart地址之后。用vstart的时机是我预先知道我的程序将被加载在某处。
  8. 数据的内存地址与文件地址应严格区分开来。数据的文件地址不会受到vstart影响。它的地址绝大多数是连续的。目前的个人理解,可能有错误

2017-10-27 00:09:24 星期五

麻辣格鸡的好难

  1. 实模式。是指CPU的寻址方式,寄存器大小,指令用法等,用来反应CPU在该环境下如何工作的概念。
  2. CPU唯一的任务就是执行指令。
  3. CPU大体分为三个部分,控制单元,运算单元,存储单元。
  4. 控制单元大致由指令寄存器,指令译码器,操作控制器组成。功能很好理解,先存储指令,再解码指令,最后进行操作,对其他CPU部分开始控制。
  5. 很多地方都用到了缓存,浏览器的访问就是一个简单例子。
  6. 寄存器之所以快,是由于它有触发器实现。已经完全忘了
  7. CPU的寄存器可分为对程序员不可见与可见。比如一些固定数据的存储,肯定是不能让程序员访问的。
  8. 实模式下,默认用到的寄存器都是16位宽。
  9. flags寄存器是计算机的窗口,展示了CPU内部的各项设置,指标。并不知道怎么用
  10. 八个通用寄存器 AX BX CX DX SI DI BP SP,其中前四个又可各自划分为两个部分。比如对于 AX来说,可以划分为 高位(High) AH ,低位(Low) AL。也可扩展(Extend) 为 EAX
  11. 是历史上第一款 x86 CPU,在8086之前都是不存在段的概念,直接用硬编码访问内存。
  12. 8086通过“段+偏移”来实现20位寻址,16 + 16 - 20,多出的 12 位不用管它,会自动进行取模运算。

2017-10-28 01:00:32 星期六

先学汇编去了 传送门

发表评论

电子邮件地址不会被公开。 必填项已用*标注