По поводу сегментного защищенного режима

Тема в разделе "WASM.OS.DEVEL", создана пользователем NoName, 18 мар 2007.

  1. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Предполагается не flat модель, т.е. для кода и данных различные жестко заданные по типу сегменты.
    Как быть с настройкой релоков для PE? Или может быть elf поможет?
    Умеет ли gcc (не асм) подставлять префиксы переопределения данных по просьбе?
    Чем подробнее напишите тем лучше. Благодарю.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я недопонял... ты собрался из защищенного режима вручную грузить PE/ELF ?
     
  3. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    я собираюсь грузить pe или elf как образ ОС
     
  4. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    чтобы загрузить форматный файл, нужен загрузчик в ядре ОС (или что-то, что уже находится в памяти и может выполнить данную операцию)
    т. е, грубо говоря, загрузить ядро ОС, которое представлено форматным файлом, не получится
    разве что только написать загрузчик, протранслировать его в binary формат и расположить перед заголовком PE/ELF в целевом файле
     
  5. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    GCC (при компиляции С-программ) генерирует только 32-ух битный код
     
  6. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    rei3er
    я знаю что нужно чтобы можно было загрузить то что мне надо, вопрос состоит не в этом.
    Мне и нужен 32-х битный код.
     
  7. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    тогда в чем?
     
  8. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    NoName
    Объясни толком что ты хочешь. А то непонятно. PE проще во Flat грузить. Сам так гружу. А вобще там можно базу установить при компиляции. Правда насколько я понял, тебе нужна возможность размещать иметь 32 битный код с возможностью загрузки на разную базу. Я в этом не разбирался, собственно ты новерно прав нужно будет через релоки делать. Компиляция не должна отличаться. Или надо будет компилировать как Dll не знаю. А дальше все делаешь в соответствии с форматом файла.
     
  9. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Проблем с форматом нету, кроме как с релоками.
    Проблема заключается в том что при не flat модели, т.е. когда есть, допустим, отдельный сегмент кода и отдельный сегмент данных (и стека) (они не перекрываются) в разных участках памяти, так вот формат релоков PE такого не предусматривает. Т.е. его релоки рассчитаны на то, что код и данные расположены как бы в одном сегменте. А т.к. у нас сегмент данных лежит отдельно, то и адресация в нем никак не совмещена с сегментом кода, поэтому нужно разлечать релоки для кода и данных.
    Как это сделать? Может ELF умеет?
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    NoName
    Тут проблем нет. Если у тебя для каждой задачи есть свой LDT и вней заведен дескрипотры для кода и данных. То релоки не нужны так как учавствует только смещение в аддресации.
    Через утелиту ld сможешь задать какие хочешь аддреса
    --section-start SECTION=ADDRESS
    Set address of named section
    -Tbss ADDRESS Set address of .bss section
    -Tdata ADDRESS Set address of .data section
    -Ttext ADDRESS Set address of .text section

    А вот если у тебя программы работают в одном аддрестном пространстве используют одни и тежи дискрипотры, то там тоже нет проблем так как притакой организации у тебя все должно быть выравнено и релоки данных и кода будут совподать.

    Помойму проблема глубже. А именно в том, что все компиляторы пихают в секцию text локальные данные. Такие как текстовые константы.
     
  11. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Для каждой задачи по одному сегменту из трех.
    LDT нет. Я так понял он тут непричем.

    только ли gcc может выставлять начальные адреса?
    А насчет секции text интересно. Наверное только виндовые пихают? Можно сделать сегмент кода с аттрибутом на выполнение и чтение или ты имеешь ввиду проблему адресации?
    Умеет ли gcc (не асм) подставлять префиксы переопределения данных по просьбе (чтобы задействовать es, fs и gs)?
     
  12. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    не умеет
    только inline-ассемблер + GNU extensions
    неа
    GCC все строковые константы размещает в .rodata (read-only data section), ну кроме тех, которыми инициализируются массивы в стеке
     
  13. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Можете пояснить как так получается что часть данных кладется компиляторами (кроме gcc) в секции кода (только си и асм)?
    Реально ли в cygwin задать для ld -section-start SECTION=ADDRESS?
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    http://www.wasm.ru/forum/viewtopic.php?id=17356