NASM, как писать прямо на жесткий диск и читать с него в реальном режиме - PullRequest
0 голосов
/ 04 мая 2018

В последней версии Ubuntu, x64.

Мне очень интересно, как операционные системы могут устанавливать себя на компьютеры при загрузке с флеш-накопителей, но я хотел бы сделать это в реальном режиме, а не в защищенном или длинном режиме. Конечно, старые операционные системы, такие как MS-DOS, использовали для этого.

Для реального режима, есть ли прерывание для этого? Или мне нужно сначала перейти в защищенный или длинный режим, прежде чем я смогу записывать данные прямо на жесткий диск и / или читать из этой же области?

Это делается для небольшой ОС реального режима с двухэтапным загрузчиком:

org 0x7C00
mov ah, 0
int 13h
mov dx, 0
mov ah, 2
mov al, 10h
mov dl, 0x80
mov ch, 0
mov dh, 0
mov cl, 2
mov bx, stage2
int 0x13
jmp stage2
times 510-($-$$) db 0
dw 0xAA55

msg db "!!"

%include "read.s" ;read.s does not exist yet, as I do not know how to read from an address on the hard disk
%include "write.s" ;write.s does not exist yet, as I do not know how to write to an address on the hard disk

stage2:
    call ReadStr ;always reads from the same address, if the message is there, sets bl to 0x01. Otherwise, sets bl to 0x00.
    cmp bl, 0x00
    je load
    mov ah, 0eh
    mov al, "#" ;tiny message to tell me that the string is already at the address
    mov bx, 0
    int 10h
    jmp $
load:
    mov ax, [msg]
    call LoadStr ;loads the message to the same address that ReadStr reads from
    mov ah, 0eh
    mov al, "$" ;tiny message to tell me that the string does not already exist at the address
    mov bx, 0
    int 10h
    jmp $

Идея заключается в том, что при первой загрузке загрузчика он должен вывести «$», но при второй загрузке он должен вывести «#», поскольку данные уже существуют на жестком диске по указанному адресу. , Но я не знаю, как реализовать read.s и write.s. В идеале (основная цель этого) ОС будет установлена ​​на компьютер при первой загрузке загрузчика с флэш-накопителя. Нужно ли для этого сначала устанавливать Long Mode или это возможно в BIOS?

1 Ответ

0 голосов
/ 04 мая 2018

Что-то работает; при первой загрузке он будет печатать «! #», но каждый раз после этого при загрузке будет печататься «##», поскольку второй сектор флеш-накопителя был перезаписан третьим сектором флеш-накопителя. Единственное, чего не хватает, так это того, как сделать это с жестким диском вместо флэш-накопителя, но, по крайней мере, теперь я знаю, как перезаписать флэш-накопитель, и, таким образом, он может каким-то образом имитировать память, даже если она неэффективна. Следующий шаг - выяснить, как добавить загрузочный сектор в оперативную память компьютера, чтобы я мог использовать грубую мощность ОЗУ для хранения и обработки данных.

org 0x7C00
stage1:
    mov ah, 2
    mov cl, 2
    mov bx, stage2
    int 13h

    call stage2

    mov ah, 2
    mov cl, 3
    mov bx, stage2
    int 13h

    mov ah, 3
    mov cl, 2
    mov bx, stage2
    int 13h

    mov ah, 2
    mov cl, 2
    mov bx, stage2
    int 13h

    call stage2

    jmp $

times 510-($-$$) db 0
dw 0xAA55
stage2:
    mov ah, 0eh
    mov al, "!"
    mov bx, 0
    int 10h
    ret
times 1024-($-$$) db 0
stage3:
    mov ah, 0eh
    mov al, "#"
    mov bx, 0
    int 10h
    ret
times 1536-($-$$) db 0
...