Загрузка ядра с дискеты

Тема в разделе "WASM.OS.DEVEL", создана пользователем beginnerga, 3 дек 2019.

Метки:
  1. beginnerga

    beginnerga New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2019
    Сообщения:
    10
    Код (ASM):
    1.           org 0
    2.           use16
    3.           ;------------------------;
    4.           mov  ah,00h              ;
    5.           mov  al,03h              ;
    6.           int  10h                 ;
    7.           ;------------------------;
    8.  
    9.           ;------------------------;
    10.           mov ah,05h               ;
    11.           mov al,0                 ;
    12.           int 10h                  ;
    13.           ;------------------------;
    14.  
    15.           ;------------------------;
    16.           mov bx,0                 ;
    17.           mov dl,0                 ;
    18.           mov dh,25                ;
    19.           mov ah,02h               ;
    20.           int 10h                  ;
    21.           ;------------------------;
    22.  
    23.           cli
    24.           cld
    25.  
    26.           xor ax, ax
    27.           mov ds, ax
    28.           mov es, ax
    29.           mov ss, ax
    30.           mov sp, 0x8000
    31.           sti
    32.  
    33.           mov dh,0            ;
    34.           mov ch,0            ;
    35.           mov cl,1            ;
    36.           ;-------------------;
    37.           mov ax, 0000h       ;
    38.           mov es, ax          ;
    39.           mov bx, .ENDLOADER  ;
    40.           ;-------------------;
    41.           mov al, 1           ;
    42.           mov ah, 2h
    43.           int 13h
    44.           jmp .ENDLOADER
    45.  
    46. times 0x200 - 2 - ($ - $$) db 0x90
    47. db  055h, 0AAh
    48.  
    49. .ENDLOADER:
    50.  
    51. ;==============================================================================}
    52. mov edi,0B8000h
    53. mov byte[es:edi],' '
    54. inc edi
    55. mov byte[es:edi],01010101b
    56. jmp $  
    Код, размещённый в загрузчике должен загружать в RAM ядро, но почему-то этого не происходит
    Код (ASM):
    1.           mov dh,0            ;
    2.           mov ch,0            ;
    3.           mov cl,2            ;
    4.           ;-------------------;
    5.           mov ax, 0000h       ;
    6.           mov es, ax          ;
    7.           mov bx, 0x8000      ;
    8.           ;-------------------;
    9.           mov al, 30          ;
    10.           mov ah, 2h
    11.           int 13h
    12.           jmp far 0:8000h
    По адресу 0:8000h расположено ядро, если его конечно можно так назвать:)
    Код (ASM):
    1. org 0x8000
    2.  
    3.  
    4. Start:
    5.           mov  ecx,2000            ;
    6.           mov  al,' '              ;
    7.           mov  ah,01010101b        ;
    8.           ;------------------------;
    9.           mov  EDI,0B8000h         ;
    10.           ;------------------------;
    11. .CICLE:    test ecx,ecx             ;
    12.           jz  .ENDCICLE               ;
    13.           MOV [ES:EDI],al          ;
    14.           inc  EDI                 ;
    15.           MOV [ES:EDI],ah          ;
    16.           inc  EDI                 ;
    17.           dec  ecx                 ;
    18.           jmp .CICLE                ;
    19. .ENDCICLE:   ;------------------------;
    20. jmp $    
    Ядро должно заполнить экран розовым, но этого не происходит. И проблема не в этом куске кода (я тестировал - он работал в загрузчике). Просьба тем кто знает сказать, в чём дело
    Весь код:
    Код (ASM):
    1.           org 0
    2.           use16
    3.           ;------------------------;
    4.           mov  ah,00h              ;
    5.           mov  al,03h              ;
    6.           int  10h                 ;
    7.           ;------------------------;
    8.  
    9.           ;------------------------;
    10.           mov ah,05h               ;
    11.           mov al,0                 ;
    12.           int 10h                  ;
    13.           ;------------------------;
    14.  
    15.           ;------------------------;
    16.           mov bx,0                 ;
    17.           mov dl,0                 ;
    18.           mov dh,25                ;
    19.           mov ah,02h               ;
    20.           int 10h                  ;
    21.           ;------------------------;
    22.  
    23.           cli
    24.           cld
    25.  
    26.           xor ax, ax
    27.           mov ds, ax
    28.           mov es, ax
    29.           mov ss, ax
    30.           mov sp, 0x8000
    31.           sti
    32.  
    33.           mov dh,0            ;
    34.           mov ch,0            ;
    35.           mov cl,2            ;
    36.           ;-------------------;
    37.           mov ax, 0000h       ;
    38.           mov es, ax          ;
    39.           mov bx, 0x8000      ;
    40.           ;-------------------;
    41.           mov al, 30          ;
    42.           mov ah, 2h
    43.           int 13h
    44.           jmp far 0:8000h
    45.  
    46. times 0x200 - 2 - ($ - $$) db 0x90
    47. db  055h, 0AAh
    48.  
    49.  
    50.  
    51. ;==============================================================================}
    52. org 0x8000
    53.  
    54.  
    55. Start:
    56.           mov  ecx,2000            ;
    57.           mov  al,' '              ;
    58.           mov  ah,01010101b        ;
    59.           ;------------------------;
    60.           mov  EDI,0B8000h         ;
    61.           ;------------------------;
    62. .CICLE:    test ecx,ecx             ;
    63.           jz  .ENDCICLE               ;
    64.           MOV [ES:EDI],al          ;
    65.           inc  EDI                 ;
    66.           MOV [ES:EDI],ah          ;
    67.           inc  EDI                 ;
    68.           dec  ecx                 ;
    69.           jmp .CICLE                ;
    70. .ENDCICLE:   ;------------------------;
    71. jmp $
    (Обновлено)Работающий код:
    Код (ASM):
    1.           org 0
    2.           use16
    3.           ;------------------------;
    4.           mov  ah,00h              ;
    5.           mov  al,03h              ;
    6.           int  10h                 ;
    7.           ;------------------------;
    8.  
    9.           ;------------------------;
    10.           mov ah,05h               ;
    11.           mov al,0                 ;
    12.           int 10h                  ;
    13.           ;------------------------;
    14.  
    15.           ;------------------------;
    16.           mov bx,0                 ;
    17.           mov dl,0                 ;
    18.           mov dh,25                ;
    19.           mov ah,02h               ;
    20.           int 10h                  ;
    21.           ;------------------------;
    22.  
    23.           cli
    24.           cld
    25.  
    26.           xor ax, ax
    27.           mov ds, ax
    28.           mov es, ax
    29.           mov ss, ax
    30.           mov sp, 0x8000
    31.           sti
    32.  
    33.           mov dh,0            ;
    34.           mov ch,0            ;
    35.           mov cl,1            ;
    36.           ;-------------------;
    37.           mov ax, 0000h       ;
    38.           mov es, ax          ;
    39.           mov bx, .ENDLOADER  ;
    40.           ;-------------------;
    41.           mov al, 1           ;
    42.           mov ah, 2h
    43.           int 13h
    44.           jmp .ENDLOADER
    45.  
    46. times 0x200 - 2 - ($ - $$) db 0x90
    47. db  055h, 0AAh
    48.  
    49. .ENDLOADER:
    50.  
    51. ;==============================================================================}
    52. mov edi,0B8000h
    53. mov byte[es:edi],' '
    54. inc edi
    55. mov byte[es:edi],01010101b
    56. jmp $  
    P.S. Программа не моя, просто пытаюсь понять, как это работает
    P.S.S. Запускаю из-под VirtualBox
     
    Последнее редактирование: 4 дек 2019
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Во первых, для изучения возьмите QEMU + связку IDA (Remote GDB debugger) и вы сможете по шагам отлаживать ваши бут программы.

    Во вторых, нельзя писать код так, как написали вы. Нельзя ставить Org XXXX после того, как вы уже поставили Org 0h.
    и вообще по хорошему нужно чтоб загрузчик умел откуда-то загружать файлы. Например с дискетки, читая FAT. Тогда у вас не будет проблем. Отдельно будет бутлоадер, отдельно будет программа.
     
    Mikl___ нравится это.
  3. beginnerga

    beginnerga New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2019
    Сообщения:
    10
    Вы говорите, что после org 0 нельзя прописать org xxxx. Тогда как поменять смещение, допустим, в середине программы?
     
    Последнее редактирование: 4 дек 2019
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    beginnerga, вы путаете
    org директива говорит компилятору сгенерировать программу, которую загрузчик загрузит по смещению внутри сегмента заданому в этой директиве
    вы должны написать программу, которая будет перемещать часть кода (которую нужно поместить в 8000h) из одного адреса, в другой. Обычное копирование - память-> память. После копирования передаете управление командой Jmp . Код должен быть базонезависимый. Иначе придется вам все смещения перерасчитывать .

    Но лучше просто сделать два исходника, как я предложил выше
    Один запишете в загрузчик, второй запишете на дискету в фс как файл, который прочитает загрузчик и передаст туда управление
     
    Последнее редактирование: 4 дек 2019
  5. beginnerga

    beginnerga New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2019
    Сообщения:
    10
    TermoSINteZ, Не могли бы вы привести пример программы, которую вы описали выше?
    Если нет, то посоветуйте, где можно найти исходники подобных программ
    --- Сообщение объединено, 4 дек 2019 ---
    TermoSINteZ, Спасибо за подсказку с org!
    Проблема была решена путём смещения "ядра" с адреса 8000h на адрес 513h (сразу после загрузочного сектора)
    --- Сообщение объединено, 4 дек 2019 ---
    TermoSINteZ,
    Ещё вы советовали "научить" программу читать с дискеты с ФС FAT, но, думаю, что для мини-"системы", которая весит 532 байта (хотя можно было с лёгкостью уместить её в загрузчике), такой метод загрузки был бы неэффективен
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Пример бутлоадера , загружающего exe с названием (KERNEL.EXE)
    смотрите аттач.
    Бутлоадер после компиляции - помещаете на образ дискетки. (0 сектор будет содержать бутлоадер) . Сама дискетка примет формат FAT12. В корень кидаете Kernel.exe файл.
    Код бутлоадера ищет файл по ФС (по имени) и загружает его

    И того бутлоадер весит 512 байт.
    Вам много чтоли?
    Помоему очень даже эффективно
     

    Вложения:

    • bootloader.ASM
      Размер файла:
      9,7 КБ
      Просмотров:
      532
    • KERNEL_small.ASM
      Размер файла:
      872 байт
      Просмотров:
      591
  7. beginnerga

    beginnerga New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2019
    Сообщения:
    10
    TermoSINteZ, Ваша программа должна выводить RE, либо я где-то накосячил?
     
  8. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    beginnerga, это ошибка бутлоадера
    MsgErrRead db "RE"

    Можете почитать исходник, чтоб понять почему не удалось прочитать файл (ошибку вернула функция биос чтения сектора)
     
  9. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Mikl___ и UbIvItS нравится это.
  10. savoyard

    savoyard Member

    Публикаций:
    0
    Регистрация:
    16 янв 2020
    Сообщения:
    42
    Всем доброго времени суток.

    Помогите разобраться в причине неработоспособности загрузчика и ядра (от TermoSINteZ'а). У меня сложилось впечатление, что дело в коде ядра. Где-то там есть ошибка, а вот где - не могу разобраться. В DOS'е-то я специалист еще тот. :) Выручайте кто чем может, а то на эту Windows 10 смотреть уже не могу. :)

    Вся документация по моему вопросу, в аттаче.
     

    Вложения:

    Последнее редактирование: 15 фев 2020
  11. savoyard

    savoyard Member

    Публикаций:
    0
    Регистрация:
    16 янв 2020
    Сообщения:
    42
    Подниму еще раз свою тему. Возможно, из-за шуток, со стороны показалось, что мне не особо-то и нужен ответ на мой вопрос, но это не так.

    Проблема в следующем:

    Пытаюсь запустить из образа дискеты 1,44 - загрузчик и ядро от (от TermoSINteZhttps://wasm.in/threads/zagruzka-jadra-s-diskety.33518/#post-414039), но у меня все работает "криво". Такое впечатление, что загрузчик код ядра на образе находит и загружает, а сам код ядра работает не корректно и вместо сообщения: "Exit... Please reboot system" - выдает какие-то "крякозябры". Образ дискеты запускал на QEMU. Все файлы и скрины есть в аттаче. Кто в теме - посмотрите пожалуйста. Может я где-то ошибся и поторопился с выводами? Заранее спасибо.
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    savoyard, никаких ошибок там нет
    upload_2020-2-16_0-53-54.png

    Содержимое бат файла самое дефолтное
    Код (DOS):
    1.  
    2. REM Start qemu on windows.
    3. @ECHO OFF
    4.  
    5. REM SDL_VIDEODRIVER=directx is faster than windib. But keyboard cannot work well.
    6. SET SDL_VIDEODRIVER=windib
    7.  
    8. REM SDL_AUDIODRIVER=waveout or dsound can be used. Only if QEMU_AUDIO_DRV=sdl.
    9. SET SDL_AUDIODRIVER=dsound
    10.  
    11. REM QEMU_AUDIO_DRV=dsound or fmod or sdl or none can be used. See qemu -audio-help.
    12. SET QEMU_AUDIO_DRV=dsound
    13.  
    14. REM QEMU_AUDIO_LOG_TO_MONITOR=1 displays log messages in QEMU monitor.
    15. SET QEMU_AUDIO_LOG_TO_MONITOR=0
    16.  
    17. REM PCI-based PC(default): -M pc
    18.  
    19. qemu-system-x86_64.exe -L . -m 128 -M pc -fda floppy_img.flp -soundhw all -localtime -net nic,model=ne2k_pci
    20. pause
    21.  
    Образ флешки прикрепил

    Возможно вы неправильно собрали кернел. Либо неправильно создали образ дискеты.
     

    Вложения:

    • floppy_img.zip
      Размер файла:
      4,6 КБ
      Просмотров:
      356
    Последнее редактирование: 16 фев 2020
  13. savoyard

    savoyard Member

    Публикаций:
    0
    Регистрация:
    16 янв 2020
    Сообщения:
    42
    TermoSINteZ, спасибо за внимание. С вашими файлами у меня прям мистика какая-то. Скачал ваш последний аттач с образом флешки, а он внутри пустой. :) Может поторопились и забыли вложить или у меня даже на это ума не хватает? :)

    Кернел и загрузчик компилировал FASM'ом, а образ дискеты делал с "живой" дискеты. Потом в этом образе подменил первые 512 байт с вашего загрузчика, а в корень скопировал кернел. В моем аттаче все эти файлы есть. Может вы их у себя попробуете запустить? Хочу понять где я ошибся.
     
  14. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    savoyard, да мой косяк по флоппику. Почему то вчера не загрузилось до конца.
    Перезалил.

    Ок посмотрю ваш аттач
     
  15. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    savoyard, добавьте инициализацию DS сегмента.

    И изучите обязательно 16 битную модель памяти и вообще как кодить простые EXE прогаммы для DOS.
    Исправленный кусок программы
    Код (ASM):
    1.  
    2. start:
    3.     ;Очищаем экран
    4.     mov ax,3
    5.     int 10h
    6.     ;=======это нужно было добавить===========
    7.     mov ax,data16
    8.     mov ds,ax
    9.     ;=======конец добавленного блока===========
    10. Exit_pr:
    11.     ;Выходим из программы
    12.     mov si,MsgExitToBIOS
    13.     call print
    14.     ;возврат управления в биос
    15.     ;int 18h
    16.     cli
    17.     hlt
    18.  
     
    savoyard нравится это.
  16. savoyard

    savoyard Member

    Публикаций:
    0
    Регистрация:
    16 янв 2020
    Сообщения:
    42
    @TermoSINteZ, спасибо за помощь по моему вопросу. Теперь все работает "прямо", в том смысле, что не "криво". :)
    Уже изучаю. Буквально позавчера поставил себе на виртуалку DOS. Запустил в DOS'е ваше обновленное ядро без загрузчика - все работает корректно.

    P.S. Кого только среди журналистов нет на WASM'е. Тут тебе и физики-ядерщики и академики с профессорами, но как только дело доходит до какого-нибудь простого вопроса, то получается, что никто кроме TermoSINteZ'а его решить-то и не может. Вот такая вот правда жизни. :) Но зато по вопросам коронавирусов, самолетиков и прочей Илоно-хрени - желающих высказаться хоть отбавляй. Лучше бы все было с точностью до наоборот. :)
     
  17. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    savoyard,
    у нас был народ раньше, кто очень активно помогал новичкам. Щас как то не очень хотят. (