首页 > 其他分享 >03 设置工作环境与环境(二)GRUB二级引导器

03 设置工作环境与环境(二)GRUB二级引导器

时间:2023-04-19 21:36:07浏览次数:31  
标签:03 函数 GRUB 文件 环境 二级 寄存器 引导

先前GRUB已经把我们的操作系统加载到内存了;

此处二级引导器的作用:先驱,收集机器信息,看计算机能否运行我们的操作系统,对CPU、内存、显卡等进行配置,放置好内核相关文件;不执行具体的加载任务;

中心思想(把处理操作系统运行环境的工作独立出来,交给二级引导器来做,这回大大减低后面开发操作系统的难度,增加操作系统的通用性;针对不同的硬件平台,只要开发不同的二级引导器就行)

实现GRUB头

GRUB头有两个文件组成:imginithead.asm汇编文件:让GRUB识别,设置c语言运行环境,调用c函数; inithead.c文件:查找二级引导器的核心文件initldrkrl.bin;将它放置到特定的内存地址上;

imginithead.asm文件主要的工作是:初始化CPU寄存器,关中断并加载GDT,切换到CPU的保护模式,最后初始化段寄存器和通用寄存器、栈寄存器,并调用了inithead_entry函数;这个函数在inithead.c中实现的;inithead_entry函数主要工作:分别调用write_realintsvefile();write_ldrkrlfile()函数;把映像文件中的initldrsve.bin文件和initldrkrl.bin文件写入到特定的内存中;这两个函数依赖于find_file和m2mcopy函数;find_file函数负责扫描映像文件中的文件头描述符,对比其中的文件名,然后返回对应的文件头描述符的地址,这样就得到文件在映像文件中的位置和大小了;m2mcopy函数负责把映像文件复制到具体的内存空间中;

进入二级引导器:

jmp 0x200000地址,正是inithead.c中由wirte_ldrkrlfile()函数放置的initldrkrl.bin文件;进入二级引导器的主模块了;

需要重新初始化CPU寄存器,加载GDTR、IDTR寄存器,最后调用二级引导器的主函数ldrkrl_entry。

调用BIOS中断:

这时需要设置中断服务,为后面内存布局、显卡图形模式等依赖这个中断;;

c函数中调用BIOS中断处理的问题:c工作在32位保护模式,BIOS中断工作在16位实模式;

  先要保存c语言环境下的CPU上下文;即保护模式下的所有寄存器都保存在内存中;

  接着切换回实模式,掉哟BIOS中断,返回相关结果;

  切换会保护模式,重新加载保存的寄存器,恢复c语言环境;

这儿是ldrkrl32.asm文件完成,并且建立一个realintsve.asm文件,将它编译为16位 的二进制文件,放在0x1000开始的地方;

 二级引导器主函数:

建立c文件ldrkrlentry.c,其中有一个函数,ldrkrl_entry函数,调用init_bstartparm函数,就是收集机器环境信息的;

 

思考题:

GRUB头中为什么需要  _entry 标号, _start 标号的地址???

标签:03,函数,GRUB,文件,环境,二级,寄存器,引导
From: https://www.cnblogs.com/xuan01/p/17334596.html

相关文章

  • CF 1820A-Yura's New Name, 800 / 思维 / ^-^ 或 ^^ 才合法
    CF1820A-Yura'sNewName处理方式:特殊情况提前判断+一般情况从首推到尾#include<iostream>#include<cstring>usingnamespacestd;constintN=1e2+10;typedeflonglongLL;intT;strings;intmain(){cin>>T;while(T--){......
  • How Many O's? UVA - 11038
    写下区间[a,b]的所有数 ,问一共有多少个0 #include<iostream>#include<cstring>#include<vector>usingnamespacestd;#defineintlonglongintn,f[40][40][2][2];vector<int>a;intdfs(intx,intcnt0,intflg,intlead){ if(x<0){ i......
  • 关于报错:Error adding module to project: setSdk: sdk '1.8' type 'JavaSDK' is not
    问题描述:Erroraddingmoduletoproject:setSdk:sdk'1.8'type'JavaSDK'isnotregisteredinProjectJdkTable(图片来自贴吧,看到有一个人问这个问题,然后自己碰到了但是忘了截图)说明当前项目在“ProjectJdkTable”里面是没有配置sdk1.8的。百度翻译过来就是:未在Project......
  • redis----day03( )
    面试面试如何聊#第一面(笔试): -办公室做题:拍照,发群里---》自己课搜,同学帮着搜----》往上写-问不答了,可以直接面试吗?#第二面:正式面试(开启手机录音,放口袋中) -一个人,多个人坐你对面-最重要的:自我介绍(自己提前写出来,500字,尽可能展现自己的优势) -面试官您......
  • 一个使用公式化序列分类的EAL学术写作辅助环境
    一个使用公式化序列分类的EAL学术写作辅助环境(AnassistiveenvironmentforEALacademicwritingusingformulaicsequencesclassification)★★实验结果实验组、对照组和两维度分析:对照组学生:使用短语库;实验组学生:使用提出的应用程序(ARP)作为辅助工具。  一、摘要......
  • papmelon 214. 萨鲁曼的军队 Saruman's Army
    地址https://www.papamelon.com/problem/214解答贪心算法尽可能标记右边的点也就是后边的点在覆盖空间的可能性更大#include<iostream>#include<algorithm>#include<set>#include<assert.h>usingnamespacestd;constintN=1010;intn,r;intarr[N];......
  • 数据结构与算法学习03
    学习要点一、预习页码:38-51二、预习内容1、顺序表应用实例——P38---例题2.3+例题2.4,练习题P71---6。2、线性表的实现——单链表(必须掌握),构造过程,见P43-图2.113、单链表的定义,见P44--最后四行4、熟练掌握单链表的插入删除操作。(重点掌握)——图2.14+图2.155、(重点掌握)单链表......
  • UESTC Final Pan's prime numbers 1272 (坑)
    FinalPan'sprimenumbersTimeLimit:3000/1000MS(Java/Others)   MemoryLimit:65535/65535KB(Java/Others)Submit StatusFinalPanlikesprimenumbersverymuch.Oneday,hewanttofindthesuperprimenumbers.Aprimenumbers n(n>4)......
  • What's PLinq? how to use it?
    What'sPLinq?howtouseit?PLinqstandsfor"ParallelLINQ",whichisaparallelimplementationofLINQ(Language-IntegratedQuery)in.NET.ItallowsdeveloperstoperformLINQqueriesinparallelbyautomaticallypartitioningtheinput......
  • 升级 .net 6后 The view 'Index' was not found. The following locations were searc
    升级.net6之后Razor页面出现找不到view的情况,原因是.net6默认移除了一些依赖包,如下完美解决web工程添加包Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationstartup.cs里面加上Compilation引用builder.Services.AddControllersWithViews().AddRazorRuntimeCompilation(); ......