Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [3]  Все   Вниз
  Печать  
Автор Тема: Дальний вызов( 48 бит ) в Си  (Прочитано 53286 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sss
Специалист

ru
Offline Offline

« Ответ #60 : 26-04-2010 03:55 » 

Serg79 но ведь ничто не мешает использовать CS как сегмент данных... Ладно это демагогия... Я просто хотел сказать, что селекторы неявно все же используются компиляторами C++.
Знаешь sss, как ни странно но ты даже с помощью ассемблерной инструкции 'mov' ничего не сможешь записать в сегментный регистр 'CS'.))) Занести в регистр 'CS' новое значение можно только косвенными методами, например выполнить дальний переход 'far jmp' или выполнить выход из дальней процедуры 'far ret'.)))

Так что sss для кого то может это и демагогия, но только не для x86 процессоров.)))

Serg79 где ты увидел что я говорю об загрузке сегментного регистра cs каким либо значением... Любишь искажать слова, да? Блин ну и упрямец... Рассказываю - в msdos создавая обработчик прерывания, необходимо было учитывать, что при его вызове значения всех регистров, кроме cs, указывали на значения регистров контекста ПРЕРВАННОЙ ЗАДАЧИ. Поэтому перед установкой обработчика прерывания значения регистров я сохранял относительно cs, используя этот регистр как ЧАСТЬ УКАЗАТЕЛЯ НА ДАННЫЕ.. Никогда не приходилось задумываться зачем нужен DEP да?
Записан

while (8==8)
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #61 : 26-04-2010 17:53 » 

Рассказываю - в msdos создавая обработчик прерывания, необходимо было учитывать, что при его вызове значения всех регистров, кроме cs, указывали на значения регистров контекста ПРЕРВАННОЙ ЗАДАЧИ. Поэтому перед установкой обработчика прерывания значения регистров я сохранял относительно cs, используя этот регистр как ЧАСТЬ УКАЗАТЕЛЯ НА ДАННЫЕ..
Не знаю sss про какие обработчики прерываний ты говоришь но те обработчики прерываний которые я видел не использовали 'CS' в качестве сегмента данных, они использовали свои участки памяти зарезервированные за ранее, стек использовался прерванного процесса. Подобным образом поступали и видимые мной резидентные программы которые подменяли обработчики прерываний своим кодом.

Что бы не быть голословным вот пример нескольких прерываний BIOS (в свое время сильно увлекся низкоуровневым программирование):
Код:
Award Software, Inc.
ASUS TUSI-M ACPI BIOS Revision 1018 Beta 005
07/30/2003
SiS 630 AGP True Color Graphics and Video Accelerator
 Bytes Video Memory,
BIOS Version 2.08.50
Support VESA BIOS Extension Ver 3.0
Silicon Integrated Systems Corp.
2.08.50

Прерывание:
Код:
Адрес: F000:EF6F   FEF6F

irq 0h: Деление на нуль. Внутреннее: активизируется при попытке
        деления на нуль.

sector:     file format binary

Disassembly of section .data:

/*
 * Я так понял, что суть данного кода в том, что бы запретить
 * аппаратные прерывания, в противном случее код что то мутит
 * с контроллерами прерываний.
 *
 * Но на сколько я знаю, что бы запретить напремер
 * IRQ 0 надо поступать так:
 * inb $0x20, %al
 * orb $1, %al
 * outb %al, $0x20
 */
000fef6f <.data+0xfef6f>:
   fef6f:       1e                      push   %ds
   fef70:       50                      push   %ax
   fef71:       51                      push   %cx
   /* В сегмент данных DS загружаетя 0040h (область данных BIOS */
   fef72:       b8 40 00                mov    $0x40,%ax
   fef75:       8e d8                   mov    %ax,%ds
   fef77:       b0 0b                   mov    $0xb,%al
   /* Записывается значение 00001011b в порт первого контроллера прерываний */
   fef79:       e6 20                   out    %al,$0x20
   fef7b:       e6 e1                   out    %al,$0xe1   /* ??? не знаю чей порт */
   fef7d:       e4 20                   in     $0x20,%al
   fef7f:       e6 e1                   out    %al,$0xe1
   fef81:       8a e0                   mov    %al,%ah
   fef83:       0a c0                   or     %al,%al
   fef85:       74 32                   je     0xfefb9
   /* Повторяется все тоже самое только для второго контроллера */
   fef87:       b0 0b                   mov    $0xb,%al
   fef89:       e6 a0                   out    %al,$0xa0
   fef8b:       e6 e1                   out    %al,$0xe1
   fef8d:       e4 a0                   in     $0xa0,%al
   fef8f:       e6 e1                   out    %al,$0xe1
   fef91:       8a c8                   mov    %al,%cl
   fef93:       0a c0                   or     %al,%al
   fef95:       74 10                   je     0xfefa7


   fef97:       e4 a1                   in     $0xa1,%al
   fef99:       e6 e1                   out    %al,$0xe1
   fef9b:       0a c1                   or     %cl,%al
   fef9d:       e6 a1                   out    %al,$0xa1
   fef9f:       e6 e1                   out    %al,$0xe1
   fefa1:       b0 20                   mov    $0x20,%al
   fefa3:       e6 a0                   out    %al,$0xa0
   fefa5:       eb 0a                   jmp    0xfefb1

   fefa7:       e4 21                   in     $0x21,%al
   fefa9:       0a c4                   or     %ah,%al
   fefab:       e6 e1                   out    %al,$0xe1
   fefad:       24 fb                   and    $0xfb,%al
   fefaf:       e6 21                   out    %al,$0x21
   fefb1:       b0 20                   mov    $0x20,%al
   fefb3:       e6 e1                   out    %al,$0xe1
   fefb5:       e6 20                   out    %al,$0x20
   fefb7:       eb 02                   jmp    0xfefbb

   /* Записывает по адресу 0040:006B значение 0xFF */
   fefb9:       b4 ff                   mov    $0xff,%ah
   fefbb:       88 26 6b 00             mov    %ah,107
   fefbf:       59                      pop    %cx
   fefc0:       58                      pop    %ax
   fefc1:       1f                      pop    %ds
   fefc2:       cf                      iret

Вот еще один обработчик прерывания:
Код:
Адрес: F000:E2C3        FE2C3

irq 2h: Не маскируемое. Внутреннее: активизируется при
        возникновении ошибок памяти.

dump:     file format binary

Disassembly of section .data:

000fe2c3 <.data+0xfe2c3>:
   fe2c3:       e9 c6 09                jmp    0xec8c
...
000fe2c6 <.data+0xfe2c6>:
   fe2c6:       50                      push   %ax
   fe2c7:       b0 8f                   mov    $0x8f,%al
   fe2c9:       e8 50 01                call   0xe41c
   fe2cc:       e4 61                   in     $0x61,%al
   fe2ce:       8a e0                   mov    %al,%ah
   fe2d0:       e8 81 06                call   0xe954
   fe2d3:       f6 c4 c0                test   $0xc0,%ah
   fe2d6:       75 10                   jne    0xfe2e8
   fe2d8:       8a c4                   mov    %ah,%al
   fe2da:       e6 e1                   out    %al,$0xe1
   fe2dc:       e6 61                   out    %al,$0x61
   fe2de:       b0 0f                   mov    $0xf,%al
   fe2e0:       e8 39 01                call   0xe41c
   fe2e3:       58                      pop    %ax
   fe2e4:       cf                      iret
...
000fe41c <.data+0xfe41c>:
   fe41c:       e6 70                   out    %al,$0x70
   fe41e:       e6 e1                   out    %al,$0xe1
   fe420:       e4 71                   in     $0x71,%al
   fe422:       e6 e1                   out    %al,$0xe1
   fe424:       c3                      ret
...
000fe954 <.data+0xfe954>:
   fe954:       e4 61                   in     $0x61,%al
   fe956:       e6 e1                   out    %al,$0xe1
   fe958:       0c 0c                   or     $0xc,%al
   fe95a:       e6 61                   out    %al,$0x61
   fe95c:       c3                      ret
...
000fec8c <.data+0xfec8c>:
   fec8c:       e8 06 00                call   0xec95
   fec8f:       75 03                   jne    0xfec94
   fec91:       e9 32 f6                jmp    0xe2c6
   fec94:       cf                      iret
   fec95:       1e                      push   %ds
   fec96:       50                      push   %ax
   fec97:       b8 40 00                mov    $0x40,%ax
   fec9a:       8e d8                   mov    %ax,%ds
   fec9c:       f7 06 15 00 04 00       testw  $0x4,21
   feca2:       58                      pop    %ax
   feca3:       1f                      pop    %ds
   feca4:       c3                      ret

sss ты можешь показать кусок кода обработчика прерываний где использовался бы регистр 'CS' в качестве сегмента данных?


Никогда не приходилось задумываться зачем нужен DEP да?
Не знаю о каком DEP ты говоришь, но если ты имеешь ввиду 'Data Execution Protection — Защита от Выполнения Данных' то я тебе могу сказать следующее.

Если ты говоришь о использовании регистра 'CS' в качестве сегмента данных для обращения к памяти в MS-DOS, то говорить о каком то 'Data Execution Protection' да же и не приходиться. Почему не приходится я думаю ты и сам знаешь, по крайней мере должен знать если писал обработчики прерываний под MS-DOS.

Если ты упомянул 'Data Execution Protection' в применении к 32-разрядному защищенному режиму. То в данном режиме обратиться к данным в другом сегменте с использованием селектора находящегося в регистре 'CS' тебе не удастся, т.к. данный селектор ссылается на дескриптор который описывает сегмент исполняемого кода и считать или записать что то с использованием данного селектора у тебя не получиться, это сразу вызовет 'исключение общей защиты (#GP)'.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #62 : 27-04-2010 00:24 » 

Код, к сожалению, не могу показать, про DEP промолчу(пока не дойдет до обсуждения выполнения кода из стека), а вот Serg79,  как же "они"  адресовали "участки памяти зарезервированные за ранее" ? Во время передачи управления нашей ISR (можно так назову?) мы имеем в стеке только флаги и регистры cs:ip указывающие на текущую ISR. Ну и как можно "разыменовать"  "участки памяти зарезервированные за ранее" ?

P.S.: Ты какието куски кода  BIOS привел -жестко сидящие в своих константных сегментах. Блин, совсем не понимаешь разницы, да? Надо же так напасть!
« Последнее редактирование: 27-04-2010 00:53 от sss » Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #63 : 27-04-2010 00:49 » 

Вот нашел - разжевано даже очень ничего, вроде. Свой код я потерял давным давно  -  сгорел жесткий 14 лет назад  Жаль.  Глупо, но тогда я имел все в одном месте....

P.S.: Интересно, в современных обработчиках ISR, не установленных системными средствами в цепочку,  тоже наверное надо извращаться...

« Последнее редактирование: 27-04-2010 00:54 от sss » Записан

while (8==8)
Страниц: 1 2 [3]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines