OSDev

для всех
Текущее время: 28 апр 2024, 22:56

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




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

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
ИМХО, по-любому стоит попытаться написать простенькое приложение под Винду, но на ассемблере, без всяких там сей. Благодаря этому увидите, как в действительности прикладная программа может обращаться со своими запросами к операционке (технические детали такого обращения могут различаться, но общая идея остаётся одинаковой). Тем более, что в написании оси без ассемблера обойтись невозможно, даже если 99% кода будет написано на каком-то языке высокого уровня: есть вещи, в принципе возможные только на ассемблере.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 фев 2012, 21:18 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
SII, на чистом ассемблере или на ассемблере с макросами (c invoke)? С использованием int или с использованием библиотек?

ИХМО нагляднее всего разобрать Borland Pascal там RTL(системные библиотеки функций) в исходниках, на ассемблере. Функции короткие, грамотно оформлены.
Borland C++ 3.1 тоже есть, но он сильно запутан.


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

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
На чистом, естественно -- чтобы видеть, что реально выполняется в тех или иных случаях. Ну и, кроме того, никакой разбор чужого кода не позволит научиться делать аналогичное самому: это надо всё же делать (хотя изучать чужое полезно, конечно).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 27 фев 2012, 10:59 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Прежде, чем писать операционку на языке высокого уровня, нужно осознать пару вещей.
1. Операционка непосредственно взаимодействует с голым железом и BIOS компьютера. А значит, ассемблер неизбежен, пусть даже и в виде ассемблерных вставок. Но вставки сложней в понимании, чем чистый ассемблерный код. Поэтому для начала надо освоиться с ассемблером, а затем переходить к более высокому уровню.
2. При написании ОС в твоём распоряжении нет ничего – никаких готовых функций и процедур. Проще всего написать сообщение. А вот работа с файлами - это не просто написании функций open/read/write/close. Эти функции - только вершина айсберга работы с файловыми системами на низком уровне. Надо изучать разбиение дисков, форматы основных файловых систем и открытие/закрытие файла превратится в гигантские функции, разбирающие битовые поля в структурах файловых систем.

В качестве быстрого и удобного стартапа могу предложить мой набор инструментов загрузки ОС - http://goncharov.pp.ru/ru/osboot.htm. Этот набор специально для начинающих, там есть простенький демонстрационный "Hello, World!" на ассемблере. А начальная загрузка всё равно неизбежна.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


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

Зарегистрирован: 25 фев 2012, 23:27
Сообщения: 8
Да , решил на ассемблере сделать.

Yoda спасибо за ссылку.


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

Зарегистрирован: 25 фев 2012, 23:27
Сообщения: 8
А кто знает - как заполнять свободное место ?
Объясню. У меня MBR не весит 512 байт , а мне нужно сделать чтобы оно весило 510 и в конце дописать нужное.
Вот как я сделал:
Код:
 jmp @1
db 512-($-7c00h)-3  dup (0)
@1:                                           
db      55h, 0aah   


Потому , когда буду на дискету записывать, то все что идет после вышеуказанного кода, будет занимать память после 512-ти байт.

Но возникают еще потребность в таком. Но в некоторых местах такое не проходит, - не понимаю механизм этого.

Подскажите, где можно об этом прочесть, чтобы понять как можно, а как нельзя такое применять ? Понятное дело что в какой-нибудь книге есть, но конкретной темы с таким названием нету ... потому не знаешь где и искать ...

Ну а микро-ОС поживает нормально - загружает ядро , которое выводит сообщения и приглашения к командам. Сейчас создаю обработку команды CREATE FILE , а потому занимаюсь проектированием файловой системы (уже 3-й день ... и так и этак ... ну уже понятно чего хочу, осталось реализовать). Далее будут команды DELETE FILE , OPEN FILE. НУ а там посмотрим что препод скажет, если скажет что пока хватит , то и хорошо - времени нету совсем, ГОСы в этом году. Но решил брать эту тему на диплом - действительно реализовуешь свой потенциал.


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

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Это зависит от используемого транслятора и читается в документации на него. Ваш код вроде как для MASM и заполняет, похоже, до 509-го байта включительно (т.е. до полных 512-и байтов остаётся ещё три байта). Этот код работоспособен только в том случае, если стоит ORG 7C00h, т.е. при "переезде" на другой адрес он начнёт давать неверные результаты.

Чтобы избавиться от зависимости от точного стартового адреса (точней, смещения), я бы сделал нечто вроде такого (за синтаксис не поручусь, поскольку уже несколько лет на ПК не пишу):

Код:
        ; Если нужно, ставим ORG с любым нужным смещением
Start   ; Метка в самом начале кода; она служит базовым адресом

; Здесь код и данные

        ; Далее идёт заполнитель до конца 512 байтов минус три байта
   DB 512 - ($ - Start) - 3  dup (0)

; Последние три байта


Понятно, если код и данные займут слишком много места, после вычисления выражения получится отрицательное число, и транслятор ругнётся.


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

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
Если вы говорите о МБР загрузчике, то там идёт код в начале 512 байт а в конце два байта, без них не загрузится
db 55h, 0aah
но перед ними идут записи о 4х партишенах и без них мбр может не загрузиться (зависит от биоса)
разделить код и зиписи в конце можно командой times 440 - ($-$$) db 0 она сама отступит нужный объём, или times 510 - ($-$$) db 0 если записи о партишенах делаются програмой например dmde-free при копировании его на диск.
Если это не МБР то в начале идёт прыжок jmp Start (3байта) потом запись о файловой системе партишена, код и в конце после кода:
times 510 - ($-$$) db 0
db 55h, 0aah
Такой загрузчик копируют на первый сектор логического диска (партишен который описан в МБР и активирован 80h), он загрузится если есть правильный МБР на физическом диске в первом секторе.
О МБР есть статьи, наберите МБР в любом поисковике


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Шо-то я "третьего" байта вообще не увидел перед загрузочной сигнатурой. Да и передача управления на нее тоже выглядит как-то странно, несмотря на то, что коды 55h и 0AAh кодируют две законченные команды, - такое возможно в случае загрузки/записи продолжения программного кода поверх сигнатуры, но обычно ее не трогают и догружают код в позицию после сигнатуры. Т.е. на лицо действительно полное непонимание автором данного фрагмента кода. Хотелось бы узнать, понимает ли он, что означает "?", "dup" и т.п.

Станислав в принципе все сказал. Однако следует учитывать, что не все ассемблеры поддерживают "$$". Я вообще часто использую (совместно с "org") самую простую для меня форму записи этой конструкции, хотя и не самую универсальную:
Код:
  org 7C00h
  ...
  db 7DFEh-$ dup 0 ; если дальше кодогенерация продолжается, т.е. присутствует сигнатура, то достаточно использовать "rb 7DFEh-$" (если поддерживается "rb")
  dw 0AA55h


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

Зарегистрирован: 25 фев 2012, 23:27
Сообщения: 8
SII писал(а):
Это зависит от используемого транслятора и читается в документации на него. Ваш код вроде как для MASM и заполняет, похоже, до 509-го байта включительно (т.е. до полных 512-и байтов остаётся ещё три байта). Этот код работоспособен только в том случае, если стоит ORG 7C00h, т.е. при "переезде" на другой адрес он начнёт давать неверные результаты.


Использую FASM. Смещение 7С00h поставил , поскольку это загрузочный сектор.

Станислав писал(а):
Если вы говорите о МБР загрузчике, то там идёт код в начале 512 байт а в конце два байта, без них не загрузится
db 55h, 0aah
но перед ними идут записи о 4х партишенах и без них мбр может не загрузиться (зависит от биоса)
разделить код и зиписи в конце можно командой times 440 - ($-$$) db 0 она сама отступит нужный объём, или times 510 - ($-$$) db 0 если записи о партишенах делаются програмой например dmde-free при копировании его на диск.
Если это не МБР то в начале идёт прыжок jmp Start (3байта) потом запись о файловой системе партишена, код и в конце после кода:
times 510 - ($-$$) db 0
db 55h, 0aah
Такой загрузчик копируют на первый сектор логического диска (партишен который описан в МБР и активирован 80h), он загрузится если есть правильный МБР на физическом диске в первом секторе.
О МБР есть статьи, наберите МБР в любом поисковике


Да, это МБР. Кстати, использую эмулятор emu8086 , может оно еще налаживает ограничения. Выбираю в нем Фасм.

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

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

 jmp @1
db 512-($-7c00h)-2  dup (0)   
@1:
db      55h, 0aah 

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

Оно работает , но вот непонятность - оно делает jmp 0000h:7DFFh (т. е. прыгает на мою переменную buf в которую загрузилось ядро ) ... и вот мне непонятно - если оно перепрыгивает db 512-($-7c00h)-2 dup (0) , то точно ли оно заполнит нулями пространство на дискете между 7С00h и buf (ведь на дискету буду записывать) ? ведь перепрыгивает это. Но видимо работает, поскольку эмулировал загрузку с дискеты ... работает, ну и ладно.
Кстати , если вместо "db 512-($-7c00h)-2 dup (0)" поставить "times 510 - ($-$$) db 0" точно также работает.

Проблема в другом. Я хочу мою дискету разметить: вот тут у меня МБР(и я заполняю все это пространство до 512 байта) , вот тут у меня код ядра до 1024, вот тут (начиная с 1024) следующий сектор, у меня начинается мой жесткий диск(как я говорил сразу будет ОЧЕНЬ примитивно . но не факт что ЖД именно здесь будет, скорее всего не здесь). Так вот, написал я кусочек ядра и хочу остальное пространство(до 1024) заполнить чем-нибудь , нулями например ... хочу точно знать что все ,что я пишу после заполнения нулями, что оно ляжет на дискету по адресу 3-го сектора (то бишь начиная с 1024). И вот я после своего кода делаю вот так:
Код:
jmp 0000:8200h

jmp @2
 db 1024-($-7c00h)  dup (0)   
; times 1024 - ($-$$) db 0      ;это тоже не помогает(((
@2:

Дальше идут переменные которые используются в коде ядра. Ведь правильно же - чтобы заполняли оперативку после ядра.
Вобщем суть такова что , вроде , все делаю аналогично как в МБР, но там оно работает (заполняет нужное пространство) , а здесь ругается :
Цитата:
invalid value : db 1024-($-7c00h) dup (0)
.
Потому не понимаю как этим пользоваться.

phantom-84 писал(а):
Шо-то я "третьего" байта вообще не увидел перед загрузочной сигнатурой. Да и передача управления на нее тоже выглядит как-то странно, несмотря на то, что коды 55h и 0AAh кодируют две законченные команды, - такое возможно в случае загрузки/записи продолжения программного кода поверх сигнатуры, но обычно ее не трогают и догружают код в позицию после сигнатуры. Т.е. на лицо действительно полное непонимание автором данного фрагмента кода. Хотелось бы узнать, понимает ли он, что означает "?", "dup" и т.п.

Станислав в принципе все сказал. Однако следует учитывать, что не все ассемблеры поддерживают "$$". Я вообще часто использую (совместно с "org") самую простую для меня форму записи этой конструкции, хотя и не самую универсальную:
Код:
  org 7C00h
  ...
  db 7DFEh-$ dup 0 ; если дальше кодогенерация продолжается, т.е. присутствует сигнатура, то достаточно использовать "rb 7DFEh-$" (если поддерживается "rb")
  dw 0AA55h


То я химичил там кое-что ... сам байт убрал, а что для него место учитывал, то забыл исправить "3" на "2". Его там нету.
Я понимаю "?" и "dup" - первое просто резервирует место (кстати, интересно было бы узнать какое там значение находится, если ничем его не заполнить, а просто зарезервировать) , а второе присваивает значение.

Такие вот дела.


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

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


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

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


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

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