问题标签 [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 回答
38 浏览

x86 - Grub 报告“不支持标签 0x0a”

我正在制作一个 OS Grub 报告“不支持标记 0x0a”,如果它是真实的。那么我将无法指定加载内核的地址。那么如何链接呢?还是grub在标准中指定的目标地址?这是我的标题

0 投票
1 回答
113 浏览

assembly - grub 似乎没有正确加载我的内核

我使用 grub 来加载我的内核。虽然我在链接脚本中指定了.=0x100 0000,但是我只能在0x10 0000处找到一个有效的MultiBoot2 header,一一对比后发现不是我的内核。并用gdb调试发现qemu的RIP死锁在0x10 06a7

这些是我的make文件和链接器脚本和内核程序我现在不知道如何调试,我会一直等待

这个转储

0 投票
1 回答
61 浏览

assembly - 为什么一开始会向 Bootloader 发送 1MB 的数据?

我正在尝试制作我的第一个内核,并找到了关于它的教程,但无法理解为什么最初将这 1MB 的数据发送到 Linker.ld 文件中的引导加载程序。我已经搜索了互联网,但找不到答案。如果可以的话,请帮帮我。这是代码:

0 投票
0 回答
64 浏览

debian - ldmtool systemd 服务可能无法正常工作 - (硬盘初始化很慢?)

多年来,我一直在使用 systemd 服务来自动安装我的 windows raid。因为我有一个新的计算机系统,所以我的服务文件不再正常工作。

这是我的 ldmtool.service:

如果我现在正在启动我的系统,fstab 安装将找不到映射器设备,我被连接到一个控制台,但可以通过按 strg+D 以默认设置启动 - 之后我的 LDM 卷被正确安装(ldmtool.service 是重新开始并找到卷)。journalctl 显示 ldmtool.service 启动了两次

  1. 有一个空字符串
  1. 正确地

所以它看起来像在第一次 ldmtool 启动时硬盘驱动器没有正确初始化,这就是为什么它没有找到任何卷。我的假设是,我的新系统的启动速度比我多年前的系统快得多。如果我重新启动我的系统(热重启),它会在 50% 的情况下正常启动,甚至在冷“正常”启动时,它也会不时正常启动(很可能是当 HDD 足够快地初始化时)我尝试了很多不同的 After/Before/WantedBy 组合,但没有任何帮助。

我在Debian Bullseye 5.10.0-5-amd64并且ldmtool 0.2.4-3 adm64 (我的新系统在 Debian Buster(内核 4x)上也发生了同样的事情,之后我升级到了靶心)

我如何编写它实际上正在等待 ldmtool 找到我的卷的服务文件?

0 投票
1 回答
171 浏览

x86 - multiboot2 标头正确进入“启用了启动服务的 EFI amd64 机器状态”-hlt 指令不起作用?

我有一个基本start.asm(nasm 汇编器)的简单设置和一个multiboot2_header.asm在编译后链接在一起的。multiboot2 标头位于最终文件的开头ELF64-x86_64。要运行它,我使用QEMU -> OVMF (UEFI) -> GRUB -> <my-binarỳ&gt;. 当我使用最小的 multiboot2 标头时,一切正常:我处于 32 位模式,我可以设置自己的堆栈和调用函数。为了验证这一点,我检查了 QEMU 中的寄存器。但是现在我想启动到EFI amd64 machine state with boot services enabled3.5节multiboot2 规范 [ 1 ] 中定义的 ,但这会导致问题。

我如何尝试实现我的目标: 规范说明,multiboot2 标头必须包含两个标签EFI boot services tag: leaves UEFI boot services enabledEFI amd64 entry address tag of Multiboot2 header tag. 我有信心我做对了(下面的代码)。

问题(更新 2021-06-17) 经过更多调查,看起来我的方法大部分(?)是正确的。问题是,我的hlt指令被忽略了。这样,执行的代码比预期的要多,一些执行中毒eax。如果我将hlt起始符号jmpjmp(更新结束)eax

multiboot2-header.asm:

PS:Rust 工具 bootinfo [ 2 ] 可以正确识别我最终 ELF 中的 multiboot2 标头和指定标签。

0 投票
1 回答
60 浏览

kernel - 为什么 grub-file 说 NASM 原始二进制文件不兼容 multiboot2?

我正在尝试制作一个最小的内核。我的目标是让这个尚不存在的内核兼容 multiboot2。所以我首先在 NASM-Assembly 中创建了一个最小的 multiboot2-header。

我正在使用 grub-file 来测试我的二进制文件是否兼容。

问题:当我将文件组装到 elf32 时,grub-file 很高兴。但是,当我使用 nasm 将我的头文件组装成原始二进制文件时,生成的文件不兼容。

这是为什么?在 multiboot2 规范中没有指定特定的可执行格式。

multiboot2header.asm:

NASM 命令:

nasm -felf32 multiboot2header.asm -o multiboot2header.bin

nasm -fbin multiboot2header.asm -o multiboot2header.bin

grub 文件命令:

grub-file --is-x86-multiboot2 multiboot2header.bin

0 投票
0 回答
56 浏览

multiboot - 从其他主机控制操作系统选择菜单

我有两台电脑。PC(比方说 PCA)和 PC(比方说 PCB):

  • PCA – 仅安装一个操作系统 -> win10
  • PCB – 安装了两个操作系统 -> win10 和 Free DOS。在 PC 启动期间,会出现操作系统选择菜单。该 PC 的主板支持 Intel AMT 技术。

两台 PC 通过以下方式连接:

  • 以太网接口 -> 用于电源管理的接口。我正在使用 AMT 通过 PCA 为 PCB 主板上电/断电
  • 硬件 RS232 接口 -> DOS OS 下用于 PCA 上的应用程序和 PCB 上的应用程序通信的接口

我需要做什么?我需要按照特定顺序执行以下步骤:

  • 由操作员手动启动 PCA 并运行测试应用程序,
  • 上电 PCB(由 PCA 控制),
  • 从 OS 选择菜单 (multi boot) -> FreeDOS 中选择 PCB OS,
  • 通过 RS232 在 PCA 和 PCB 之间进行一些通信,
  • 断电 PCB(由 PCA 控制),
  • 上电 PCB(由 PCA 控制),
  • 从操作系统选择菜单(多启动)-> Win10 中选择 PCB 操作系统,

我正在考虑的解决方案:

通过 USB 在 PCA 和 PCB 之间添加下一个连接。在这种情况下,PCA 应该将 USB 键盘模拟为 PCB 的 HID,我想向 PCB 发送特定的击键(1 或 2)以从引导操作系统选择菜单中选择特定的操作系统。我找不到如何在 PCA 上实现 HID 键盘仿真的解决方案/示例。

我在这里找到了一些使用 WIN32 USB API https://social.msdn.microsoft.com/Forums/en-US/1b301a05-321b-4991-a73e-ee8be04b7249/c-with-usb?forum=netfxnetcom描述的旧技巧

但详细信息不再可用 - 它已从服务器中删除。

我发现的其他提示与使用 Raspberry PI 作为键盘仿真或键盘仿真但在本地用于同一台 PC 的解决方案相当相关。

也许其他想法来解决这个问题?通过以太网控制操作系统选择菜单?

如果您可以分享任何示例,提示如何实施,我将非常感激。

提示:由于某种原因,无法使用 Arduino 或 Raspberry PI 等附加硬件部件作为键盘仿真。一般来说,我不能添加任何硬件——只能在 PCA 和 PCB 之间添加额外的连接,并且可以进行软件修改。


更新

给你更好的画面。在 PCB 上插入特殊的 PCI 卡,我需要将一些特定的数据写入卡 eeprom。使用 freeDOS 的原因是我从客户那里收到了只能在真正的 DOS 操作系统下运行的 exe -> 我没有该应用程序的源代码,也没有机会获得它。

我什至不知道 exe 究竟是如何工作的,因为客户没有任何文档。在这种情况下,我在 DOS 下开发了应用程序,我的应用程序使用指定的参数调用客户 exe,并与第二台 PC 通信以通过 RS232 返回结果。确保 exec 在 windows 命令行下无法正常工作。

现在我收到客户的请求,写 eeprom 后我需要执行一些测试,我收到了第二个 exe,但在 windows 下 -> 同样的故事,我没有任何源代码、文档等,只是我只是需要使用该可执行文件。这是我需要在一个周期内切换 2 个操作系统的主要原因。

0 投票
1 回答
117 浏览

osdev - 查找 GRUB2/Multiboot 'module' (aka initrd) 的位置

我正在开发一个操作系统,需要加载一个 INITRD(grub 命令“模块”)并且找不到关于模块加载到哪里(在 RAM 中)的信息

grub 是否有办法告诉我,或者它是固定地址还是以上都没有?任何帮助,将不胜感激

0 投票
1 回答
66 浏览

linker - multiboot2 标头在 ELF 文件中“为时已晚”(偏移量很大),即使它是第一部分

在我的multiboot2final 中找不到标头ELF,因为在二进制文件中它位于 offset 处0x334e0,但 multiboot2 规范只检查第一个32KiB,即0x8000字节。因此,它“为时已晚”。

我不知道我该如何解决这个问题。ELF 标头是否过于臃肿?multiboot2 标头本身是正确的,即检查 multiboot2 标头的几个工具告诉它是正确的。当我将标题与其他代码链接在一起时,它只是不起作用。如果我调整工具以验证 multiboot2 标头,即bootimage[ 1 ] 比第一个更查看32KiB,它也可以工作。

我的链接器脚本(用于GNU ld):

readelf -WSl <my-elf>告诉,该.multiboot2_header部分确实是第一个:

在那里,您可以看到文件中的标题“为时已晚”。我该如何解决这个问题?如何将它移动到 ELF 文件中的较小偏移量,即更靠近文件开头?

PS:ELF get 是由 cargo/rustc/llvm 组装的,GNU ld在我的例子中它与自定义链接脚本一起使用。

0 投票
0 回答
15 浏览

operating-system - 分页后如何运行 ELF 内核

如您所知,Multiboot2 内核包含在 ELF32 文件中。ELF32 文件必须通过 .lds 脚本清楚地告知选择器地址。

但问题是 grub2 需要一个地址才能在物理内存中加载内核。而在ELF文件中定义的地址被grub2当LD链接该目标地址中的每个内核对象时被grub2用作目标物理地址。显然,分页后虚拟地址和物理地址之间的关系将完全改变。

所以,我想知道当内核头文件(在 ASM 中)试图长跳转到 C 内核时,如果一切都会出错。

因为我不能指望 GCC 会做什么,因为简单的转储很难理解复杂的现代优化规则。

所以我不能在跳转时代码怎么做,它是用相对地址还是绝对地址跳转?或者我可以简单地更改一些选项,让两个程序以不同的方式处理代码。

非常感谢!