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

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

Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 23 октября 2010 14:27
· Личное сообщение · #1

вот как я сделал IDTR
Code:
  1.          ; загрузка IDTR
  2.          mov         eax, 0x9107                  ; физический адрес 0x9000 (G - глобальная страница, + стандартные параметры)
  3.          mov         [0x00101000 + 9*4], eax       ; логический адрес тоже 0x9000 (страница №9)
  4.          mov         edi, 0x9000
  5.          xor         eax, eax
  6.          mov         ecx, 100*2            ; всего будет 100 прерываний
  7.          rep         stosd                      ; забиваем всё нулями
  8.  
  9.          mov         edx, 8*8         ; выбераем 8-е прерывание
  10.          mov         edi, 0x9000
  11.          add         edi, edx
  12.          mov         esi, IDT
  13.          mov         ecx, 8
  14.          rep         movsb                      ; заносим в IDT, заготовленную запись
  15.  
  16.          lidt    fword ptr IDTR


отключаем некоторые прерывания, на которых не имеется обработчиков:
Code:
  1.          mov         ax, 0xFFFE  ; запрещаем IRQ, кроме IRQ0
  2.          out         0x21, ax


собственно IDTR собственной персоны:
Code:
  1. IDT_size equ      100*8
  2. IDTR         dw IDT_size-1
  3.                  dd     0x00009000


8-ой элемент для IDT
Code:
  1. IDT:
  2. dw 0x3000, 0x0000, 1000111000000000b, 0x0000


проблема:
возникает #GP в случаях:
1) при тике таймер
2) int 8
успешно работает jmp на адрес, указанный в дескрипторе

в чем может быть проблема ?




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 23 октября 2010 19:37
· Личное сообщение · #2

1)если IRQ от таймера закрыто то как оно у вас при тике в IDT попадает?
2) ну естественно если у вас в таблице IDT нет указателя на обработчик(к сожалению по памяти ее описание не помню, поэтому описание 8 елемента мне мало о чем говорит)
таблица показывает что он есть ? или что его нет?



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 23 октября 2010 19:54
· Личное сообщение · #3

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

делал еще 0-ой и 3-ий элемент и пытался вызвать его таким образом int 0, int 3 соответственно...
при int происходит #GP

cdf2_23.10.2010_CRACKLAB.rU.tgz - IDTR.png




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 23 октября 2010 19:57
· Личное сообщение · #4

ну что бы избежать недоразумений со страничной адрессацией как в предыдущем топике про видео
я бы на вашем месте сначала без нее все отладил
а потому уже со страничной адресацией



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 23 октября 2010 20:05
· Личное сообщение · #5

да дело в том, что работало)
а потом вдруг перестало)))




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 23 октября 2010 20:08
· Личное сообщение · #6

ревизию изменений нужно вести
тогда легче понять что поламали



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 23 октября 2010 20:20
· Личное сообщение · #7

помнится мне я всего-навсего добавил пару процедурок, но они отрабатывают до инициализации IDT, так что никто IDT затереть не мог...



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 24 октября 2010 09:15 · Поправил: Clerk
· Личное сообщение · #8

o Дескриптор валидный шлюза(смещение, сегмент и пр.) ?
o Если используются межкольцевые переключения(понижение кпл), то должен быть валидным TSS(стек).



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 24 октября 2010 12:20
· Личное сообщение · #9

хм...
у меня страничная адресация
никакими TSS не заморачивался...
я все эти действия делаю в страничной адресации
стэк у меня, как был изначально указан на 0x7C00 так и не изменялся...
при попытки его переправить в другое место так же возникает #GP



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 24 октября 2010 12:37
· Личное сообщение · #10

ой... #GP не возникает при замене стэка на другой, но он только как-то неправильно работает:

у меня функция для вывода на экран значения регистра принимает его через стэк...
в итоге этой функции ничего не пришло...



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 24 октября 2010 17:01 · Поправил: Clerk
· Личное сообщение · #11

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



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 24 октября 2010 17:33
· Личное сообщение · #12

Я знаю что такое селектор, что такое дескриптор, что такое стэк, знаю механизм сегментной адресации, знаю механизм страничной адресации
исправно взаимодействую между страницами, вызываю процедуры загруженные в другие страницы, успешно работаю с таблицей стараниц и т. д.
у меня изначально работал IDT успешно, потом я незнаю почему он начал давать сбои



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 24 октября 2010 17:34
· Личное сообщение · #13

и к тому же со стэком всё уладил, там просто не сразу увидел неточности...



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 24 октября 2010 18:03
· Личное сообщение · #14

Hell Knight
Да вы даже не знаете что используете сегментацию:
> у меня страничная адресация, не юзаю cs
Обычно после изучения архитектуры хардварной изучают уже созданные оси, так учатся на ошибках других, иначе выйдет костыли типо линуса, где архитектуры нет.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 24 октября 2010 18:06
· Личное сообщение · #15

иначе выйдет костыли типо линуса

Да есть там архитектура миниксовая

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 24 октября 2010 18:07
· Личное сообщение · #16

т. е. получается, что при включении страничной адресации сегментация никуда не пропадает ?
т. е. как бы работает 2 режима ?
я про это не слышал... тогда это немного меняет ситуацию...



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 24 октября 2010 18:22
· Личное сообщение · #17

Coderess
Нет там архитектуры и изначально её небыло. МС фиксит по вторникам ошибки реализации, Торвальдс фиксит ошибки архитектуры. Тоесть после введения очередной убогой поделки призванной расширить какойто функционал, куча иных поделок отваливается. Вот и получилось невесть что, а не ось, хотя и работает кое как.



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 24 октября 2010 18:35
· Личное сообщение · #18

ткните пожалуйста пальцем в мануале где по этому вопросу я бы смог раскрыть эту проблему
где ниболее полно будет рассказано про IDT, IDTR и обработку прерываний
с английским языком дружу, так что разберусь



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 24 октября 2010 18:37 · Поправил: Clerk
· Личное сообщение · #19

Intel® 64 and IA-32 Architectures Software Developer's Manuals
http://www.intel.com/products/processor/manuals/




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 27 октября 2010 09:06
· Личное сообщение · #20

Clerk, пальцем в небо, блин.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 27 октября 2010 09:08
· Личное сообщение · #21

www.sysersoft.com/download/IA-32%20Intel%20Architecture.zip
вроде живая была



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 27 октября 2010 13:02
· Личное сообщение · #22

читаю я мануалы... у меня есть свежие... там еще рассматривается и IA-64, впринципе пока что(на данный момент, сколько прочитал), единственное, что новое для себя вынес это только про 64-bit режим, до этого информацию брал с васма




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 28 октября 2010 08:58
· Личное сообщение · #23

Hell Knight
И что - только по инфе с васма начали писать ось?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 28 октября 2010 09:05
· Личное сообщение · #24

нет) у меня еще была инфа с wiki.osdev.org + Таненбаум



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 28 октября 2010 10:19
· Личное сообщение · #25

вот, лог-файл от boch'a

32a8_28.10.2010_CRACKLAB.rU.tgz - log.log



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 28 октября 2010 13:46
· Личное сообщение · #26

Code:
  1. 00014342399e[CPU0 ] interrupt(): not accessable or not code segment cs=0x0008
  2. 00014342399e[CPU0 ] interrupt(): not accessable or not code segment cs=0x0008
  3. 00014342399e[CPU0 ] interrupt(): not accessable or not code segment cs=0x0008
  4. 00014342399i[CPU0 ] CPU is in protected mode (active)
  5. 00014342399i[CPU0 ] CS.d_b = 32 bit
  6. 00014342399i[CPU0 ] SS.d_b = 32 bit
  7. 00014342399i[CPU0 ] EFER   = 0x00000000
  8. 00014342399i[CPU0 ] | RAX=000000000000917f  RBX=0000000000000100
  9. 00014342399i[CPU0 ] | RCX=0000000000000000  RDX=0000000000000090
  10. 00014342399i[CPU0 ] | RSP=0000000000007ffc  RBP=0000000000000000
  11. 00014342399i[CPU0 ] | RSI=0000000000000263  RDI=0000000000009800
  12. 00014342399i[CPU0 ] |  R8=0000000000000000   R9=0000000000000000
  13. 00014342399i[CPU0 ] | R10=0000000000000000  R11=0000000000000000
  14. 00014342399i[CPU0 ] | R12=0000000000000000  R13=0000000000000000
  15. 00014342399i[CPU0 ] | R14=0000000000000000  R15=0000000000000000
  16. 00014342399i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df IF tf sf zf af pf cf
  17. 00014342399i[CPU0 ] | SEG selector     base    limit G D
  18. 00014342399i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
  19. 00014342399i[CPU0 ] |  CS:0008( 0001| 0|  0) 00000000 000fffff 1 1
  20. 00014342399i[CPU0 ] |  DS:0010( 0002| 0|  0) 00000000 000fffff 1 1
  21. 00014342399i[CPU0 ] |  SS:0010( 0002| 0|  0) 00000000 000fffff 1 1
  22. 00014342399i[CPU0 ] |  ES:0010( 0002| 0|  0) 00000000 000fffff 1 1
  23. 00014342399i[CPU0 ] |  FS:0000( 0005| 0|  0) 00000000 0000ffff 0 0
  24. 00014342399i[CPU0 ] |  GS:0000( 0005| 0|  0) 00000000 0000ffff 0 0
  25. 00014342399i[CPU0 ] |  MSR_FS_BASE:0000000000000000
  26. 00014342399i[CPU0 ] |  MSR_GS_BASE:0000000000000000
  27. 00014342399i[CPU0 ] | RIP=0000000000000257 (0000000000000257)
  28. 00014342399i[CPU0 ] | CR0=0xe0000011 CR1=0x0 CR2=0x0000000000000000
  29. 00014342399i[CPU0 ] | CR3=0x00100000 CR4=0x00000000
  30. 00014342399i[CPU0 ] >> jmp .+0xfffffffe (0x00000257) : EBFE
  31. 00014342399e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting


У тебя кривая GDT, либо ты в GDTR загрузил адрес без учёта страничной адресации (должен быть виртуальный).
Селектор из CS не является селектором дескриптора сегмента кода, и по тройному исключению проц ребутится.



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 28 октября 2010 16:15
· Личное сообщение · #27

кстати, вполне возможный вариант, что в GDTR загружен адрес нерасчитанный на страничную адресацию...
исправлю...



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 28 октября 2010 21:22
· Личное сообщение · #28

Всё!
Как раз в этом и была проблема...




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 28 октября 2010 22:24
· Личное сообщение · #29

Тогда можно закрыть, видимо.


 eXeL@B —› Программирование —› прерывания
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати