Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

Обьясните пожалуйста как Win запрешает выполнение Asm-ного коа In   Найти похожие ветки 

 
BKGG   (2004-02-03 12:51) [0]

У меня написанно следующее:

procedure TForm1.Button1Click(Sender: TObject);
asm
mov DX,3F2h ;
in  AX,DX   ;
end;

  Программа компилируется но не выполняется. говорить - Error: Privileged Instruction.
  Вопрос: как Windows запрешает выполнение етого in AX,DX кода? В этом вопросе я подразумеваю следуюшее:
  Как ми знаем Windows поочередно, циклически виделяет определенное процессорное время для каждого своего процесса, т.е. для каждого потока входяшего в этот процесс. Пуст наступило время для единственного потока входяшего в моем процессе. В это время Windows загрузить в процесорние регистри информациу, которое нужно для выполнения моего потока (тут я хочу особое внимание уделить IP и сегментным регистрам). Пуст в IP
регистр записанно адрес MOV AX,DX кода. Програма начинает выполняться. После выполнения этого кода значение записанное в этом регистре вырастет и будет указывать на следующий код. Значение этого регистра будет расти до того момента пока не будет прерывание или указание Jamp-а.
  Когда выполняеться этот in  AX,DX код как Windows узнает о том что выполняется приказ чтении из порта. Данный момент выполняется толко один поток, поток моеий программы а не какой-нибудь системный поток Windows-са.
  Как ви можете обыснить ето. На сколько я знаю в Windows 95 и Windows 98 токих запретов не было. Они появились толко в 2000-ном версие. Какоый механизм запрещает выполнение этих указаниы и возможно ли их обойти.


 
Игорь Шевченко ©   (2004-02-03 12:57) [1]

Механизм, запрещающий выполнение инструкций IN и прочих называется режимом работы процессора. Возможно ли обойти - возможно, воспользовавшись библиотекой досутпа к портам, либо написанием драйвера.


 
Fay ©   (2004-02-03 12:58) [2]

Только в 2000!? А в NT4 прокатывало?


 
Ihor Osov'yak ©   (2004-02-03 14:38) [3]

2 [2] Fay ©   (03.02.04 12:58)

Аналогична ситуация в NT4, 2000, XP, 2003.. Думаю, во всех новых вин будет также..

Дело в том, что  код  пользовательских приложений (win32) выполняется с самым низким уровнем привилегий (так называемое кольцо 3), для которого запрещено делать ввод/вывод в порты.  Запрет достигается какой-то алхимией вокруг дескрипторов, привилегий, битовых карт ввода-вывода... Алхимия делается на уровне ядра ОС, комментировать не буду, так  как сам еще до конца не разобрался.  Скажу только что в NT семействе (NT, w2k, xp, 2003) это доведено до абсолюта (т.е. категорический запрет на ввод-вывод для портов для кода кольца 3), в win9x для некоторых портов сделано исключение, наверно с целью совместимости со старыми приложениями dos, win16...


 
NightAngel ©   (2004-02-03 20:11) [4]

В Intel процессорах проверка на доступность порта ввода-вывода при CPL>IOPL (устанавливается в поле IOPL в регистре EFLAGS)строится на проверки битовой маски в TSS, если там 0, в бите соответствующем номеру этого порта - тогда можно работать с портом, если 1, или вобще нет отображения для этого порта, то тогда нельзя и процессор генерит GPF. В NT системах указатель на карту просто указывает за пределы TSS, поэтому и не один поток из юзер мода не может напрямую работать с портами, так как карты как таковой нет. Только у меня есть подозрение, что на платформе NT TSS на каждый процесс одна, там по моему только указатель на стек нулевого кольца при переключении меняют. Так что если ее изменить, есть подозрение, что все потоки в системе смогут использовать порты напрямую. Указатель на TSS текущего потока по определению хранится в GDT, у Win2k она в GDT по смещению 28 (как в WinXP не знаю, нужно смотреть). Также указатель на TSS хранится в структуре Kernel Processor Control Region (KPCR), которая находится по адресу fs:0h при ring==0, указатель на TSS находится в этой структуре по адресу fs:40h. Попробуте создать свой TSS и переписать указатели. И для этого не обязательно менять TSS можно сделать так, как указано в статье Context в IFSDK. Да, там есть еще пара TSS, но насколько я понял они предназначены для аппартного переключения задач при крахе машины, чтобы сделать дамп памяти и т.д. Если он один на всю систему, а по моему это так, там достаточно только указатель на стек ядра менять при переключении потоков, то Вы разрешите всем юзать регистры ввода вывода напрямую. Теперь как это сделать. Можно написАть user mode драйвер, он очень простой, и к нему обратиться, далее драйвер может быть выгружен, а приложение будет работать с портами - тут смысл в том как в IA-32 запрещают доступ к портам из колец большего нулевого - там есть сегмент состояния задачи(TSS) в нем и указано к каким портам можно получить доступ не из нулевых колец. О чем я выше уже объяснял. По умолчанию в NT системах доступ к портам прикрыт, а приведенные ниже ф-ции изменяют маску разрешения в TSS и она такой и останется в независимости от присутствия драйвера. Ну а номера портов глобальны в системе независимо от кольца, в котором работает процессор. Используют ф-ции Ke386QueryIoAccessMap, Ke386SetIoAccessMap, Ke386IoSetAccessProcess, а потом можно уже из юзер мода писАть в порты, так как в TSS карта разрешения портов станет такой, какой
нужно. В сети где-то уже есть реализация подобной идеи.
Читайте также статью в IFSDK \src\filesys\OSR_docs\Context.pdf.


 
KSergey ©   (2004-02-04 09:26) [5]

> [4] NightAngel ©   (03.02.04 20:11)

Все это здорово, вот только замечание для автора вопроса в смысле следовать этому совету или нет: нужна стабильно и правильно работающая программа работы с портами или просто программа работающая с портами любой ценой?


 
Alex Konshin ©   (2004-02-04 09:39) [6]

NightAngel ©   (03.02.04 20:11) [4]
Здорово. Я бы так не сказал.
Только сдается мне, что для автора вопроса это будет просто сотрясение воздуха, что-то не верится, что он хоть чего-то поймет :)
Пусть лучше автор поведает, что же он хочет сделать, может и нет никакой необходимости порты читать.


 
Ihor Osov'yak ©   (2004-02-04 11:10) [7]

2 [6] Alex Konshin ©   (04.02.04 09:39)

Читают ответы не только авторы вопросов :-). Ну и ведь не исключено, что ответ, даже в случае когда он не понятен автору вопроса,  послужит отправной точкой для дальнейшей разборки... А то, что орфография вопроса  хромает - а вдруг, для спрашивающего русский не родной?

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


 
LP   (2004-02-04 11:25) [8]

Вопрос к AngelNight:
Я, скажем, очень бегло и очень давно ознакомился с режимами i486. Если не трудно - развейте мои сомнения по одному вопросу: порядок и смещение полей в TSS зависят от операционной системы или от процессора?

С уважением, LAMER Pro


 
LP   (2004-02-04 11:27) [9]

Вопрос к NightAngel (извините, за неправильное написание ника ранее):
Я, скажем, очень бегло и очень давно ознакомился с режимами i486. Если не трудно - развейте мои сомнения по одному вопросу: порядок и смещение полей в TSS зависят от операционной системы или от процессора?

С уважением, LAMER Pro



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.039 c
14-1079274306
Домарощинер
2004-03-14 17:25
2004.04.11
Выборам ВВП-2 посвящается...


3-1078995293
sherminator
2004-03-11 11:54
2004.04.11
оптимальная БД


1-1080308424
D Purple
2004-03-26 16:40
2004.04.11
как заполнить Array of const массивом array of string или присвои


6-1076087886
Djon007
2004-02-06 20:18
2004.04.11
Как превратьть это в робочее состояние?


4-1076003841
sergey1
2004-02-05 20:57
2004.04.11
Чужой процесс...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский