04 设置工作模式与环境(三)收集信息

本节将实现二级引导器的具体工作:检查CPU是否支持64位工作模式,收集内存信息,是否符合系统最低运行要求,接着再设置系统需要的MMU页表,显卡模式,释放中文字体文件;

init_bstartparm()函数:检查CPU模式,收集内存信息,设置内核栈,设置内核字体,建立内核MMU页表数据;

检查与收集机器信息:

machbstart_t结构体,清零,在内存1MB处初始化;

检查CPU:

init_chkcpu函数,使用CPUID指令检查是否支持64位长模式,并设置之前的machbstart_t结构体的mb_cpumode为64位;

获取内存布局:

s_e820结构体用来描述一段内存;init_mem函数完成:获取这个结构体数组;检查内存大小,不能太小;

 其中的  mmap函数是通过之前的realadr_call_entry函数,调用了实模式下的_getmmap函数,此函数内部调用了BIOS中断,就能获取结构体数组;

初始化内核栈:

在machbstart_t结构体中,记录栈地址和栈大小,供内核在启动时使用;

注意要检查内核栈空间与内存中已经存在的信息是否发生冲突;

放置内核文件和字库文件:

内核已经编译成一个独立的二进制程序,和其他文件被一起打包到映像文件中,因此需要解包出来,放在特定的物理内存中;

r_file_to_padr函数在影像中查找相应的为念,并复制到对应的地址,返回文件大小;;放置完更新machbstart_t结构体中的数据;

结构体中mb_nextwtpadr始终指向下一段空闲内存的首地址;

建立页表数据:

在二级引导器中建立MMU页表数据,目的就是在内核加载运行之初开启长模式,MMU需要的页表数据已经准备好 了;

映射核心逻辑:两重循环,外层循环控制页目录顶指针,16项,内层循环执行一个页目录,每个页目录中有512个物理页地址;

内核启动初期,虚拟地址和物理地址要保持相同

设置图像模式:

上电初,显卡会自动进入文本模式,不能显示汉字和图形;要切换到图像模式;

用BIOS中断,c函数调用;

处理VBE 模式的代码;定义了显卡的几种图形模式,包括分辨率,像素格式,显存大小;

串联:

在init_bstartparm函数中串联起来上述函数,依次调用;

显示logo:

24位 位图文件;logo函数,

 

运行实验之后更新;

4.21更新:

 提示先避坑:虚拟机Ubuntu系统得是64位的,不然编译会报错,gcc编译不通过;还有一个原因是Cosmos也是64位的;

假如说原本是32位的,你在VirtualBox上设置成64位,也不会生效的;;;;

尽量使用git下载源码到Linux上,同时学一学git命令;;;

因为作者已经打包好了命令了,这里先跳过具体编译细节(先弄出来再研究内部具体细节),使用打包好的 在代码目录下,执行

make vboxtest

执行完效果:

 

把生成的hd.img 下载到本地主机,接着使用之前的命令将其转化为 hd.vdi文件,挂载到咱们的系统Cosmos下,

 使用命令挂载:

 

 再虚拟机Virtualbox上启动Cosmos:完成本节效果;

 

posted @ 2023-04-21 10:07  QianFa01  阅读(59)  评论(0)    收藏  举报