прерывания и планировщик

Тема в разделе "WASM.OS.DEVEL", создана пользователем Hell_Knight, 10 окт 2010.

  1. Hell_Knight

    Hell_Knight New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    51
    ситуация такая:
    страничная организация
    я загружаю код планировщика в память
    и хочу его прицепить к прерыванию таймера
    код действительно загружается в память, т. к. проверял делая jmp в него
    цеплять к прерыванию старался так:
    по нулевому физическому адресу + 8*4(1Ch*4) ставил указатель на расположение в памяти кода планировщика(ставил, как логический адрес, так и физический)
    заматил, что General Protection вылазит при включении прерываний, в инструкции (sti)
    я тогда решил проинициализировать все векторы прерываний, сделал, что бы они ссылались на процедуру с единственной командой(iret)
    но #GP появлялся снова и снова...
    может, в PM по другому устанавливаются обработчики ?
     
  2. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    в pm есть idt дескриптор прерываний. и все прерывания указываются в нем.а про 0 адресу нечего нет
     
  3. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Ну может и есть. Более того при идентичном отображении там скорее всего находится таблица векторов прерываний. Вот только проблема в том, что в РМ вместо нее должна использоваться таблица дескрипторов прерываний. Автору топика не мешало бы подучить мат. часть. Вообще странно, как можно использовать "страничную организацию" и ничего не знать про организацию обработки прерываний в РМ.
     
  4. Hell_Knight

    Hell_Knight New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    51
    хорошо с этим всё понятно...
    А вот при страничной адресации, в таблицу дескрипторов какой адрес нужно загружать: физический или логический ?
    У меня практики работы с этим дескриптором нету, так что простите за тупой вопрос
    всё ли я правильно сделал(код ниже) ?
    возникает #GP при прерываниее на int 0
    проверил это поставив jmp $
    до него дело не дошло...
    Код (Text):
    1. mov eax, 0x3007
    2. mov [0x00101000 + 3*4], eax ; планировщик
    3. lidt    fword [IDTR]
    4. int 0
    5. sti
    6. ...
    7. IDT:
    8. dw 0x100C, 8, 1000111000000000b, 0x0010 ; int 0 => лин. адрес: 0x0010100C
    9. ...
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Hell_Knight
    Виртуальный, какойже есчо. Вначале матчасть изучают, потом тока пишут ось или тп., совсем обнаглели.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    метод тыка же!
     
  7. Hell_Knight

    Hell_Knight New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    51
    обновил пост выше...
    З.Ы. читал статейки от Broken Sword'a (про защищенный режим)
    еще книжку Таненбаума
    и бегло пролистал про прерывания))) моё упущение...
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Hell_Knight
    А маны интела/амд почему не юзаете ?

    Накол =)
     
  9. Hell_Knight

    Hell_Knight New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    51
    Во я НУП!!!!
    Ну конечно же!!!!!
    Какой 0x0010100C ????
    Когда нужно заливать туда 0x3000(кталог №0, страница №3 смещение 0) !!!!

    З.Ы. пока сюда не отпостил, так и не обратил как-то внимание на это))))
    весь день над этим дескриптором сижу...
    всё никак не привыкну к страничной организации
     
  10. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Еще про PIC/APIC нужно почитать. Автору желаю всяческих успехов. Не каждый знает про вектор 1Ch.
     
  11. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Каталог #0??? Какой вид страничной переадресации используешь?
     
  12. Hell_Knight

    Hell_Knight New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    51
    ну об этом тоже захватил краем глаза...
    =)
    я решил сделать выбор на 8h (IRQ 0)
    я использую страницы по 4кб
    та у которой адрес:
    31..22 смещение в каталоге
    21..12 смещение в таблице страниц
    11..0 смещение
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    В РМ лучше сместить обработчики прерываний с номера 8 на минимум номер 32.

    Это обычная 32-разрядная страничная адресация. В ней только один каталог страниц. То что находится на уровень ниже в терминологии Интел называется таблицами страниц.
     
  14. Hell_Knight

    Hell_Knight New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    51
    хорош, это обязательно я сделаю...
     
  15. Hell_Knight

    Hell_Knight New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    51
    хм... странно, не с того не с сего снова стало возникать #GP после инструкции sti...
    с чего бы это ?
    я даже вынес IDT для удобства в отдельную страницу :)
    так удобнее контролировать его...
    я структуру IDT не трогал, может опять дело с TLB ?
    но тогда каким образом можно поправить ситуацию ?
     
  16. Hell_Knight

    Hell_Knight New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    51
    вот планировщик, задаётся:
    Код (Text):
    1. mov     eax, 0x3107     ; G глобальная страница + стандартные параметры
    2. mov     [0x00101000 + 3*4], eax     ; планировщик (0x3000)
    вот IDT где хранится:
    Код (Text):
    1. mov     eax, 0x9107 ; IDT (G глобальная страница + стандартные параметры)
    2. mov     [0x00101000 + 9*4], eax     ; 0x9000
    вот IDT инициализирую и загружаю 8-ой обработчик
    Код (Text):
    1.     ; загрузка IDTR
    2.     mov     edi, 0x9000 ; страница №9 (указываем на начало IDT)
    3.     xor     eax, eax
    4.     mov     ecx, 100*2
    5.     rep     stosd       ; забиваем нулями
    6.  
    7.     mov     edx, 8*8
    8.     mov     edi, 0x9000
    9.     add     edi, edx        ; указываем на 8-ой элемент IDT (для INT 8)
    10.     mov     esi, IDT
    11.     mov     ecx, 8
    12.     rep     movsb       ; заливаем подготовленный элемент на 8-ой элемент в IDT
    13.     lidt    fword ptr IDTR
    вот собственно сам элемент, указывающий на 8-ой обработчик
    Код (Text):
    1. IDT:
    2.     dw 0x3000, 0x0000, 1000111000000000b, 0x0000        ; указываем на 0x3000, т. е код планировщика
    вот кусок памяти для загрузки в IDTR
    Код (Text):
    1. IDT_size    equ 100*8
    2. IDTR        dw  IDT_size-1
    3.             dd  0x00009000
    подскажите пожалуйста почему не работают прерывания ?
    после команды sti возникает #GP
    раньше работало, щас что-то перестало...
    может опять какая-то фигня со всякими кэшами и т. п. ?
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Error code ?
    Cs:Eip ?
     
  18. Hell_Knight

    Hell_Knight New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    51
    если бы я знал как этот код получить...

    у меня просто VMware выкидывает ошибку, что мол останавливаю тебя и всё...
    никаких error code нету...

    у меня страничная адресация, не юзаю cs
     
  19. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
  20. Hell_Knight

    Hell_Knight New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2009
    Сообщения:
    51
    т. е. мне нужно сделать обработчик 13-го прерывания ?
    который будет читать из стэка код ошибки ?