标签: grub

简单内核无法在GRUB中启动

我正在从OSDev.org学习一些OS开发.我有一个内核,我正在尝试使用qemu在GRUB Legacy(0.97)中启动.但是,当我输入时kernel 200+9,我收到了消息

[Multiboot-elf, <0x100000:0x80:0x4008>(bad), entry=0x10000c]
Run Code Online (Sandbox Code Playgroud)

这是我所期望的,除了(坏)部分.如果我boot现在输入GRUB就会挂起.

我认为数字0x100000,0x44,0x4008分别代表.text段起始地址,.bss起始地址和.bss段大小.我认为这是因为objdump -h在内核映像上运行会产生以下结果:

kernel.bin:     file format elf32-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000044  00100000  00100000  00001000  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .bss          00004008  00100044  00100044  00001044  2**2
                  ALLOC
Run Code Online (Sandbox Code Playgroud)

所以你可以看到我提到的数字几乎匹配.问题是,而不是100044,.bss的开头只有44个.我认为这就是GRUB说错的原因.我的内存不足1 MB(低内存).但objdump告诉我我的部分超过了这个门槛,所以我不知道出了什么问题.无论如何,我会在下面粘贴我的代码,它相对较短.虽然我的问题可能是非常基本的,如果你以前做过OS开发,所以代码可能是无关紧要的.

;loader.s - contains the multiboot header for grub and calls the main kernel method

global loader                           ; making entry point visible to linker
global magic                            ; we will …
Run Code Online (Sandbox Code Playgroud)

assembly kernel grub qemu osdev

24
推荐指数
1
解决办法
3435
查看次数

GRUB是否切换到保护模式?

我想问一下,在启动过程中是否将GRUB切换到保护模式,或者它是Linux内核.而且我想问一下 - 内核本身(vmlinuz)是ELF还是纯二进制格式?谢谢.

linux cpu grub protected-mode linux-kernel

15
推荐指数
2
解决办法
4884
查看次数

启用GRUB以从内核自动启动

我正在为操作系统开发内核.为了执行它,我决定使用GRUB.目前,我已经连接到GRUB的脚本stage1,stage2,垫文件,这使得它可引导内核本身一起.唯一的问题是,当我运行它时,你必须让GRUB知道内核的位置和手动的大小然后启动它,如下所示:

kernel 200+KERNELSIZE
boot

KERNELSIZE是块中内核的大小.这很好,一开始就没问题,但是可以在二进制文件中获取这些值并使GRUB自动启动内核吗?有关如何实现这一目标的任何建议?

operating-system kernel grub osdev

13
推荐指数
1
解决办法
1881
查看次数

vagrant provisioning开关字符编码

vagrant provision今天正在运行,但由于以下错误而失败:

Package configuration???????????????????????????? Configuring grub-pc ??????????????????????????????? 
The GRUB boot loader was previously installed to a disk that is no
?? longer present, or whose unique identifier has changed for some reason.   
?? It is important to make sure that the installed GRUB core image stays in  
?? sync with GRUB modules and grub.cfg. Please check again to make sure
?? that GRUB is written to the appropriate boot devices.
???? If you're unsure which drive is designated …
Run Code Online (Sandbox Code Playgroud)

grub character-encoding vagrant

11
推荐指数
1
解决办法
1082
查看次数

具有共享库支持的Grub引导加载程序

我想在启动阶段使用grub boot-loader加载共享库(闭源二进制用户空间库).有没有机会,或者我必须编写一个自定义精灵装载程序(grub模块)来执行此操作?


  • 2014年8月29日:有关更多详细信息,这是一个编程问题,我想在其中自定义或添加一些新功能到Grub boot-loader项目.感谢您的支持!

grub shared-libraries bootloader

11
推荐指数
1
解决办法
1088
查看次数

Grub并进入实模式(低级汇编语言编程)

我一直在玩玩具操作系统,并一直使用grub作为我的引导加载程序.最近在尝试使用VGA时,我发现我无法使用硬件中断.我发现这是因为我被grub挂入了保护模式.

有没有人知道怎么回到实模式而不必摆脱grub?

x86 assembly grub real-mode

7
推荐指数
1
解决办法
1676
查看次数

使用grub,是否可以在引导期间(加载normal.mod之前)使用“if,while”?

我的电脑安装了grub。在加载 normal.mod 之前的启动过程中,我需要能够在已链接到 core.img 的配置文件中运行 if 和 while 命令(使用 grub-mkimage -c myconfig.confg)。在 myconfig.config 中,我有一个 if 语句,并且在启动过程中不断收到“unknown command if”。我在http://www.gnu.org/software/grub/manual/html_node/Embedded-configuration.html中看到了一个示例,看起来我只需要包含搜索、测试和普通模块。我错过了什么吗?谢谢

grub

7
推荐指数
1
解决办法
1055
查看次数

Linux内核参数中modprobe.blacklist和rd.driver.blacklist的区别

语境

我主要看到了通过将参数附加到内核来将驱动程序模块列入黑名单的三种方法:(i) modprobe.blacklist=driver_name(ii) rd.driver.blacklist=driver_name(iii)最后两者。这通常通过将这些参数附加到GRUB_CMDLINE_LINUX变量 at 来完成/etc/default/grub

在实践中,我无法找出它们之间的真正差异。但我想它也可能会随着你的环境而改变。有疑问,我一直在同时使用两者,它适用于我的 Fedora 31。

我的研究

驱动程序黑名单

man dracut.cmdline

rd.driver.blacklist=<drivername>[,<drivername>,...]
           do not load kernel module <drivername>. This parameter can be
           specified multiple times.
Run Code Online (Sandbox Code Playgroud)

modprobe.blacklist

man modprobe

(……)。modprobe 还将使用在内核命令行上以 <module>.<option> 形式指定的模块选项和以 modprobe.blacklist=<module> 形式的黑名单

总结问题

那么,Linux 中将驱动程序列入黑名单modprobe.blacklistrd.driver.blacklist将驱动程序列入黑名单的区别是什么?我应该什么时候使用每一种?

linux grub driver linux-kernel

7
推荐指数
1
解决办法
1034
查看次数

如何以编程方式创建可引导CD?

我正在使用准系统教程作为我正在研究的操作系统的基础,它似乎是一个较旧的教程:它已经将内核编译成软盘映像,然后用GRUB加载它.

基本上,我仍然想使用GRUB,但我想让我的操作系统从CD运行.主要原因是我实际上没有可用的真正软盘驱动器(我目前在VirtualBox中测试),因此我无法在真实硬件上测试我的操作系统.

我一直在网上闲逛,我可以找到许多从软盘映像创建可引导CD的实用程序,但这些似乎都需要一个真正的软盘驱动器,而且它并不是我真正想要的.我希望能够在我的制作步骤中最终得到可引导的CD,而不需要首先将图像放在软盘上,这看起来毫无意义.

我想回答这个问题的简单方法是:如何设置GRUB以从CD读取我的内核映像?我需要一个特殊的工具来从Windows执行此操作吗?(内核无法编译自己,这不适合于looong)

谢谢!

grub bootable osdev

6
推荐指数
2
解决办法
2064
查看次数

grubby致命错误:无法找到合适的模板

所以我yum -y update kernel在AWS EC2基础映像上升级了内核,得到以下内容:

Running Transaction
  Installing : kernel-2.6.32-504.3.3.el6.x86_64
grubby fatal error: unable to find a suitable template
Run Code Online (Sandbox Code Playgroud)

这是/boot/grub/grub.conf的内容:

default=0
timeout=0
hiddenmenu
title CentOS (2.6.32-358.el6.x86_64)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.32-358.el6.x86_64 ro root=LABEL=rootfs console=ttyS0
        initrd /boot/initramfs-2.6.32-358.el6.x86_64.img
Run Code Online (Sandbox Code Playgroud)

所以grub.conf没有得到更新,因为我已经安装了kernel-2.6.32-504.1.3.el6.x86_64,所以上次更新内核时grub没有得到更新.我尝试手动添加内核:

grubby --grub --add-kernel="/boot/vmlinuz-2.6.32-504.3.3.el6.x86_64 ro root=LABEL=rootfs \
  console=ttyS0" --title="CentOS (2.6.32-504.3.3.el6.x86_64)" \
  --initrd=/boot/initramfs-2.6.32-504.3.3.el6.x86_64.img
Run Code Online (Sandbox Code Playgroud)

然后/boot/grub/grub.conf看起来像这样:

default=0
timeout=0
hiddenmenu
title CentOS (2.6.32-504.3.3.el6.x86_64)
        kernel /vmlinuz-2.6.32-504.3.3.el6.x86_64 ro root=LABEL=rootfs console=ttyS0
        initrd /initramfs-2.6.32-504.3.3.el6.x86_64.img
title CentOS (2.6.32-358.el6.x86_64)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.32-358.el6.x86_64 ro root=LABEL=rootfs console=ttyS0
        initrd /boot/initramfs-2.6.32-358.el6.x86_64.img
Run Code Online (Sandbox Code Playgroud)

但是,/vmlinuz-2.6.32-504.3.3.el6.x86_64不是我输入的内核.所以我删除了它并再次尝试:

grubby --grub …
Run Code Online (Sandbox Code Playgroud)

linux boot kernel grub

6
推荐指数
0
解决办法
7129
查看次数