- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个简单且小型的 64 位操作系统。到目前为止,我一直使用单个文件并使用 NASM 对其进行编译:
nasm -f bin os.asm -o os.bin
然后使用 qemu 测试 .bin
文件。
现在我需要在我的 os.bin 文件中使用多个文件。我插入了这一行:
extern helper_func
然后在代码中调用它。在另一个 .asm 文件中,我创建了这个函数或过程。问题是bin格式不支持extern
,所以我尝试使用ELF格式创建.obj
文件,然后将它们与gcc链接:
gcc -m32 -nostdlib -nodefaultlibs -lgcc os.obj helper.obj -t linker.ld
使用此链接器文件:
ENTRY(_start)
SECTIONS
{
. = 0x7C00;
.text :
{
*(.text);
}
}
但是当我尝试运行已创建的 .bin
时,qemu 无法识别该文件。我做错了什么?
(我使用了 gcc,因为我计划将来使用 C 代码)
实际上,我什至不知道 gcc 中所有标志的作用;我是从网上复制的XD。
这是我到目前为止所做的:
nasm -f elf os.asm -o os.obj
nasm -f elf helper.asm -o helper.obj
gcc -m32 -nostdlib -nodefaultlibs -lgcc os.obj helper.obj -t linker.ld -o myos.bin
objcopy --input-target=elf32-little --output-target=binary myos.bin myos.bin.new
qemu-system-x86_64 myos.bin.new
这些编译都没有错误。但是当我运行 qemu 时我得到这个:
os.asm:
[bits 16]
section .text
global _start
_start:
; Zero segment
cli
jmp 0x0000:.zero_seg
.zero_seg:
xor ax, ax
mov ss, ax
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov sp, _start
cld
sti
; Reset disk
call reset_disk
; Load disk sectors
mov al, 2 ; sectors to read
mov cl, 2 ; start sector
mov bx, second_sector ; offset to load
call read_disk
; Enable A20 line
call enable_a20
jmp second_sector
_end1:
jmp $
%include "liba/disk.asm"
%include "liba/a20.asm"
; padding and magic number
times 510-($-$$) db 0
dw 0xaa55
second_sector:
call check_long
call switch_long
_hang:
jmp $
%include "liba/long.asm"
%include "liba/gdt.asm"
[bits 64]
extern helper_func
long_mode:
jmp kernel_code
_end2:
jmp $
times 512-($-$$-512) db 0
kernel_code:
; two byte
call helper_func
helper.asm:
[bits 64]
section .text
global helper_func
helper_func:
kernel_end:
hlt
jmp .kernel_end
ret
在 os.asm 中我使用了这个库:
磁盘.asm:
read_disk:
pusha
mov ah, 0x02
mov dl, 0x80 ; 0x00 Floppy/FlashDrive -- 0x80 HardDisk
mov ch, 0 ; cylinder
mov dh, 0 ; head
int 0x13
jc .disk_err
popa
ret
.disk_err:
jmp $
reset_disk:
xor ax, ax
mov bx, second_sector
mov dl, 0x80
int 0x13
ret
a20.asm:
test_a20:
pusha
mov ax, [0x7dfe]
push bx
mov bx, 0xffff
mov es, bx
pop bx
mov bx, 0x7e0e
mov dx, [es:bx]
cmp ax, dx
je .cont
popa
mov ax, 1
ret
.cont:
mov ax, [0x7dff]
push bx
mov bx, 0xffff
mov es, bx
pop bx
mov bx, 0x7e0f
mov dx, [es:bx]
cmp ax, dx
je .exit
popa
mov ax, 1
ret
.exit:
popa
xor ax, ax
ret
enable_a20:
pusha
;BIOS
mov ax, 0x2401
int 0x15
call test_a20
cmp ax, 1
je .done
;Keyboard
sti
call wait_c
mov al, 0xad
out 0x64, al
call wait_c
mov al, 0xd0
out 0x64, al
call wait_d
in al, 0x60
push ax
call wait_d
mov al, 0xd1
out 0x64, al
call wait_c
pop ax
or al, 2
out 0x60, al
call wait_c
mov al, 0xae
out 0x64, al
call wait_c
sti
call test_a20
cmp ax, 1
je .done
;FastA20
in al, 0x92
or al, 2
out 0x92, al
call test_a20
cmp al, 1
je .done
jmp $
.done:
popa
ret
wait_c:
in al, 0x64
test al, 2
jnz wait_c
ret
wait_d:
in al, 0x64
test al, 1
jz wait_d
ret
长.asm:
enable_long:
cli
call check_long
mov edi, 0x1000
mov cr3, edi
xor eax, eax
mov ecx, 4096
rep stosd
mov edi, 0x1000
mov dword [edi], 0x2003
add edi, 0x1000
mov dword [edi], 0x3003
add edi, 0x1000
mov dword [edi], 0x4003
add edi, 0x1000
mov dword ebx, 3
mov ecx, 512
.setEntry:
mov dword [edi], ebx
add ebx, 0x1000
add edi, 8
loop .setEntry
mov eax, cr4
or eax, 1 << 5
mov cr4, eax
mov ecx, 0xc0000080
rdmsr
or eax, 1 << 8
wrmsr
mov eax, cr0
or eax, 1 << 31
or eax, 1 << 0
mov cr0, eax
ret
switch_long:
call enable_long
lgdt [GDT.Pointer]
jmp GDT.Code:long_mode
ret
check_long:
pusha
pushfd
pop eax
mov ecx, eax
xor eax, 1 << 21
push eax
popfd
pushfd
pop eax
xor eax, ecx
jz .done
mov eax, 0x80000000
cpuid
cmp eax, 0x80000001
jb .done
mov eax, 0x80000001
cpuid
test edx, 1 << 29
jz .done
popa
ret
.done:
popa
jmp $
gdt.asm:
GDT:
.Null: equ $ - GDT
dw 0
dw 0
db 0
db 0
db 0
db 0
.Code: equ $ - GDT
dw 0
dw 0
db 0
db 10011000b
db 00100000b
db 0
.Data: equ $ -GDT
dw 0
dw 0
db 0
db 10000000b
db 0
db 0
.Pointer:
dw $ - GDT - 1
dq GDT
最佳答案
我对您正在构建的环境一无所知。我强烈建议构建一个 x86-64 cross compiler .
我可以对一些可能出现的问题做出合理的猜测。使用GCC链接会生成.note.gnu.build-id
节并将其放在二进制文件中所有其他节之前。这会将磁盘启动签名 ( 0xaa55
) 移动到第一个扇区最后 2 个字节之外的位置。这是我认为您的磁盘不会被识别为可引导的唯一原因,这在您的屏幕截图中似乎是这种情况。您需要添加-Wl,build-id=none
添加到您的 GCC 链接选项以防止生成此部分。
要按照您的方式构建自定义 64 位引导加载程序,您应该将所有内容生成为 64 位对象而不是 32 位对象。使用-m64
使用 GCC 编译/链接时,以及 -felf64
当使用 NASM 进行汇编时(--64
如果使用 as
GNU 汇编器进行汇编)。
确保您没有使用 -static
生成可重定位代码我建议消除 .eh_frame
带有选项 -fno-asynchronous-unwind-tables
的部分.
链接器脚本使用 -T
传递选项,而不是-t
选项。在您的链接选项中,您有 -t linker.ld
它应该是 -T linker.ld
您可以通过让它确定源对象/可执行文件类型来简化 OBJCOPY 参数。你可以做objcopy -O binary myos.bin myos.bin.new
相反。
我认为您应该使用的命令可能如下所示:
nasm -f elf64 os.asm -o os.obj
nasm -f elf64 helper.asm -o helper.obj
gcc -m64 -wl,--build-id=none -static -fno-asynchronous-unwind-tables \
-nostdlib -nodefaultlibs -lgcc os.obj helper.obj -T linker.ld -o myos.bin
objcopy -O binary myos.bin myos.bin.new
<小时/>
在 disk.asm
您对驱动器号进行硬编码。当引导加载程序首次启动时,您可以重用/保存DL寄存器的值。 BIOS 会在DL 中为您传递启动驱动器号。如果您重复使用该值,则无需根据启动的驱动器类型(软盘、硬盘驱动器等)更改代码。
我有一些General Bootloader Tips这可能很有值(value)。
将来当您开始编译 C 文件时,我建议使用以下选项:
gcc -m64 -ffreestanding -mcmodel=kernel -mno-red-zone \
-mno-mmx -mno-sse -mno-sse2 -c filename.c -o filename.o
关于assembly - 链接两个或多个程序集文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56409250/
我有一个网站,并且我使用 javascript sdk 添加了“点赞”按钮。 这是代码 (function(d, s, id) { var js, fjs = d.g
我知道 HTML 是逐行读取的。当您链接多个 css 文件(如规范化文件和样式表文件)时,由于 CSS 重要性特异性和源顺序,样式表文件应链接在规范化文件之后。看起来这不会影响链接的 JavaScri
我正在使用官方 Bootstrap site 提供的 CDN 链接在我的网络应用程序中使用面板进行测试 在彻底检查我的代码后,面板没有显示。 但是我在 SO 上看到了类似的帖子并且 CDN 链接不同
这里是编码初学者。我正在尝试为我的移动设备网站设置断点,以便我的网站适合小屏幕。我只是想检查如果我缩小视口(viewport)的宽度,背景颜色是否会改变,但没有发生任何变化。也许我只是对一个简单的错误
举一个我想要的例子,想象一下这个字符串: $text = 'lorem ipsum About us lorem ipsum'; 如果此字符串包含一个 href 以 / 开头的 anchor 链接,则
如何链接到 LaTeX 文档的另一部分或子部分?这种链接的常规范式是什么,像[链接名称]那样写,或者像网页超链接那样写? 最佳答案 链接到另一个部分需要您的部分进行一些额外的标记。要使用的命令是: \
我有一个订单表,其中包含订单号、客户 ID 和代理 ID。然后有一个带有 id 的客户表和一个带有 id 的代理表。 我需要获取所有具有来自代理 ID 'a03' 和代理 ID 'a05' 的订单的客
假设我有: dic = {"z":"zv", "a":"av"} ## Why doesn't the following return a sorted list of keys? keys = d
我在尝试链接到外部库时得到了一些奇怪的结果。如果我从命令行运行以下命令: gcc fftwTest.c -I../extlib/fftw-3.3.5-dll32 -L../extlib/fftw-3.
我认为我没有正确理解 jQuery 链接。我正在遍历一个数组并尝试将 div 元素添加到我的包装器 CSS 类中,每个 div 元素都有一个“click”类和自定义 css top 和 left 属性
HTML 使用超级链接与网络上的另一个文档相连。几乎可以在所有的网页中找到链接。点击链接可以从一张页面跳转到另一张页面。 HTML 超链接(链接) HTML使用标签 a 来设置超文本链接。 超链
这个问题在这里已经有了答案: How do I link to part of a page? (hash?) (7 个答案) Scroll Automatically to the Bottom
我想创建一个 Docker Swarm 集群,运行一个 Elasticsearch 实例、一个 MongoDB 实例和一个 grails 应用程序,每个都在单独的机器上。我正在使用 Docker Ma
我正在尝试将 CakePHP HTML Linker 用于以下代码 Add Cuisine 由于 span 标签需要在 a 标签内。我无法根据需要获得输出。关于如何完成它的任何建议? 最佳答案 禁用链
大家好, 我最近开发了一个应用程序,很快就会提交到 App Store。我想免费提交这个应用程序,并想知道我是否可以实现一个带有 PayPal 捐赠标志的按钮,上面基本上写着“捐赠用于开发”或与此相关
我想尝试在 dlang 中使用 libuv。我下载了这样的 dlang 绑定(bind): git clone git@github.com:tamediadigital/libuv.git 现在我接
我有一个节点(节点 a),各种其他节点(节点 b/c/d/e)与之引用。 我可以创建一个带有参数的 View 作为我正在查看的节点(节点 a),并获取引用该节点的节点列表。 基本上在节点 a 查看节点
我正在尝试建立一个常见问题页面,上面有目录,下面有答案。我想点击目录中的一个问题,并在同一页面上链接到相应的答案。我如何在 CakePHP 中使用 $this->Html->link() 执行此操作方
在 WooCommerce 3.0+ 中,我使用 js 创建了一些选项卡,每个选项卡中包含来自不同类别的产品。我已经设法修改了简单产品的添加到购物车链接,其中点击了 addtocart 按钮它进入下一
Delphi 2007/2009 奇怪的问题在这里: 根据设计时定义的组件属性,是否可以在链接中包含文件或保留文件? 示例:如果我将 SomeProperty 保留为真,则在编译时,单元 SomeUn
我是一名优秀的程序员,十分优秀!