全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
按照MIT 6.828的计划表继续往下走,看到了一份需要看的阅读资料,也就是这次整理的这一份幻灯片。其实,为了解决之前的疑惑相关的内容我已经从其他的资料中看到了类似的内容,这次简单做一个快速的勾勒性阅读。
首先需要注意一点,x86平台上的函数参数传递等行为跟工具以及运行环境等都是相关的。这里,专门提到了工具是gcc。
1. EIP就是很多资料中提到的IP寄存器或者PC寄存器,每执行一条指令之后会自动增加1。
2. 这里给出来了一些可以对EIP的值造成影响的指令。
类似的寄存器内容在很多芯片资料中看到过,但是,对比看下来早期的x86的寄存器配置并不是很强大。甚至说,相比现在的一些MCU来说这个配置都是有一些“寒酸”的。
这里简单分析了一条pushl实现的功能,首先是移动esp指向接下来的地址(通过减去4),继而想这个地址存储eax的内容。
这里提到的向前兼容的特性在我之前分析的UNIX类型的JOS系统中看到过,JOS的BootLoader设计就是按照这样的一个流程。
OS给用户提供的地址信息跟实际的存储地址有一个映射关系,这是OS需要处理的一套复杂逻辑,但是对用户来说其实是清晰的。
这个存储地址的逻辑关系图比较重要,是理解很多设计的重要参考。这部分内容在之前看MIT 6.828的lab1网页的时候也看到了。
从这个标题可以看出来,函数的调用约定跟工具以及OS都有关系。而这里的描述是针对JOS的。这个图中表达的内容跟我之前看过的一份网络上的文章是一致的,这在之前的笔记中能够找到。
有了前面的调用约定模型,理解这样的对等汇编其实还是很容易的。
这里提到了代码文件最终编程可执行文件的过程,中间涉及到了编译、汇编自己链接的过程。
这一页讲的其实是QEMU的模拟实现,但是这里的256M可能恰好是跟之前看到的JOS所能够访问的存储空间一致,让我觉得有点巧妙的关联感。
对于指令的模拟,现在看起来就是一个查表响应,似乎比较简单。
QEMU模拟的过程中,也有一些设备的依赖,这个其实是直接通过HOST与HOST的硬件进行交互。
这样,这一份幻灯片资料就整理完了。其实,这部分资料如果早看一段时间的话对我的学习速度推进更有作用。