Многозадачность - собственная реализация

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

  1. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    тут просто попытка использовать многозадачность
    проблема в том, что на bochs-е все ОК, а на реальной машине идет перезагрузка
    Код (Text):
    1. format binary
    2.  
    3. CODE_32_SEGMENT         = 0x0050
    4. CODE_32_SECTORS_COUNT   = 4096 / 512
    5. STACK_SIZE              = 512
    6. HEAD_STACK_ESP          = 0x90000 + STACK_SIZE
    7. INTERRUPT_STACK_ESP     = HEAD_STACK_ESP + STACK_SIZE
    8.  
    9. org 7C00h
    10. use16   ; 16-bit code
    11.     mov ax, 3
    12.     int 0x10
    13.     mov cl, 2   ; read from sector with number 2
    14.     xor ch, ch
    15.     xor dh, dh
    16.     mov ax, CODE_32_SEGMENT
    17.     mov es, ax
    18.     xor bx, bx
    19.     mov ax, 0x0200 OR CODE_32_SECTORS_COUNT
    20.     int 13h
    21.     jmp CODE_32_SEGMENT:0000h
    22. align 512  
    23.  
    24. org CODE_32_SEGMENT SHL 4
    25. use16
    26.     xor ax, ax
    27.     mov ds, ax
    28.     db  0x66   
    29.     lgdt [gdtr]
    30.     cli
    31.     in  al, 0x70
    32.     or  al, 0x80
    33.     out 0x70, al   
    34.     in  al, 0x92
    35.     or  al, 2
    36.     out 0x92, al   
    37.     mov eax, cr0
    38.     or  al, 1
    39.     mov cr0, eax
    40.     db  0x66
    41.     db  0xEA
    42.     dd  startup_32 
    43.     dw  1 SHL 3
    44. use32
    45. startup_32:
    46.     mov eax, 2 SHL 3
    47.     mov ds, ax
    48.     mov ss, ax
    49.     xor eax, eax
    50.     mov es, ax
    51.     mov esp, HEAD_STACK_ESP
    52.     mov eax, 4 SHL 3   
    53.     ltr ax
    54.     mov ecx, 10
    55. @@:
    56.     call 3 SHL 3:0000h
    57.     dec ecx
    58.     jnz @B
    59.         hlt
    60.  
    61. @@:
    62.     iretd
    63. handler_beginning:
    64.     mov dword [ebx], eax
    65.     add ebx, 2
    66.     inc eax
    67.     jmp @B
    68.  
    69. gdtr:
    70.     dw  BOOT_GDT_TABLE - 1
    71.     dd  gdt
    72. gdt:
    73.     dq  0x0000000000000000
    74.     dq  0x00CF98000000FFFF  ; 32-bit code
    75.     dq  0x00CF92000000FFFF  ; 32-bit data
    76.  
    77. ; interrupt TSS descriptor
    78. macro __TSS_DESCRIPTOR__ address, flags {
    79.     dw  0x0067  ; TSS limit
    80.     dw  address AND 0x0000FFFF
    81.     db  (address AND 0x00FF0000) SHR 16
    82.     db  flags
    83.     db  0
    84.     db  (address AND 0xFF000000) SHR 24
    85. }
    86. ; TSS descriptors
    87.     __TSS_DESCRIPTOR__  task_tss, 0x89
    88.     __TSS_DESCRIPTOR__  head_tss, 0x89
    89.  
    90. ; LDT descriptor for task switching
    91.     dq  0x000082000000FFFF
    92.  
    93. BOOT_GDT_TABLE = $ - gdt
    94.  
    95. task_tss:
    96.     dd  0   ; previos TSS descriptor selector
    97.     dd  INTERRUPT_STACK_ESP ; ring0 ESP
    98.     dd  2 SHL 3
    99.     dd  5 dup(0)    ; ring1 ESP, ring2 ESP, ring1 selector, ring2 selector, cr3
    100.     dd  handler_beginning
    101.     dd  0   ; eflags
    102.     dd  0x0F30  ; eax
    103.     dd  2 dup(0)    ; ecx, edx
    104.     dd  0xB800 SHL 4    ; ebx
    105.     dd  INTERRUPT_STACK_ESP ; esp
    106.     dd  4 dup(0)    ; ebp, esi, edi, es
    107.     dd  1 SHL 3 ; cs
    108.     dd  2 dup(2 SHL 3)  ; ss, ds
    109.     dd  2 dup(0)    ; fs, gs
    110.     dd  5 SHL 3 ; LDT selector
    111.     dd  0
    112.  
    113. head_tss:
    114.     db  96 dup(0)
    115.     dd  5 SHL 3 ; LDT selector
    116.     dd  0
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    могу посоветовать протестить на vmware еще. код смотреть ща времени нету(
     
  3. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    VMWare say Kernel Stack Fault :dntknw:
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    добавь обработку исключений себе.. будет легче)
    сделай чтоб выводился дамп контекста при исключении
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Тоже еще не смотрел внимательно, но автору топика посоветую с помощью 'jmp $' найти инструкцию, которая вызывает перезагрузку. Так будет проще найти ошибку. (Почему-то подозреваю, что это 'ltr')
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    проще обработку исключений добавить)

    перезагрузка процессора инициируется скорее всего по следующей причине: какая-то неправильная инструкция генерирует исключение, допустим, #GP (General Protection). Т.к. обработчика у этого исключения нету (сброшен бит Present в IDT у этого вектора), процессор генерирует исключение двойной ошибки #DF (Double Fault). Т.к. не находится обработчика и у этого исключения, продолжение работы невозможно (оно невозможно в любом случае при генерации Double Fault), процессор переходит в shutdown-режим. Чипсет обнаруживает, что процессор "отбросил коньки" и выставляет сигнал #RESET
     
  7. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    нет
    перезагрузка идет тут
    Код (Text):
    1. @@:
    2.     call 3 SHL 3:0000h ; идет первый вызов
    3.     dec ecx ; а вот сюда возврата нет
    4.     jnz @B
    5.         hlt
    6.  
    7. @@:
    8.     iretd ; ошибка тут, потому как на dec ecx перехода нет
    9. handler_beginning:
    10.     mov dword [ebx], eax ; нормально выводит 0
    11.     add ebx, 2
    12.     inc eax
    13.     jmp @B ; переходит на iretd
    не знаю, почему дальше iretd дело не идет
    NT установлен, селектор-линк в TSS правильный, селекторы сегментных регистров тоже...
     
  8. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    ну не знаю, пошагово прогонял в Bochs, ничего подозрительного не замечал (кстати Bochs тоже :))
     
  9. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Код (Text):
    1. format binary
    2.  
    3. CODE_32_SEGMENT         = 0x0050
    4. CODE_32_SECTORS_COUNT   = 4096 / 512
    5. STACK_SIZE              = 512
    6. HEAD_STACK_ESP          = 0x90000 + STACK_SIZE
    7. INTERRUPT_STACK_ESP     = HEAD_STACK_ESP + STACK_SIZE
    8.  
    9. org 7C00h
    10. use16   ; 16-bit code
    11.     mov ax, 3
    12.     int 0x10
    13.     mov cl, 2   ; read from sector with number 2
    14.     xor ch, ch
    15.     xor dh, dh
    16.     mov ax, CODE_32_SEGMENT
    17.     mov es, ax
    18.     xor bx, bx  ; offset in segment
    19.     mov ax, 0x0200 OR CODE_32_SECTORS_COUNT
    20.     int 13h ; read sectors
    21.     jmp CODE_32_SEGMENT:0000h
    22. align 512   ; end of first sector
    23.  
    24. org CODE_32_SEGMENT SHL 4
    25. use16
    26.     xor ax, ax
    27.     mov ds, ax
    28.     db  0x66
    29.     lgdt [gdtr]
    30.     cli
    31.     in  al, 0x70
    32.     or  al, 0x80
    33.     out 0x70, al
    34.     in  al, 0x92
    35.     or  al, 2
    36.     out 0x92, al
    37.     mov eax, cr0
    38.     or  al, 1
    39.     mov cr0, eax
    40.     db  0x66
    41.     db  0xEA
    42.     dd  startup_32
    43.     dw  1 SHL 3
    44. use32
    45. startup_32:
    46.     mov eax, 2 SHL 3
    47.     mov ds, ax
    48.     mov ss, ax
    49.     xor eax, eax
    50.     mov es, ax
    51.     mov esp, HEAD_STACK_ESP ; set stack
    52.     mov eax, 4 SHL 3    ; head TSS descriptor selector
    53.     ltr ax
    54.     lidt [idtr]
    55.     mov ecx, 10
    56. @@:
    57.     call 3 SHL 3:0000h
    58.     dec ecx
    59.     jnz @B
    60.     hlt
    61.  
    62. print:
    63.         mov ebx, 0xB8000
    64.         mov ecx, 32
    65. @@:
    66.         mov edx, 0x0F30
    67.         shl eax, 1
    68.         adc edx, 0
    69.         mov dword [ebx], edx
    70.         add ebx, 2
    71.         dec ecx
    72.         jnz @B
    73.     ret
    74.  
    75. exception:
    76. repeat 0x20
    77.     mov eax, % - 1
    78.     call print
    79.     hlt
    80. align 16
    81. end repeat
    82.  
    83. @@:
    84.     iretd
    85. handler_beginning:
    86.     mov dword [ebx], eax
    87.     add ebx, 2
    88.     inc eax
    89.     jmp @B
    90.  
    91. gdtr:
    92.     dw  BOOT_GDT_TABLE - 1
    93.     dd  gdt
    94. gdt:
    95.     dq  0x0000000000000000
    96.     dq  0x00CF98000000FFFF  ; 32-bit code
    97.     dq  0x00CF92000000FFFF  ; 32-bit data
    98.  
    99. ; interrupt TSS descriptor
    100. macro __TSS_DESCRIPTOR__ address, flags {
    101.     dw  0x0067  ; TSS limit
    102.     dw  address AND 0x0000FFFF
    103.     db  (address AND 0x00FF0000) SHR 16
    104.     db  flags
    105.     db  0
    106.     db  (address AND 0xFF000000) SHR 24
    107. }
    108. ; TSS descriptors
    109.     __TSS_DESCRIPTOR__  interrupt_tss, 0x89
    110.     __TSS_DESCRIPTOR__  head_tss, 0x89
    111.  
    112. ; LDT descriptor for task switching
    113.     dq  0x000082000000FFFF
    114.  
    115. BOOT_GDT_TABLE = $ - gdt
    116.  
    117. idtr:
    118.     dw  BOOT_IDT_TABLE - 1
    119.     dd  idt
    120. idt:
    121.  
    122. repeat 0x20
    123.     dw  (exception + ((% - 1) SHL 4)) AND 0x0000FFFF
    124.     dw  1 SHL 3
    125.     db  0
    126.     db  0x8E
    127.     dw  ((exception + ((% - 1) SHL 4)) AND 0xFFFF0000) SHR 16
    128. end repeat
    129.  
    130. BOOT_IDT_TABLE = $ - idt
    131.  
    132. interrupt_tss:
    133.     dd  0   ; previos TSS descriptor selector
    134.     dd  INTERRUPT_STACK_ESP ; ring0 ESP
    135.     dd  2 SHL 3
    136.     dd  5 dup(0)    ; ring1 ESP, ring2 ESP, ring1 selector, ring2 selector, cr3
    137.     dd  handler_beginning
    138.     dd  0   ; eflags (changed from code)
    139.     dd  0x0F30  ; eax
    140.     dd  2 dup(0)    ; ecx, edx
    141.     dd  0xB800 SHL 4    ; ebx
    142.     dd  INTERRUPT_STACK_ESP ; esp
    143.     dd  4 dup(0)    ; ebp, esi, edi, es
    144.     dd  1 SHL 3 ; cs
    145.     dd  2 dup(2 SHL 3)  ; ss, ds
    146.     dd  2 dup(0)    ; fs, gs
    147.     dd  5 SHL 3 ; LDT selector
    148.     dd  0
    149.  
    150. head_tss:
    151.     db  96 dup(0)   ; first filled when APIC generate interrupt
    152.     dd  5 SHL 3 ; LDT selector
    153.     dd  0
    исключение #TS
     
  10. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    rei3er
    Причина исключения найдена? Интересно все-таки, в чем дело.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
  12. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    дело вот в чем
    Код (Text):
    1. mov ds, ax
    2. mov ss, ax
    3. xor   eax, eax
    4. mov es, ax
    fs и gs на реальной машине и в VMWare оказывались в неопределенном состоянии
    в то время как в Bochs в них был загружен нулевой селектор, что и давало в итоге правильный результат на этом эмуляторе
    реальный код BIOS, вероятно для каких-то целей эти регистры использовал, тем самым делая их ненулевыми, а т. к у меня в коде они не обнуляются, в итоге при выполнении iretd из TSS (куда селекторы предварительно записывались) в fs и gs процессор пытался закэшировать дескрипторы, которых на самом деле в GDT не было, что и приводило к исключению
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    хм.. ) будем знать насчет использования FS & GS в биосе