我创建了一个小操作系统(未完成),仅使用16位汇编,可与qemu-system-i386一起工作。
但现在我想在一台真实的的机器上测试它,并在出现错误的情况下使它与真正的PC兼容。
这是操作系统
Makefile:
boot = bootloader.asm
kernel = kernel.asm
boot_o = bootloader.bin
kernel_o = kernel.bin
bin = myos.bin
asm_compiler = nasm
qemu = qemu-system-i386
compile:
$(asm_compiler) -f elf32 -g $(boot) -o $(boot_o)
$(asm_compiler) -f elf32 -g $(kernel) -o $(kernel_o)
ld -m elf_i386 -nmagic -T linker.ld -o $(bin) $(boot_o) $(kernel_o)
run:
$(qemu) -fda $(bin)
clean:
-rm $(boot_o)
-rm $(kernel_o)
-rm $(bin)
字符串
linker.ld:
OUTPUT_FORMAT(binary)
ENTRY(_start)
SECTIONS
{
. = 0x7c00;
bootloader :
{
bootloader.bin (.boot);
}
kernel :
{
kernel.bin (.kernel);
}
/DISCARD/ :
{
*(.bss*);
*(COMMON*);
}
}
型
bootloader.asm:
bits 16
section .boot
global _start
_start:
cli
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x9000
mov bx, 0x7e00
mov al, 1
mov dh, 0
mov dl, 0
mov ch, 0
mov cl, 2
mov ah, 2
int 0x13
pusha
mov ax, 0x0700 ; function 07, AL=0 means scroll whole window
mov bh, 0x07 ; character attribute = white on black
mov cx, 0x0000 ; row = 0, col = 0
mov dx, 0x184f ; row = 24 (0x18), col = 79 (0x4f)
int 10h ; call BIOS video interrupt
popa
pusha
mov ah, 0x02
xor dx, dx
int 10h
mov si, boot_msg
mov ah, 0x0e
boot_characterLoop:
lodsb
or al, al
jz continue
int 10h
jmp boot_characterLoop
continue:
mov ah, 0x86
mov cx, 0xF
mov dx, 0x4240
int 15h
int 15h
int 15h
popa
jmp 0x7e00
boot_msg: db "The os is correctly loaded"
times 510-($-$$) db 0
dw 0xAA55
型
kernel.asm:
bits 16
section .kernel
global _start_kernel
_start_kernel:
mov ax, 0x3
int 10h
commandLoop:
mov si, user
call print
mov di, input_string
call input
ifCommand:
cld
mov si, C_shutdown
mov di, input_string
mov cx, CL_shutdown
repe cmpsb
jz thenCommandShutdown
cld
mov si, C_reboot
mov di, input_string
mov cx, CL_reboot
repe cmpsb
jz thenCommandReboot
cld
mov si, C_clear
mov di, input_string
mov cx, CL_clear
repe cmpsb
jz thenCommandClear
jmp elseCommand
thenCommandShutdown:
call shutdown
thenCommandReboot:
call reboot
thenCommandClear:
call clearScreen
jmp commandLoop
elseCommand:
mov si, input_string
call print
mov si, cmdNotFound
call print
call newLine
jmp commandLoop
exit:
cli
hlt
;- Includes --------------------+
%include "lib/console.asm" ; |
%include "lib/system.asm" ; |
;-------------------------------+
;- Variables ----------------------------------+
user: db "user >> ", 0 ; |
input_string: times 20 db 0 ; |
cmdNotFound: db ": command not found!", 0 ; |
;----------------------------------------------+
;- Commands Variables ------------------------------+
; |
C_shutdown: db "shutdown", 0 ; |
CL_shutdown equ $ - C_shutdown ; |
; |
C_reboot: db "reboot", 0 ; |
CL_reboot equ $ - C_reboot ; |
; |
C_clear: db "clear", 0 ; |
CL_clear equ $ - C_clear ; |
;---------------------------------------------------+
times 512-($-$$) db 0
型
我该怎么办?我需要食物吗?(我用的是ubuntu 22.04.02 LTS)ps。对不起的语法,但我是意大利人,我只有14岁😅
2条答案
按热度按时间luaexgnf1#
最简单的方法是将操作系统映像写入USB拇指驱动器,然后从该驱动器 Boot 机器。
插入您的拇指驱动器,然后运行
dmesg
查看内核日志并查看新设备的名称。它可能是sdb
(SCSI驱动器B)。请仔细检查是否写入了正确的设备,否则您的安装将被丢弃!
然后:
字符串
您需要确保目标计算机已配置:
1.在传统(非UEFI)模式下 Boot 。
祝你好运!
eiee3dmh2#
离开qemu并在“真实的的机器”上工作会带来一些变化,qemu可能会为您提供帮助:
mov bh, 0
。字符串
吃还是不吃
我在DOS/Windows系统上使用BIOS固件,所以既不是Ubuntu也不是UEFI固件。
每当我需要测试一个业余爱好的操作系统时,我就把它放在一个3. 5英寸的软盘上,我可以把它插入一个插入USB端口的外部软盘驱动器中。我唯一要确定的是外部设备在 Boot 顺序中是最高的(所以在硬盘和/或光驱之前)。有一个BIOS设置。
而不是软盘(最简单的),我可以只把它放在USB棒上,让BIOS假装这个棒是软盘。