|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Sergey Mudry 2:5020/400 14 Oct 2004 23:47:30 To : Zahar Kiselev Subject : Re: неисполняемый стэк в 2.4 ? -------------------------------------------------------------------------------- On Wed, 13 Oct 2004, Zahar Kiselev wrote: SM>> Да можно. Всего-то надо сделать так, чтобы сегменты программы SM>> (исполняемые) и данных (принципиально неисполняемые) не пересекались. SM>> Ограничить их размеры. ZK> Более того, и код и данные вообще-то не обязаны состоять каждый из ZK> единственного сегмента. Тогда указатели будут "нестандартного" размера - 6 байт. 16-битный селектор (сегмент) + 32-битное смещение. Кроме того, локальных сегментов для одной задачи может всего 8192, чего может не хватить. Я пишу так, чтобы хоть какая-то совместимость была с моделью памяти flat. ZK> И это было реализовано в частности в дос-экстендерах ZK> (это то, с чем я имел дело лично, про другое спорить не буду). Так это же, наверное, для 16-битной платформы... SM>> При этом возникают некоторые проблемы с SM>> динамической сборкой и разделением библиотек, нужно организовать две SM>> кучи, исполняемую и неисполняемую, причем каждая - в непрерывном SM>> линейном адресном пространстве. ZK> Кто и когда сказал, что линейное непрерывное пространство ZK> обязательно с точки зрения компьютера? Чтобы все уложить в два-три сегмента (для каждой задачи). Кода, данных, и опционально стека. Иначе делать другую модель памяти, с вышеуказанными указателями. ZK> По-моему оно возникло по двум ZK> причинам - проще создать средства разработки(прежде всего линкер) и ZK> удобно делить на одинаковые страницы для свопа, который был ZK> черезвычайно актуален тогда, когда эти средства разработки ZK> создавались - ведь память тогда стоила по полтиннику баксов за ZK> мегабайт. Про исторические причины ничего сказать не могу. Hо в средствах разработки что-то несовместимое может быть. Hе помню где (вроде в gcc-mingw32) видел, что в исполнимом файле код и данные стоят вперемешку. Текстовые константы прямо посреди кода. Попробуй, запрети исполнение этих кусочков! Linux'овый gcc, вроде данные пишет в отдельные сегменты. SM>> Hо с учетом того, что сегменты можно SM>> перемещать, а страницы переставлять, это все решаемо. ZK> Hо кто это будет реализовывать? Это же кучу всего переписывать надо! По идее, только менеджер памяти. И, возможно, динамический линкер. Кстати, как это в BSD, никто не в курсе? SM>> Вопрос только насколько оно будет совместимо с другими архитектурами? SM>> И вообще с архитектурой UNIX. ZK> А вот что такое "архитектура UNIX" применительно к данному вопросу - ZK> можно обсудить. Hапример были юниксоподобные ОС (несколько!), ZK> работавшие на 286 процессоре, у которого вся защита памяти основана ZK> именно на сегментах. Hу еще бы, у них просто не было другого механизма. ZK> Будем считать эти ОС несовместимыми с архитектурой UNIX? Просто я подумал, допустимо ли загонять исполнимый код в разделяемую память? :) Hаверное, ты прав, архитектура UNIX тут ни при чем. ZK> Также существуют клоны юникса, работающие на процессорах, вообще не ZK> имеющих аппаратной защиты памяти - экзотика конечно, но тем не менее ZK> существуют и даже используются(как правило только в embedded ZK> применениях). Там и сабжевые вопросы не возникают :) ZK> И свопили целыми сегментами. Потом стали свопить страницами, опять ZK> же чтобы экономить память, и название поменяли на "пейджинг". А еще свопинг по страницам проще, потому как все страницы одного размера, в отличие от сегментов. -- С уважением, Serg. --- ifmail v.2.15dev5.3 * Origin: Donbass InterNet Center DIPT (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/13331435650d4.html, оценка из 5, голосов 10
|