- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从 OSDev.org 学习一些操作系统开发知识。我有一个内核,我正在尝试使用 qemu 在 GRUB Legacy (0.97) 中启动。但是,当我输入 kernel 200+9
时,我收到消息
[Multiboot-elf, <0x100000:0x80:0x4008>(bad), entry=0x10000c]
除了(不好的)部分之外,这就是我所期望的。如果我输入 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
所以你可以看到我提到的数字几乎匹配。问题是 .bss 的开头不是 100044,而是 44。我认为这就是 GRUB 说不好的原因。我的内存不能低于 1 MB(内存不足)。但 objdump 告诉我我的部分高于该阈值,所以我不知道出了什么问题。无论如何,我将在下面粘贴我的代码,它相对较短。虽然如果您以前做过操作系统开发,我的问题可能非常基本,所以代码可能是无关的。
;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 use this in kmain
global mbd ; we will use this in kmain
extern kmain ; kmain is defined in kmain.cpp
; setting up the Multiboot header - see GRUB docs for details
MODULEALIGN equ 1<<0 ; align loaded modules on page boundaries
MEMINFO equ 1<<1 ; provide memory map
FLAGS equ 0x03;MODULEALIGN | MEMINFO ; this is the Multiboot 'flag' field
MAGIC equ 0x1BADB002 ; 'magic number' lets bootloader find the header
CHECKSUM equ -(MAGIC + FLAGS) ; checksum required
section .text
loader:
align 4
dd MAGIC
dd FLAGS
dd CHECKSUM
; reserve initial kernel stack space
STACKSIZE equ 0x4000 ; that's 16k.
mov esp, stack + STACKSIZE ; set up the stack
mov [magic], eax ; Multiboot magic number
mov [mbd], ebx ; Multiboot info structure
call kmain ; call kernel proper
cli
.hang:
hlt ; halt machine should kernel return
jmp .hang
section .bss
align 4
stack: resb STACKSIZE ; reserve 16k stack on a doubleword boundary
magic: resd 1
mbd: resd 1
.
// kernel.c - Contains the main kernel method
void kmain() {
extern unsigned int magic;
if (magic != 0x2BADB002) {
// Something went wrong
}
volatile unsigned char *videoram = (unsigned char *) 0xB800;
videoram[0] = 65;
videoram[1] = 0x07;
}
下面是我的自定义链接器脚本:
ENTRY (loader)
SECTIONS {
. = 0x00100000;
.text ALIGN (0x1000) : {
*(.text)
}
.rodata ALIGN (0x1000) :
{
*(.rodata*)
}
.data ALIGN (0x1000) :
{
*(.data)
}
.bss :
{
sbss = .;
*(COMMON)
*(.bss)
ebss = .;
}
/DISCARD/ : {
*(.eh_frame)
*(.comment)
}
}
最后,我使用以下几行构建内核:
nasm -f elf -o loader.o loader.s
gcc -c -o kernel.o kernel.c
ld -T linker.ld -o kernel.bin loader.o kernel.o
cat stage1 stage2 pad kernel.bin > floppy.img
其中 stage1 和 stage2 是来自 GRUB Legacy 的文件,pad 是任何 750 字节的文件(因此 stage1+stage2+pad 的文件大小为 102400 字节或 200 个 block ,这就是我使用内核 200+9 启动的原因)。
最后,我在 qemu 中运行内核:
qemu-system-x86_64 -fda floppy.img
最佳答案
对于包含所有详细信息的好问题+1,谢谢。
至少在我的机器上,生成的 kernel.bin
大小为 4869 字节,仅适合 10 个扇区,而不是 9 个。此外,VGA 文本内存位于 0xb8000
不是 0xb800
(多一个零 - 0xb800
是实模式段,必须乘以 16)。通过这些小小的调整,它在这里工作得很好。
关于assembly - 简单内核无法在 GRUB 中启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14311761/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
本节,我们就来看看 GRUB 的配置文件 /boot/gmb/grub.conf 中到底写了什么。命令如下: [rootdlocalhost ~]# vi /boot/grub/grub.conf d
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我使用 grub 加载我的内核。虽然我在链接描述文件中指定了.=0x100 0000,但我只能在0x10 0000处找到一个有效的MultiBoot2头文件。一一比较后,我发现它不是我的内核。并使用g
GRUB 脚本中是否可以进行文件名通配符扩展? 就像是: for i in directory/*; do echo $i; done 我的目的是让 GRUB 加载位于某些目录中的不同 cfg 文件。
我想问一下是 GRUB 在启动时将 CPU 切换到保护模式还是 Linux 内核做的。我还想问 - 内核本身 (vmlinuz) 是 ELF 还是纯二进制格式?谢谢。 最佳答案 GRUB 确实让您进入
我想查看 grub_dprintf() 生成的 GRUB2 调试日志,例如,在 mmap.c: grub_dprintf ("mmap", "EFI memory region 0x%llx-0x
我一直在开发一个玩具操作系统,并且一直使用 grub 作为我的引导加载程序。最近在尝试使用VGA时,我发现无法使用硬件中断。我发现这是因为我被 grub 拖入了保护模式。 有人知道如何在不必摆脱gru
我正在从 OSDev.org 学习一些操作系统开发知识。我有一个内核,我正在尝试使用 qemu 在 GRUB Legacy (0.97) 中启动。但是,当我输入 kernel 200+9 时,我收到消
我有一个系统,在一个硬盘驱动器上安装了多个 Red Hat。我想在运行时自动选择默认安装来启动。 Red Hat 的做法(与 Grub 文档略有不同)是进入 grub shell 并说 savedef
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我是 linux 和 bash 的新手,所以我不知道我做错了什么。我设置grub不显示,按shift 3秒后显示。这很好用。然后我将 30_os-prober 中的行(如下所示)更改为“F11”,其中
我想以编程方式选择当前操作系统重新启动后将运行的下一个操作系统。例如我有这些操作系统: -Linux Mint -Windows 7 我现在在Linux中,我想在重新启动后运行Windows。我必须修
我想在启动期间在多个操作系统之间进行选择。我如何使用我的蓝牙键盘/手机或至少我的红外 Remote 来管理它? 最佳答案 一个解决方案是先启动linux系统,然后添加boot once命令 grub
我可以在 GRUB 加载时运行一些自定义代码吗?换句话说,GRUB 是否提供了在加载任何操作系统之前运行一些自定义代码的工具? 最佳答案 自 GRUB 支持以来 the Multiboot speci
本章第一节就已经讲过,BIOS 在进行完成系统检测之后,就会找到第一个可以启动的设备,并读取该设备的 MBR(主引导记录)以及加载 MBR 中的 boot loader(启动引导程序),这个启动引导程
我想直接启动到我的 Xubuntu。我在网上搜索了一下,发现可以编辑文件/etc/default/grub使 GRUB 的超时时间为 0 秒。你要做的就是改变GRUB_TIMEOUT至0然后在你的 s
安装Ubuntu后,EFI系统分区的/efi/UBUNTU/里面有几个*.efi文件: GRUBX64.EFI MOKMANAG.EFI SHIMX64.EFI mmx64.efi fwupx64.e
我按照出色的指南制作了一张 Debian Live DVD https://willhaley.com/blog/custom-debian-live-environment/ . 我希望在选择自动登
这是我的 arch linux 的 grub.cfg 文件的内容。 # # DO NOT EDIT THIS FILE # # It is automatically generated by gru
我是一名优秀的程序员,十分优秀!