问题标签 [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.

0 投票
1 回答
178 浏览

x86 - Multiboot 1 引导信息总大小

有没有一种快速可靠的方法来找出内存中 Multiboot 1 启动信息的总大小?

澄清一下:我不是在询问 EBX 寄存器中的值所指向的结构的大小,而是在询问内存中所有信息的总大小。

我目前正在开发兼容 x86 Multiboot 1 的内核。该标准不保证 GRUB 将放置此信息或其总大小。该标准规定:

“Multiboot 信息结构及其相关子结构可以由引导加载程序放置在内存中的任何位置(当然,为内核和引导模块保留的内存除外)。操作系统有责任避免覆盖此内存,直到它是用它完成的。”

实际上,这似乎总是在最低的 1MB 内存中加载。到目前为止,在启动​​期间,我使用标识映射为最低 1MB 初始化我的启动分页结构,以确保 Multiboot 信息是可访问的。找出这个结构的位置是微不足道的,但我还没有找到任何关于找到准确尺寸的信息。(理想情况下不走整个结构)。

0 投票
0 回答
493 浏览

macos - 预期的可重定位表达式

我正在尝试使用LLVM从MacOS上的Multiboot 2 规范编译示例,但一开始我失败了。我想从boot.S创建一个包含multiboot2.h的目标文件,所以我调用但它因错误而崩溃: gcc -m32 boot.S

下面是boot.S代码:

有谁知道这个错误是什么意思?以及如何解决?

PS我是汇编程序中的菜鸟。我只是想了解 multiboot 2 内部的工作原理。

0 投票
0 回答
54 浏览

x86 - 未正确生成多引导标头

我正在我的小操作系统上开发。使用 Bochs 模拟器运行它。目前,当我生成最终的 ELF 文件时,Bochs 中的 GRUB 可以从中启动,但问题是目前在 C 代码中,我有一个变量,其中包含将显示在屏幕上的文本(char message[] = "some short message"),当我增加大小时在该文本中,可以说我将其替换为:

char message[] = "This is going to be a very very long line because I want to test how does framebuffer perform when we are exceeding size of one line, will this part occur on the second line?"

Error: no multiboot header found当我尝试从 GRUB 引导我的操作系统时出现错误。我知道 GRUB 试图在我的可执行文件中找到0x1BADB002标志校验和,并且我尝试提供它们,并且看起来当文本的大小很小时它运行良好,但当它很大时却不行。总的来说,它当然不应该依赖于此,所以我可能在链接.o文件时搞砸了一些东西,但我不知道是什么。

PS 我正在学习一个教程,但对我正在使用的所有工具(nasmld等)还不是很熟悉,所以我想说我的问题是:

  1. 多重引导标头是否应该恰好位于可执行文件的开头?因为当我尝试使用hexdump查看内容工作可执行文件时,它不是以类似的开头1B AD B0 02
  2. 在教程中说这. = 0x00100000是必要的,因为系统本身正在为自己使用 RAM 的底部 1MB 地址空间,这意味着我的多重引导标头将在最终可执行文件中的 1MB 之后的某个位置?
  3. C 编译器(我使用的是 GCC 7.5.0)是否会char message[] = "some short message"根据消息的大小对行进行不同的处理?将代码转换为汇编程序时,它是否将它们存储在不同的部分中?因为当我从链接器脚本中删除rodata部分时,它甚至可以使用长消息。

在此先感谢您的帮助,以下是有关构建流程的一些重要文件:

loader.s(初始化一些东西并从kmain.c调用kmain函数)

主程序

链接.ld

0 投票
1 回答
265 浏览

assembly - 通过 8042 PS/2 控制器重置后,QEMU 不会重新启动我的操作系统

@MichaelPetch 重写了整个问题,以将其简化为应该易于复制的特定问题。最初的问题集中在以 64 位长模式进行 OS 开发时遇到的问题。该代码试图使用 8042 PS/2 控制器重新启动机器,但它无法在 QEMU 上运行,尽管它在 BOCHS 中运行。原始代码可以在这个Github 项目中找到。

Michael 确定问题不是特定于长模式的。问题空间大大缩小,以更好地说明核心问题。


对于这个演示,我是:

  • 使用 GRUB Multiboot2 规范引导 32 位内核。
  • 使用 8042 PS/2 控制器通过键盘重新启动机器。
  • 创建一个 ELF 可执行文件并将其放置在 ISO 映像中,以便它可以作为 CDROM 引导。
  • 假设此代码目标机器/环境支持通过 8042 PS/2 控制器重新启动

本次演示的代码如下:

引导加载程序.asm

链接.ld

我的 Linux 构建脚本是:


问题

当我运行构建脚本并使用以下命令在 QEMU 中运行它时:

GRUB 引导内核并BOOT在窗口左上角以洋红色属性正确显示为白色。它应该在重新启动机器之前短暂等待加载 GRUB 并重复循环。

它没有做预期的事情。它BOOT按原样显示,但 QEMU 似乎坐着什么也不做,这不是我所期望的。

如果我使用附加选项运行 QEMU,-d int我发现机器似乎处于由无效操作码异常 (v=06)、一般保护错误 (v=0d) 和双重错误(v =08)。输出通常类似于:

它不断重复类似的模式。不同寻常的是,它似乎陷入了这个异常循环:

是什么导致了这个问题,我该如何解决它,以便 QEMU 能够正确重启并再次启动 GRUB?

0 投票
0 回答
119 浏览

c++ - 将多引导引导加载程序和 C++ 内核的位数从 32 更改为 64?

我正在编写一个操作系统。我的经验只允许我将其制作为 32 位,但我想将其转换为 64 位。

我该怎么做才能使它成为 64 位?

我只想知道一般信息而不链接代码,但认为它不相关。因此这里是我的 kernel.s 代码:

不过,我认为它还没有准备好。
如有必要,这是我的 kernel.cpp 代码:



我正在使用asUbuntu 中的汇编程序构建我的汇编代码;我的 C++ 代码由g++.

如果有重复,请链接它们,因为即使滚动了整个页面我也没有发现它们。

0 投票
0 回答
52 浏览

macos - 当我将 .section 添加到我的汇编代码中时,它会引发一个错误,但是当我不这样做时,它会因为 .multiboot 部分而引发一个不同的错误

这是我的代码,当我编译时它会引发一个错误,它说我必须添加.section,但是当我这样做时,它会引发一个不同的错误,告诉我删除.section。我该如何解决这个问题?

0 投票
1 回答
111 浏览

assembly - 我在哪里可以找到信息来声明多引导标头的常量

我正在尝试开发自己的操作系统,并遵循这些教程。

https://wiki.osdev.org/Bare_Bones

我知道我将使用 GRUB/现有的引导加载程序来加载“kernel.c”。在将控制权移交给“kernel.c”之前,我知道硬件没有初始化,因此我将设置诸如内存映射、堆栈等之类的东西。

我看到在多引导标头中设置了特定的变量/硬件

为什么特别提到上面代码中的那些?我在哪里可以找到这些多引导头?我是否应该在以下链接中使用与 GRUB 指定的架构相关的特定架构?

https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#multiboot_002eh

我在哪里可以了解更多关于我的其他操作系统项目的引导程序集的信息?

0 投票
1 回答
28 浏览

git - VirtualBox debian 64。安装 git 后无法重新启动我的虚拟机(但如果有人知道如何在 2 个驱动器上进行双启动,我会接受它)

大家好, 一切都在标题中。

  1. 我创建了我的 VM debian x64
  2. 我用“apt install git-all”安装 git

在此步骤之后,我无法使用界面关闭我的虚拟机(我可以使用交叉窗口关闭虚拟机并单击“关闭”)但是当我尝试再次启动此虚拟机时,初始化失败,我没有没有图形界面了。

其他可以帮助我的选择:)

我使用 VM 是因为我不想保留我的窗口,但我需要 debian。我不知道如何在 2 个驱动器上进行双启动。

我的意思是我在 SSD 上有 Windows(只有操作系统、桌面和其他文件存储在我的 hdd 上)。而且我想将我的硬盘分成两部分以将 debian 放在其中之一上,但我真的不知道该怎么做。

希望有人能帮助我,祝你好运。:)

0 投票
0 回答
104 浏览

assembly - Grub 没有正确加载我的操作系统

我刚刚根据这个 youtube教程创建了一个在屏幕上打印文本的基本操作系统。本教程中使用的方法相当复杂(我假设),因为它使用 C++ 而不是 C。在 Grub 菜单中选择操作系统后,菜单关闭但屏幕保持紫色。没有文本打印到屏幕上。我已经仔细检查了我的代码是否与教程相匹配,但它仍然不能像在他的机器上那样工作。

相关硬件:

这些文件相当小,包括在下面。

内核.cpp

loader.s:(因为 C++ 期望在运行之前设置堆栈指针)

链接器.ld

生成文件

0 投票
1 回答
205 浏览

gcc - 加载我的内核时,GRUB2 产生“找不到多引导头”错误

我读到GRUB Multiboot header not found但我仍然无法加载我的内核

我尝试直接在 .s 文件中写入 multiboot2 标头,然后链接它。它应该出现在所有其他段之前:

[kheader.s]

[链接脚本]

[倾倒]

通过 hexdump 可以看到他被准确的放在了 1M 地址,所以 Grub 无法识别。如何让header放在文件的前端?

这是制作日志