03 设置工作环境与环境GRUB二级引导器
Posted xuan01
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 标号的地址???
linux —— 启动引导程序 lilo 与 grub
目录:1、启动引导程序概要
2、lilo 的安装与配置
3、grub的安装与配置
4、两种引导程序的切换
5、附:编译内核时的lilo 设置
1、启动引导程序概要
2、lilo 的安装与配置
3、grub的安装与配置
4、两种引导程序的切换
5、附:编译内核时的lilo 设置
与lilo相关的一个文件是:/etc/lilo.conf(这个文件由 liloconfig 这个指令生成) 。
双系统的情况下,执行lilo.conf 好像没有 检测到我的win7系统,编译内核后,它只识别到了两个内核。下面是添加原来 window启动项的步骤。
5.1 查看自己的设备名
sudo fdisk -l
我的部分结果如下:
设备 启动 Start 末尾 扇区 Size Id 类型 /dev/sda1 * 4096 94380031 94375936 45G 7 HPFS/NTFS/exFAT /dev/sda2 94384126 488396799 394012674 187.9G f W95 扩展 (LBA) /dev/sda5 94384128 241180671 146796544 70G 7 HPFS/NTFS/exFAT /dev/sda6 241184768 304099327 62914560 30G 7 HPFS/NTFS/exFAT /dev/sda7 304099392 346042431 41943040 20G 7 HPFS/NTFS/exFAT /dev/sda8 346044416 366061567 20017152 9.6G 83 Linux /dev/sda9 366063616 378073087 12009472 5.7G 82 Linux 交换 / Solaris /dev/sda10 378075136 381071359 2996224 1.4G 83 Linux /dev/sda11 381073408 429117439 48044032 22.9G 83 Linux /dev/sda12 429119488 433121279 4001792 1.9G 83 Linux /dev/sda13 433123328 464371711 31248384 14.9G 83 Linux /dev/sda14 464373760 480387071 16013312 7.7G 83 Linux /dev/sda15 480389120 484390911 4001792 1.9G 83 Linux /dev/sda16 484392960 488396799 4003840 1.9G 83 Linux
我装双系统时,是在240G的固态硬盘的win7下,使用分区工具diskgenius 划出71G为空闲,然后使用u盘启动的方式安装ubuntu16.04,以自定义分区的方式,在空闲空间自己给不同的目录分区。
上面 /dev/sda8 时linux 的根目录挂载的区, /dev/sda1 是我的 window 的C盘区。
5.2 往 /etc/lilo.conf 添加 window启动项
在文件最后添加:
### win7 operation system ########### other = /dev/sda1 label = "Win7-64bit" table = /dev/sda
注: other: linux 系统引导项使用的是image,而其他系统使用other ,后面填写启动的系统所在的区
label:这里是显示在启动面板的名称,长度不能超过16个字符
table:分区表所在的外部设备 ,我的硬盘是固态硬盘,说以分区是以 sdaX 名,table要填的,就是去掉数字后的设备名,我这里相应的就是 /dev/sda
如果是普通硬盘的话,我不确定是hdaX或者是 hdX,放在填上去掉数字的那个名称就是了:/dev/hda 或 /dev/hd
添加之后保存,进入下一步。
5.3 重新执行
sudo /sbin/lilo
让结果更改生效。如果出错的话继续会去修改吧。 (语法参考:man lilo.conf)
看到结果列出的列表里包含了你的window那就证明成功了,重启即可看到window选项了。
以上是关于03 设置工作环境与环境GRUB二级引导器的主要内容,如果未能解决你的问题,请参考以下文章