全球微资讯!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函数,
运行实验之后更新;