создание ОС на FASM

Тема в разделе "WASM.OS.DEVEL", создана пользователем vova65, 21 сен 2011.

  1. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    Доброго времени суток!
    Помогите пожалуйста с загрузчиком OС

    при тестировании кода на Oracle VM выводится строка Starting OS и возникает ошибка

    как мне понять что за ошибка и как ее исправить????

    прошу сильно не пинать я в этом новичек...

    Код (Text):
    1.  use16
    2.  org 7C00h
    3.  ;org 100h
    4.  start:
    5.  jmp 0000h:entr ;теперь CS=0, IP=0x7c00
    6.  entr:
    7.  ;---------------------------------------------------------
    8.  macro zPR {
    9.  cli ; Запретить прерывания
    10.  ; Запретить(NMI)
    11.  in al,70h
    12.  or al,80h
    13.  out 70h,al
    14.  }
    15.  macro rPR {; разрешить(NMI)
    16.  in al,70h
    17.  and al,07Fh
    18.  out 70h,al
    19.  sti ; разрешить прерывания
    20.  }
    21.  macro A20 {; Открыть линию A20
    22.  in al,92h
    23.  or al,2
    24.  out 92h,al
    25.  }
    26.  macro pMode {
    27.  mov eax,cr0
    28.  or al,1
    29.  mov cr0,eax
    30.  }
    31.  macro tex t{
    32.  mov edi,0B8000h;
    33.  mov esi,t
    34.  int 20h
    35.  }
    36.  ;---------------------------------------------------------
    37.  mov al,12h
    38.  int 10h
    39.  
    40.  push cs
    41.  pop ds
    42.  
    43.  A20
    44.  ;Загрузить адрес и размер GDT в GDTR
    45.  lgdt [gdtr]
    46.  ;Загрузить адрес и размер IDT в IDTR
    47.  lidt [idtr]
    48.  ;-----------------------------------
    49.  zPR
    50.  ; Переключиться в защищённый режим
    51.  pMode
    52.  ;
    53.  jmp 00001000bm_entry
    54.  ;32-битная адресация
    55.  use32
    56.  ;Точка входа в защищенный режим
    57.  pm_entry:
    58.  mov ax,cs
    59.  mov ds,ax
    60.  mov es,ax
    61.  
    62.  rPR
    63.  ; вывод на экран
    64.  tex msg
    65.  ;
    66.  jmp $
    67.  
    68.  
    69.  ret
    70.  msg db 'Starting OS',0
    71.  
    72.  exit2: ;обработчик int
    73.  cld
    74.  loo1:
    75.  lodsb
    76.  test al,al
    77.  stosb
    78.  mov al,7
    79.  stosb
    80.  jnz loo1
    81.  ;jmp ex1
    82.  iretd
    83.  
    84.  
    85.  ;IDT
    86.  idt:
    87.  dd 0,0 ;0
    88.  dd 0,0 ;1
    89.  dd 0,0 ;2
    90.  dd 0,0 ;3
    91.  dd 0,0 ;4
    92.  dd 0,0 ;5
    93.  dd 0,0 ;6
    94.  dd 0,0 ;8
    95.  dd 0,0 ;9
    96.  dd 0,0 ;10
    97.  dd 0,0 ;11
    98.  dd 0,0 ;12
    99.  dd 0,0 ;13
    100.  dd 0,0 ;14
    101.  dd 0,0 ;15
    102.  dd 0,0 ;16
    103.  dd 0,0 ;17
    104.  dd 0,0 ;18
    105.  dd 0,0 ;19
    106.  dd 0,0 ;20
    107.  dd 0,0 ;21
    108.  dd 0,0 ;22
    109.  dd 0,0 ;23
    110.  dd 0,0 ;24
    111.  dd 0,0 ;25
    112.  dd 0,0 ;26
    113.  dd 0,0 ;27
    114.  dd 0,0 ;28
    115.  dd 0,0 ;29
    116.  dd 0,0 ;30
    117.  dd 0,0 ;31
    118.  dw exit2, 08h, 1000111000000000b, 0;32
    119.  dw exit2, 08h, 1000111000000000b, 0 ; 33
    120.  
    121.  idt_size equ $ - gdt
    122.  idtr:
    123.  dw idt_size - 1
    124.  dd idt
    125.  ;GDT.
    126.  gdt:
    127.  db 8 dup (0)
    128.  ; (10h) Code segment, read/execute, nonconforming
    129.  dw 0FFFFh
    130.  dw 0
    131.  db 0
    132.  db 10011010b
    133.  db 11001111b
    134.  db 0
    135.  
    136.  ; (18h) Data segment, read/write, expand down
    137.  dw 0FFFFh
    138.  dw 0
    139.  db 0
    140.  db 10010010b
    141.  db 11001111b
    142.  db 0
    143.  gdt_size equ $ - gdt
    144.  gdtr:
    145.  dw gdt_size - 1
    146.  dd gdt
    147.  ;------------------------------------------------------------------------
    148.  times 510-($-start) db 00h
    149.  db 055h, 0AAh
     
  2. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Лог бокса:
    Код (Text):
    1. 00002227327e[CPU0 ] write_virtual_checks(): no write access to seg
    2. 00002227327i[CPU0 ] CPU is in protected mode (active)
    3. 00002227327i[CPU0 ] CS.d_b = 32 bit
    4. 00002227327i[CPU0 ] SS.d_b = 16 bit
    5. 00002227327i[CPU0 ] | EAX=00000053  EBX=00000000  ECX=00000000  EDX=00000000
    6. 00002227327i[CPU0 ] | ESP=0000ffd0  EBP=00000000  ESI=00007c4d  EDI=000b8000
    7. 00002227327i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af PF cf
    8. 00002227327i[CPU0 ] | SEG selector     base    limit G D
    9. 00002227327i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
    10. 00002227327i[CPU0 ] |  CS:0008( 0001| 0|  0) 00000000 000fffff 1 1
    11. 00002227327i[CPU0 ] |  DS:0008( 0001| 0|  0) 00000000 000fffff 1 1
    12. 00002227327i[CPU0 ] |  SS:0000( 0005| 0|  0) 00000000 0000ffff 0 0
    13. 00002227327i[CPU0 ] |  ES:0008( 0001| 0|  0) 00000000 000fffff 1 1
    14. 00002227327i[CPU0 ] |  FS:0000( 0005| 0|  0) 00000000 0000ffff 0 0
    15. 00002227327i[CPU0 ] |  GS:0000( 0005| 0|  0) 00000000 0000ffff 0 0
    16. 00002227327i[CPU0 ] | EIP=00007c5c (00007c5c)
    17. 00002227327i[CPU0 ] | CR0=0x00000011 CR1=0 CR2=0x00000000
    18. 00002227327i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
    19. 00002227327i[CPU0 ] >> stosb byte ptr es:[edi], al : AA
    20. 00002227327e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
     
  3. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    От себя хочу сказать, что не нужно все тянуть в первичный загрузчик. У него другие задачи. И не нужно выкладывать код, делающие много чего, не локализовав место ошибки. Код создается поэтапно, данная ошибка появляется на определенном этапе, а не как результат сочетания действий.
     
  4. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    Если не сложно Phantom_84 то объясните пожалуйста:
    - Где Вы взяли лог бокса? (а то я как-то не могу у себя в файле VBox.log найти подобных строк)
    - что этот лог значит? (а то я три недели назад начал изучать FASM и еще неочень разбираюсь в FASMe...)

    Если знаете то может посоветуете хорошие учебники по работе железа и написания OS на ASM (хочу в идеале выучить работу ПК на низком уровне)
     
  5. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    я как-то еще не-очень понял как в первичном загрузчике загрузить вторичный загрузчик с USB флешки на которой помимо первичного загрузчика есть другие файлы...
    насколько я понимаю то вторичный загрузчик нужно записывать на флешке сразу после первичного загрузчика и потом в первичном с помощью BIOS считывать вторичный загрузчик. Только как..?

    Обычно я решаю свои проблемы сам? и не особо пользуюсь форумами. Но так как с ASM не нашел толковых учебников то только догадываюсь о месте ошибке вот и выклал весь код чтоб наверняка :) Если я смогу локализовать место ошибки то я и смогу разобраться как ее устранить...
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    vova65
    1. Рекомендуется до вызова прерывания и процедур настроить стек.
    2. После перехода в защищенный режим стековый сегмент уже обязательно надо настроить.
    2. Ошибки проще всего искать в Bochs.
    3. По поводу основной ошибки. Она элементарная легко найдёшь в отладчике.
    4. Ошибок много так что фантом прав не надо спешить.
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Это лог не виртуал бокса, а просто бокса (bochs'а) :)
    По-моему все предельно понятно. Общий смысл: "пишешь в сегмент, недоступный для записи, командой stosb".

    Pavia прав. Ты должен все что используешь настроить сам: сегментные регистры, указатель стека, указатель инструкций, флаг прерываний, флаг направления и т.д. и т.п.
     
  8. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    как создать img образ usb флешки для запуска в Bochs
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Образ флешки - копипаст всех секторов в файл. Но в эмуляторах обычно не используется понятие "образ флешки". Жесткий диск, флоппик, CD/DVD. Совсем рядом была соответствующая тема.
     
  10. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    Помогите пожалуйста разобраться что это за ошибка и как ее исправить...

    Код (Text):
    1. 00044174192i[CPU0 ] CPU is in protected mode (active)
    2. 00044174192i[CPU0 ] CS.d_b = 32 bit
    3. 00044174192i[CPU0 ] SS.d_b = 16 bit
    4. 00044174192i[CPU0 ] EFER   = 0x00000000
    5. 00044174192i[CPU0 ] | RAX=000000006000007f  RBX=0000000000007e00
    6. 00044174192i[CPU0 ] | RCX=0000000000000002  RDX=0000000000000000
    7. 00044174192i[CPU0 ] | RSP=0000000000007c00  RBP=0000000000007c00
    8. 00044174192i[CPU0 ] | RSI=00000000000e32f8  RDI=000000000000ffac
    9. 00044174192i[CPU0 ] |  R8=0000000000000000   R9=0000000000000000
    10. 00044174192i[CPU0 ] | R10=0000000000000000  R11=0000000000000000
    11. 00044174192i[CPU0 ] | R12=0000000000000000  R13=0000000000000000
    12. 00044174192i[CPU0 ] | R14=0000000000000000  R15=0000000000000000
    13. 00044174192i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df IF tf sf zf af pf cf
    14. 00044174192i[CPU0 ] | SEG selector     base    limit G D
    15. 00044174192i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
    16. 00044174192i[CPU0 ] |  CS:0008( 0001| 0|  0) 00000000 ffffffff 1 1
    17. 00044174192i[CPU0 ] |  DS:0008( 0001| 0|  0) 00000000 ffffffff 1 1
    18. 00044174192i[CPU0 ] |  SS:0000( 0005| 0|  0) 00000000 0000ffff 0 0
    19. 00044174192i[CPU0 ] |  ES:0008( 0001| 0|  0) 00000000 ffffffff 1 1
    20. 00044174192i[CPU0 ] |  FS:0000( 0005| 0|  0) 00000000 0000ffff 0 0
    21. 00044174192i[CPU0 ] |  GS:0000( 0005| 0|  0) 00000000 0000ffff 0 0
    22. 00044174192i[CPU0 ] |  MSR_FS_BASE:0000000000000000
    23. 00044174192i[CPU0 ] |  MSR_GS_BASE:0000000000000000
    24. 00044174192i[CPU0 ] | RIP=0000000000007e32 (0000000000007e32)
    25. 00044174192i[CPU0 ] | CR0=0x60000011 CR2=0x0000000000000000
    26. 00044174192i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
    27. 00044174192i[CPU0 ] 0x0000000000007e32>> jmp .-2 (0x00007e32) : EBFE
    28. 00044174192e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown
    29.  status is 00h, resetting
     
  11. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    vova65
    Я так понял по логам это у тебя тройная-ошибка. Прерывания ты разрешаешь, а обрабатывать не обрабатываешь.
     
  12. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    Pavia
    и как эту тройную-ошибку исправить???
     
  13. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Два варианта.
    1) Не разрешать прерывания.
    2) Настроить контролёр прерываний, повесть обработчики прерываний по крайней мере заглушки и разрешить прерывания.
     
  14. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    как настраивается контролёр прерываний? а то я перерыл кучу литературы и толком не понял :dntknw:
     
  15. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    vova65
    Ничего процесс обучения человека идет во первых по кривой во вторых ступенчато. Так что как только прочитали теорию её надо пробовать пока не забыли. И по хорошему повторить это через несколько дней. Тогда знания будут накапливаться.

    А если ближе к существу то, что конкретно не поняли?
    Тут у меня приведено краткое описание.
    http://www.wasm.ru/forum/viewtopic.php?pid=423397#p423397
     
  16. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    после просмотра информации по вышеуказанной ссылке, непонимания исчезли...
     
  17. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    Как вывести на экран русскоязычную букву используя видеобуфер по адресу 0B800h..????
     
  18. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    vova65
    Тут пример того, как подменить карту символов, но сам вывод строки через int 10h. Просто замените на вывод в b8000h.
     
  19. vova65

    vova65 New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2011
    Сообщения:
    56
    что значит строка лога...???

    Код (Text):
    1. 00046603999e[CPU0 ] fetch_raw_descriptor: GDT: index (7f3f) fe7 > limit (1f)
     
  20. Phantom_84

    Phantom_84 New Member

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