问题标签 [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.
visual-studio - Visual Studio 2015 - 控制链接顺序
我有一个较旧的 Visual Studio 2010 项目。最近我对它重新产生了兴趣,因此我将其转换为 VS 2015 项目。一切顺利,没有报告任何问题,编译成功。
现在,问题在于创建的 .obj 之一必须是第一个被链接的东西(输出必须是多引导兼容的,因此我必须确保多引导标头是应该的) .
对于旧版本的 VS,这是以一种有点 hackish 的方式完成的:必须是第一个的文件的名称以 '__' 开头(那时我就像个孩子,并不总是想着如何做正确的事情只要他们工作)。自然,这不再起作用了。
那么,如何告诉链接器某个链接顺序是预期的呢?或者,在问题的上下文中,如何使用 VS 2015 构建兼容多引导的二进制文件?
编辑:我已经选择了一个正确的答案,但我想指出,如果有人遇到同样的问题,还有另一种方法。您可以为多重引导标头指定一个部分名称(我们称之为 .boot),然后将其与文本部分合并(请参阅https://msdn.microsoft.com/en-us/library/wxz26dz2.aspx)。要了解如何为多引导标头指定节名称,请阅读汇编程序的文档(或用于生成带有标头的 .obj 的文档)。
assembly - 在简单内核的上下文中理解链接描述文件值
关于开发一个小内核,我正在关注这本书: https ://littleosbook.github.io
我已经到了必须链接二进制文件的地步,我想确保在继续之前了解链接器脚本:
首先,为什么要具体说明ALIGN
章节(4KB)?(我认为这不太可能与优化有关,或者我可能弄错了,这可能是出于性能原因,否则我认为启动过程没有限制 - 通过删除ALIGN
脚本中的函数调用来确认)
然后考虑要链接的可执行文件:
我说.rodata
, 和.bss
部分还不需要吗?(因为内核仍然可以正常启动)
从这个小链接描述文件中,还有什么我无法从ld
手册中理解的东西(我读了一点以了解点、theSECTIONS
和入口点)吗?
看来我可以在脚本中重新排列节的顺序,内核仍然可以工作,这是为什么呢?
boot - 在 QEMU 中同时使用多重引导和软盘
我正在尝试开发一个操作系统。我已经完成了OSDev的准系统教程,但在多重引导方面仍然存在一些问题。
据我了解,当我按照教程创建多引导映像时,我有一个 ELF 格式的二进制文件。-kernel
当我指定选项时,这个 ELF 可执行文件由 QEMU 加载到内存中。所以我在内存中有一个可执行程序,它有一个入口点。它旁边有一些函数和库。记忆中没有别的东西了。也没有可以读取或写入扇区的软盘或磁盘映像。这主要是因为我没有在这方面向 QEMU 指定任何内容。
但是,我想要实现的是在 QEMU 加载我的 ELF 可执行文件之后,我想要一个可以读取或写入扇区的磁盘或软盘架构。我还想从中加载一些用户程序,或者在其上设置文件系统。到目前为止,我的想法是这样的:
qemu-system-i386 -kernel myKernel.bin -fda myDisk.image
或者,也许,我应该获取我的myKernel.bin
文件,用零填充它,直到它与 512 字节对齐,然后将其余的磁盘映像附加到它。
我的问题是如何使用 QEMU 实现此功能。在深入编写磁盘驱动程序之前,我需要知道这样的任务是否可行。如果不可能,我可以采取不同的方法,但这些是我现在的想法。我已经调查过了-initrd
,这不是我想要的。我也不希望 QEMU 将任何文件加载到 RAM 中。相反,我想自己操作磁盘映像。关于如何做到这一点的任何建议?
windows - 如何再次从 Windows 重新启动到 Windows?(远程,windows-ubuntu 多引导)
我在桌面上使用 Windows 10 和 ubuntu 14.04LTS 我想从我的笔记本电脑远程使用桌面。
我的 grub 选择 ubuntu 作为默认的 os 引导系统。而且我知道如何将桌面从 ubuntu 远程重启到 windows (sudo grub-reboot boot_number && sudo reboot)
但是我怎样才能再次从 Windows 重新启动到 Windows?在这种情况下,当我从 Windows 重新启动时,默认选择 ubuntu。但有时,我想从 Windows 重新启动到 Windows!
总而言之...
1. 我想远程从 windows 到 windows 或 ubuntu / 从 ubuntu 到 windows 或 ubuntu。
2.我知道rebbot其他事情的方式。
3.但是不知道怎么从windows重启到windows
先感谢您。
kernel - grub 在“multiboot /boot/kernel.bin”之后什么都不做
我试图在 grub 和 qemu 的帮助下启动自定义内核。
如果我用“qemu -kernel -m 64 ./kernel.bin”启动它,它工作正常。
如果我用“grub-mkrescue -o os.iso ./os/”创建iso
它开始加载 grub 并且屏幕保持黑色
目录树:
grub.cfg 的内容
屏幕上显示“加载内核:完成”行。
有人知道有什么问题吗?欢迎任何建议
==================================================== ===== UPD:我在“C”文件中有 kernel_main(),正如我在 GDB 中看到的,kernel_main 永远不会被调用。奇怪的 ?
我不明白,“调用 kernel_main”指令会发生什么?
这是“kernel.c”,什么都没有,只是清除 vid.mem。缓冲
“grub-file --is-x86-multiboot kernel.bin”也是“确认多重启动”
[已解决] 我不知道它是怎么回事,但它现在可以工作了。它的魔力 | 0x1BADB002
我写的内核是 AT&T 语法,子不能实现我需要的所有东西。GDT 和 IDT 不断崩溃,所以我用 kernel.s [NASM] 再测试一次
和 MAGIC,它现在可以工作了。呀呀呀呀呀:p
x86 - 保护模式初始化期间的堆栈结构
我正在开发一个遵循多重引导规范的简单内核。这是一个类项目,所以我不能直接发布我的代码,但对于我的问题,说我们使用的是multiboot 示例代码的修改版本就足够了。
我正在尝试将全局描述符表寄存器(GDTR)设置为指向适当的地址。为此,我一直在关注 OSDev wiki 中的GDT 教程。在本教程中,他们的平面保护模式示例代码只是从堆栈中加载两个值并将它们放入 GDTR。这让我很困惑,因为我认为应该在初始化堆栈之前设置 GDTR。如果内核还没有初始化它,我不知道 ESP 会指向哪里。我想 GRUB 有可能在跳转到 boot.S 中的任何代码之前将其设置为某个值,但我无法找到任何文档来建议这一点。
tl;dr - 为什么OSDev GDT 教程在加载全局描述符表的地址和大小时从相对于 ESP 的地址检索数据?
assembly - 最简单的链式加载启动管理器
为了从闪存驱动器启动,我们在实模式下使用 BIOS 中断 13h 加载磁盘,并指定磁盘 0x80。其他磁盘应由 0x81、0x82... 访问,如此链接所述
我正在尝试制作简单的 GRUB。
我的第一步是从闪存驱动器启动(将 MBR 加载到 0x7C00 并打印一条消息作为正确启动的证明)并读取我的主硬盘(我假设它的编号为 0x81,前 15 个扇区需要引导)再次进入 0x7C00。
我想这个幼稚的想法应该让我进入我的主 HDD 的引导加载程序,但它并不像预期的那样。你能告诉我有什么问题吗?
顺便问一下,我应该如何获得 HDD 的数量?
请注意,我的主硬盘包含带有多个操作系统的 grub2。
编辑:对我来说,这是一个理论上的问题,但由于评论中的请求,我添加了代码。
引导加载程序.asm:
第二阶段 bootloader-loader.asm:
BPB.asm:
磁盘加载.asm:
生成文件:
此代码应打印XY
到屏幕上,然后将控制权传递给 HDD 的引导扇区。但我得到的只是XY
打印到屏幕上。
assembly - multboot 标头中校验和的目的是什么?
“校验和”的目的是什么?
字段“校验和”是一个 32 位无符号值,当添加到其他魔术字段(即“魔术”和“标志”)时,必须有一个 32 位无符号和为零。
c - x86 保护模式下的键盘中断导致处理器错误
我正在研究一个简单的内核,我一直在尝试实现一个键盘中断处理程序来摆脱端口轮询。我一直在-kernel
模式下使用 QEMU(以减少编译时间,因为使用生成 isogrub-mkrescue
需要相当长的时间)并且它工作得很好,但是当我想切换到-cdrom
模式时它突然开始崩溃。我不知道为什么。
最终我意识到,当它从 iso 引导时,它还会在引导内核本身之前运行 GRUB 引导加载程序。我发现 GRUB 可能会将处理器切换到保护模式,这会导致问题。
问题:通常我会简单地初始化中断处理程序,只要我按下一个键,它就会被处理。但是,当我使用 iso 运行内核并按下一个键时,虚拟机就崩溃了。这发生在 qemu 和 VMWare 中,所以我认为我的中断一定有问题。
请记住,只要我不使用 GRUB,代码就可以正常工作。
interrupts_init()
(见下文)是main()
内核函数中首先调用的东西之一。
本质上的问题是:有没有办法让它在保护模式下工作?.
我的内核的完整副本可以在我的GitHub 存储库中找到。一些相关文件:
lowlevel.asm
:
interrupts.c
:
kernel.c
boot.asm
:
x86 - x86 ASM: DD Being Used as an "Instruction"?
In the following x86 assembly code:
The values don't seem to be assigned to any variables. So what does this snippet of code do? I've heard something about it being stored in memory, but where exactly?