OSDev http://osdev.su/ |
|
Написал код ядра. И что с ним делать? http://osdev.su/viewtopic.php?f=6&t=498 |
Страница 2 из 3 |
Автор: | SII [ 26 фев 2012, 19:14 ] |
Заголовок сообщения: | Re: Написал код ядра. И что с ним делать? |
ИМХО, по-любому стоит попытаться написать простенькое приложение под Винду, но на ассемблере, без всяких там сей. Благодаря этому увидите, как в действительности прикладная программа может обращаться со своими запросами к операционке (технические детали такого обращения могут различаться, но общая идея остаётся одинаковой). Тем более, что в написании оси без ассемблера обойтись невозможно, даже если 99% кода будет написано на каком-то языке высокого уровня: есть вещи, в принципе возможные только на ассемблере. |
Автор: | pavia [ 26 фев 2012, 21:18 ] |
Заголовок сообщения: | Re: Написал код ядра. И что с ним делать? |
SII, на чистом ассемблере или на ассемблере с макросами (c invoke)? С использованием int или с использованием библиотек? ИХМО нагляднее всего разобрать Borland Pascal там RTL(системные библиотеки функций) в исходниках, на ассемблере. Функции короткие, грамотно оформлены. Borland C++ 3.1 тоже есть, но он сильно запутан. |
Автор: | SII [ 26 фев 2012, 22:53 ] |
Заголовок сообщения: | Re: Написал код ядра. И что с ним делать? |
На чистом, естественно -- чтобы видеть, что реально выполняется в тех или иных случаях. Ну и, кроме того, никакой разбор чужого кода не позволит научиться делать аналогичное самому: это надо всё же делать (хотя изучать чужое полезно, конечно). |
Автор: | Yoda [ 27 фев 2012, 10:59 ] |
Заголовок сообщения: | Re: Написал код ядра. И что с ним делать? |
Прежде, чем писать операционку на языке высокого уровня, нужно осознать пару вещей. 1. Операционка непосредственно взаимодействует с голым железом и BIOS компьютера. А значит, ассемблер неизбежен, пусть даже и в виде ассемблерных вставок. Но вставки сложней в понимании, чем чистый ассемблерный код. Поэтому для начала надо освоиться с ассемблером, а затем переходить к более высокому уровню. 2. При написании ОС в твоём распоряжении нет ничего – никаких готовых функций и процедур. Проще всего написать сообщение. А вот работа с файлами - это не просто написании функций open/read/write/close. Эти функции - только вершина айсберга работы с файловыми системами на низком уровне. Надо изучать разбиение дисков, форматы основных файловых систем и открытие/закрытие файла превратится в гигантские функции, разбирающие битовые поля в структурах файловых систем. В качестве быстрого и удобного стартапа могу предложить мой набор инструментов загрузки ОС - http://goncharov.pp.ru/ru/osboot.htm. Этот набор специально для начинающих, там есть простенький демонстрационный "Hello, World!" на ассемблере. А начальная загрузка всё равно неизбежна. |
Автор: | PCU [ 27 фев 2012, 16:14 ] |
Заголовок сообщения: | Re: Написал код ядра. И что с ним делать? |
Да , решил на ассемблере сделать. Yoda спасибо за ссылку. |
Автор: | PCU [ 04 мар 2012, 18:45 ] |
Заголовок сообщения: | Re: Написал код ядра. И что с ним делать? |
А кто знает - как заполнять свободное место ? Объясню. У меня MBR не весит 512 байт , а мне нужно сделать чтобы оно весило 510 и в конце дописать нужное. Вот как я сделал: Код: jmp @1 db 512-($-7c00h)-3 dup (0) @1: db 55h, 0aah Потому , когда буду на дискету записывать, то все что идет после вышеуказанного кода, будет занимать память после 512-ти байт. Но возникают еще потребность в таком. Но в некоторых местах такое не проходит, - не понимаю механизм этого. Подскажите, где можно об этом прочесть, чтобы понять как можно, а как нельзя такое применять ? Понятное дело что в какой-нибудь книге есть, но конкретной темы с таким названием нету ... потому не знаешь где и искать ... Ну а микро-ОС поживает нормально - загружает ядро , которое выводит сообщения и приглашения к командам. Сейчас создаю обработку команды CREATE FILE , а потому занимаюсь проектированием файловой системы (уже 3-й день ... и так и этак ... ну уже понятно чего хочу, осталось реализовать). Далее будут команды DELETE FILE , OPEN FILE. НУ а там посмотрим что препод скажет, если скажет что пока хватит , то и хорошо - времени нету совсем, ГОСы в этом году. Но решил брать эту тему на диплом - действительно реализовуешь свой потенциал. |
Автор: | SII [ 04 мар 2012, 21:59 ] |
Заголовок сообщения: | Re: Написал код ядра. И что с ним делать? |
Это зависит от используемого транслятора и читается в документации на него. Ваш код вроде как для MASM и заполняет, похоже, до 509-го байта включительно (т.е. до полных 512-и байтов остаётся ещё три байта). Этот код работоспособен только в том случае, если стоит ORG 7C00h, т.е. при "переезде" на другой адрес он начнёт давать неверные результаты. Чтобы избавиться от зависимости от точного стартового адреса (точней, смещения), я бы сделал нечто вроде такого (за синтаксис не поручусь, поскольку уже несколько лет на ПК не пишу): Код: ; Если нужно, ставим ORG с любым нужным смещением Start ; Метка в самом начале кода; она служит базовым адресом ; Здесь код и данные ; Далее идёт заполнитель до конца 512 байтов минус три байта DB 512 - ($ - Start) - 3 dup (0) ; Последние три байта Понятно, если код и данные займут слишком много места, после вычисления выражения получится отрицательное число, и транслятор ругнётся. |
Автор: | Станислав [ 05 мар 2012, 06:08 ] |
Заголовок сообщения: | Re: Написал код ядра. И что с ним делать? |
Если вы говорите о МБР загрузчике, то там идёт код в начале 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), он загрузится если есть правильный МБР на физическом диске в первом секторе. О МБР есть статьи, наберите МБР в любом поисковике |
Автор: | phantom-84 [ 05 мар 2012, 09:28 ] |
Заголовок сообщения: | Re: Написал код ядра. И что с ним делать? |
Шо-то я "третьего" байта вообще не увидел перед загрузочной сигнатурой. Да и передача управления на нее тоже выглядит как-то странно, несмотря на то, что коды 55h и 0AAh кодируют две законченные команды, - такое возможно в случае загрузки/записи продолжения программного кода поверх сигнатуры, но обычно ее не трогают и догружают код в позицию после сигнатуры. Т.е. на лицо действительно полное непонимание автором данного фрагмента кода. Хотелось бы узнать, понимает ли он, что означает "?", "dup" и т.п. Станислав в принципе все сказал. Однако следует учитывать, что не все ассемблеры поддерживают "$$". Я вообще часто использую (совместно с "org") самую простую для меня форму записи этой конструкции, хотя и не самую универсальную: Код: org 7C00h
... db 7DFEh-$ dup 0 ; если дальше кодогенерация продолжается, т.е. присутствует сигнатура, то достаточно использовать "rb 7DFEh-$" (если поддерживается "rb") dw 0AA55h |
Автор: | PCU [ 05 мар 2012, 12:17 ] |
Заголовок сообщения: | Re: Написал код ядра. И что с ним делать? |
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" - первое просто резервирует место (кстати, интересно было бы узнать какое там значение находится, если ничем его не заполнить, а просто зарезервировать) , а второе присваивает значение. Такие вот дела. |
Страница 2 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |