问题标签 [multiboot]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 在 Grub2 中引导自定义内核
我想用 Grub2 启动一个自定义内核。我使用了旧的(grub 1)多引导标头:
但它不适用于 Grub2,所以我搜索了新的 Multiboot 规范并找到了它:http ://bzr.savannah.gnu.org/lh/grub/branches/multiboot2/annotate/head:/doc/multiboot2 .h (它不是一个真正的规范,它只是一个头文件)
所以,现在我正在使用这个多重引导标头:
但它也不起作用:没有多重引导标头
有什么建议么?
谢谢!
kernel - Grub 2 未在内核中检测到 Multiboot 标头
我遇到了 Grub 2(和 QEMU's -kernel
)没有在我的内核中检测到 Multiboot v1 标头的问题。我之前在单独的部分中有标题.text
。
linker.ld
:
boot.s
(GNU 作为语法):
我已经验证了标题部分正在按照幻数指定的方式添加:
然而 Grub 2 说内核没有有效的 Multiboot 标头,并且使用 QEMU 的-kernel
选项会导致:
这似乎是 BIOS 映射范围内的地址,而不是 Multiboot 应该在的位置。
我已经与 Bran 和 OSDev 中的常用代码(加上我以前的内核)进行了比较,但我似乎无法弄清楚我做错了什么。
operating-system - 多重引导标头是什么意思?
是什么意思multiboot header
?在阅读有关如何制作操作系统的教程时。我遇到了这个词。
linker - 如何告诉/强制 GNU ld 将部分/符号放入输出 ELF 文件的特定部分?
这将是一个很长的时间,所以拿一些咖啡/茶/yerba。
概括
如何告诉/强制 GNU ld 将部分/符号放入输出 ELF 文件的特定部分?
具体来说,我不是在询问符号的物理/加载地址,而是询问文件中的偏移量。
背景
我正在尝试采用真实世界的 BSD 内核并使其与 Multiboot 兼容并可由 GRUB 引导。为了使 ELF 映像与 Multiboot 兼容并可由 GRUB 识别,需要0x1BADB002
在文件的前 8KiB 中嵌入一个幻数 ( )。
我指的是Multiboot 0.6.96。
由于原始内核是相当大的一段代码,我将使用基于来自 OSDev wiki 的 Bare Bones 内核的示例。由于该内核已经与 Multiboot 兼容,因此我将使用
extra_symbol
with value0xCAFEBABE
作为我的问题的示例。
boot.s
包含:
中的额外符号.text
最简单的选择是将具有该值的符号放在.text
其他任何部分之前:
这个例子很好,但如果真正的 BSD 内核.text
在文件中的 0x2000 (8KiB) 之后启动。这种方法不是一种选择。
之前的额外部分.text
?
另一种选择是将整个.extras
部分放在.text
. 在我的天真中,我希望.text
在链接描述文件之前放置这样一个部分也会使其更早地出现在输出 ELF 中:
但事实并非如此:
实际上,节在节头表中排在第一位,但它在文件 ( 0x6010
)中的偏移量在.text
. 事实上,它甚至在.bss
.
问题
ELF 规范明确指出:
虽然图中显示了紧接在 ELF 头之后的程序头表,以及紧随节之后的节头表,但实际文件可能会有所不同。此外,节和段没有指定的顺序。只有 ELF 标头在文件中具有固定位置。
我如何利用它并告诉 GNU ld 将我的extra_symbol
(可能是整个.extras
部分)放在文件中的任何其他部分之前,最好是在 ELF 标头之后?
framebuffer - GRUB2 + VESA BIOS 扩展/VBE 坏了?
虽然我之前确实解决了构建正确引导映像的问题,但在一天的大部分时间里,我一直在努力解决另一个与 GRUB2 相关的问题。
问题是,即使我在多重引导标头中设置了视频信息请求位,GRUB2 也不会返回正确的 VESA BIOS 扩展 (VBE) 信息。
内核是我自己的工作,值得注意的是它曾经与一些早期版本的 GRUB2 一起工作(TM)(我可以用白色像素填充屏幕,没问题)。
这是我当前的 grub.cfg:
这是我用来构建启动映像的脚本:
bash - 让 ubuntu 持久化 live iso 更快
首先,我想分享一下我如何制作 Ubuntu live iso 的 USB pendrive 的经验,它是多重引导的,它可以通过bash
代码复制自己。我试图指导你做这样的事情,然后,只要我不是专家,问我怎样才能让它更快(在引导、操作或克隆时)?
首先,您应该使用 GParted 等工具将您的 USB 闪存驱动程序分区为两个分区。一个 fat32 分区和另一个 ext2 的固定大小为 5500MB(如果您更改其大小,那么您也必须在 bash 代码中更改此数字)。您可以通过 USB 闪存驱动器的整个大小减去第二个分区的大小来找到第一个分区的大小。
其次,你必须下载 ubuntu iso 镜像(我下载的是 lubuntu 13.10 因为它更快,但我认为 ubuntu 也必须工作)然后将它复制到第一个分区(fat32 分区。)并将其重命名为ubuntu.iso
.
第三,运行这个命令来安装 grub bootloader(你也可以在 bash 代码中找到这个命令)
“/mnt/usb2”目录是您挂载第一个分区的目录,/dev/sdc1
也是它的设备。如果您不了解此信息,请使用fdisk -l
或 Menu->Preferences->Disks 来查找。然后将以下文件复制到他们提到的目录中并重新启动到 USB 闪存(对于我的主板,按 F12 然后从“HDD Hard”列表中选择我的闪存设备。)
/第一个分区的路径/boot/grub/grub.cfg
bash 代码:/path to the first partition/boot/liveusb-installer
所以在那之后,如果你想克隆这个闪存,只需重新启动到 grub 引导加载程序的第二个选项,然后打开另一个 USB 闪存驱动器并运行liveusb-installer /dev/sdc
。它将使用从第一个安装的每个应用程序到/dev/sdc
驱动器的另一个 USB 驱动器。我编写了这段代码,所以我所有的学生都有相同的闪存驱动器来练习使用 c、python 或 sage 到处进行编程。non-persistent(grub 菜单中的第二个选项)的速度很好,但是第一个选项,即持久性选项,需要 3-4 分钟才能启动,然后有点慢!此外,安装(复制)需要半小时才能完成!有什么改进可以让它更快吗?
任何建议将不胜感激
bare-metal - 错误:未找到多重引导标头
这一天发现了一些引起我注意的事情。是构建一个简单的裸操作系统
我阅读了如何使多重引导兼容,我正在使用 NASM 和 GCC,我需要制作一个具有多重引导头的加载器并调用我系统的主要点,因为我有两个文件 loader.asm 和 loader.ld
loader.asm
loader.ld
main.c
我正在使用的构建
最后的链接
我用 grub-mkrescue 构建了一个简单的 iso 并用 qemu 运行,但我总是得到
我认为问题出在文件中,loader.ld
但我找不到在哪里
elf - GRUB 可以加载没有多重引导标头的 ELF 文件吗?
我一直认为情况并非如此,但是,我最近阅读的教程的常见问题解答暗示它是:
为什么是多重引导标头?GRUB 不能加载纯 ELF 文件吗?
GRUB 能够加载多种格式。但是,在本教程中,我们将创建一个兼容 Multiboot 的内核,该内核可以由任何其他兼容的引导加载程序加载。为此,多重引导标头是强制性的。
我试图立即谷歌它,没有任何有用的结果。那么:GRUB 是否支持加载没有多重引导标头的 ELF 文件?
linker - 未找到 GRUB Multiboot 标头
在阅读了这个问题及其主要答案后,我在内核上运行了 readelf,并注意到我的 .text 部分位于 0x00101000 而不是 0x00100000。我还注意到上面的部分 .not.gnu.build-i 位于 .text 部分应该在的位置。有没有办法让我的 .text 部分位于正确的位置?我已经习惯align 4
将其设置为1M。
assembly - 内核完成后跳回 GRUB
所以,我有一个由 GRUB2 加载的受保护模式(32 位,x86)汇编程序。它与多重引导兼容。这个程序只是一个游戏,而不是一个操作系统。因此,我想使用 GRUB 作为一种程序切换器。
跳回 0x7C00 显然是行不通的,因为当我的内核被加载时,CPU 已经处于保护模式,而 0x7C00 是实模式引导扇区的入口点。那么,第 1 阶段加载的 GRUB2 第 2 阶段引导加载程序在哪里?假设我的程序没有,它会被删除吗?另外,简单地跳转到引导加载程序还有其他问题吗?
我想在不切换到实模式或重新启动机器的情况下执行此操作。