Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Написание ОС: формат исполняемых файлов

26K
05 июня 2011 года
mudBit
224 / / 30.05.2011
О форматах исполняемых файлов в ОС собственного производства.

Если я разработал формат исполняемого файла, как создавать в нем файлы? То есть что нужно делать - перенастраивать как-то компилятор-линковщик, писать собственный, хитро писать ld-скрипты или что-нибудь еще? Подскажите, кто сталкивался.
260
05 июня 2011 года
Ramon
1.1K / / 16.08.2003
Алгоритм таков:

1. Сразу застрелиться
2. Переродиться, посмотреть на свой формат и перейти к пункту №1
3. Переродившись в очередной раз, получить просветление, заюзать существующий формат и снова перейти к пункту №1
26K
05 июня 2011 года
mudBit
224 / / 30.05.2011
Цитата: Ramon
Алгоритм таков:

1. Сразу застрелиться
2. Переродиться, посмотреть на свой формат и перейти к пункту №1
3. Переродившись в очередной раз, получить просветление, заюзать существующий формат и снова перейти к пункту №1



Ладно, понял...:/)))
Использую формат Linux или UNIX, заодно и совместимость будет...

Кстати, где найти доходчивую информацию об этих форматах? То есть такую, чтобы ее хватило для написания полноценного ранера?

399
06 июня 2011 года
KIV
432 / / 20.01.2009
Погуглите - ELF Specification (а именно ELF сейчас стандарт для Linux и практически все приложения идут в нём). Первая же ссылка - на PDF с полным описанием (правда, по-английски, но если собрались писать ОС английский вы должны уметь читать хорошо).
26K
06 июня 2011 года
mudBit
224 / / 30.05.2011
Спасибо. Я просто не знал про ELF.
349
06 июня 2011 года
Phantom-84
656 / / 27.10.2005
Возвращаясь к первоначальному вопросу и учитывая то, что за ним последовало, предлагаю сделать компоновщик из Object ELF в свой оригинальный формат. Если формат несложный и программа пишется на ассемблере, то можно с помощью макросов и "бинарного" формата выходного файла генерировать файлы собственного формата. Я пользуюсь обоими способами.
26K
06 июня 2011 года
mudBit
224 / / 30.05.2011
Идея интересная. Попробую реализовать. За помощь - респект.
Правда, совместимость с этим "эльфом" все-равно придется потом добавить, а то не поймут.
А пишу я на Си и пользуюсь только встроенным ассемблером, так что компоновщик надо будет делать ой каким мощавым! :=]
349
06 июня 2011 года
Phantom-84
656 / / 27.10.2005
Встроенный ассемблер тут не к месту. Я говорил про ассемблер типа fasm'а. А компоновщик как раз для Си и нужен (ну или когда часть программы написана на Си, а часть на ассемблере). Просто группируй секции по именам и/или аттрибутам или подсмотри, какие секции формирует твой компилятор, и выбирай только их. Плюс найди точку входа.
26K
06 июня 2011 года
mudBit
224 / / 30.05.2011
Да. Я так и сделаю. А свой формат мне нужен вот почему - в связи со спецификой моей ОС, файлы приложений и динамических библиотек должны иметь одинаковый формат. Плюсов это дает много, а минусов - мало. Так что я напишу линковщик и выложу потом исходник где-то сдесь. На всякий случай.

А про инлайн-ассемблер - это я просто к слову.
260
07 июня 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: mudBit
А свой формат мне нужен вот почему - в связи со спецификой моей ОС, файлы приложений и динамических библиотек должны иметь одинаковый формат.



"Файлы приложений и динамических библиотек", что в ELF, что в COFF также имеют одинаковый формат.
Это тоже "к слову".

PS: И да, не забывайте, что у вас есть динамическая линковка, раз уж появились динамические библиотеки, с такими радостями как symbol resoving, fixups, да даже с PIC'ом. Ваш формат все это учитывает?

349
07 июня 2011 года
Phantom-84
656 / / 27.10.2005
Цитата: mudBit
А свой формат мне нужен вот почему - в связи со спецификой моей ОС, файлы приложений и динамических библиотек должны иметь одинаковый формат.

Это не аргумент. Можно использовать существующие форматы. Лично я использую собственный формат из-за простоты загрузки. Кстати динамические библиотеки могут отличаться по формату от файлов приложений (или иметь расширенный формат) - это не так важно. Например, я до сих пор большинство приложений собираю в формате, в котором отсутствуют средства релокации, а либы грузятся по требованию. Пока приложения не очень сложные, это нормально.

26K
09 июня 2011 года
mudBit
224 / / 30.05.2011
Извините, я недостаточно точно выразился... Они(приложения и дин.либы)должны иметь не только одинаковый формат файла, но и одинаковый способ загрузки и запуска. С точки зрения ОС они не должны отличатся вообще. Кроме того, поддерживатся будет(пока) только явное связывание. Релокация мне, если я правильно понимаю, тоже не будет нужна, так как для этих целей будут использоваться сегменты MMU Intel Pentium. Неявное связывание я добавлю потом, для совместимости(хоть какой-то) с POSIX.
Кстати о компоновщике. Киньте, пожалуйста, ссылку на что-нибудь стоящее по их написанию. Гуглить пробовал. Или за деньги, или ничего полезного. Вообще-то я могу его сделать и так, методом проб и ошибок, но хотелось бы сделать все как надо, то есть по книге.
349
09 июня 2011 года
Phantom-84
656 / / 27.10.2005
Cм. описание формата ELF. Строишь образ исполняемого модуля в памяти (с привязкой к определенному базовому адресу, но с учетом возможной релокации, если это необходимо), разрешаешь адресные и символьные ссылки. Насчет "сегментов MMU Intel Pentium" не понял. Если речь о сегментации, то думаю, про это лучше забыть и использовать FLAT-модель. Релокация нужна в основном для библиотек. Плюс нужно проработать вопрос о представлении структур, отвечающих за импорт/экспорт, в объектниках. Лучше, чтобы это не сильно отличалось от того, как ты хранишь подобные структуры в исполняемых файлах собственного формата
26K
09 июня 2011 года
mudBit
224 / / 30.05.2011
Попытаюсь объяснить насчет сегментации. Понимаете, я думал использовать вызов функций библиотеки через дальний указатель СЕЛЕКТОР:СМЕЩЕНИЕ, а для передачи параметров и получения результата просто "подключать" к процессу-библиотеке стек вызывающего процесса.
Линковщик я напишу.
26K
09 июня 2011 года
mudBit
224 / / 30.05.2011
"Структуры импорта/экспорта" - это статические ресурсы, типа иконок, данных и т.д.? По идее, должны передаваться через те же дальние указатели...
260
09 июня 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: mudBit
Попытаюсь объяснить насчет сегментации. Понимаете, я думал использовать вызов функций библиотеки через дальний указатель СЕЛЕКТОР:СМЕЩЕНИЕ, а для передачи параметров и получения результата просто "подключать" к процессу-библиотеке стек вызывающего процесса.
Линковщик я напишу.



Не знаю как остальным, а мне уже страшно... =T_T=

349
09 июня 2011 года
Phantom-84
656 / / 27.10.2005
Цитата: mudBit
Попытаюсь объяснить насчет сегментации. Понимаете, я думал использовать вызов функций библиотеки через дальний указатель СЕЛЕКТОР:СМЕЩЕНИЕ, а для передачи параметров и получения результата просто "подключать" к процессу-библиотеке стек вызывающего процесса.

Я тебе на своем опыте могу сказать, что сегментация дает больше минусов, чем плюсов. Я раньше для дров использовал сегменты, потому что еще не было формата, поддерживающего релокацию, и как мне тогда казалось она была и не нужна. Так вот я сильно заблуждался. С переходом к чистой FLAT-модели все стало значительно проще. С прикладными библиотеками все еще сложнее - ты разрушаешь единое адресное пространство приложения (про "библиотеки-процессы" вообще не понял - тут видимо взаимодействовать с библиотеками нужно посредством IPC, что не слишком эффективно). Но дело конечно твое, использовать сегментацию или релокацию.

26K
09 июня 2011 года
mudBit
224 / / 30.05.2011
2 Phantom-84
Попытаюсь объяснить насчет библиотек-процессов. В одном из предыдущих сообщений я сказал, что как приложения так и дллы будут иметь одинаковый способ загрузки и запуска, то есть библиотекой будет процесс. А сейчас объясню по поводу подключения стеков. Таков алгоритм взаимодействия системы и процессов:
1) Приложение совершает системный вызов - эмулированое прерывание
2) Система находит нужный процесс, точку входа(сильно упрощенное описание).
3) В процессе-библиотека система создает новый поток, в котором сегменты кода и данных, соответственно, регистр IP для данного сегмента от библиотеки, а сегмент стека и регистры BP и SP - от приложения. Поток приложения ставится на паузу, а созданный поток - запускается.
4) Созданный поток выполняет все нужные действия и совершает системный вызов, уже другой, дабы отдать результат приложению.
5) Система удаляет поток библиотеки, корректирует стековые регистры потока приложения и запускает его.
Вот так :))
2 Ramon
Я тоже ОЧЕНЬ веселый человек :=))
349
09 июня 2011 года
Phantom-84
656 / / 27.10.2005
Цитата: mudBit
"Структуры импорта/экспорта" - это статические ресурсы, типа иконок, данных и т.д.? По идее, должны передаваться через те же дальние указатели...

Речь о том, как эти структуры хранятся в исполняемых файлах и как они должны храниться в объектниках. Если ты "смешаешь" их с обычными данными, то это может стать причиной опережающего чтения данных во время разрешения импортных/экспортных связей, а также появления лишних релоков.

349
09 июня 2011 года
Phantom-84
656 / / 27.10.2005
Цитата: mudBit
Попытаюсь объяснить насчет библиотек-процессов. В одном из предыдущих сообщений я сказал, что как приложения так и дллы будут иметь одинаковый способ загрузки и запуска, то есть библиотекой будет процесс.

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

Цитата: mudBit
А сейчас объясню по поводу подключения стеков. Таков алгоритм взаимодействия системы и процессов:
1) Приложение совершает системный вызов - эмулированое прерывание
2) Система находит нужный процесс, точку входа(сильно упрощенное описание).
3) В процессе-библиотека система создает новый поток, в котором сегменты кода и данных, соответственно, регистр IP для данного сегмента от библиотеки, а сегмент стека и регистры BP и SP - от приложения. Поток приложения ставится на паузу, а созданный поток - запускается.
4) Созданный поток выполняет все нужные действия и совершает системный вызов, уже другой, дабы отдать результат приложению.
5) Система удаляет поток библиотеки, корректирует стековые регистры потока приложения и запускает его.
Вот так :))

Нехило ты с либами решил общаться. Я же говорил, IPC. Тут тебе либы (в обычном понимании этого слова) вообще без надобности. Типа "везде процессы".

26K
09 июня 2011 года
mudBit
224 / / 30.05.2011
Цитата: Phantom-84
Если ты "смешаешь" их с обычными данными, то это может стать причиной опережающего чтения данных во время разрешения импортных/экспортных связей, а также появления лишних релоков.


Ну как вам сказать... Мне кажется, лучший способ пресечь опережающее чтение - не маркировать процесс как работающий, пока загрузка файла не закончится полностью.
Да, кстати, данные, которые нужно уберечь от записи, лучше передавать не через дальние указатели, а методом ООП, то есть вызвал функцию, получил 1 пиксель(на примере изображения), сохранил, запросил еще пиксель, и так далее. Редактировать что-либо без ведома библиотеки невозможно. Наверное... :)

26K
09 июня 2011 года
mudBit
224 / / 30.05.2011
Цитата: Phantom-84
Нехило ты с либами решил общаться. Я же говорил, IPC. Тут тебе либы (в обычном понимании этого слова) вообще без надобности. Типа "везде процессы".


Вот именно. Всё - процессы. Мне кажется именно это имел в виду Таненбаум.
А если серьезно, то не вижу в этом ничего плохого, кроме низкой производительности. Выход - добавить кэш.

349
09 июня 2011 года
Phantom-84
656 / / 27.10.2005
Цитата: mudBit
Ну как вам сказать... Мне кажется, лучший способ пресечь опережающее чтение - не маркировать процесс как работающий, пока загрузка файла не закончится полностью.

Я код и данные загружаю из файла по запросу, а импорт/экспорт разрешаю сразу.

260
09 июня 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: Phantom-84
Я думал, одинаковый способ загрузки в одно и тоже адресное пространство. Кто-нибудь думал иначе?



Во истину это уже не библиотеки. На лицо как минимум месиво в терминологии.

PS: Клиент-сервер это отдельный разговор. А все творения тАНЕНБАУМА настоятельно рекомендую сжечь, а прах спустить в фаянсового друга.

349
09 июня 2011 года
Phantom-84
656 / / 27.10.2005
Цитата: mudBit
Вот именно. Всё - процессы. Мне кажется именно это имел в виду Таненбаум.
А если серьезно, то не вижу в этом ничего плохого, кроме низкой производительности. Выход - добавить кэш.

Это не плохо, но это не либы. Пусть это будет, но только не как безальтернативный традиционному вариант.

26K
09 июня 2011 года
mudBit
224 / / 30.05.2011
Ну, думаю, мне надо делать иначе. Библиотеки загружать сразу, а выгружать их после истечения времени с момента последнего обращения. А перевод библиотек в статус процессов, думаю, пойдет только на пользу.
26K
09 июня 2011 года
mudBit
224 / / 30.05.2011
2 Phantom-84
Последнее мое сообщение - к предпоследнему вашему
26K
09 июня 2011 года
mudBit
224 / / 30.05.2011
Цитата: Phantom-84
Это не плохо, но это не либы. Пусть это будет, но только не как безальтернативный традиционному вариант.



Ну ясен яндекс, что поддержку традиционных либов надо будет потом добавить.

26K
09 июня 2011 года
mudBit
224 / / 30.05.2011
Цитата: Ramon
...А все творения тАНЕНБАУМА настоятельно рекомендую сжечь, а прах спустить в фаянсового друга.



И чем он вам так неугодил?..

26K
09 июня 2011 года
mudBit
224 / / 30.05.2011
Да, начали за здравие, закончили за упокой... Начали с форматов исполняшек, а в итоге я вам продал всю системную структуру:) Можно попросить у вас, как у "экспертов", мнение насчет вот-такой реализации ОС? Я думаю, это не совсем банальная клиент-сервер.
260
09 июня 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: mudBit
Да, начали за здравие, закончили за упокой... Начали с форматов исполняшек, а в итоге я вам продал всю системную структуру:) Можно попросить у вас, как у "экспертов", мнение насчет вот-такой реализации ОС? Я думаю, это не совсем банальная клиент-сервер.



Это боян, ибо ничего нового не может быть уже лет эдак 50. Похожий, но более чистый клиент-сервер вы найдете в QNX'се.

PS: А господин тАНЕНБАУМ пишет всякую ерунду да и код у него соответствующий, но почему то считается аффтаритетным экспиртом.

26K
09 июня 2011 года
mudBit
224 / / 30.05.2011
Лет 50? Эхх... А я то надеялся :(
Ну а насчет Таненбаума - дело вкуса.
26K
09 июня 2011 года
mudBit
224 / / 30.05.2011
Цитата: Ramon
...Похожий, но более чистый клиент-сервер вы найдете в QNX'се.



В смысле - найдете? Исходник они, по-моему, еще не открыли...

260
09 июня 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: mudBit
В смысле - найдете? Исходник они, по-моему, еще не открыли...



Открывали и закрыли снова. Но описалова никто никогда не отменял.

26K
10 июня 2011 года
mudBit
224 / / 30.05.2011
Цитата: Ramon
Открывали и закрыли снова.



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

260
10 июня 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: mudBit
Погодите, если они его уже открывали, то код уже распространился по Сети. Как тогда они его могли закрыть? Ведь каждый может скачать этот код у кого-то, кто успел его скачать раньше.



Успели, скачали снапшот на опред момент. А потом репозиторий был закрыт и все. Если постараетесь то возможно и найдете. Вот только проблема в том, что как бы лицензионное соглашение существует.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог