- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经完成了以下教程:
http://intermezzos.github.io/book/multiboot-headers.html
不幸的是,它使用 NASM 而不是 GNU 汇编器,而且因为我通常使用 GNU 工具链,所以我宁愿使用它。本教程有以下简单的 hello world 程序:
section .multiboot_header
header_start:
dd 0xe85250d6 ; magic number
dd 0 ; protected mode code
dd header_end - header_start ; header length
; checksum
dd 0x100000000 - (0xe85250d6 + 0 + (header_end - header_start))
; required end tag
dw 0 ; type
dw 0 ; flags
dd 8 ; size
header_end:
它提供多重引导 header 以及以下内容:
global start
section .text
bits 32
start:
mov word [0xb8000], 0x0248 ; H
mov word [0xb8002], 0x0265 ; e
mov word [0xb8004], 0x026c ; l
mov word [0xb8006], 0x026c ; l
mov word [0xb8008], 0x026f ; o
mov word [0xb800a], 0x022c ; ,
mov word [0xb800c], 0x0220 ;
mov word [0xb800e], 0x0277 ; w
mov word [0xb8010], 0x026f ; o
mov word [0xb8012], 0x0272 ; r
mov word [0xb8014], 0x026c ; l
mov word [0xb8016], 0x0264 ; d
mov word [0xb8018], 0x0221 ; !
hlt
它们与以下 linker.ld 文件链接在一起:
ENTRY(start)
SECTIONS {
. = 1M;
.boot :
{
/* ensure that the multiboot header is at the beginning */
*(.multiboot_header)
}
.text :
{
*(.text)
}
}
编译和运行所有这些可以通过以下方式完成:
nasm -f elf64 boot_nasm.asm
nasm -f elf64 multiboot_header_nasm.asm
ld --nmagic --output=kernel.bin --script=linker.ld multiboot_header_nasm.o boot_nasm.o
查看教程如何使用内核制作 iso 镜像以及如何使用 qemu 启动。现在我已经将源代码移植如下以使用GNU Assembler:
.section .multiboot_header
header_start:
.long 0xe85250d6 # magic number
.long 0 # protected mode code
.long header_end - header_start
# checksum
.long 0x100000000 - (0xe85250d6 + 0 + (header_end - header_start))
# required end tag
.word 0 # type
.word 0 # flags
.long 8 # size
header_end:
和
.text
.global start
.code32
start:
movw $0x0248, (0xb8000) # H
movw $0x0265, (0xb8002) # e
movw $0x026c, (0xb8004) # l
movw $0x026c, (0xb8006) # l
movw $0x026f, (0xb8008) # o
movw $0x022c, (0xb800a) # ,
movw $0x0220, (0xb800c) #
movw $0x0277, (0xb800e) # w
movw $0x026f, (0xb8010) # o
movw $0x0272, (0xb8012) # r
movw $0x026c, (0xb8014) # l
movw $0x0264, (0xb8016) # d
movw $0x0221, (0xb8018) # !
hlt
我通过以下方式将它们编译并链接在一起:
as boot.S -o boot.o
as multiboot_header.S -o multiboot_header.o
ld --nmagic --output=kernel.bin --script=linker.ld multiboot_header.o boot.o
objdump
显示两种情况输出的 kernel.bin
就每个段中的代码而言是相同的。唯一的区别是段所在的偏移量略有不同。主要区别在于nasm 版本可以启动,而GNU 汇编程序版本则不能。
GNU 汇编器版本给我错误:未找到多重引导 header 。
这是两个创建的二进制文件的 objdump 输出:
% objdump -D -s kernel_nasm.bin
kernel_nasm.bin: file format elf64-x86-64
Contents of section .boot:
100000 d65052e8 00000000 18000000 12afad17 .PR.............
100010 00000000 08000000 ........
Contents of section .text:
100020 66c70500 800b0048 0266c705 02800b00 f......H.f......
100030 650266c7 0504800b 006c0266 c7050680 e.f......l.f....
100040 0b006c02 66c70508 800b006f 0266c705 ..l.f......o.f..
100050 0a800b00 2c0266c7 050c800b 00200266 ....,.f...... .f
100060 c7050e80 0b007702 66c70510 800b006f ......w.f......o
100070 0266c705 12800b00 720266c7 0514800b .f......r.f.....
100080 006c0266 c7051680 0b006402 66c70518 .l.f......d.f...
100090 800b0021 02f4 ...!..
Disassembly of section .boot:
0000000000100000 <header_start>:
100000: d6 (bad)
100001: 50 push %rax
100002: 52 push %rdx
100003: e8 00 00 00 00 callq 100008 <header_start+0x8>
100008: 18 00 sbb %al,(%rax)
10000a: 00 00 add %al,(%rax)
10000c: 12 af ad 17 00 00 adc 0x17ad(%rdi),%ch
100012: 00 00 add %al,(%rax)
100014: 08 00 or %al,(%rax)
...
Disassembly of section .text:
0000000000100020 <start>:
100020: 66 c7 05 00 80 0b 00 movw $0x248,0xb8000(%rip) # 1b8029 <start+0xb8009>
100027: 48 02
100029: 66 c7 05 02 80 0b 00 movw $0x265,0xb8002(%rip) # 1b8034 <start+0xb8014>
100030: 65 02
100032: 66 c7 05 04 80 0b 00 movw $0x26c,0xb8004(%rip) # 1b803f <start+0xb801f>
100039: 6c 02
10003b: 66 c7 05 06 80 0b 00 movw $0x26c,0xb8006(%rip) # 1b804a <start+0xb802a>
100042: 6c 02
100044: 66 c7 05 08 80 0b 00 movw $0x26f,0xb8008(%rip) # 1b8055 <start+0xb8035>
10004b: 6f 02
10004d: 66 c7 05 0a 80 0b 00 movw $0x22c,0xb800a(%rip) # 1b8060 <start+0xb8040>
100054: 2c 02
100056: 66 c7 05 0c 80 0b 00 movw $0x220,0xb800c(%rip) # 1b806b <start+0xb804b>
10005d: 20 02
10005f: 66 c7 05 0e 80 0b 00 movw $0x277,0xb800e(%rip) # 1b8076 <start+0xb8056>
100066: 77 02
100068: 66 c7 05 10 80 0b 00 movw $0x26f,0xb8010(%rip) # 1b8081 <start+0xb8061>
10006f: 6f 02
100071: 66 c7 05 12 80 0b 00 movw $0x272,0xb8012(%rip) # 1b808c <start+0xb806c>
100078: 72 02
10007a: 66 c7 05 14 80 0b 00 movw $0x26c,0xb8014(%rip) # 1b8097 <start+0xb8077>
100081: 6c 02
100083: 66 c7 05 16 80 0b 00 movw $0x264,0xb8016(%rip) # 1b80a2 <start+0xb8082>
10008a: 64 02
10008c: 66 c7 05 18 80 0b 00 movw $0x221,0xb8018(%rip) # 1b80ad <start+0xb808d>
100093: 21 02
100095: f4 hlt
这是使用 GNU 汇编器创建的版本:
% objdump -D -s kernel.bin
kernel.bin: file format elf64-x86-64
Contents of section .boot:
100000 d65052e8 00000000 18000000 12afad17 .PR.............
100010 00000000 08000000 ........
Contents of section .text:
100000 66c70500 800b0048 0266c705 02800b00 f......H.f......
100010 650266c7 0504800b 006c0266 c7050680 e.f......l.f....
100020 0b006c02 66c70508 800b006f 0266c705 ..l.f......o.f..
100030 0a800b00 2c0266c7 050c800b 00200266 ....,.f...... .f
100040 c7050e80 0b007702 66c70510 800b006f ......w.f......o
100050 0266c705 12800b00 720266c7 0514800b .f......r.f.....
100060 006c0266 c7051680 0b006402 66c70518 .l.f......d.f...
100070 800b0021 02f4 ...!..
Disassembly of section .boot:
0000000000100000 <header_start>:
100000: d6 (bad)
100001: 50 push %rax
100002: 52 push %rdx
100003: e8 00 00 00 00 callq 100008 <header_start+0x8>
100008: 18 00 sbb %al,(%rax)
10000a: 00 00 add %al,(%rax)
10000c: 12 af ad 17 00 00 adc 0x17ad(%rdi),%ch
100012: 00 00 add %al,(%rax)
100014: 08 00 or %al,(%rax)
...
Disassembly of section .text:
0000000000100000 <start>:
100000: 66 c7 05 00 80 0b 00 movw $0x248,0xb8000(%rip) # 1b8009 <header_end+0xb7ff1>
100007: 48 02
100009: 66 c7 05 02 80 0b 00 movw $0x265,0xb8002(%rip) # 1b8014 <header_end+0xb7ffc>
100010: 65 02
100012: 66 c7 05 04 80 0b 00 movw $0x26c,0xb8004(%rip) # 1b801f <header_end+0xb8007>
100019: 6c 02
10001b: 66 c7 05 06 80 0b 00 movw $0x26c,0xb8006(%rip) # 1b802a <header_end+0xb8012>
100022: 6c 02
100024: 66 c7 05 08 80 0b 00 movw $0x26f,0xb8008(%rip) # 1b8035 <header_end+0xb801d>
10002b: 6f 02
10002d: 66 c7 05 0a 80 0b 00 movw $0x22c,0xb800a(%rip) # 1b8040 <header_end+0xb8028>
100034: 2c 02
100036: 66 c7 05 0c 80 0b 00 movw $0x220,0xb800c(%rip) # 1b804b <header_end+0xb8033>
10003d: 20 02
10003f: 66 c7 05 0e 80 0b 00 movw $0x277,0xb800e(%rip) # 1b8056 <header_end+0xb803e>
100046: 77 02
100048: 66 c7 05 10 80 0b 00 movw $0x26f,0xb8010(%rip) # 1b8061 <header_end+0xb8049>
10004f: 6f 02
100051: 66 c7 05 12 80 0b 00 movw $0x272,0xb8012(%rip) # 1b806c <header_end+0xb8054>
100058: 72 02
10005a: 66 c7 05 14 80 0b 00 movw $0x26c,0xb8014(%rip) # 1b8077 <header_end+0xb805f>
100061: 6c 02
100063: 66 c7 05 16 80 0b 00 movw $0x264,0xb8016(%rip) # 1b8082 <header_end+0xb806a>
10006a: 64 02
10006c: 66 c7 05 18 80 0b 00 movw $0x221,0xb8018(%rip) # 1b808d <header_end+0xb8075>
100073: 21 02
100075: f4 hlt
现在我正在查看它,看起来 GNU 汇编器版本有一个重叠的 .boot 和 .text 段,因此 grub 在加载文件时可能会用 .text 部分的数据覆盖 .boot 部分。有人知道如何解决这个问题吗?
最佳答案
多重启动规范指出:
The Multiboot header must be contained completely within the first 8192 bytes of the OS image, and must be longword (32-bit) aligned.
objdump
给我们:
Idx Name Size File off Algn
3 .multiboot_header 00000018 00000040 2**0 CONTENTS, READONLY
注意Algn=2**0
。
解决方案:指定对齐方式:
.section .multiboot_header
.balign 4
header_start:
这也应该针对 nasm
版本完成,由于文件布局的原因,它在这里工作只是偶然的。
关于assembly - GNU 程序集引导加载程序无法引导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37993964/
我正在尝试使用中介包在 R 中进行中介分析。我查看了有关如何执行此操作的文档,并通读了 R 提供的示例(即,我已经运行了“example(mediate)”)。尽管如此,我还是无法运行最简单的中介。理
我在我的应用程序中引导 View 时遇到问题。 我试图在 bootstrap 中获取 View 实例,以便我可以分配 View 变量等。 问题是我似乎无法按照推荐的方式来做。我可以做这个: $this
我已经遵循了几个有关运行 RMI 应用程序的教程。但是,我似乎无法使其工作,因为我一直陷入相同的错误:ClassNotFoundException。我知道这个错误意味着我将文件放在了错误的位置,但我尝
最后,我开始与 Aurelia 合作。有一个入门套件可用 Here这有助于初始化 Aurelia。但它是一个模板,应该在网站模板中使用。 我有一个预配置 WebApi项目,我想在其中使用 Aureli
对于回归问题,我有一个训练数据集: - 3个具有高斯分布的变量 - 20 个均匀分布的变量。 我的所有变量都是连续的,在 [0;1] 之间。 问题是用于对我的回归模型进行评分的测试数据对所有变量具有均
我正在尝试“拉伸(stretch)”或扩展第 1 列中的 A 部分以填充该行的高度。 1行2列: +---------------------+---------------------+ |
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我正在使用 bootstrap 4 填充功能。默认情况下,bootstrap4 中的 col 或 col-12 类在左右应用 15px 填充。我想为移动设备设置左右padding 0,所以我使用下面的
我正在尝试通过自己编写引导加载程序来引导 linux 内核,但不知道如何加载内核。 所有人都在说使用 int 13h 将扇区从硬盘加载到内存。 其中部门应该加载??加载扇区后怎么办? 如果可以的话,请
如何合并两者以创建垂直菜单?我有一个基本的路由设置(它可以工作并呈现为标准的水平菜单): Home Gallery Contact 从 react-bootst
我的应用程序中有一些状态来自服务器并且不会更改(在用户 session 的生命周期内)。此状态在 HTML 中引导。 我应该将它合并到 reducer 中作为商店的一部分吗?const bootstr
有没有办法使用 styled-components与 react-bootstrap 一起? React-bootstrap 为其组件公开了 bsClass 属性而不是 className ,这似乎与
除了 YouTube 播放器的大小之外,以下代码运行良好。我无法将其调整为我想要的大小。 我试着把 width="150"和 height="100"在 iframe 但什么也没发生。
我正在尝试使这个东西与 this one 相同。我已经打印了。但崩溃消耗不起作用。 @foreach($faqs as $faq)
我想在启动 Play 应用程序时运行一些代码。这似乎不起作用。有什么线索吗? public class Global extends GlobalSettings { @Override
我了解监督学习和无监督学习之间的区别: 监督学习是一种使用标记数据“教导”分类器的方法。 无监督学习让分类器“自行学习”,例如使用聚类。 但是什么是“弱监督学习”?它如何对示例进行分类? 最佳答案 更
我对 python 还是很陌生,所以请原谅我,如果这是非常简单的或非常错误的思考方式。 我安装了 python 2.7。根据我在运行以下代码时的理解,它列出了它查找模块的目录。 Python 2.7.
我想使用 bootstrap carousel 制作一个 slider ,但我的 slider 不滑动即使我点击按钮也不会滑动 我测试了很多其他的 bootstrap slider ,我也遇到了同样的
我正在尝试通过替换 base 形状为 (4,2) 的 2D numpy 数组按行进行采样,比如 10 次。最终输出应该是一个 3D numpy 数组。 尝试了下面的代码,它有效。但是有没有不用 for
我是 Bootstrap 的新手,现在我正在检查它的 slider 功能。简单的 slider 和动画效果 - 一切正常。 但是我看不懂,我可以做这样的东西吗? - http://www.owlcar
我是一名优秀的程序员,十分优秀!