OSDev

для всех
Текущее время: 27 апр 2024, 22:00

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: как правильно делать прерывания
СообщениеДобавлено: 24 апр 2013, 15:55 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
пробую сделать прерывания, и как то ничего не выходит с сегментными регистрами,

Код:
pushad ; сохраняю все регистры
mov cx , es
shl ecx, 16
mov cx , ss
mov bx , ds
shl ebx, 16
mov bx , fs
mov dx , gs
mov ax, 40h
mov ES, ax
mov SS, ax
mov DS, ax
mov FS, ax
mov GS, ax
mov esp, 500h
mov ebp, 500h
pushad

popad ; востанавливаю все регистры
mov gs , dx
mov fs , bx
shr ebx, 16
mov ds , bx
mov ss , cx
shr ecx, 16
mov es , cx
popad

возникает какой то глюк с сегментами,
програмный код встаёт и всё обламывается.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 апр 2013, 10:38 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Это код реального режима?
Зачем так извращаться с сегментными регистрами? Только ради использования команды POPAD? Нет никакого смысла. Лучше использовать непосредственно push/pop с сегментными регистрами, каждая такая команда использует ровно один байт. Будет занимать много меньше места и быстрей выполняться.
Этот код где находится? В обработчике прерывания?
Не забыл, что в конце обработчика необходимо использовать возврат инструкцией iret, а не ret?

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 апр 2013, 14:09 
Аватара пользователя

Зарегистрирован: 16 апр 2010, 10:10
Сообщения: 320
Откуда: Псковская обл.
Вроде нельзя читать из сег. рег. в любой дроугой кроме AX.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 апр 2013, 14:52 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Можно в любой регистр кроме другого сегментного.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 апр 2013, 15:51 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
А если б было нельзя, не прошла бы трансляция.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 апр 2013, 01:30 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
Yoda писал(а):
Это код реального режима?
Зачем так извращаться с сегментными регистрами? Только ради использования команды POPAD? Нет никакого смысла. Лучше использовать непосредственно push/pop с сегментными регистрами, каждая такая команда использует ровно один байт. Будет занимать много меньше места и быстрей выполняться.

просто команды push/pop то же используют сегментные регистры если бы у меня использовался только один кодовый сегмент и один сегмент данных проблем бы таких не было.
кстати
Код:
push ES
push SS
push DS
push FS
push GS

это я тоже использовал
Yoda писал(а):
Этот код где находится? В обработчике прерывания?
Не забыл, что в конце обработчика необходимо использовать возврат инструкцией iret, а не ret?

да в обработчике прерываний(Int32, Trap32) и в конце стоит iretd.




в IDT стоит Int32 Sel:Off=0008:0010171a и Trap32 Sel:Off=0008:0010171a
код ещё раз повторю
Код:
Interrupt_code:
pushad
mov cx , es
shl ecx, 16
mov cx , ss
mov bx , ds
shl ebx, 16
mov bx , fs
mov dx , gs
mov ax, 40h
mov ES, ax
mov SS, ax
mov DS, ax
mov FS, ax
mov GS, ax
mov esp, 500h
mov ebp, 500h
pushad
; код прерывания
popad
mov gs , dx
mov fs , bx
shr ebx, 16
mov ds , bx
mov ss , cx
shr ecx, 16
mov es , cx
popad
iret


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 апр 2013, 12:59 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
scuter писал(а):
просто команды push/pop то же используют сегментные регистры если бы у меня использовался только один кодовый сегмент и один сегмент данных проблем бы таких не было.

Таких проблем и нет. Достаточно сначала установить стек (сегмент и указатель) и push-ить/pop-ить остальные регистры/сегменты туда. Например, так:
Код:
   mov   [cs:SaveSS], ss
   mov   [cs:SaveSP], sp
   mov   ss, NewSS
   mov   sp, NewSP
   pushad
   push   ds
   push   es
   push   fs
   push   gs
   mov   ax, NewSeg
   mov   ds, ax
   mov   es, ax
   mov   fs, ax
   mov   gs, ax
   ...
   pop   gs
   pop   fs
   pop   es
   pop   ds
   popad
   iret


scuter писал(а):
в IDT стоит Int32 Sel:Off=0008:0010171a и Trap32 Sel:Off=0008:0010171a

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

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 апр 2013, 13:41 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Если в коде присутствует mov SS, ax, значит ты не настраивал TSS, или не разобрался с его работой. Загрузки SS в обработчике прерывания не должно быть.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 апр 2013, 14:51 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Да, обычно ss:esp настраивается автоматически или используется текущий стек. Я во вступительной части обработчиков настраиваю только ds и es, т.к. в режиме ядра при дальнейших вызовах вложенных подпрограмм эти регистры должны ссылаться на сегмент данных ядра. Примерно так:
Код:
  push ds
  push es

  push ss ; ds <- KDATA
  pop ds

  push ss ; es <- KDATA
  pop es
  ...
  pop es
  pop ds
  iret
Регистры fs и gs сохраняют/настраивают/восстанавливают вложенные подпрограммы, когда это необходимо.

В коде обработчика не увидел команды EOI.


Последний раз редактировалось phantom-84 26 апр 2013, 15:09, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 апр 2013, 15:09 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
В 0 кольце стек не перегружается, востальных перезагружается автоматом. Не перезагрузка вызывает трудности при переполнении стека или работе в сегметном режиме. Так что перезагружать или нет решать вам.
Лучше сделать как выше перезагрузить через кодовый сегмент.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB