| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для Linux/Unix > загрузка операционных систем |
| Автор: BSDyashnik 12.12.2009, 16:42 |
| хочу изучить ядро FreeBSD. читаю http://www.freebsd.org.ua/doc/ru_RU.KOI8-R/books/arch-handbook/index.html очень многие вещи непонятны: 1) есть ли какие-то строго определенные правила загрузки ядра на x86(если есть, какую литературу почитать) 2) одинакова ли загрузка для разных ОС (понятно, что ядра разные, я имею ввиду сам процесс и сам код загрузки) 3) одинакова ли для разных ОС MBR 4) как я понимаю, для фряхи используется синтаксис AT&T, а каким компилятором компилировать - не знаю 5) что нужно почитать и понять работу процессора для x86(понятно сама суть, что надо загрузить ядро), но непонятно как? 6) если я буду писать свой загрузчик для простенькой программки - не спалю ли я чего? т.е. насколько безопасно 7) очень охота научиться и разобраться с системой с самого начала (пока до ядра), посоветуйте пожалуйста как и с чего начать (на Си писал много, на ассемблере - не писал) 8) будут возникать еще вопросы - прошу тему не закрывать всем спасибо за внимание |
| Автор: Logree 12.12.2009, 18:46 |
| 1. Нет(если не считать за правилос грузить его c PL 0) 2. Как хочешь так и пиши, стандартная схема - первичный загрузчик, вторичный, ядро. 3. Смотря что ты подразумиваешь под MBR см http://akina.hop.ru/mbr.php3. 4. Gas 5. http://www.intel.com/products/processor/manuals/ http://www.wasm.ru/publist.php?list=24 6. Нет. Маловероятно 7. Начинай учить ASM без него ни куда. |
| Автор: BSDyashnik 12.12.2009, 19:05 |
| Logree, благодарю за ответ. что такое PL 0 ? несовсем понятно, какой asm учить? учить по мануалам с интеловского сайта? а писать только в синтаксесе для gas. отличается ли gas для фряхи и линукса? т.е. принципиально для всех ОС работает одна схема загрузки - первичный загрузчик, вторичный, ядро тогда получается, что отличается только реализация!? но почему же тогда не используется один код загрузки для всех ОС? если кто читал интеловские мануалы, скажите, той инфы, которая в них есть, достаточна для изучения загрузки ОС или же надо еще что знать из архитектуры именно на программном уровне? |
| Автор: Logree 12.12.2009, 21:09 | ||||
| Синтаксис значения не имеет лично мне нравиться fasmовский(это немного измененый интеловский), вообще все известные мне книжки по асм используют intel синтаксис так что лучшебы начать с него. Privilegen Level 0 - смотри мануал.
Я просто привёл пример - схема может быть другой, для меня странно что человек "много писавший на C" задаёт такой вопрос.
Мануалы Intel не описывают способы реализации ОС, они описывают архитектуру процессора(хотя рекомендации и примеры кода присутствуют), про загрузку компьютера олезно почитать Bios Boot Specification. PS Ищи сайты по OS Dev'у. |
| Автор: BSDyashnik 13.12.2009, 00:21 |
| Logree, спасибо за исчерпывающий ответ, пойду изучать. p.s. по поводу что много писал, так я ж системным программированием не занимался - другое писал уточнить хотел - что такое OS Dev'у? это http://wiki.osdev.org/Main_Page ? |
| Автор: Logree 13.12.2009, 03:32 |
| Автор: BSDyashnik 14.12.2009, 01:17 |
| взялся за асм, прочитал кучу статей и пришел к выводу, что все вставки в исходный код и отдельные модули (linux & freeBSD) используют синтаксис AT&T, но многие советуют начинать именно с компилятора nasm, потом переходить на as, наверное так и сделаю |
| Автор: 500mhz 15.12.2009, 16:34 |
| BSDyashnik не забивайте себе голову мертвым компилятором (nasm), fasm перспективней и постоянно развиваеться никто не мешает компилить фасмом obj и линковать gccсшным линкером или как альтернатива http://www.openwatcom.org/index.php/Download там интеловский синтаксис в инлайн асме |
| Автор: BSDyashnik 15.12.2009, 17:00 |
| 500mhz, спасибо, с выбором все еще не определился(хотя установил и попробовал все) суть заключается в том, что под никсами используется синтаксис AT&T, вот, и скорее всего только as годиться, хотя практически нигде в литературе он не используется |
| Автор: BSDyashnik 15.12.2009, 17:28 |
| у меня вот проблема с пониманием некоторых вещей: например, возьмем реальный режим. 1) пусть сегментные регистры 16 разрядные(пока не дошел до 32 разрядных), тогда адресное пространство от 0 до 65535. физический адрес, который вычисляет процессор равен сегментный адрес*16 + смещение вот, вопрос в том, что тут же перекрываются адреса, т.е. если сегментный адрес и смещение в пределах от 0000 до FFFF, например: 13E5h x 10h + 17h = 13E50h + 17h = 13E67h и 13E6h x 10h + 07h = 13E60h x 07h = 13E67h так получается, что сегментный адрес имеет не весь диапозон от 0000 до FFFF собственно, как это понять? или может я что недопонимаю? 2) когда запускается программа, у нее есть как минимум три сегмента (cs, ds, ss) не понимаю, каким образом в них записываются адреса соответствующих сегментов и как они разбросаны в оперативной памяти? предполагаю, что это делает каким то образом операционка, ну а если просто эта программа загружается во время загрузки(типа как загрузчик), кто ж тогда нахначает адреса этих сегментов? всю жизнь считал, что исполняемый код представляет некую так сказать абстракцию, и весь это код последовательно загружается в оперативную память и последовательно выполняется(т.е. получается, что код загрузился по какому то адресу, а в сегментные регистры записываются адреса из этого загруженного кода соответствующие адреса сегментов) ребята, помогите понять что и как, запутался совсем |
| Автор: 500mhz 16.12.2009, 12:33 | ||
1) все не помню по поводу сегментов давно это было,в реал моде сегмент принятно считать 64 кб, ну не суть важно, короче по вопросу, в режиме 8086 если сделаю seg:0xFFFF + offset:0xFFFF то следуя формуле
2) тут дело в типе файлов, СОМ - это просто кусок кода (бинарник) размером не более 64 кб без всяких заголовков который ложиться в память с адреса 0х100, у него CS=DS=SS и так далее, естественно значения ставяться операционкой. У ЕХЕ есть заголовок в котором описано из чего он состоит где что лежит и какие значения дать сегментам. Типа так ====Заголовок ЕХЕ===== ====Секция кода====== ====Секция данных==== никто не запрещает в ехе слепить все в 1 секцию и присвоить сегментам одинаковый адрес все равно будет работать |
| Автор: BSDyashnik 16.12.2009, 12:48 |
| 500mhz, спасибо за ответ, все равно не понял вчера прочитал, что действительно, в реал-моде адреса перекрываются |
| Автор: 500mhz 16.12.2009, 14:07 |
| ну так что не понял то? (seg:0xFFFF * 16) + offset:0xFFFF = 0х16FFE9 а на самом деле будет 0хFFE9 так как шина у тебя 16 бит , а вот если включена А20 тогда адрес так и останется 0х16FFE9 потому что с А20 шина имеет 20 бит |
| Автор: BSDyashnik 16.12.2009, 14:20 |
| (seg:0xFFFF * 16) + offset:0xFFFF = 0х16FFE9 а как это так получилось? если 0xFFFF * 16 = 0xFFFF0 0xFFFF0 + 0xFFFF = 10FFEF |
| Автор: 500mhz 16.12.2009, 15:57 |
| BSDyashnik сорри ошибся, но суть та же ) |
| Автор: Logree 16.12.2009, 18:16 | ||||
Всё правильно Пример: чтобы загрузить программу по физ.адресу 10600h ты можешь 1. занести в сегментный регистр CS=1060h в IP=0000 (на рпямую с IP работать нельзя для этого нужно сделать jmp 1060h:0000h) 2. занести в сегрегистр CS = 1000h в IP=0600h (jmp 1000h:0600h) в обоих случаях ты попадёшь на один и тот же код, только если ты таким образом передаёшь управление программе для первого случая нужно указать org 0, для второго org 0600h.
прои загрузке сначала из ПЗУ копируется и запускается код BIOS, а вот он-то и назначает для загрузчика CS=0000h IP(OFFSET)=7C00h Вообще выше я тебе уже советовал почитать Bios Boot Specification там про это написано более подробно, ды и эта информация есть практически в любой статье про "написание собственного загрузч(щ)ика" |
| Автор: 500mhz 16.12.2009, 18:55 |
| я так понимаю ТС хочет свой мсдос написат, я бы посоветовал смотреть в сторону flat mode (unreal mode) там и фрейм буффер и памяти вся что есть и адресное пространство линейное |
| Автор: Logree 16.12.2009, 19:02 | ||||
ТС с вами не согласен
|
| Автор: 500mhz 16.12.2009, 19:15 |
| какая связь между загрузкой , сегментами памяти и ядром которое работает в пмоде и грузиться какимнить лилом или грубом? кстати сорцы последних паблике лежат , да и ядра тоже, изучай нехочу )))) имхо тут завуалированое оседевелоперство ) |
| Автор: Logree 16.12.2009, 19:22 |
| Автор: 500mhz 16.12.2009, 19:51 |
| омг! сударь мы с вами земляки (Тольятти) но я там 11 лет как не живу (я не в России), неужели и туда докатился Коломбо? ))) |
| Автор: Logree 16.12.2009, 20:25 |
| Да, отметился |
| Автор: BSDyashnik 16.12.2009, 21:38 |
| спасибо, уже разобрался целью написать ОС для себя не ставлю, цель другая, хорошо понимать проц, этапы загрузки и функционирование ядра |
| Автор: Logree 16.12.2009, 22:46 |
| Это ты сейчас так говоришь ;) |
| Автор: BSDyashnik 17.12.2009, 00:44 |
| |
| Автор: 500mhz 17.12.2009, 11:29 |
| TC увиливает ) 99% умеющих кодить пытались написать свой мсдос ))) |
| Автор: GoldFinch 17.12.2009, 11:32 |
откуда статистика? |
| Автор: 500mhz 17.12.2009, 12:04 |
| GoldFinch а что сударь вы попал в 1%? |
| Автор: Logree 17.12.2009, 13:53 |
| только не мсдос а свою МОГООСЬ. |
| Автор: GoldFinch 17.12.2009, 14:04 |
| 500mhz, я не занимаюсь бессмысленными вещами, это же относится и ко многим |
| Автор: BSDyashnik 17.12.2009, 14:42 |
| я рад за тех, кто попал в 99% только ничего я не пишу, просто изучаю код а чтоб писать ядро, нужны как минимум огромные знания, хотя б глубокое понимание какого либо ядра |