OSDev http://osdev.su/ |
|
Размещение кода ядра http://osdev.su/viewtopic.php?f=5&t=476 |
Страница 2 из 5 |
Автор: | SII [ 24 дек 2011, 18:36 ] |
Заголовок сообщения: | Re: Размещение кода ядра |
Слишком жёстко что-то фиксировать -- ИМХО, нехорошо. В частности, любой нормальный загрузочный модуль должен быть перемещаемым (ну или позиционно-независимым). В Винде, собственно, так и есть, просто у большинства ЕХЕшников таблица перемещений удалена, из-за чего они становятся неперемещаемыми (тем не менее, технически использование перемещаемых ЕХЕшников там поддерживается). Так что надо просто делать поддержку перемещаемых модулей, а в документации чётко оговорить: базовый адрес загрузки приложения предсказать невозможно, поэтому полагаться на него нельзя. Если после этого какой-то придурок сделает неперемещаемое приложение -- это его проблемы; такое приложение должно быть выброшено на свалку, и всё (желательно вместе с автором). Что же касается траты времени на перемещение, то эта не шибко большая проблема. Во-первых, приложение можно строить в предположении, что оно будет грузиться с какого-то достаточно большого адреса, и ОС, если только имеется такая возможность, должна грузить такое приложение именно с этого адреса; все накладные расходы в такой ситуации сводятся к проверке возможности выделения необходимого объёма виртуальной памяти с данного адреса -- а это мизер по сравнению со всем остальным. Но и в том случае, когда перемещение потребуется, расходы на прибавление базового адреса загрузки и выполнение других действий, связанных с перемещением, будут ощутимо меньше, чем время физической загрузки приложения с внешнего носителя, т.е. скорость запуска приложения будет по-прежнему определяться в первую очередь временем, потребным на его поиск и загрузку. |
Автор: | Bargest [ 24 дек 2011, 18:42 ] |
Заголовок сообщения: | Re: Размещение кода ядра |
Кстати, если обнаружен файл другой версии ОСи - можно его проапгрейдить при первом запуске (релокнуть на "стандартный" для данной версии адрес), и в дальнейшем он снова в большинстве случаев не будет перемещаться. А если это PosIndependentCode - проблем вообще нет. |
Автор: | phantom-84 [ 24 дек 2011, 18:53 ] |
Заголовок сообщения: | Re: Размещение кода ядра |
Bargest писал(а): Да, я сделал проще. Желание переделать было бы, если б я увидел действительно серьезные плюсы. Дело ваше. Я имел удовольствие наблюдать прецедент перелопачивания всей системы (включая все приложения!!!) из-за того, что кто-то вовремя не увидел "серьезные плюсы" размещения ядра выше прикладного пространства. Думаю, в случае чего смогу найти несколько "приятных слов" и в ваш адрес.Цитата: По поводу "сделать системный процесс с тождественным отображением" - не пойму, как. Ведь при переключении виртуальной памяти код должен находиться в одном и том же виртуальном адресе. Если для этого процесса поставить тождественное отображение - значит и физический адрес должен быть равен виртуальному. И как тогда это сделать, если на компе 4 гига оперативки, а весь системный код спроецирован на 512й гигабайт? Можно конечно там сделать кусочек с нетождественным отображением, и переключать через него, но тогда можно считать точно так же: "А кто сказал, что физическая память не станет больше 512 гигов? Тогда ведь часть адресов будет недоступна для нашего системного процесса." Есть варианты. Например, общаться с этим процессом из других процессов через IPC. Ты лучше скажи, зачем тебе тождественное отображение вообще нужно. Тогда, исходя из этого, может, и более удачное решение сможем подобрать. Что касается последнего вопроса, то суть не в том чтобы отображать ядра в верхних адресах, а в том, чтобы отображать ядро над прикладным пространством. При необходимости можно подвинуть ядро еще выше (или даже увеличить размер виртуального пространства, поддерживаемый системой), тем самым расширив прикладное пространство. С ядром это сделать значительно проще, чем с приложениями.Цитата: В отображении в нулевые адреса сейчас проблемы не вижу. А в отображении в конец - вижу. Просто не хочу создавать лишние трудности лишь ради того, что вдруг системная часть будет весить больше 16 гигов (имхо - система с таким количеством кода и дров толком не работоспособна). Чисто из любопытства, о каких проблемах "отображения в конец" идет речь?
Для аппаратных буферов у меня в конце пара сотен страничек есть глобальных.:) |
Автор: | Bargest [ 24 дек 2011, 19:08 ] |
Заголовок сообщения: | Re: Размещение кода ядра |
Проблема отображения в конец - как раз то, что сделать нормальное тождественное отображение становится трудно. Да, вы правы. Я подумал - без него (тождественного отображения) можно обойтись, и это будет проще, чем изощряться и делать жуткую схему работы. Возможно, сделаю в конец, если мап в начало действительно может вызвать серьезные проблемы. Спасибо за объяснения. |
Автор: | pavia [ 24 дек 2011, 19:15 ] |
Заголовок сообщения: | Re: Размещение кода ядра |
Не вижу проблем делаем ядро в начале. Затем код пользовательских программ. Релокацию сделать не проблема. Как для первых так и для вторых. |
Автор: | Bargest [ 24 дек 2011, 19:21 ] |
Заголовок сообщения: | Re: Размещение кода ядра |
Я запутался. :-( Так может оно вызвать серьезные проблемы или нет? |
Автор: | SII [ 24 дек 2011, 19:29 ] |
Заголовок сообщения: | Re: Размещение кода ядра |
Как ни располагай, никаких проблем никогда не будет (конечно, если система в целом нормальная). |
Автор: | phantom-84 [ 24 дек 2011, 19:38 ] |
Заголовок сообщения: | Re: Размещение кода ядра |
SII писал(а): Слишком жёстко что-то фиксировать -- ИМХО, нехорошо. В частности, любой нормальный загрузочный модуль должен быть перемещаемым (ну или позиционно-независимым). В Винде, собственно, так и есть, просто у большинства ЕХЕшников таблица перемещений удалена, из-за чего они становятся неперемещаемыми (тем не менее, технически использование перемещаемых ЕХЕшников там поддерживается). А кто сказал, что не поддерживается. Но, как вы сами сказали, информация для релокации выбрасывается из большинства исполняемых модулей, являющихся основными модулями приложений. В таком виде мы и получаем большинство программ. Насчет "любого нормально модуля", который что-то там должен, не согласен - это мое ИМХО. "Норма" - это то, что принимается и используется большинством, т.е. это не только мое "скромное мнение".Цитата: Так что надо просто делать поддержку перемещаемых модулей, а в документации чётко оговорить: базовый адрес загрузки приложения предсказать невозможно, поэтому полагаться на него нельзя. Если после этого какой-то придурок сделает неперемещаемое приложение -- это его проблемы; такое приложение должно быть выброшено на свалку, и всё (желательно вместе с автором). Где наше скромное место, мы и так знаем :) У меня приложение может быть и перемещаемым, и нет. В последнем случае, если его (фиксированная) база удовлетворяет определенным требованиям, у него тоже очень мало шансов оказаться на свалке. Мне кажется, что данные для релокации, - это в подавляющем большинстве случаев избыточная информация для прикладного исполняемого модуля.Цитата: Что же касается траты времени на перемещение, то эта не шибко большая проблема. Во-первых, приложение можно строить в предположении, что оно будет грузиться с какого-то достаточно большого адреса, и ОС, если только имеется такая возможность, должна грузить такое приложение именно с этого адреса; все накладные расходы в такой ситуации сводятся к проверке возможности выделения необходимого объёма виртуальной памяти с данного адреса -- а это мизер по сравнению со всем остальным. Но и в том случае, когда перемещение потребуется, расходы на прибавление базового адреса загрузки и выполнение других действий, связанных с перемещением, будут ощутимо меньше, чем время физической загрузки приложения с внешнего носителя, т.е. скорость запуска приложения будет по-прежнему определяться в первую очередь временем, потребным на его поиск и загрузку. Это все понятно, но если этого вообще можно избежать, то почему бы это не сделать. Думаю, я достаточно обосновал свою точку зрения. А что вы выберете, дело ваше.
|
Автор: | SII [ 24 дек 2011, 20:55 ] |
Заголовок сообщения: | Re: Размещение кода ядра |
phantom-84 писал(а): А кто сказал, что не поддерживается. Но, как вы сами сказали, информация для релокации выбрасывается из большинства исполняемых модулей, являющихся основными модулями приложений. В таком виде мы и получаем большинство программ. Насчет "любого нормально модуля", который что-то там должен, не согласен - это мое ИМХО. "Норма" - это то, что принимается и используется большинством, т.е. это не только мое "скромное мнение". 1. Норма -- это вовсе не обязательно то, что принимается и используется большинством. Например, в Средневековье большинство, причём абсолютное, "принимало и использовало" кучу всяких глупостей вроде гвоздей, которыми-де распяли Христа, да и сейчас не шибко лучше... 2. Выбрасывать таблицу перемещения является нормой в Винде. Вы ж вроде как не её клон создаёте? Цитата: У меня приложение может быть и перемещаемым, и нет. В последнем случае, если его (фиксированная) база удовлетворяет определенным требованиям, у него тоже очень мало шансов оказаться на свалке. Мне кажется, что данные для релокации, - это в подавляющем большинстве случаев избыточная информация для прикладного исполняемого модуля. Да, обычно они являются избыточными. Однако их наличие никаких проблем не создаёт (ну, занимает выполняемый модуль на диске несколько больше места, и что с того? размеры кода давно стали занимать мизерный объём от общего количества хранимых данных, и их разрастание на несколько процентов ни на что не влияет), а вот их отсутствие -- может создать. Так что с наличием таких данных будет надёжнее. Другое дело, что, выделив достаточный объём памяти под ядро, можно быть уверенным в отсутствии каких-либо проблем на ближайшие 100 лет (быстро растут объёмы обрабатываемых данных, но не объёмы кода и данных ядра -- там как раз всё довольно скромно, и даже нынешние гигабайтовые потребности объясняются не реальными нуждами, а больше быдлокодингом и впихиванием в ядро всего подряд). Цитата: Это все понятно, но если этого вообще можно избежать, то почему бы это не сделать. Думаю, я достаточно обосновал свою точку зрения. А что вы выберете, дело ваше. Не удастся избежать проблем со 100% гарантией, причём именно наличие информации о перемещении даёт наибольший шанс на то, что программа всё же будет работать. Ну а обоснование вполне достаточное, тут согласен. |
Автор: | Himik [ 24 дек 2011, 21:57 ] |
Заголовок сообщения: | Re: Размещение кода ядра |
Bargest писал(а): "А кто сказал, что физическая память не станет больше 512 гигов? Тогда ведь часть адресов будет недоступна для нашего системного процесса." Объясните этот момент, пожалуйста. Тогда может пойму смысл, и переделаю. Смысл в том, что ядро размещается не на каком-то фиксированном адресе (например 512 гигов), а просто с другого края, и заполняет память не с снизу вверх, а сверху вниз. |
Страница 2 из 5 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |