Формирование таблицы дескрипторов

Тема в разделе "WASM.ASSEMBLER", создана пользователем valeri, 17 июн 2009.

  1. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Пишу программу, которая переводит процессор в защищенный режим. В таблицу дескрипторов сегментов необходимо добавить дескриптор TSS. Проблема в том, что сам TSS располагается в секции данных и его адрес становится известен только после компиляции, причем в формате сегмент:смещение. Писать дополнительный код для вычисления физического адреса TSS и добавления его в качестве базы в дескриптор нежелательно, можно ли сделать так, чтобы адрес вычислялся и помещался в дескриптор при компиляции кода автоматически и дескриптор сразу жестко прописывался в сегменте данных, например с помощью макроса?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а в чем цель создания двух тем, еще и в неподходящем для этого форуме (см. OS.KERNEL) ?
     
  3. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Двух тем? Если создалось две темы подряд извиняюсь, глюк с инетом был, ну а в этом форуме создат, так как это больше вопрос по ассемблеру, как по инструменту, чем конкретно по работе в OS.KERNEL.
     
  4. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Двух тем? Если создалось две темы подряд извиняюсь, глюк с инетом был, ну а в этом форуме создат, так как это больше в%E
     
  5. DEADHUNT

    DEADHUNT New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2009
    Сообщения:
    34
    flat model чем не устроила? в x86-64 от TSS толку мало, да и тем более модель памяти там только плоская.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    valeri
    создавалось три (!) разных (!!) темы. глюк с инетом исключается
     
  7. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Ну еще раз извиняюсь за три темы! Ну а если бы я использовал flat? Хотя нежелательно из-за особенностей проги.
     
  8. _220

    _220 New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2006
    Сообщения:
    111
    Досовая прога что-ли? Я не мучаюсь и гружусь с дискеты. Если нужна обязательно досовая прога, то можно выкрутится с помощю двойной компиляции. Я пишу макрос show, который выводит на экран адрес, на фасме:

    macro show [procedure]{
    bits = 16
    display `procedure,' equ '
    repeat bits/4
    d = '0' + procedure shr (bits - %*4) and 0Fh
    if d > '9'
    d = d + 'A'-'9'-1
    end if
    display d
    end repeat
    display 13,10
    }

    TSS_1: ....
    TSS_2:.....

    show TSS_1, TSS_2

    Потом пишу в конце файла show что_нужно_показать, включаю в файл offsets.inc
    Собираю как
    fasm blabla.asm blabla.bin | find "TSS_" > offsets.inc
    и еще раз
    fasm blabla.asm blabla.bin , вуаля
     
  9. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Спасибо хороший вариант, буду пробовать.
     
  10. DEADHUNT

    DEADHUNT New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2009
    Сообщения:
    34
    Код (Text):
    1. TSS_1:
    2. ....
    3. dd TSS_1
    так не проще? предполагается что модель памяти flat, хотя можно вычесть базовый адрес сегмента если надо.
     
  11. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Ответ непосредственно по вопросу топика: не получится, т.к. база TSS хранится в дескрипторе в расщепленном виде. Сам дескриптор можно прописать в исходнике, но базу придется скорректировать во время запуска. Кстати, здесь был упомянут вполне примелемый выход из этой ситуации - загрузка исполняемого образа по фиксированному адресу.
     
  12. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Хотя это еще зависит от формата исполняемого образа и предполагаемого места его загрузки.
     
  13. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Образ грузится по фиксированному адресу 10000h. Но вот адрес сегмента данных, в котором Tss и расположен известен только после компиляции.
     
  14. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Какой выходной формат используешь, какой компилятор, из какого количества объектных модулей собираешь исполняемый образ?

    ЗЫ :) В крайнем случае можно базу в дескрипторе прописать в исполняемом образе уже после компиляции :)
     
  15. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Использую mаsm, проект собирается из 3 файлов, выходной файл соm
     
  16. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Ну если com-файл, как это по идее и должно быть, имеет размер, не превышающий 64 кб, то ты можешь старший байт базы прописать равным 0, находящийся перед ним байт базы прописать равным 1, а для младших двух байт использовать 16-разрядный релок, т.к. младшие два байта базы размещены в дескрипторе вплотную друг к другу. Получишь базу вида: 0x0001XXXX.
     
  17. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Хотя нет, ведь у com-файла стартовое смещение 0x100, которое трудно будет отнять от релоцируемого элемента.
     
  18. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Может, перепишешь свой код под какой-нибудь ассемблер, который позволяет формировать чистые бинарники с нулевой внутрисегментной базой, например, насм или фасм?
     
  19. valeri

    valeri New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2005
    Сообщения:
    59
    Адрес:
    Russia
    Ну у меня вернее как раз чистый бинарник будет
     
  20. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Тогда в чём проблема вообще не понятно.
    Раздули топик непонятно из-за чего :)
    Если у тебя COM или чистый бинарь - значит сегмент один.
    Линейный адрес TSS будет равень адресу загрузки плюс смещение в этом сегменте.
    LinearAddr=ImageLoadBaseAddr + offset TSS
    Всё.
    Для заполнения дескриптора (разрезания на куски) можно тоже встроенными командами MASM обойтись.
    Например первый байт (счёт от нуля) получается так: (LinearAddr SHR 8) AND 0FFh
    Аналогично можно выделить любые другие нужные биты адреса.