我是引导加载程序和 Linux 内核的新手。我一直在做一个项目,我们必须用 Linux 内核替换引导 QNX 内核。我们当前的引导加载程序代码支持引导 QNX 内核。似乎引导加载程序也支持引导 Linux(不确定),我需要知道它是否足以启动 Linux 内核。
下面是我们的引导加载程序正在做的事情。
Bootloader 正在调用 start_kernel 函数,该函数有两个参数传递给它,一个是内核入口点,第二个是指向引导行的指针
1.地址0X90000ULL,类型转换为boot_params结构。
2.重新定位initrd
3.复制引导扇区,设置数据和命令行到最后的位置
4.初始化Linux GDT
5.跳转到内核入口点
6.禁用中断
7.Lunch_kernel()
现在在上面的代码中,有两个棘手的事情怀疑对 Linux 内核引导的支持。
首先是跳转到内核入口点的方式,通常我看到在 uboot 或 Linux 源代码中跳转到内核入口是在汇编中,但在我们的引导加载程序中它只是归档一个结构。
struct
{
long Kery;
long kernel_code_segment;
}
jumpv;
void *jump_s;
jumpv.kery=first argument pass to start_kernel;
jumpv.kernel_code_segment=0x10;
jump_s=(void *)&jumpv;
第二件事是Lunch_kernel(),其定义在代码库中根本不存在。
现在上面的东西足以将控制权传递给 Linux 映像或我可以添加/修改的其他内容以在我们当前的引导加载程序代码中引导 Linux 映像。
我们正在研究 X86 架构。
由于某种原因,在我们确定事情之前,我们不能在我们的板上进行打击和试验。