Сейчас на форуме: zds, UniSoft (+5 невидимых)

 eXeL@B —› Программирование —› комп просто напросто перезагружается.
Посл.ответ Сообщение

Ранг: 16.2 (новичок), 11thx
Активность: 0.030
Статус: Участник

Создано: 30 января 2013 20:52 · Поправил: Abraham
· Личное сообщение · #1

Привет!При написании загрузчика, для своей ОС, я столкнулся вот с такой проблемой: при переводе CPU в UNREAL MODE (нереальный режим) комп просто напросто перезагружается. Я в сети находил много примеров по переводу процессора в нереальный режим, но они были написаны на TASM (пытался перевести на NASM, но эффект тот же самый) или вовсе нерабочие!!! Листал многие книги (Зубков, Кулаков …) Но результат нулевой ? !!! Вот мой исходничек, укажите на ошибку или предложите свой вариант (желательно для NASM):
Code:
  1.  [BITS 16]
  2.  [ORG 0X7C00]
  3.  start:
  4.  cli
  5.  
  6.  mov ax, cs
  7.  mov ds, ax
  8.  mov ss, ax
  9.  mov sp, 0x7c00
  10.  
  11.  xor al,al
  12.  out 0x70, al
  13.  
  14.  lgdt [GDTR]
  15.  
  16.  in al,0x92
  17.  or al, 2
  18.  out 0x92, al
  19.  
  20.  mov eax,CR0
  21.  or al, 1
  22.  mov CR0, eax
  23.  
  24.  JMP PROTECTED_MODE
  25.  
  26.  [BITS 32]
  27.  
  28.  
  29.  PROTECTED_MODE:
  30.  
  31.  mov ax, 8
  32.  mov ds, ax
  33.  mov es, ax
  34.  mov fs, ax
  35.  mov gs, ax
  36. ;ВОТ НА ЭТОМ МЕСТЕ ОН И ПЕРЕЗАГРУЖАЕТСЯ, ВИДИМО, ЧТО-ТО ЕГО НЕ УСТРАИВАЕТ В СЕГМЕНТНЫХ РЕГИСТРАХ mov eax,cr0
  37.  and al, 0xfe
  38.  mov cr0,eax
  39.  
  40.  jmp GO
  41.  
  42.  gdt:
  43.  dd 0,0
  44.  descr_code db 0FFh,0FFh,0,0,0,1001001b,11001111b,0
  45.  
  46.  GDTR:
  47.  dw 8*2-1
  48.  dd gdt
  49.  
  50.  GO:
  51.  xor ax,ax
  52.  mov ds,ax
  53.  mov es,ax
  54.  mov fs,ax
  55.  mov gs,ax
  56.  
  57.  in al,70h 
  58.  and al,07Fh 
  59.  out 70h,al
  60.  
  61.  sti
  62.  
  63.  mov ax,cs
  64.  mov ds,ax




Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 30 января 2013 21:15
· Личное сообщение · #2

Не помню как в нереальном, а в защищенном надо отключать маскируемые и немаскируемые прерывания, либо настраивать IDT, тк при первом же тике таймера будет исключение, тк не обрабатывается то будет DE, которое тоже не обрабатывается что и приводит к перезагрузке.




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 31 января 2013 10:52 · Поправил: OKOB
· Личное сообщение · #3

Почитайте

Защищенный режим процессоров Intel 80286/80386/80486
© Александр Фролов, Григорий Фролов
Том 4, М.: Диалог-МИФИ, 1993

В частности 234 стр.

Перед тем, как переключить процессор в защищённый режим, надо выполнить некоторые подготовительные действия, а именно:

Подготовить в оперативной памяти глобальную таблицу дескрипторов GDT. В этой таблице должны быть созданы дескрипторы для всех сегментов, которые будут нужны программе сразу после того, как она переключится в защищённый режим. Впоследствии, находясь в защищённом режиме, программа может модифицировать GDT (если, разумеется, она работает в нулевом кольце защиты). Программа может модифицировать имеющиеся дескрипторы или добавить новые, загрузив заново регистр GDTR.

Для обеспечения возможности возврата из защищённого режима в реальный необходимо записать адрес возврата в реальный режим в область данных BIOS по адресу 0040h:0067h, а также записать в CMOS-память в ячейку 0Fh код 5. Этот код обеспечит после выполнения сброса процессора передачу управления по адресу, подготовленному нами в области данных BIOS по адресу 0040h:0067h.

Запретить все маскируемые и немаскируемые прерывания.

Открыть адресную линию A20.

Запомнить в оперативной памяти содержимое сегментных регистров, которые необходимо сохранить для возврата в реальный режим, в частности, указатель стека реального режима.

Загрузить регистр GDTR.

Мало что изменилось с того времени

вот код от этой книги
http://read.pudn.com/downloads151/ebook/657619/[Frolov][Zaschischenny_rezhim_processorov_Intel]/V06/LST4-15/TOSSYST.ASM__.htm

а это в другой книге, но код вероятно списан у Фроловых
http://litrus.net/book/read/65872?p=36

-----
127.0.0.1, sweet 127.0.0.1


| Сообщение посчитали полезным: Abraham, Zoeken
 eXeL@B —› Программирование —› комп просто напросто перезагружается.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати