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二级引导器的主要内容,如果未能解决你的问题,请参考以下文章

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

8.操作系统实战——环境配置,用文件模拟硬盘(生成文件,格式化,安装GRUB,转换虚拟硬盘格式)

系统启动项/系统引导原理(BIOS、UEFI、GRUB)

在Linux环境直接复移动硬盘上的GRUB

妙手回春——GRUB系统引导器恢复指南

linux 启动引导器 grub,单用户模式: