全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
现在lab1的内容全都学习完了,该做的练习也都做了。接下来,整理一下自己看这一部分课程讲义的一些笔记。
整理之前,先把自己完成后进行测试评估的结果show一下。至少是看着已经基本通关了。
这里建议看的资料我基本上不管之前是否了解,都大概看了一下。其中,这个图解的git工作过程我觉得还是很不错的,简短但是很奏效,能够快速了解git进行版本管理的一些基本理念。
由于这部分课程得涉及到汇编语言,得从底层角度了解系统的一些基本机理。这一份汇编的教程我也去读了一下,没有感受到特别难,也没有对汇编产生恐惧感。至少,我觉得这种语言读起来不会特别痛苦,但是表达力上自然是不如高级语言来的爽快。
1. 首先,这里给出了学习环境的搭建。由于现在的机器基本上都是64bit的,而ubuntu等OS其实是到了最新的版本之后也基本放弃了32bit。因此,我第一次的环境搭建尝试是在一个比较新的64bit Ubuntu虚拟机上做的。最终,我的编译在修改了文件之后通过了,可是运行的时候异常。遇到的这个问题差点让我放弃这个课程,还好最终切换了一个方式,直接换了32bit的系统,结果一切顺利。
2. QEMU我尝试接触学习过,一直不顺利,各种操作都觉得有难度。退出操作也是当时有些摸不到头脑的地方之一,还好当时我基本在GUI模式之下,直接杀死进程也来得容易。其实,这里提供了一个中止的方式。自然,这个在我后来的学习中使用真的是比较频繁的。
3. 命令行的信息其实是输出了一些底层信息,至少是硬件相关的。其实,这个并不能代表OS内核对硬件的访问,最初我理解错误。这些信息其实是在开发过程中工具链给定死了的。
这一页中比较关键的其实是中间的这个图,能够让我们理解一下早期PC的存储分配。其实现在的新计算机也有对老计算机的兼容考虑,因此这部分信息中的一部分作为一个空洞存在于现代计算机中。
1. 如果要使用gdb调试,可以使用课程提供的gdb的配置文件。这个在使用的时候若想生效,需要指定gdb可用的配置文件目录。
2. 另外,介绍了一下32bit模式下的分页机制中的地址转换规则。
编译的过程中生成了两份反汇编代码,分别对应于BootLoader和kernel。在进行调试,采用gdb进行打断点的时候这些信息很有用。同时,由于这两个文件包含了源代码和汇编代码的对应关系,可以辅助理解整个系统设计以及生效的过程。
1. 这里推荐了一些C语言的资料,我都跳过了没看。算是对我自己这方面能力的一点自信吧!如果有时间,或许我也可以去看看这些教程究竟有什么独到之处。
2. 中间写了错别字批注,应该是分段。
3. 大概十年前,工作需要读过elf的相关文档。现在已经忘得差不多了,我又看了一些小短文暂时补充了这次课程所需要的基础。后续,关于这个文件的标准可以再研究一下。
4. 在这里,又学到了一招GNU objdump的用法。
1. 这一页开始的标注部分依然是工具的使用技巧操作。
2. 关于启动地址的实现,其实是通过编译工具链中的链接器实现的。这个在看代码以及工程的时候也去关注过,也做了测试。
3. 这里提到了内核的入口点,其实也是BootLoader最后的执行点。
1. 这里解释了JOS为什么只能够使用256M空间。
2. 描述了一个常用工具的printf实现,其实这部分在各种学习中比较熟悉了。
1. 分析了JOS中cprintf的实现,有自己的独到之处。我觉得设计其实是非常巧妙的。
2. 要想顺利完成stack的监控,按照试验数据自己总结规律是可以的,更好的方式其实是去看一下函数调用call stack的约定设计说明。
上面的标注还是堆栈处理相关的部分,下面的这个标注主要是描述了stabs信息如何传递到程序的。
最后这部分要求实现的功能如果纯粹按照注释来做是会出错的,不排除这个跟机器环境有关。因为,这个信息跟OS以及工具都有一定的关系。如果是在linux环境之下,使用了GNU的工具,还是得看一下stabs的相关文档。
这就是lab1学习的简单梳理,这样,这一课算是画上句号了。