2012-06-17 4 views
3

Как любой программист в мире хотя бы раз в жизни, я пытаюсь создать свою «революционную», новую и единственную операционную систему. : DСборка - прочитайте следующий сектор виртуального диска

Ну, я использую виртуальный эмулятор (виртуальный ящик виртуальной машины Oracle), для которого я создаю новую операционную систему unknwon с диском vmdk. Мне нравится vmdk, потому что они просто простые файлы, поэтому я могу вставить мой загрузчик поверх первых 512 байт виртуального жесткого диска.

Теперь я пытаюсь прочитать следующий сектор этого виртуального диска, на котором я бы вставлял простое ядро, которое отображало бы сообщение.

У меня есть два вопрос:

  • Может ли я чтение второго сегмента (первый -512 bytes- занимаемого загрузчика) правильно? КОД:

    ReadDisk: 
        mov bx, 0x8000 ; segment 
        mov es, bx 
        mov bx, 0x0000 ; offset 
    
        mov ah, 0x02 ; read function 
        mov al, 0x01 ; sectors - this might be wrong, trying to read from hd 
        mov ch, 0x00 ; cylinder 
        mov cl, 0x02 ; sector 
        mov dh, 0x00 ; head 
        mov dl, 0x80 ; drive - trying to read from hd 
        int 0x13 ; disk int 
        jc ReadDisk 
        jmp [es:bx] ; buffer 
    

    Здесь я получаю сообщение об ошибке, после проверки CF. Однако, если я использую INT 13, 1 для получения последнего сообщения о статусе , AL равно 0, поэтому ошибка не сохраняется.

  • Я вставляю свое простое ядро ​​в нужное место внутри vmdk? То, что я делаю, вставляет его после 512-го байта файла, первые 512 байт, как я уже сказал, являются загрузчиками. файл будет выглядеть следующим образом:

    BE 45 7C E8 16 00 EB FE B4 0E B7 00 B3 07 CD 10 <- First sector 
    C3 AC 08 C0 74 05 E8 EF FF EB F6 C3 B4 00 B2 80 
    CD 13 BE 5D 7C 72 F5 BB 00 80 8E C3 BB 00 00 B4 
    02 B0 06 B5 00 B1 01 B6 00 B2 07 CD 13 BE 4E 7C 
    72 CF 26 FF 27 57 65 6C 63 6F 6D 65 21 00 52 65 
    61 64 69 6E 67 20 65 72 72 6F 72 21 00 52 65 73 
    65 74 74 69 6E 67 20 65 72 72 6F 72 21 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA <- Boot-loader signature 
    B4 0E B0 2E CD 10 EB FE 00 00 00 00 00 00 00 00 <- Start of the second sector 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    

Таким образом, это то, как я пытаюсь добавить ядро ​​во второй сектор. Что вы думаете об этом неправильно? Благодаря!

ОБНОВЛЕНИЕ

O.K. Я не получаю никаких ошибок сейчас, но я не вижу, что загруженный код выполняется. Он должен отображать точку в окне:

;-------------------------------------------- 
; 'load.asm' 
; loaded from 'boot.asm' 

[org 0x8000] 
[bits 16] 

;-------------------------------------------- 

main: 
mov ah, 0x0E ; print function 
mov al, '.' ; ascii char 
int 0x10 ; IO int 

jmp $ ; hang 
+0

Вы должны действительно отправиться на http://osdev.org/ и попросить его там. И прочитайте некоторые статьи из своей вики. – Griwes

ответ

1

Повторите попытку после сбоя. Я думаю, что вы получите сообщение об ошибке с отсутствием сообщения, когда диск вращается, поэтому эмулятор может не работать в первый раз. Четыре попытки хорошо работали для меня как в бочках, так и в qemu, но я не пробовал ни на что другое. Вы также можете сбросить контроллер накопителя перед чтением, чтобы удалить все предыдущие ошибки. Используйте прерывание 0x13 с al, а номер привода - dl.


Примечание: Hardcoding номер диска может работать пока, но не позволяет поддерживать загрузку с других дисков. BIOS должен оставить номер диска в dl при запуске вашего загрузчика, чтобы вы могли его сохранить.

+0

Я все еще не могу получить то, что хочу. Ошибка не отображается, но код, загруженный в память, не выполняется. См. Обновление! – ali

+0

'bh' и' bl' также влияют на результат функции печати. Лично я бы установил видеорежим с помощью функции 0 010 прерывания 0 и записывал непосредственно в видеопамять. Кроме того, если вы используете 0x8000 в качестве сегмента, линейный адрес равен 0x80000, поэтому директива 'org' неверна. Для этой программы это будет проблемой только в том случае, если баран в этом месте не существует. Если вы можете, вы должны подключить отладчик и убедиться, что процессор прыгает в нужное место. – ughoavgfhw

2

Одна из проблем здесь:

jmp [es:bx] 

Это будет считывать адрес, 16-битовое смещение, на самом деле, из ячейки памяти по адресу, указанному в (части сегмента) регистры es и bx (смещение), а затем установите ip на это 16-разрядное смещение.

Что вы можете использовать вместо этого:

jmp some_constant1:some_constant2 

Это установит cs к some_constant1 и ip к some_constant2. Неудивительно, что хорошие кандидаты для этих двух констант равны 0x8000 и 0 соответственно, поскольку это место, где загружается ваш код.

Теперь вторая проблема здесь:

[org 0x8000] 

Это org говорит NASM для генерации кода таким образом, что он будет работать, если загружен по смещению 0x8000. Теперь смещение 0x8000 - это не то же самое, что сегмент 0x8000. Если вы используете jmp 0x8000:0, то вы должны использовать:

[org 0] 
Смежные вопросы