OSDev

для всех
Текущее время: 29 апр 2024, 00:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
СообщениеДобавлено: 05 мар 2012, 12:55 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
PCU писал(а):
Смещение 7С00h поставил , поскольку это загрузочный сектор.
Логика на высоте.

Цитата:
Да, это МБР.
И... тебе же описали структуру MBR.

Код:
jmp 0000h:7DFFh  ; прыгает на адрес в оперативке, который идет сразу за МБР (7c00h + 512d)
Угу ) Диплом, говоришь, собираешься защищать...

Код:
buf  rb 512    ; сюда загружается мое ядро. Эта переменная,по идее,смещена в оперативке на 512 от начала - после МБР
Идея верная, только кто твое ядро загружать-то будет?

Цитата:
...
У дискеты нет MBR. Это называется загрузочным сектором. Разметка вроде бы правильная, если ты будешь загружать ядро в память последовательно, но не хватает директивы "org" (на словах она как бы есть, но на деле, в коде, что-то не видно). Не хочешь "org", делай $-$$, но тогда адрес загрузки бутсектора следует считать началом сегмента.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 мар 2012, 12:58 
Заблокирован

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
invalid value : db 1024-($-7c00h) dup (0) - эта ошибка может потаму, что вы забили код на больше чем 1024 байт и заполнять нолями нечего, я пишу times 512*49 - ($-$$) db 0 и если 49 секторов не хватает добавляю ещё. Переменные можете хранить не в коде, а в каком то месте, например 07E00-9FFFF здесь, там 623104 байт минус код если вы его туда тоже грузите.
Тогда у вас код меньше будет по раэмеру за счёт отсутствия этих переменных. Константы естественно так не сделаеш из за того, что в них нужная инфа. Если бы у меня были в бинарнике переменные то он был бы больше раза в 2, особенно когда нужны списки команд для дисков или флешек их много и кождый по 1024 байт и должны быть выровнены на несколько бит.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 мар 2012, 13:16 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Код:
  org 7C00h
  ...
  jmp 0:@f
  rb 7DFEh-$ ; 510-($-$$)
  dw 0AA55h
@@:
  ...
  add_sec_count = ($-($$+512)+511)/512 ; или ($-$$-1)/512, или ($-$$+511)/512-1
  rb 10000h-$ ; защита от переполнения сегмента


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 мар 2012, 13:38 

Зарегистрирован: 25 фев 2012, 23:27
Сообщения: 8
phantom-84 писал(а):
Код:
  org 7C00h
  ...
  jmp 0:@f
  rb 7DFEh-$ ; 510-($-$$)
  dw 0AA55h
@@:
  ...
  add_sec_count = ($-($$+512)+511)/512 ; или ($-$$-1)/512, или ($-$$+511)/512-1
  rb 10000h-$ ; защита от переполнения сегмента


Благодарю за пример. сегодня буду разбираться, а то не все сходу понял.

Цитата:
jmp 0000h:7DFFh ; прыгает на адрес в оперативке, который идет сразу за МБР (7c00h + 512d)
Угу ) Диплом, говоришь, собираешься защищать...

Скорее всего да)) пока хромаю в знаниях и очень, не спорю.
а что не так здесь?

Цитата:
Идея верная, только кто твое ядро загружать-то будет?


вот полный текст моего загрузчика. в конце переменная куда которая принимает ядро. по идее оно прыгает на (7c00h + 512d).


Код:
ORG 7C00h

cli
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7c00
sti



;Read our kernel in the buf . Kernel consist of one sector   
mov ah,2h
mov al,1h
mov ch,0
mov cl,2
mov dh,0
mov dl,0h
xor bx,bx
mov bx,buf
int 13h   


mov SI,msg                     ; Output 'For laoding OS press any key ...'
MOV AH, 0Eh   



print:   MOV AL, [SI]
         CMP AL, 0
         JZ done
         INT 10h 
         INC SI
         JMP print

 
done:     mov ah,03h
          xor bh,bh
          int 10h
          inc dh
          xor dl,dl
          mov ah,2h
          int 10h

 
          MOV AH, 0
           INT 16h


jmp 0000h:7DFFh 

msg DB  'For laoding OS press any key ...',0

 jmp @1   
times 510 - ($-$$) db 0   
@1:
db      55h, 0aah 

buf rb 512



если что не так, буду благодарен за критику.


Станислав писал(а):
invalid value : db 1024-($-7c00h) dup (0) - эта ошибка может потаму, что вы забили код на больше чем 1024 байт и заполнять нолями нечего, я пишу times 512*49 - ($-$$) db 0 и если 49 секторов не хватает добавляю ещё. Переменные можете хранить не в коде, а в каком то месте, например 07E00-9FFFF здесь, там 623104 байт минус код если вы его туда тоже грузите.
Тогда у вас код меньше будет по раэмеру за счёт отсутствия этих переменных. Константы естественно так не сделаеш из за того, что в них нужная инфа. Если бы у меня были в бинарнике переменные то он был бы больше раза в 2, особенно когда нужны списки команд для дисков или флешек их много и кождый по 1024 байт и должны быть выровнены на несколько бит.


Благодарю за совет. буду смотреть еще раз.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 мар 2012, 14:53 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Код:
ORG 7C00h

cli
; mov ax, cs
xor ax,ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7c00
sti



;Read our kernel in the buf . Kernel consist of one sector   
mov ah,2h
mov al,1h
mov ch,0
mov cl,2
mov dh,0
mov dl,0h
; xor bx,bx
mov bx,buf
int 13h   
; отсутствует проверка результата чтения!

mov SI,msg                     ; Output 'For laoding OS press any key ...'
; MOV AH, 0Eh   



print:   MOV AL, [SI]
         CMP AL, 0
         JZ done
mov ah,0Eh
mov bx,7 ; не помешает
         INT 10h 
         INC SI
         JMP print

; этого фрагмента вообще не понял. Что делают эти видеофункции?
done:     mov ah,03h
          xor bh,bh
          int 10h
          inc dh
          xor dl,dl
          mov ah,2h
          int 10h

 
          MOV AH, 0
           INT 16h


; jmp 0000h:7DFFh 
jmp 0:buf ; фактически jmp 0:7E00h

msg DB  'For laoding OS press any key ...',0

; jmp @1   - полный бред
times 510 - ($-$$) db 0   
; @1: - см. выше
db      55h, 0aah 

buf rb 512
; можно просто указать метку buf и писать догружаемый код

add_sec_count = ($-buf+511)/512 ; на будущее для дозагрузки нескольких секторов
rb 10000h-$ ; защита от переполнения сегмента


Часто для успешного чтения сектора с флоппика его приходится читать несколько раз. Лучше изначально применять преобразование LBA-to-CHS, иначе очень скоро ты по уши увязнешь в трехмерных координатах (я где-то на форуме выкладывал упрощенный вариант преобразования специально для флоппика).

P.S. Не мешало бы привести код к единому стилю оформления, чтобы выдранные из разных источников фрагменты не резали глаз.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 мар 2012, 14:21 

Зарегистрирован: 28 янв 2012, 18:02
Сообщения: 29
Я тут разбирался с исходниками Linux 1.0.
Посмотри, вдруг пригодится. http://kliga.ru/wiki/doku.php?id=%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B8_%D0%BF%D0%BE_%D1%8F%D0%B4%D1%80%D1%83_1.0
Есть там не много консоли, не много FAT12 (читаю оглавление, вывожу картинку с образа дискеты) и т.д. Собирается это все gcc и binutils Так что если не будешь использовать Linux, можешь не смотреть.
Объема не пугайся. Из всех исходников используется только пара десятков функции, просто чтобы посмотреть как работает та или иная подсистема.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 мар 2012, 15:26 

Зарегистрирован: 25 фев 2012, 23:27
Сообщения: 8
phantom-84 спасибо большое.

tlx писал(а):
Я тут разбирался с исходниками Linux 1.0.
Посмотри, вдруг пригодится. http://kliga.ru/wiki/doku.php?id=%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B8_%D0%BF%D0%BE_%D1%8F%D0%B4%D1%80%D1%83_1.0
Есть там не много консоли, не много FAT12 (читаю оглавление, вывожу картинку с образа дискеты) и т.д. Собирается это все gcc и binutils Так что если не будешь использовать Linux, можешь не смотреть.
Объема не пугайся. Из всех исходников используется только пара десятков функции, просто чтобы посмотреть как работает та или иная подсистема.


В линуксе пока мисть не работаю, но вот летом планирую начать разбираться . да и более плотнее ОС заняться летом хочу. то наверное пригодится. спасибо.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB