gate tss

Тема в разделе "WASM.ASSEMBLER", создана пользователем 0136, 5 сен 2009.

  1. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Привет всем! Почему то не удается сделать программное прерывание в виде задачи. Подскажите где мог ошибиться.
    Значит так, данные у меня расположены по сегментному адресу 2000h, код для РМ расположен по сегментному адресу 3000h.
    mov ax, 2000h ; настроим сегментные регистры на данные
    mov ds, ax
    mov es, ax ; DS = ES = 2000H, аппаратные и немаск прерывния выключены

    mov eax, 20000h ; настроим GDT, вычисляется физ. адрес GDT
    add ax, offset ds:Zero_descriptor ; прибавляется к физ.адрeсу смещение в сег. данных
    mov ds:LA_GDT, eax ; сохр. физ. адреса GDT

    mov eax, 20000h ; вычислим физ адр. сегмента TSS_0
    add ax, offset tss_0 ; добавим смещение
    mov word ptr ds:TSS_0_descriptor+2, ax
    shr eax, 16
    mov byte ptr ds:TSS_0_descriptor+4, al

    mov eax, 20000h ; вычислим физ адр. сегмента TSS_INT49
    add ax, offset tss_INT49 ; добавим смещение
    mov word ptr ds:TSS_INT49_descriptor+2, ax
    shr eax, 16
    mov byte ptr ds:TSS_INT49_descriptor+4, al

    lgdt fword ptr ds:Lim_GDT ; загрузка GDTR

    mov eax, 20000h ; инициализация таблицы IDT
    add ax, offset Gate_descriptor0 ; добавим смещение
    mov ds:LA_IDT, eax ; сохранение физ. адреса IDT

    xor eax, eax ; настройка смещений шлюзов
    mov eax, 30000h ; в сегменте 3000h находится обработчик
    add eax, offset int_30h ; добавим смещение
    mov word ptr ds:Gate_descriptor48, ax
    shr eax, 16
    mov word ptr ds:Gate_descriptor48+6, ax

    lidt fword ptr ds:Lim_IDT ; IDTR

    ; тут включается РМ и тождественное странич преобразование и прыжок на код РМ

    вот то что по сегментному адресу 2000h, таблица тождествен преобразования находится по сегментному адресу 4000h.
    ; GDT
    Zero_descriptor db 8 dup (0)
    Code_descriptor db 0FFh, 0FFh, 0, 0, 0, 10011000b, 11001111b, 0 ; 8
    Data_descriptor db 0FFh, 0FFh, 0, 0, 0, 10010010b, 11001111b, 0 ; 16

    TSS_0_descriptor db 067h, 0, 0, 0, 0, 10001001b, 0, 0 ; 24
    TSS_INT49_descriptor db 067h, 0, 0, 0, 0, 10001001b, 0, 0 ; 32

    size_GDT = $-Zero_descriptor-1 ; размер GDT
    Lim_GDT dw size_GDT ; операнды команды LGDT
    LA_GDT dd 0

    ; IDT
    Gate_descriptor0 db 34*8 dup (0) ; дескрипторы 0 - 33
    Gate_descriptor34 db 14*8 dup (0) ; дескрипторы 34 - 47
    Gate_descriptor48 db 0h, 0h, 08h, 0h, 0h, 11101110b, 0h, 0h ; Программное прерывание INT 30h

    Gate_descriptor49 db 0h, 0h, 32, 0h, 0h, 11100101b, 0h, 0h ; Программное прерывание INT 31h

    size_IDT = $-Gate_descriptor0-1 ; размер IDT
    Lim_IDT dw size_IDT ; операнды команды LIDT
    LA_IDT dd 0

    tss_0 db 68h dup (0) ; сегмент контекста задачи №0
    ; сегмент контекста задачи
    tss_INT49 dd 0 ; back link
    dd 0; ESP0
    dd 0 ; SS0
    dd 0 ; ESP1
    dd 0 ; SS1
    dd 0 ; ESP2
    dd 0 ; SS2
    dd 40000h ; CR3
    dd 30000h + offset Start_INT49 ; EIP
    dd 0 ; EFLAGS
    dd 0 ; EAX
    dd 0 ; ECX
    dd 0 ; EDX
    dd 0 ; EBX
    dd 6F000h ; ESP
    dd 0 ; EBP
    dd 0 ; ESI
    dd 0 ; EDI
    dd 16 ; ES
    dd 8 ; CS
    dd 16 ; SS
    dd 16 ; DS
    dd 0 ; FS
    dd 0 ; GS
    dd 0 ; LDTR
    dd 0 ; T

    вот код РМ.
    mov ax, 16 ; flat
    mov es, ax
    mov ds, ax
    mov ss, ax
    mov esp, 70000h

    mov ax, 24 ; загружаем селектор дескриптора задачи в регистр TR
    ltr ax

    mov eax, 1 ; работает, он оформлен как шлюз прерывания
    int 30h

    int 31h ; вот с этим проблема начинается, он оформлен как шлюз задачи
    ; до сюда не доходит
    mov es:[0b8000h], 02020202h
    jmp $

    Start_INT49:
    iret
    jmp Start_INT49


    Вроде дал все самое необходимое, если кто делал подобное, может увидит ошибку? Потому что я делал такое, но сейчас оно почему то не работает! Получается когда вызываю int 31h то вход в обработчик получается (проверял), а выхода не получается, где то оно там "уходит". Спасибо за внимание :)
     
  2. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Bochs debugger в руки - и вперёд отлаживать.
     
  3. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    бошом не пользуюсь, не доверяю таким всям штукам :)
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    0136
    А зря. Хороший эмулятор, особенно последняя версия 2.4 вообще прям.
    Хотя, конечно, не без багов, но все же лучше, чем гадать.
    А принципиальность такая - это всегда плохо для кодера. Попробовал бы в бошсе сначала отладить, а потом уже спрашивал:)
     
  5. 0136

    0136 New Member

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

    _220 New Member

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


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

    А, то есть пользоваться в лом, хочешь чтобы тебя просто носом ткнули в ошибку, кому на тебя время тратить-то нужно? Гадать без отладчика не в лом?

    А это не принципиальность, это лень. Не будем ее поощрять, тебе совет дали - чего еще нужно?
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Такое некультурное поведение на этом форуме не поощряется. Либо ты исправляешься, либо тема отправляется куда подальше, а своими проблемами тебе придется разбираться самому, а попутно думать о том, как общаться с другими людьми.
     
  8. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Я думал есть профи, который сразу скажет в чем дело. Это ведь обычное дело, все просто. И это, как бабы ведете себя :) не дуйтесь, но так и есть - обидили :)
    скажем дружно - нафиг нужно :) деффачки тчк
     
  9. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    _220 - "Не будем ее поощрять, тебе совет дали - чего еще нужно?" - чего нужно было - читай с самого начала.
     
  10. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Great - задумайся сам о себе, нефиг дуться на правду, я сказал мне влом, значит мне влом. не высмактывай из пальца. исправлять, поучать дома будешь. и без твоих высказываний делаю сам.
     
  11. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    0136, задумайся сам о себе, нефиг дуться на правду: ты пришёл сюда, и начинаешь что-то требовать. Тебе предлагают решения, ты говоришь мне влом, дайте другое. А когда тебе объясняют, что ты неправ, ты начинаешь исправлять и поучать окружающих.

    Хочешь я за тебя загружу твой код в bochs и найду там ошибку? Я могу, надо лишь о цене договориться.
     
  12. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    все ок, не нужно