Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2023, 09:46   #1
Окоза-Окоза
Пользователь
 
Регистрация: 09.01.2023
Сообщений: 19
Злость ОС: Как выполнить переход из bootloader на fasm в ядро на C\C#\C++?

Вот какое дело: имеется загрузчик на asm кто любопытный вот код:

Код:
org 7C00h 
;////////////////////code//////////////////// 
 start: 
    cli 
    xor ax, ax 
    mov ds, ax 
    mov es, ax 
    mov ss, ax 
    mov sp, 07C00h 
    sti 
 
 
  mov ax, 3 
  int 10h 
;=================set-cursor============= 
  mov ah, 2h 
  mov dh, 0 
  mov dl, 0 
  xor bh, bh 
  int 10h 
;=================set-cursor============== 
 
;==========draw-text====================== 
  mov ax, 1301h 
  mov bp, msg 
  mov cx, 21 
  mov bl, 84 
  int 10h 
;==========draw-text====================== 
 
;-----------cycle------------------- 
  jmp $ 
;-----------cycle------------------- 
 
;////////////////////code//////////////////// 
;==============no-code===================== 
msg db 'Welcome to  FIREOS!!!',0 
;==============no-code===================== 
 
times 510 - ($ - $$) db 0 
db 0x55, 0xAA
и хочу сделать ядро ОС, только на C\C#\C++ неважно. только как сделать чтобы загрузчик осознал и загрузил ядро на C*. А также какой начальный код должен у него (ядра) быть? ОТВЕТЫ типа я дурак, идиот, это долго не задавать. На другом форуме это было. За нормальные ответы спасибо. Если эти темы поднимались извините, я на форуме в первый раз.

Последний раз редактировалось Окоза-Окоза; 10.01.2023 в 09:30.
Окоза-Окоза вне форума Ответить с цитированием
Старый 09.01.2023, 13:51   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Дело в том, что вы написали первичный загрузчик и сейчас кроме прерываний BIOS вам ничего не доступно.
По сути ваша программа сейчас ограничена 1Мб памяти в 16-битном реальном режиме работы процессора.
Чтобы перейти к ядру написанному на другом языке вам надо:
1) Определить блок в оперативной памяти куда будет загружаться ядро
2) Оформить ядро на работу в этом блоке оперативной памяти
3) Считать с диска сектора, содержащие бинарный образ ядра в нужное место оперативной памяти
4) Осуществить дальний переход на стартовый адрес в этом ядре (который может быть указан в заголовке ядра или вычислен загрузчиком)
Код:
jmp 0x0FF0:0x0100 ; Переходим на ядро в виде COM файла загруженное по линейному адресу 0x10000
; При этом в CS будет сегментный адрес 0x0FF0, а начало файла будет записано с отступом на 256 байт от начала сегмента
; Итого: 0x0FF0 * 16 = 0x0FF00 + 0x00100 = 0x10000

Последний раз редактировалось macomics; 09.01.2023 в 13:54.
macomics вне форума Ответить с цитированием
Старый 10.01.2023, 09:28   #3
Окоза-Окоза
Пользователь
 
Регистрация: 09.01.2023
Сообщений: 19
По умолчанию

Только где более подробную инфу брать?
Окоза-Окоза вне форума Ответить с цитированием
Старый 10.01.2023, 09:33   #4
Окоза-Окоза
Пользователь
 
Регистрация: 09.01.2023
Сообщений: 19
По умолчанию

И как загрузить кернель в ОЗУ по адресу? и тем более на C\C#\C++? Скорее всего будут asmовые вставки.
Окоза-Окоза вне форума Ответить с цитированием
Старый 10.01.2023, 12:18   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Как-то так
Код:
; Загрузка COM файла длиной не более 512 байт
LINEAR_LOADING_ADDRESS = 0x10000
; Итого 0x1000 * 16 + 0 = 0x10000 = 64 кб (это я просто выбрал адрес, он может быть любым в пределах 640 кб. Только не затрите:
; 0x00000 - 0x003FF: IDT
; 0x00400 - 0x0050F: BIOS vars
; 0x07C00 - 0x07DFF: Саму загрузочную программу
; 0x9FC00 - 0x9FFFF: Расширенную память BIOS)

    org 0x7C00

    mov ax, cs
    mov ds, ax
    mov [device], dl

    mov ah, 2 ; Функция чтения секторов с диска (CHS)
    mov al, 1 ; Количество подряд считываемых секторов (для FDD лучше не больше 1, для HDD/USB/CD можно и больше)
    mov dl, [device] ; Значение получается при старте загрузчика в этом регистре (его надо сохранить в переменной device)
    mov dh, 0 ; Номер головки
    mov ch, 0 ; Номер дорожки
    mov cl, 2 ; Номер сектора (нумеруются с 1, а в 1 секторе находится этот самый загрузчик)
    push LINEAR_LOADING_ADDRESS shr 4 ; Сегментный адрес для считывания сектора в память
    mov bx, LINEAR_LOADING_ADDRESS and 1111b ; Смещение в сегменте
    pop es

    int 19 ; Вызов функции BIOS для работы с дисками

    jmp ((LINEAR_LOADING_ADDRESS - 0x0100) shr 4):0x0100; Переход на загруженную программу (По выбранному мной адресу выше)

device db ?

rb 510 - $ + $$
db 0x55, 0xAA

Последний раз редактировалось macomics; 10.01.2023 в 12:52.
macomics вне форума Ответить с цитированием
Старый 10.01.2023, 12:55   #6
Окоза-Окоза
Пользователь
 
Регистрация: 09.01.2023
Сообщений: 19
По умолчанию

А как тогда из кернеля на C сделать com? это просто приложение будет которое играет роль кернеля?
Окоза-Окоза вне форума Ответить с цитированием
Старый 10.01.2023, 12:57   #7
Окоза-Окоза
Пользователь
 
Регистрация: 09.01.2023
Сообщений: 19
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Загрузка COM файла длиной не более 512 байт
это символьная длина а не вес? а если больше то на старые накопители не будет что ли?
Окоза-Окоза вне форума Ответить с цитированием
Старый 10.01.2023, 15:11   #8
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Чтобы было больше, тогда надо загрузить большее чем 1 число секторов. Я показал как сделать самое сложное для вас. Цикл с загрузкой секторов напишите сами (надеюсь). И еще кое-что. Настройка процессора для работы с COM программой выглядит чуть сложнее. Точнее вот так
Код:
mov ax, 0x0FF0
mov ds, ax ; все сегментные регистры (cs = ds = es = ss = 0x0FF0) необходимо настроить на один и тот же сегментный адрес. В cs этот адрес запишет команда jmp, а в остальные надо заносить это же значение вручную.
mov es, ax
mov ss, ax
mov sp, 0xFFFE
mov word [0x0000], 0x19CD ; По адресу 0x0FF00 должна быть команда int 0x20 для DOS, но т.к. DOS нету, то поставим команду int 0x19 - перезагрузка с диска (продолжение загрузки с дисков)
mov word [0xFFFE], 0 ; А в конце стека (по адресу 0x1FEFE) должен быть адрес возврата (0x0000) на эту самую команду int 0x19, чтобы COM программа могла завершить свою работу по retn
jmp 0x0FF0:0x0100
Это все для того же линейного адреса 0x10000

Последний раз редактировалось macomics; 10.01.2023 в 15:25.
macomics вне форума Ответить с цитированием
Старый 10.01.2023, 15:23   #9
Окоза-Окоза
Пользователь
 
Регистрация: 09.01.2023
Сообщений: 19
По умолчанию

Накуралесил. так сойдет? в архиве только код загрузчика.
Вложения
Тип файла: rar boot.rar (4.4 Кб, 4 просмотров)
Окоза-Окоза вне форума Ответить с цитированием
Старый 10.01.2023, 15:29   #10
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Так вы на FASM пишите или на NASM?

ADD: Выглядит работоспособным, но есть замечания.
Стек слишком маленький и попадает на загруженный код. Его стоит переместить в конец сегмента (mov sp, 0xFFFE)

Последний раз редактировалось macomics; 10.01.2023 в 15:48.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ядро программы С++ kineziz Общие вопросы C/C++ 3 06.06.2012 23:06
Чем отличаеться fasm от fasm editor&? TotKtoNado Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 07.11.2011 17:00
простейшее ядро lem Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 28.09.2011 16:37
Стек и bootloader kuraga1991 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 29.12.2010 22:17
Ядро Adblock PHP 13 22.06.2010 21:16