终于有时间开始搞我的OS Demo了。
希望能在元旦之前搞完。
这里不定时更新记录我在《操作系统真象还原》的一些笔记。以此督促和勉励自己。
很早之前就想看这本书了,之前在一个腾讯员工的书单上看到的,虽然貌似没什么名气,但看了一部分觉得还是挺有趣的,是我能非常乐意看下去的类型。那种带着程序员的幽默而不乏真实技术的书籍。
- 编译器提供库函数,库函数封装了系统调用,这样的代码集合称之为运行库。
- 用户进程永远不会因为进入了内核态而变身为操作系统。
- cs: ip。 汇编指令,表示当前执行的指令。cs是代码段寄存器,ip是指令指针寄存器,指令指针计算为
- DRAM,动态随机访问内存。物理内存,也就是内存条就属于DRAM。其动态并不是内容变化的意思,而是保存时间短,需要顶起的刷新。
- 地址总线宽度决定可以访问的内存空间容量。书中所说是决定内存空间大小,我觉得应该是容量,或者说是上限,更为合适。
yy总线先分配外设地址,最后才将其余可用地址分配给DRAM。所以说,内存空间存在一个上限。 - 在8086中,内存空间中最前面的 1KB 地址为中断向量表。可以通过使用
int 中断号
来实现相关的系统调用。 - 魔数。约定的含有具体意义但不说明的数字。在Linux中就是通过魔数来辨别文件系统。
- 尽管所有语言都会被转化成机器码,但中间存在效率,也许一个意思,Java语句有100条机器码,而汇编只有10条不到。
- 编译器的自我进化真的是非常神奇。内容太多,以后有机会可以再读p16。
- CHS方式中扇区的编号是从1开始的
- 判别是否是主引导记录mbr的方式为文件末尾的两个魔数0x55和0xaa
- mbr固定会被加载到内存的 0x7c00 地址
$
是编译器给当前行安排的地址,$$
则是本section的起始地址- section 只是用于给程序员在逻辑上规划代码用的,并没有什么实质意义
- 编译器有一个重要的工作是给程序中各符号编址。
很重要,符号包括数据类型,数据。编译器只负责编址,它只会将数据相对于文件开头的偏移量作为该数据的地址。 - vstart。虚拟起始地址。告知编译器在当前section之后的所有数据都编在这个vstart地址之后。用vstart的时机是我预先知道我的程序将被加载在某处。
- 数据的内存地址与文件地址应严格区分开来。数据的文件地址不会受到vstart影响。它的地址绝大多数是连续的。
目前的个人理解,可能有错误
麻辣格鸡的好难
- 实模式。是指CPU的寻址方式,寄存器大小,指令用法等,用来反应CPU在该环境下如何工作的概念。
- CPU唯一的任务就是执行指令。
- CPU大体分为三个部分,控制单元,运算单元,存储单元。
- 控制单元大致由指令寄存器,指令译码器,操作控制器组成。功能很好理解,先存储指令,再解码指令,最后进行操作,对其他CPU部分开始控制。
- 很多地方都用到了缓存,浏览器的访问就是一个简单例子。
- 寄存器之所以快,是由于它有触发器实现。
已经完全忘了 - CPU的寄存器可分为对程序员不可见与可见。比如一些固定数据的存储,肯定是不能让程序员访问的。
- 实模式下,默认用到的寄存器都是16位宽。
- flags寄存器是计算机的窗口,展示了CPU内部的各项设置,指标。
并不知道怎么用 - 八个通用寄存器
AX BX CX DX SI DI BP SP
,其中前四个又可各自划分为两个部分。比如对于AX
来说,可以划分为 高位(High)AH
,低位(Low)AL
。也可扩展(Extend) 为EAX
- 是历史上第一款 x86 CPU,在8086之前都是不存在段的概念,直接用硬编码访问内存。
- 8086通过“段+偏移”来实现20位寻址,16 + 16 - 20,多出的 12 位不用管它,会自动进行取模运算。
先学汇编去了 传送门