使用 LD 时 NASM 引导加载程序的下一个扇区未加载
next sector of NASM bootloader is not loading when using LD
我正在尝试创建一个允许 Rust 代码启动的引导加载程序,但我对 OS dev、makefile 和程序集还很陌生,而且我仍然是 Rust 的业余爱好者。我正在尝试使用 int 13h (ah 0h2) 来读取下一个扇区并执行该汇编代码,然后在某个时候执行 rust 代码。然而,我的引导加载程序的“第一阶段”中的代码似乎从来没有 运行。这是我的代码:
boot.asm
;[ORG 0x7c00]
[BITS 16]
global _start
_start:
; set segment registers
; (user3840170 said to set up the segment registers, but this didn't fix the problem)
cli
xor ax, ax ; code segment
mov ds, ax ; data segment
mov es, ax ; extra segment
mov ss, ax ; stack segment
mov bp, 7c00h ; base pointer
mov sp, 7c00h ; stack pointer
sti
; print message
mov si, msg1
call print
; read the next sectors, then jump
mov al, 01h ; sectors to read (1)
mov bx, 7e00h ; buffer address (512 bytes away from current address 0x7c00)
mov cx, 0002h ; cylinder and sector numbers (cylinder 0, sector 2)
mov dl, 0 ; drive 0 (boot drive)
mov dh, 0 ; head 0
mov ah, 02h
int 13h
jmp 7e00h ; jumps to stage one
%include 'Bootloader/print.asm'
msg1: db "bootsector is loading stage 1", 0
times 510-($ - $$) db 0
dw 0xAA55
;;;;;;;;;;;
; STAGE ONE
;;;;;;;;;;;
mov si, msg2
call print
msg2: db 'Hello', 0
mov al, 'A'
mov ah, 0eh
int 10h
times 1024 - ($ - $$) db 0
print.asm
;set of things for printing strings to TTY
print:
mov bx, 0
.loop:
lodsb
cmp al, 0
je .done
call print_char
jmp .loop
.done:
ret
print_char:
mov ah, 0eh
int 10h
ret
print_line:
mov al, 0ah
call print_char
mov al, 0dh
call print_char
ret
最后,我用来将其构建为 .iso 的 Makefile 和 运行 在 VirtualBox 中的它:(我正在 运行ning genasm 命令,我还没有编写 Rust内核尚未)
genfull: clean
mkdir -p iso
powershell.exe -Command "cd Kernel; cargo rustc -Z build-std=core -- --emit obj=kernelNP.o; cd .."
objcopy ./Kernel/kernelNP.o Kernel.o --prefix-alloc-sections='.rust' && rm -rf ./Kernel/kernelNP.o
nasm -f elf64 ./Bootloader/boot.asm -o bootsec.o
ld Kernel.o bootsec.o --oformat binary -o main.img
genisoimage -quiet -no-emul-boot -V 'BOOT' -input-charset iso8859-1 -o ./out/boot.iso -b main.img -hide main.img iso/
rm -rf ./*.img ./*.bin ./iso/ ./*.o
genasm: clean
mkdir -p iso
nasm -f elf64 ./Bootloader/boot.asm -o bootsec.o
ld bootsec.o --oformat binary -Ttext 0x7c00 -o iso/main.img
genisoimage -quiet -no-emul-boot -V 'BOOT' -input-charset iso8859-1 -o ./out/boot.iso -b main.img -hide main.img iso/
rm -rf ./*.img ./*.bin ./iso/ ./*.o
clean:
rm -rf ./*.img ./*.bin ./iso/ ./*.o
请帮我解释为什么第二扇区从来没有 运行s!
我找到问题了,是makefile。这是新的 genasm:
genasm: clean
mkdir -p iso
nasm -g -f elf32 -F dwarf -o boot.o ./Bootloader/boot.asm
ld -melf_i386 -Ttext=0x7c00 -nostdlib --nmagic -o boot.elf boot.o
objcopy -O binary boot.elf iso/main.img
genisoimage -quiet -no-emul-boot -V 'BOOT' -input-charset iso8859-1 -o ./out/boot.iso -b main.img -hide main.img iso/
rm -rf ./*.img ./*.bin ./iso/ ./*.o ./*.elf
我正在尝试创建一个允许 Rust 代码启动的引导加载程序,但我对 OS dev、makefile 和程序集还很陌生,而且我仍然是 Rust 的业余爱好者。我正在尝试使用 int 13h (ah 0h2) 来读取下一个扇区并执行该汇编代码,然后在某个时候执行 rust 代码。然而,我的引导加载程序的“第一阶段”中的代码似乎从来没有 运行。这是我的代码:
boot.asm
;[ORG 0x7c00]
[BITS 16]
global _start
_start:
; set segment registers
; (user3840170 said to set up the segment registers, but this didn't fix the problem)
cli
xor ax, ax ; code segment
mov ds, ax ; data segment
mov es, ax ; extra segment
mov ss, ax ; stack segment
mov bp, 7c00h ; base pointer
mov sp, 7c00h ; stack pointer
sti
; print message
mov si, msg1
call print
; read the next sectors, then jump
mov al, 01h ; sectors to read (1)
mov bx, 7e00h ; buffer address (512 bytes away from current address 0x7c00)
mov cx, 0002h ; cylinder and sector numbers (cylinder 0, sector 2)
mov dl, 0 ; drive 0 (boot drive)
mov dh, 0 ; head 0
mov ah, 02h
int 13h
jmp 7e00h ; jumps to stage one
%include 'Bootloader/print.asm'
msg1: db "bootsector is loading stage 1", 0
times 510-($ - $$) db 0
dw 0xAA55
;;;;;;;;;;;
; STAGE ONE
;;;;;;;;;;;
mov si, msg2
call print
msg2: db 'Hello', 0
mov al, 'A'
mov ah, 0eh
int 10h
times 1024 - ($ - $$) db 0
print.asm
;set of things for printing strings to TTY
print:
mov bx, 0
.loop:
lodsb
cmp al, 0
je .done
call print_char
jmp .loop
.done:
ret
print_char:
mov ah, 0eh
int 10h
ret
print_line:
mov al, 0ah
call print_char
mov al, 0dh
call print_char
ret
最后,我用来将其构建为 .iso 的 Makefile 和 运行 在 VirtualBox 中的它:(我正在 运行ning genasm 命令,我还没有编写 Rust内核尚未)
genfull: clean
mkdir -p iso
powershell.exe -Command "cd Kernel; cargo rustc -Z build-std=core -- --emit obj=kernelNP.o; cd .."
objcopy ./Kernel/kernelNP.o Kernel.o --prefix-alloc-sections='.rust' && rm -rf ./Kernel/kernelNP.o
nasm -f elf64 ./Bootloader/boot.asm -o bootsec.o
ld Kernel.o bootsec.o --oformat binary -o main.img
genisoimage -quiet -no-emul-boot -V 'BOOT' -input-charset iso8859-1 -o ./out/boot.iso -b main.img -hide main.img iso/
rm -rf ./*.img ./*.bin ./iso/ ./*.o
genasm: clean
mkdir -p iso
nasm -f elf64 ./Bootloader/boot.asm -o bootsec.o
ld bootsec.o --oformat binary -Ttext 0x7c00 -o iso/main.img
genisoimage -quiet -no-emul-boot -V 'BOOT' -input-charset iso8859-1 -o ./out/boot.iso -b main.img -hide main.img iso/
rm -rf ./*.img ./*.bin ./iso/ ./*.o
clean:
rm -rf ./*.img ./*.bin ./iso/ ./*.o
请帮我解释为什么第二扇区从来没有 运行s!
我找到问题了,是makefile。这是新的 genasm:
genasm: clean
mkdir -p iso
nasm -g -f elf32 -F dwarf -o boot.o ./Bootloader/boot.asm
ld -melf_i386 -Ttext=0x7c00 -nostdlib --nmagic -o boot.elf boot.o
objcopy -O binary boot.elf iso/main.img
genisoimage -quiet -no-emul-boot -V 'BOOT' -input-charset iso8859-1 -o ./out/boot.iso -b main.img -hide main.img iso/
rm -rf ./*.img ./*.bin ./iso/ ./*.o ./*.elf