Создание ОС. Проблема

Тема в разделе "WASM.OS.DEVEL", создана пользователем Wedge, 8 авг 2008.

  1. Wedge

    Wedge New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2008
    Сообщения:
    8
    Доброго дня всем.
    Выкопал я в сети сборник статей "Разработка операционных систем". Решил поглядеть, работает ли. Дошел до обработки прерываний. Скомпилировал - не работает. В bochs ошибка : IOAPCI: Write to unsupported address.

    Ошибка именно в этой строке:

    #define IDT_TABLE 0x100000
    #define IDT_REG 0x100800
    #define SYS_CODE_SELECTOR 8

    asm("lidt 0(,%0,)"::"a"(IDT_REG));

    Вопрос: в чем проблемa?
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Этих сборников. Поодной строчки судить трудно. Прерывания запрещены?
    Синтаксис чето не пойму ты что загружаешь регистр с адресса IDT_REG ? А регистр чего содержит.
     
  3. Wedge

    Wedge New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2008
    Сообщения:
    8
    ща весь код постану

    instlib.c :
    функции установки прерываний
    Код (Text):
    1. #define IDT_TABLE 0x100000
    2. #define IDT_REG 0x100800
    3. #define SYS_CODE_SELECTOR 8
    4.  
    5. void i_install(unsigned char vector, void (*func)(), unsigned char type)
    6. {
    7.   char * idt_table=IDT_TABLE;
    8.  
    9.   unsigned char i;
    10.   unsigned char b[8];
    11.  
    12.   b[0]=  (unsigned int)func & 0x000000FF;
    13.   b[1]=( (unsigned int)func & 0x0000FF00) >> 8;
    14.   b[2]=SYS_CODE_SELECTOR;
    15.   b[3]=0;
    16.   b[4]=0;
    17.   b[5]=type;
    18.   b[6]=( (unsigned int)func & 0x00FF0000) >> 16;
    19.   b[7]=( (unsigned int)func & 0xFF000000) >> 24;
    20.  
    21.  
    22.  
    23.   for(i=0;i<8;i++){
    24.     *(idt_table+vector*8+i)=b[i];
    25.   }
    26.  
    27.  
    28. }
    29.  
    30. //Включение обработки прерываний
    31. void i_setup()
    32. {
    33.   unsigned short *table_limit = IDT_REG;
    34.   unsigned int *table_address = IDT_REG+2;
    35.  
    36.   *table_limit = 256*8 - 1;
    37.   *table_address = IDT_TABLE;
    38.  
    39.   asm("lidt 0(,%0,)"::"a"(IDT_REG));
    40. }
    41.  
    42.  
    43.  
    44.  
    45. void i_enable()
    46. {
    47.   asm("sti");
    48. }
    49.  
    50. void i_disable()
    51. {
    52.   asm("cli");
    53. }
    Код (Text):
    1. void init_interrupts()
    2. {
    3.   i_install(0x20, &irq_timer, 0x8e);
    4.   i_install(0x21, &irq_keyboard, 0x8e);
    5.   i_setup();
    6.   i_enable();
    7. }
     
  4. Wedge

    Wedge New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2008
    Сообщения:
    8
    ЗЫ. Это выдрано из сборника :)
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Перед загрузкой IDT нужно замаскировать прерывания, а после размаскировать.
    NMI тоже надо маскировать перед установкой
    Порт 70h
    Бит 7 если 1 то NMI – разрешены иначе если 0 то NMI-запрещены
    NMI – Не маскируемые прерывания.


    PS. А использовать Intel'овский синтекс религия не позволяет?
     
  6. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Wedge чеза сборник дай ссылку, если не трудно
     
  7. Wedge

    Wedge New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2008
    Сообщения:
    8
    на sysbin.com
    http://www.sysbin.com/files/lowlevel/osdev1.htm
     
  8. Wedge

    Wedge New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2008
    Сообщения:
    8
    NMI убиты в загрузчике
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Wedge
    Тогда похоже баг боша. попробуй другую версию.
     
  10. Wedge

    Wedge New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2008
    Сообщения:
    8
    пробовал VMWare, тоже не работает
     
  11. ExMike

    ExMike New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    8
    собственно по тому учебнику тоже делаю, и когда реализовал что бы можно было писать загружается ядро и сразу вмварка уходит в даун после нажатия любого символа...
    Wedge
    если дошел дальше 11 урока, покажи свой kernel.c :)
     
  12. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    ExMike
    Я в свое время видил много примеров. И статей по разработке. Вот с них и начинал. Но всеравно читал документацию.

    Если уходит в даун по нажатию то неверно обрабатываешь прерывания. Скорее всего размаскированны прерывания, а ошибка в таблице прерываний или обработчике прерываний. Еще могут быть ошибки со стеком и сегментыми регистрами. Обработчики исключений и ловушек нужно добавить тогда перезагружаться не будет, а будет в них попадать.
     
  13. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Wedge
    Столько багов.
    Вот еще один нашел. cli маскирует прерывания sti де маскирует прерывания. Лучши демаскировать только для которых есть обработчики, а это делается через програмирование контроллера. А теперь собственно бага перепрограмирован только ведущий контроллер прерываний, а надо и ведомый тоже. Или замаскировать его.
     
  14. Wedge

    Wedge New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2008
    Сообщения:
    8
    И как это сделать?
     
  15. ExMike

    ExMike New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    8
    Pavia
    да пасиб, там походу адрес криво указан...
     
  16. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Wedge
    Дай лучши образ я посмотрю что нетак IOAPIC.

    От жары мозги уже плавяться. У второго вектор и так выши. Чето сразу не подумал. Можно нетрогать. А вот прерывания я бы не стал все размаскировать. Для этого их надо замаскировать на саомм контроллере. При помощи OCW1

    MOV AL, 0FCh // Таймер, клава размаскированы
    OUT 21h, AL
    Ведомы замасирован так как он подключен по второй линии к первому.
     
  17. ExMike

    ExMike New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    8
    Пофиксил свою траблу сенк 2Pavia
    вместо в ставки асма в си, переписали просто на асм и всё чудом запахало)
     
  18. Wedge

    Wedge New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2008
    Сообщения:
    8
    ExMike
    кинь плиз исходник )
    У мя тоже моск расплавился