Int и исключение GP

Тема в разделе "WASM.ASSEMBLER", создана пользователем DimoK, 13 апр 2005.

  1. DimoK

    DimoK New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2005
    Сообщения:
    5
    Адрес:
    Russia
    При вызове пользовательского прерывания в защищённом режиме сразу вылетает исключение GP

    пишу на fasme

    не могу понять в чём глюк

    обработчики исключений прекрасно работают, а пользовательского прерывания нет

    пишу int 0x30 и сразу в GP

    дескриптор пользовательского прерывания загружен как надо проверено
     
  2. DimoK

    DimoK New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2005
    Сообщения:
    5
    Адрес:
    Russia
    уже неделю парю и немогу понять в чём дело

    всю документацию по intel на анг перерыл и причину найти не могу
     
  3. ava

    ava New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2003
    Сообщения:
    169
    DimoK, судя по всему, ты тоже пишешь ОСь (мог бы обрисовать ситуацию подробнее). Возможные проблемы:

    - неправильный дескриптор, возможно, неправильный DPL (покажи дескриптор и содержимое GDT);

    - не загружен TR;

    - ошибка в TSS (покажи его);

    - и вообще что угодно (покажи весь код целиком).



    P. S. Посмотри код ошибки #GP.
     
  4. DimoK

    DimoK New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2005
    Сообщения:
    5
    Адрес:
    Russia
    DPL=CPL=0

    До многозадачности ещё не дошёл поэтому TSS нету и соответственно TR не загружен

    А всё остальное есть. Делал всё по документации Intel для Pentium 4

    вот исходники

    файлик 1
    Код (Text):
    1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    2. ;;                Работа в реальном режиме                  ;;
    3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    4.  
    5. ;Сегмент стека
    6. use16
    7. Stack_RM:
    8.     times 0x100 : db 0
    9. label Stack_RM_Top at $-1
    10. ;Конец сегмента стека Stack_RM
    11.  
    12. ;Сегмент данных
    13. use16
    14. Data_RM:
    15.  
    16. ;P,DPL,S и тип сегмента
    17. code    equ 00001000b ;сегмент кода
    18. data    equ 00000000b ;сегмент данных
    19. d_e_c_c equ 00000100b ;
    20. d_w_c_r equ 00000010b ;данные запись, код чтение
    21. access  equ 00000001b ;доступен
    22. p   equ 10000000b ;
    23. s   equ 00010000b ;
    24.  
    25. ;Атрибуты
    26. gdt_atr       equ data or d_w_c_r or p or s     ; 10010010b
    27. cs_atr        equ code or d_w_c_r or p or s     ; 10011010b
    28. ds_atr        equ data or d_w_c_r or p or s     ; 10010010b
    29. video_atr     equ data or d_w_c_r or p or s     ; 10010010b
    30. ss_atr        equ data or d_w_c_r or d_e_c_c or p or s  ; 10010110b
    31. idt_atr       equ data or d_w_c_r or p or s     ; 10010010b
    32. trap_atr      equ 10001111b
    33. interrupt_atr equ 10001110b
    34. include 'RUS.inc'
    35. Data_RM_size=$-Data_RM ;размер сегмента данных
    36. ;Конец сегмента данных Data_RM
    37.  
    38. ;Сегмент кода
    39. use16
    40. Code_RM:
    41.  
    42.       ;Определение сегмента стека
    43.       mov ax,Stack_RM
    44.       mov ss,ax
    45.       mov sp,Stack_RM_Top
    46.  
    47.       ;Определение сегмента данных
    48.       push cs
    49.       pop ds
    50.  
    51.       ;Очищаем экран:
    52.       mov ax,3
    53.       int 0x10
    54.  
    55.       ;Заменяем символы в знакогенераторе на Русские
    56.       mov  bp,RUS1       ; RUS1 - первая часть модифицируемых символов.
    57.       mov  bx,0x1000         ; AH - высота символов
    58.       mov  cx,0x30       ; 48 символов
    59.       mov  dx,0x80       ; 128 - номер первого модифицируемого символа
    60.       mov  ax,0x1100         ; ah=11h - номер функции прерывания BIOS int 10h модификации системного шрифта
    61.       push cs
    62.       pop  es            ;es=cs
    63.                  ;es:bp - адрес новых символов.
    64.       int  0x10          ;вызов прерывания BIOS int 10h
    65.  
    66.       mov  bp,RUS2       ; RUS2 - первая часть модифицируемых символов.
    67.       mov  bx,0x1000         ; AH - высота символов
    68.       mov  cx,0x20       ; 32 символа
    69.       mov  dx,0xe0       ; 224 - номер первого модифицируемого символа
    70.       mov  ax,0x1100         ; ah=11h - номер функции прерывания BIOS int 10h модификации системного шрифта
    71.       push cs
    72.       pop  es            ;es=cs
    73.                  ;es:bp - адрес новых символов.
    74.       int  0x10          ;вызов прерывания BIOS int 10h
    75.  
    76.       ;Открываем линию А20 для 32-х битной адресации
    77.       in  al,0x92
    78.       or  al,2
    79.       out 0x92,al
    80.  
    81.       ;Заполняем таблицу глобальных дескрипторов
    82.       load_descr_gdt gdt_gdt, gdt+0x8200,      gdt_size-1,  01000000b,gdt_atr
    83.       load_descr_gdt gdt_cs,  Code_PM+0x8200,  Code_PM_size-1,  01000000b,cs_atr
    84.       load_descr_gdt gdt_ds,  Data_PM+0x8200,  Data_PM_size-1,  01000000b,ds_atr
    85.       load_descr_gdt gdt_es,  0x0b8000,        0x0ffff,     01000000b,video_atr
    86.       load_descr_gdt gdt_ss,  Stack_PM+0x8200, Stack_PM_size-1, 01000000b,ss_atr
    87.       load_descr_gdt gdt_idt, idt+0x8200,      idt_size-1,  01000000b,idt_atr
    88.       load_descr_gdt gdt_exc, Exception+0x8200,Exception_size-1,  01000000b,cs_atr
    89.       load_descr_gdt gdt_int, Interrupt+0x8200,Interrupt_size-1,  01000000b,cs_atr
    90.  
    91.       ;Загружаем gdtr
    92.       xor eax,eax
    93.       mov ax,cs
    94.       shl eax,4
    95.       add eax,gdt
    96.       mov [gdtr_base],eax
    97.       lgdt [cs:gdtr]
    98.  
    99.       ;Запрещаем маскируемые прерывания
    100.       cli
    101.  
    102.       ;Запрещаем немаскируемые прерывания
    103.       in al,0x70
    104.       or al,0x80
    105.       out 0x70,al
    106.  
    107.       ;Устанавливаем для IRQ0-IRQ7 номера прерываний 20h-27h
    108.       mov dx,0x20 ;master
    109.       mov ah,0x20
    110.       call set_int_controller
    111.  
    112.       ;Устанавливаем для IRQ8-IRQ15 номера прерываний 28h-2Fh
    113.       mov dx,0x0a0 ;slave
    114.       mov ah,0x28
    115.       call set_int_controller
    116.  
    117.       ;Заполняем таблицу прерываний
    118.       load_descr_idt exc00,   exc_00-Exception,    gdt_exc-gdt, trap_atr
    119.       load_descr_idt exc01,   exc_01-Exception,    gdt_exc-gdt, trap_atr
    120.       load_descr_idt exc02,   exc_02-Exception,    gdt_exc-gdt, trap_atr
    121.       load_descr_idt exc03,   exc_03-Exception,    gdt_exc-gdt, trap_atr
    122.       load_descr_idt exc04,   exc_04-Exception,    gdt_exc-gdt, trap_atr
    123.       load_descr_idt exc05,   exc_05-Exception,    gdt_exc-gdt, trap_atr
    124.       load_descr_idt exc06,   exc_06-Exception,    gdt_exc-gdt, trap_atr
    125.       load_descr_idt exc07,   exc_07-Exception,    gdt_exc-gdt, trap_atr
    126.       load_descr_idt exc08,   exc_08-Exception,    gdt_exc-gdt, trap_atr
    127.       load_descr_idt exc09,   exc_09-Exception,    gdt_exc-gdt, trap_atr
    128.       load_descr_idt exc0a,   exc_0a-Exception,    gdt_exc-gdt, trap_atr
    129.       load_descr_idt exc0b,   exc_0b-Exception,    gdt_exc-gdt, trap_atr
    130.       load_descr_idt exc0c,   exc_0c-Exception,    gdt_exc-gdt, trap_atr
    131.       load_descr_idt exc0d,   exc_0d-Exception,    gdt_exc-gdt, trap_atr
    132.       load_descr_idt exc0e,   exc_0e-Exception,    gdt_exc-gdt, trap_atr
    133.       load_descr_idt exc0f,   exc_0f-Exception,    gdt_exc-gdt, trap_atr
    134.       load_descr_idt exc10,   exc_10-Exception,    gdt_exc-gdt, trap_atr
    135.       load_descr_idt exc11,   exc_11-Exception,    gdt_exc-gdt, trap_atr
    136.       load_descr_idt exc12,   exc_12-Exception,    gdt_exc-gdt, trap_atr
    137.       load_descr_idt exc13,   exc_13-Exception,    gdt_exc-gdt, trap_atr
    138.       load_descr_idt exc14,   exc_14-Exception,    gdt_exc-gdt, trap_atr
    139.       load_descr_idt exc15,   exc_15-Exception,    gdt_exc-gdt, trap_atr
    140.       load_descr_idt exc16,   exc_16-Exception,    gdt_exc-gdt, trap_atr
    141.       load_descr_idt exc17,   exc_17-Exception,    gdt_exc-gdt, trap_atr
    142.       load_descr_idt exc18,   exc_18-Exception,    gdt_exc-gdt, trap_atr
    143.       load_descr_idt exc19,   exc_19-Exception,    gdt_exc-gdt, trap_atr
    144.       load_descr_idt exc1a,   exc_1a-Exception,    gdt_exc-gdt, trap_atr
    145.       load_descr_idt exc1b,   exc_1b-Exception,    gdt_exc-gdt, trap_atr
    146.       load_descr_idt exc1c,   exc_1c-Exception,    gdt_exc-gdt, trap_atr
    147.       load_descr_idt exc1d,   exc_1d-Exception,    gdt_exc-gdt, trap_atr
    148.       load_descr_idt exc1e,   exc_1e-Exception,    gdt_exc-gdt, trap_atr
    149.       load_descr_idt exc1f,   exc_1f-Exception,    gdt_exc-gdt, trap_atr
    150.  
    151.       load_descr_idt timer,   int_timer-Interrupt,     gdt_int-gdt, interrupt_atr
    152.       load_descr_idt keyboard,    int_keyboard-Interrupt,  gdt_int-gdt, interrupt_atr
    153.  
    154.       load_descr_idt dummy_iret0, dummy_iret_0-Interrupt,  gdt_int-gdt, interrupt_atr
    155.       load_descr_idt dummy_iret1, dummy_iret_0-Interrupt,  gdt_int-gdt, interrupt_atr
    156.       load_descr_idt dummy_iret2, dummy_iret_0-Interrupt,  gdt_int-gdt, interrupt_atr
    157.       load_descr_idt dummy_iret3, dummy_iret_0-Interrupt,  gdt_int-gdt, interrupt_atr
    158.       load_descr_idt dummy_iret4, dummy_iret_0-Interrupt,  gdt_int-gdt, interrupt_atr
    159.       load_descr_idt dummy_iret5, dummy_iret_0-Interrupt,  gdt_int-gdt, interrupt_atr
    160.       load_descr_idt dummy_iret6, dummy_iret_0-Interrupt,  gdt_int-gdt, interrupt_atr
    161.       load_descr_idt dummy_iret7, dummy_iret_1-Interrupt,  gdt_int-gdt, interrupt_atr
    162.       load_descr_idt dummy_iret8, dummy_iret_1-Interrupt,  gdt_int-gdt, interrupt_atr
    163.       load_descr_idt dummy_iret9, dummy_iret_1-Interrupt,  gdt_int-gdt, interrupt_atr
    164.       load_descr_idt dummy_ireta, dummy_iret_1-Interrupt,  gdt_int-gdt, interrupt_atr
    165.       load_descr_idt dummy_iretb, dummy_iret_1-Interrupt,  gdt_int-gdt, interrupt_atr
    166.       load_descr_idt dummy_iretc, dummy_iret_1-Interrupt,  gdt_int-gdt, interrupt_atr
    167.       load_descr_idt dummy_iretd, dummy_iret_1-Interrupt,  gdt_int-gdt, interrupt_atr
    168.       load_descr_idt int30h,      int_30h-Interrupt,       gdt_int-gdt, interrupt_atr
    169.  
    170.       ;Загружаем idtr
    171.       xor eax,eax
    172.       mov ax,cs
    173.       shl eax,4
    174.       add eax,idt
    175.       mov [idtr_base],eax
    176.       lidt [cs:idtr]
    177.  
    178.       ;Переключаемся в защищённый режим
    179.       mov eax,cr0
    180.       or eax,1
    181.       mov cr0,eax
    182.  
    183.       ;Загружаем селектор в регистр CS,DS,ES,SS
    184.       mov ax,gdt_ds-gdt
    185.       mov ds,ax
    186.       mov ax,gdt_es-gdt
    187.       mov es,ax
    188.       mov ax,gdt_ss-gdt
    189.       mov ss,ax
    190.       mov esp,Stack_PM_Top
    191.       db 0x66
    192.       db 0x0ea
    193.       dd 0
    194.       dw gdt_cs-gdt
    195.  
    196. ;Процедура перепрограммирует контроллер прерываний
    197. ;      На входе: DX - порт контроллера прерыванght
    198. ;                AH - начальный номер прерывания
    199. set_int_controller:
    200.       mov al,11
    201.       out dx,al
    202.       call pic_delay
    203.       mov al,ah
    204.       inc dx
    205.       out dx,al
    206.       call pic_delay
    207.       mov al,4
    208.       out dx,al
    209.       call pic_delay
    210.       mov al,1
    211.       out dx,al
    212.       call pic_delay
    213.       mov al,0x0ff
    214.       out dx,al
    215.       dec dx
    216.       ret
    217.  
    218. pic_delay:
    219.  
    220.     jmp pd
    221. pd:   ret
    222.  
    223. ;Конец сегмента кода Code_RM


    файлик 2


    Код (Text):
    1. use32
    2. Align 4
    3. ;Структура описывает дескриптор GDT
    4. struc descr_gdt
    5. {
    6.     .limit   dw 0
    7.     .base1   dw 0
    8.     .base2   db 0
    9.     .atr     db 0
    10.     .lim_atr db 0
    11.     .base3   db 0
    12. }
    13.  
    14. Align 4
    15. ;Таблица глобальных дескрипторов
    16. gdt:
    17.     gdt_0   descr_gdt ;смещение 0x00
    18.     gdt_gdt descr_gdt ;смещение 0x08
    19.     gdt_idt descr_gdt ;смещение 0x10
    20.     gdt_cs  descr_gdt ;смещение 0x18
    21.     gdt_ds  descr_gdt ;смещение 0x20
    22.     gdt_es  descr_gdt ;смещение 0x28
    23.     gdt_ss  descr_gdt ;смещение 0x30
    24.     gdt_exc descr_gdt ;смещение 0x38
    25.     gdt_int descr_gdt ;смещение 0x40
    26.  
    27. ;Размер таблицы GDT
    28.        gdt_size=$-gdt
    29.  
    30. ;Структура для описания псевдо дескриптора gdtr
    31.       label gdtr fword
    32.          dw gdt_size-1
    33.       gdtr_base: dd 0
    34. ;Макрос заполняет дескрипторы сегментов
    35. macro load_descr_gdt des,base_adr,limit,g_d_avl,type
    36. {
    37.     ;Переопределяем указатели
    38.     des.limit   equ des
    39.     des.base1   equ des+2
    40.     des.base2   equ des+4
    41.     des.atr     equ des+5
    42.     des.lim_atr equ des+6
    43.     des.base3   equ des+7
    44.  
    45.     ;Заполняем базу
    46.     xor eax,eax
    47.     mov eax,base_adr
    48.     mov [des.base1],ax
    49.     shr eax,16
    50.     mov [des.base2],al
    51.     mov [des.base3],ah
    52.  
    53.     ;Заполняем лимит и флаги G,D,AVL
    54.     xor eax,eax
    55.     mov eax,limit
    56.     mov [des.limit],ax
    57.     shr eax,16
    58.     or al,g_d_avl
    59.     mov [des.lim_atr],al
    60.  
    61.     ;Заполняем флаги P,DPL,S и тип сегмента
    62.     xor eax,eax
    63.     or al,type
    64.     mov [des.atr],al
    65. }
    66.  
    67. ;Структура описывает дескриптор IDT
    68. struc descr_idt
    69. {
    70.     .offset1   dw 0
    71.     .selector  dw 0
    72.     .no_use    db 0
    73.     .type_atr  db 0
    74.     .offset2   dw 0
    75. }
    76.  
    77. ;Таблица дескрипторов прерываний
    78. idt:
    79. ;Вентили исключений
    80.     exc00        descr_idt
    81.     exc01        descr_idt
    82.     exc02        descr_idt
    83.     exc03        descr_idt
    84.     exc04        descr_idt
    85.     exc05        descr_idt
    86.     exc06        descr_idt
    87.     exc07        descr_idt
    88.     exc08        descr_idt
    89.     exc09        descr_idt
    90.     exc0a        descr_idt
    91.     exc0b        descr_idt
    92.     exc0c        descr_idt
    93.     exc0d        descr_idt
    94.     exc0e        descr_idt
    95.     exc0f        descr_idt
    96.     exc10        descr_idt
    97.     exc11        descr_idt
    98.     exc12        descr_idt
    99.     exc13        descr_idt
    100.     exc14        descr_idt
    101.     exc15        descr_idt
    102.     exc16        descr_idt
    103.     exc17        descr_idt
    104.     exc18        descr_idt
    105.     exc19        descr_idt
    106.     exc1a        descr_idt
    107.     exc1b        descr_idt
    108.     exc1c        descr_idt
    109.     exc1d        descr_idt
    110.     exc1e        descr_idt
    111.     exc1f        descr_idt
    112. ;Вентили аппаратных прерываний
    113.     timer        descr_idt ;int 20h-irq0
    114.     keyboard         descr_idt ;int 21h-irq1
    115.     dummy_iret0      descr_idt ;int 22h-irq2
    116.     dummy_iret1      descr_idt ;int 23h-irq3
    117.     dummy_iret2      descr_idt ;int 24h-irq4
    118.     dummy_iret3      descr_idt ;int 25h-irq5
    119.     dummy_iret4      descr_idt ;int 26h-irq6
    120.     dummy_iret5      descr_idt ;int 27h-irq7
    121.     dummy_iret6      descr_idt ;int 28h-irq8
    122.     dummy_iret7      descr_idt ;int 29h-irq9
    123.     dummy_iret8      descr_idt ;int 2ah-irq10
    124.     dummy_iret9      descr_idt ;int 2bh-irq11
    125.     dummy_ireta      descr_idt ;int 2ch-irq12
    126.     dummy_iretb      descr_idt ;int 2dh-irq13
    127.     dummy_iretc      descr_idt ;int 2eh-irq14
    128.     dummy_iretd      descr_idt ;int 2fh-irq15
    129. ;Вентиль прерывания
    130.     int30h       descr_idt
    131. idt_size=$-idt
    132.  
    133. label idtr fword
    134.          dw idt_size-1
    135.       idtr_base: dd 0
    136.  
    137. ;Макрос заполняет дескрипторы прерываний
    138. macro load_descr_idt des,offset,selector,type_atr
    139. {
    140.       ;Переопределяем указатели
    141.       des.offset1  equ des
    142.       des.selector equ des+2
    143.       des.type_atr equ des+5
    144.       des.offset2  equ des+6
    145.  
    146.       ;Заполняем смещение
    147.       xor eax,eax
    148.       mov eax,offset
    149.       mov [des.offset1],ax
    150.       shr eax,16
    151.       mov [des.offset2],ax
    152.  
    153.       ;Заполняем селектор
    154.       xor eax,eax
    155.       mov eax,selector
    156.       mov [des.selector],eax
    157.  
    158.       ;Устанавливаем атрибуты и тип вентиля
    159.       xor eax,eax
    160.       mov eax,type_atr
    161.       mov [des.type_atr],eax
    162. }




    обработчики писать не буду там ничего особенного
     
  5. ava

    ava New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2003
    Сообщения:
    169
    Мда. Душераздирающее зрелище.

    Рано тебе еще ОСь писать.

    Разбирайся со своим кодом сам.

    Советую прикрутить к обработчикам исключений дампер регистров (и кода ошибки).



    P. S. Код лучше выкладывать в аттаче.
     
  6. DimoK

    DimoK New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2005
    Сообщения:
    5
    Адрес:
    Russia
    А чё не нравится

    всё по полочкам разложено
     
  7. DimoK

    DimoK New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2005
    Сообщения:
    5
    Адрес:
    Russia
    Щас с многозадачностью разберусь и всё пучком будет

    Мне надо то написать ось в которой хотя бы была консоль и работало одновременно пару простеньких программ типа Hello World
     
  8. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Советую прикрутить к обработчикам исключений дампер регистров (и кода ошибки).



    Ага, самое главное - cs:eip и байтов 8 по ним. Чтобы понять, где возникает проблема. И весь код, в том числе и вызов int 30h, обработчики.
     
  9. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
  10. unic

    unic New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1
    Адрес:
    perm
    Учись писать понятный и наглядный КОД!