GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
在BootLoader调用kernel之后,先执行一段entry.S的汇编代码,之后调用的i386_init函数进入到C语言的处理过程。这里对这个函数所作的处理做一个大概的梳理。
首先,软件先对需要清零的存储区域进行清零操作。这个处理过程在嵌入式中也有,我接触到的软件设计中一般是在启动代码中做这部分工作。但是,处理的机制其实是差不多的。存储的区间范围信息的获取,其实是通过链接文件来实现的。
这个是这个项目相关的链接文件,通过在链接文件中增加两个标签来获取.bss段的起始地址。之后,借助于C语言的库函数来实现清零。
之后的处理是终端的初始化。
终端的初始化其实是操作了显示器、键盘以及串口的初始化。这个硬件的处理细节暂时不去做深入的了解了,对应的知识可重用性不是特别高。
继续往下,其实是对cprintf的一个测试,是否支持八进制的输出。这个之前已经测试过了,而通过前面的终端初始化中的错误处理其实是能够看得出来这个cprintf已经就绪了的。
继续往下是存储的初始化,这部分已经做了一个初步的了解,主要的工作就是对存储的分页管理机制进行相应的配置准备。这是后面接下来需要重点关注的部分。
继续往下,通过无限循环的方式实现了一个终端的响应处理。这个一直是我感兴趣的地方,可能会涉及到shell的解析等工作。后面可以对这个框架做一个简单的分析。
这是这个循环中的一个循环体的实现,看得出来循环之中套循环。其实,最终软件应该是用这个循环取代掉另一个了。从这里的信息看,能够看到之前JOS启动时候的提示信息的来源点。而这个无限循环的循环体,应该就是shell处理的过程,大概率跟我之前看到过的shell例程是相似的。如何在这个小型的JOS中实现这样的交互,接下来我刚好是可以去了解一下。
这样,这次的这段代码函数分析基本就是到此结束了。整体的启动动作以及接下来的响应模式,也算是有一个基本的了解了。