zloi7777
Постоялец
Offline
|
|
« : 21-04-2010 09:35 » |
|
Как в Си задать аналог ассемблернной строчки: ASM: call [pword _test] ... public _test _test label proc _test_off dd 0 ;32-bit offset _test_seg dw 0140h ;16-bit selector Си: ? Для 32-х битного адреса все просто ASM: call [dword _test] ... public _test _test label proc _test_off dd 0 ;32-bit offset Си: extern "C" void (*test)(void); ... test(); Но как сишному компилятору сказать что функция test имеет 48-ми битный адрес???
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #1 : 21-04-2010 10:41 » |
|
Какой компилятор, какая целевая процессорная платформа?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #2 : 21-04-2010 11:31 » |
|
Borland (CodeGear) bcc32
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #3 : 22-04-2010 03:03 » |
|
1. какая-то неувязочка Borland (CodeGear) bcc32
и Но как сишному компилятору сказать что функция test имеет 48-ми битный адрес???
2. как данные public _test _test label proc _test_off dd 0 ;32-bit offset _test_seg dw 0140h ;16-bit selector связаны с вызовом call [dword _test] или call [pword _test] 3. и моё самое любимое:) Зачем? Что ты с этого получишь и зачем пытаться перехитрить компилятор? PS: не долгое гугление привело нас сюда http://www.codenet.ru/progr/cpp/4/r77_1.phpвсё подробно расписано (поищи в тексте фразу "Объявление ближних или дальних функций ") да и вообще всё это для старого доброго доса и реального режима, как это связано с защищённым режимом не понятно
|
|
« Последнее редактирование: 22-04-2010 03:56 от Алексей1153++ »
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 22-04-2010 03:57 » |
|
LogRus, с форматированием был косячок - я поправил
|
|
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #5 : 22-04-2010 04:48 » |
|
3. и моё самое любимое:) Зачем? Что ты с этого получишь и зачем пытаться перехитрить компилятор? PS: не долгое гугление привело нас сюда http://www.codenet.ru/progr/cpp/4/r77_1.phpвсё подробно расписано (поищи в тексте фразу "Объявление ближних или дальних функций ") да и вообще всё это для старого доброго доса и реального режима, как это связано с защищённым режимом не понятно Я как раз и использую защищенный режим, и 48-ми битная адресация функции нужна для межсигментного вызова в защищенном режиме. 2. как данные Цитата: zloi7777 от Вчера в 08:35 Код: (asm) public _test _test label proc _test_off dd 0 ;32-bit offset _test_seg dw 0140h ;16-bit selector связаны с вызовом call [dword _test] или call [pword _test] В данных описан адрес функции. 1. какая-то неувязочка в чем? компилятор Borland Builder C++.
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #6 : 22-04-2010 06:23 » |
|
А где про такое написано? Можно ссылку (или название книги)?
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #7 : 22-04-2010 06:37 » |
|
я про программировании защищенного режима 0, так что пара вопросов В данных описан адрес функции.
т.е. функция на этапе кодирования знает свой адрес? не всё ли ей равно, как её вызывают (говорим про stdcall, не fastcall), дёрнул ret и был таков? Алексей1153++, спасибо.
|
|
|
Записан
|
Странно всё это....
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #8 : 22-04-2010 06:52 » |
|
т.е. функция на этапе кодирования знает свой адрес? не всё ли ей равно, как её вызывают (говорим про stdcall, не fastcall), дёрнул ret и был таков? Это указатель на функцию. Я в первом посте про это написал.
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #9 : 22-04-2010 07:10 » |
|
ах, вот оно что. так вот в C++ указатели всегда одного размера 32 бита (на x86), этого вполне достаточно для покрытия всего адресного пространства и дополнительных 16 бит тут не нужно.
|
|
|
Записан
|
Странно всё это....
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #10 : 22-04-2010 07:19 » |
|
ах, вот оно что. так вот в C++ указатели всегда одного размера 32 бита (на x86), этого вполне достаточно для покрытия всего адресного пространства и дополнительных 16 бит тут не нужно. Его достаточно для работы в пределах одного сегмента ( короткий переход ), для вызова функции из другого сегмента надо 48 бит: 32 (как при коротком переходе ) это смещение и 16 селектор сегмента.
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #11 : 22-04-2010 07:23 » |
|
Ну походу никак такое не сделаешь. Напиши inline функцию или максрос и всё
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #12 : 22-04-2010 07:29 » |
|
быыырррр
ладно вернём к главному вопросу, какая цель иметь длинные переходы, какую задачу ты решаешь?
|
|
|
Записан
|
Странно всё это....
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #13 : 22-04-2010 07:35 » |
|
Ну походу никак такое не сделаешь. Напиши inline функцию или максрос и всё енто понятно и написано , но выглядин не так красиво....
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #14 : 22-04-2010 07:36 » |
|
LogRus, он видимо хочет переключить задачу в защищенном режиме
zloi7777, нормально выглядит. Если пишешь такие вещи, то без ассемблера полюбому не обойтись.
|
|
« Последнее редактирование: 22-04-2010 07:37 от resource »
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #15 : 22-04-2010 07:44 » |
|
ладно вернём к главному вопросу, какая цель иметь длинные переходы, какую задачу ты решаешь? шлюз вызова, сегмент задачи ( прога под свою ос)
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #16 : 22-04-2010 07:51 » |
|
zloi7777, какой формат исполняемых файлов в "своей" ОС ?
|
|
« Последнее редактирование: 22-04-2010 07:54 от resource »
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #17 : 22-04-2010 07:59 » |
|
Если пишешь такие вещи, то без ассемблера полюбому не обойтись. ясен пень все написано и работает, осдалось оформить хедер файл для кончного пользования, которы будит писать свои проги на Си используя указатели на мои функции..., и тут встала затыка в указателях на 48бит. понятно что можно написать: #define test_cpp() asm { call [PWORD PTR test_asm] } с параметрами чуть страшнее. Или написать функция на ассемблере, но это лишнии операции и размер.
|
|
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #18 : 22-04-2010 08:00 » |
|
какой формат исполняемых файлов в "своей" ОС ? exe (PE)
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #19 : 22-04-2010 08:05 » |
|
Переключать задачи должна только ОС. Программам это не нужно (нельзя) делать. PE ? Что PE лодер написал? Уже целую ОС наверное сделал... ну что-то PE уж какой-то чисто виндовый формат.
|
|
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #20 : 22-04-2010 08:15 » |
|
Переключать задачи должна только ОС. Программам это не нужно (нельзя) делать. PE ? Что PE лодер написал? Уже целую ОС наверное сделал... ну что-то PE уж какой-то чисто виндовый формат. шлюзы вызова, вызова функций ядра из ring0. a PE,там с бесяток полей нужны, а дальше простое копирование. а bcc32 - компилятор тоже виндовый
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #21 : 22-04-2010 08:43 » |
|
Обрывками фраз разговаривать это как-то некрасиво, и что самое главное - не понятно. И оверквотинг всё таки нехорошее дело
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #22 : 22-04-2010 15:32 » |
|
Я как раз и использую защищенный режим, и 48-ми битная адресация функции нужна для межсигментного вызова в защищенном режиме.
Ты правильно сказал что для дальнего вызова требуется помимо смещения указать селектор нового сегмента. В твоих примерах на ассемблере я не увидел и намека на присутствие селекторов в вызовах подпрограмм. Если ты делаешь вид что разбираешься в данной теме и говоришь что реализовал основной функционал ядра, то должен знать что на данный момент нет актуальных компиляторов языка 'C' которые поддерживали бы создание программы для защищенного режима с использованием нескольких сегментов как кода так и данных. Скажу больше, не один современный и актуальный компилятор языка 'C' даже не пытается оперировать, если конечно не прибегать к помощи ассемблерных вставок, сегментными регистрами микропроцессора. Это все о x86 архитектуре.
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #23 : 22-04-2010 15:33 » |
|
ИМХО, тему лучше перенести в "Ассемблер", здесь мало что к "С" относиться.
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #24 : 23-04-2010 00:26 » |
|
Скажу больше, не один современный и актуальный компилятор языка 'C' даже не пытается оперировать, если конечно не прибегать к помощи ассемблерных вставок, сегментными регистрами микропроцессора.
Serg79, надо уточнить однако... Он, компилятор, считает что для кода используется селектор cs, для данных ds, стека ss... Если человек создал код ОС создающий и управляющий процессами (!) - я вообще проблемы не вижу. Просто, примерно как в windows, использовать линейную модель при переводе процессора в защищенный режим: настроить GDT так, что все селекторы пусть ссылаются на один и тот же дескриптор и ВСЁ. Ещё вариант - межсегментный вызов это обращение к сервисной функции ОС ? Ну тогда вызов через обработчик прерывания ( 0x2E например)... Или "библиотека - заглушка" вызывающая прерывание... P.S.: zloi7777, интересно, подкачка страниц тоже реализована? А переключение задач?
|
|
« Последнее редактирование: 23-04-2010 01:11 от sss »
|
Записан
|
while (8==8)
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #25 : 23-04-2010 05:47 » |
|
Ещё вариант - межсегментный вызов это обращение к сервисной функции ОС ? Ну тогда вызов через обработчик прерывания ( 0x2E например)... Или "библиотека - заглушка" вызывающая прерывание... Я какраз и пытался обойтись без "библиотека - заглушка", но как видно несудьба... интересно, подкачка страниц тоже реализована? А переключение задач? подкачка страниц - нет (из флеш уж больно медленно это все делать ), переключение задач - да Ты правильно сказал что для дальнего вызова требуется помимо смещения указать селектор нового сегмента. В твоих примерах на ассемблере я не увидел и намека на присутствие селекторов в вызовах подпрограмм. в самом первом посте - _test_seg Если ты делаешь вид что разбираешься в данной теме и говоришь что реализовал основной функционал ядра, то должен знать что на данный момент нет актуальных компиляторов языка 'C' которые поддерживали бы создание программы для защищенного режима с использованием нескольких сегментов как кода так и данных. Скажу больше, не один современный и актуальный компилятор языка 'C' даже не пытается оперировать, если конечно не прибегать к помощи ассемблерных вставок, сегментными регистрами микропроцессора. Это все о x86 архитектуре. Но вот пока несталкнулся с данной проблемой незнал я этого
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #26 : 23-04-2010 06:04 » |
|
zloi7777, так как с тем, что бы использовать линейную адресацию?
|
|
|
Записан
|
while (8==8)
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #27 : 23-04-2010 06:18 » |
|
zloi7777, так как с тем, что бы использовать линейную адресацию? как раз от нее и пытаюсь отойти, при линейной все просто и быстро, и проблем с сишными компилятовами нет, но защита при этом хромает.
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #28 : 23-04-2010 06:20 » |
|
так и подумал...
|
|
|
Записан
|
while (8==8)
|
|
|
sss
Специалист
Offline
|
|
« Ответ #29 : 23-04-2010 06:33 » |
|
zloi7777, а если заглушка cpp файл, создаваемый разработчиками ОС, внедряемый в каждый проект? Не надо париться с загрузчиком exe... Я так понимаю, адреса функций железно задаются?
|
|
« Последнее редактирование: 23-04-2010 06:36 от sss »
|
Записан
|
while (8==8)
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #30 : 23-04-2010 06:53 » |
|
Заглушка на exe некак не влияет (кроме размера), селекторы функций ядра известы заранее (покрайней мере у меня), а exe полюбому надо размешать в сегментах, и память под них выделять
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #31 : 23-04-2010 07:00 » |
|
zloi7777, я вообще про механизм загрузки dll... Если использовать dll-заглушку, надо после загрузки exe в оперативную память прописать адреса в IAT... Не понял. А что по твоему из себя представляет запись extern "C" void (*test)(void);
? Ведь, как я понял, собираться exe будет в "нормальной" ОС?
|
|
|
Записан
|
while (8==8)
|
|
|
Serg79
|
|
« Ответ #32 : 23-04-2010 07:03 » |
|
sss на сколько я знаю, на текущий момент нет ни одной реализации OS в которой бы реализовывалась поддержка нескольких сегментов кода или данных в 32-х разрядном защищенном режиме. Эта фишка x86 процессоров так и осталась не востребованной. Хотя может где то в лабораториях институтов и существуют подобные системы. Serg79, надо уточнить однако... Он, компилятор, считает что для кода используется селектор cs, для данных ds, стека ss... Если человек создал код ОС создающий и управляющий процессами (!) - я вообще проблемы не вижу. Просто, примерно как в windows, использовать линейную модель при переводе процессора в защищенный режим: настроить GDT так, что все селекторы пусть ссылаются на один и тот же дескриптор и ВСЁ.
sss, компилятор ничего не считает.)) Он реализует код для той аппаратной платформы для которой он создан. И если в x86 регистр 'CS' используется в качестве обозначения сегмента или селектора выполняемого кода, то ты хоть какую ОС пиши, а изменить предназначение регистра 'CS' не сможешь.))
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #33 : 23-04-2010 07:13 » |
|
Serg79, что за гон. В msdos в обработчике прерывания всегда использовал cs как сегмент данных для сохранения других селекторов... Он единственный был в правильном контексте. Блин они тогда не назывались селекторами
|
|
« Последнее редактирование: 23-04-2010 07:16 от sss »
|
Записан
|
while (8==8)
|
|
|
Serg79
|
|
« Ответ #34 : 23-04-2010 07:24 » |
|
zloi7777, так как с тем, что бы использовать линейную адресацию? как раз от нее и пытаюсь отойти, при линейной все просто и быстро, и проблем с сишными компилятовами нет, но защита при этом хромает. Кто тебе сказал что защита в каком то месте хромает? Приведи пример?)) zloi7777 как тебе наверно известно, при определении сегмента, будь то кода, данных или стека, ты указываешь помимо флагов доступа так же базовое смещение этого сегмента от нулевого адреса физической памяти и длину (размер) этого сегмента. zloi7777 и как ты наверно знаешь, физическая память отображенная на разные сегменты может быть одной и той же, что не увеличивает безопасности выполняющихся процессов в данных сегментах. Да и вообще сегментная модель управления процессами очень не удобная в плане управления памятью процесса. Если процессу требуется 50 Мб. памяти, то ему необходимо будет выделить сегмент размером в 50 Мб и отобразить этот сегмент на непрерывный участок физической памяти размерностью в 50 Мб. Как в таком случае обеспечивать выгрузку страниц в SWAP не понятно, короче нигде не используется сегментная модель управления памятью.
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #35 : 23-04-2010 07:31 » |
|
Serg79, что за гон. В msdos в обработчике прерывания всегда использовал cs как сегмент данных для сохранения других селекторов... Он единственный был в правильном контексте. Блин они тогда не назывались селекторами sss, извени но при всем твоем желании 'CS' не может использоваться для чего либо отличного чем от хранения сегмента кода (в msdos) или селектора кода (в PM). Так как он участвует в выборке следующей команды (CS:IP) для исполнения процессором.)))
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #36 : 23-04-2010 07:43 » |
|
zloi7777, так как с тем, что бы использовать линейную адресацию? как раз от нее и пытаюсь отойти, при линейной все просто и быстро, и проблем с сишными компилятовами нет, но защита при этом хромает. О какой защите идет речь? Что, у страниц памяти уже отсутствует защита?
|
|
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #37 : 23-04-2010 08:29 » |
|
Упс, извеняюсь, фигню написал про линейную адресацию, мой косяк. Просто думал о своем.....
Откатываясь назад. Как она может мне помоч в моей проблеме?
|
|
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #38 : 23-04-2010 08:43 » |
|
zloi7777, я вообще про механизм загрузки dll... Если использовать dll-заглушку, надо после загрузки exe в оперативную память прописать адреса в IAT... Не понял. А что по твоему из себя представляет запись
Код: extern "C" void (*test)(void);
? Ведь, как я понял, собираться exe будет в "нормальной" ОС? изночаль хотел прикомпилять либу с кодом типа: public _test _test label proc _test_off dd 0 ;32-bit offset _test_seg dw 0140h ;16-bit selector
теперь придется PUBLIC _test _test PROC near call [pword test] ret _test ENDP ... test label proc test_off dd 0 ;32-bit offset test_seg dw 0140h ;16-bit selector
и в сях: extern "C" void test(void);
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #39 : 23-04-2010 08:55 » |
|
Упс, извеняюсь, фигню написал про линейную адресацию, мой косяк. Просто думал о своем.....
Откатываясь назад. Как она может мне помоч в моей проблеме?
Знаешь zloi7777, помимо того что ты написал как ты выразился фигню, так ты еще здесь очень много пыли в глаза напускал. Ну да ладно, пускай это будет на твоей совести.))) Если по существу касаемо твоего вопроса. Как я уже было выше сказано, современные компиляторы языка 'C' не умеют генерировать код для 32-разрядных программ защищенного режима, используемых несколько сегментов кода или данных. На мой взгляд есть два выхода из этой ситуации: - Первое. Реализовать свой (или подправить существующий открытый) компилятор который будет уметь создавать такой код.
- Второе. Обеспечить "плоский режим" среды выполнения пользовательских приложений со стороны ядра. Как ты это будешь делать, с использованием разных сегментов для задач или одного но со страничной организацией, это уже не суть важно.
Если кто может предложить еще какие то пути решения позволяющие запускать программы, генерируемые современными компиляторами. То дополните данный список.
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #40 : 23-04-2010 08:58 » |
|
Serg79 но ведь ничто не мешает использовать CS как сегмент данных... Ладно это демагогия... Я просто хотел сказать, что селекторы неявно все же используются компиляторами C++.
zloi7777 я, честно перестал понимать. При чем здесь near? Это все работало в 16 битном исполнении.... У тебя защищенный 32(64?) битный режим... Я хотел сказать, что компилятор c++ при вызове функций внешних библиотек использует значения из IAT, заполняемые загрузчиком процесса...
|
|
|
Записан
|
while (8==8)
|
|
|
Serg79
|
|
« Ответ #41 : 23-04-2010 09:09 » |
|
Serg79 но ведь ничто не мешает использовать CS как сегмент данных... Ладно это демагогия... Я просто хотел сказать, что селекторы неявно все же используются компиляторами C++.
Знаешь sss, как ни странно но ты даже с помощью ассемблерной инструкции 'mov' ничего не сможешь записать в сегментный регистр 'CS'.))) Занести в регистр 'CS' новое значение можно только косвенными методами, например выполнить дальний переход 'far jmp' или выполнить выход из дальней процедуры 'far ret'.))) Так что sss для кого то может это и демагогия, но только не для x86 процессоров.)))
|
|
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #42 : 23-04-2010 09:29 » |
|
Если по существу касаемо твоего вопроса. Как я уже было выше сказано, современные компиляторы языка 'C' не умеют генерировать код для 32-разрядных программ защищенного режима, используемых несколько сегментов кода или данных. На мой взгляд есть два выхода из этой ситуации:
•Первое. Реализовать свой (или подправить существующий открытый) компилятор который будет уметь создавать такой код. •Второе. Обеспечить "плоский режим" среды выполнения пользовательских приложений со стороны ядра. Как ты это будешь делать, с использованием разных сегментов для задач или одного но со страничной организацией, это уже не суть важно. Про компиляторы я понял, как сделать - постом выше написал, я непойму, как способ организации памяти(линейная адресация) может мне помоч вызвать сервисную функцию ОС из пользовательской программы используя шлюз вызова?
|
|
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #43 : 23-04-2010 09:40 » |
|
zloi7777 я, честно перестал понимать. При чем здесь near? Это все работало в 16 битном исполнении.... У тебя защищенный 32(64?) битный режим... Я хотел сказать, что компилятор c++ при вызове функций внешних библиотек использует значения из IAT, заполняемые загрузчиком процесса...
Я какраз и вызываю описанным выше способом Функции внешних библиотек ОС, селекторы шлюзов вызовов известны заранее (определены в GDT или LDT). А у near что в 16, что 32 значение одинаковое - используется только в пределах сегмента.
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #44 : 23-04-2010 10:11 » |
|
Про компиляторы я понял, как сделать - постом выше написал, я непойму, как способ организации памяти(линейная адресация) может мне помоч вызвать сервисную функцию ОС из пользовательской программы используя шлюз вызова? Не совсем понял что ты имеешь в виду. Если в общих словах, то повысить уровень привилегии исполняемого кода, например с 3-го до 0-го уровня можно только тремя способами: - Первый способ. Это использовать "шлюз вызова" (Call-Gate) в котором описываются права доступа к этому шлюзу и указывается селектор который должен указывать на сегмент, который будет использоваться в качестве сегмента кода. Да, дескриптор "щлюза-вызова" должен находиться в таблице "глобальных дескрипторов" (GDT).
- Второй способ. Это использовать прерывание, которое будет описано в таблице дескрипторов прерываний (IDT). В этой таблице в качестве обработчика могут быть указаны следующие дескрипторы на соответствующие обработчики. Это: 1 - Task Gate, 2 - Interrupt Gate, 3 - Trap Gate.
Короче zloi7777, это очень большая тема и в двух словах ничего не объяснишь. Только могу сказать, что современные ОС для x86 процессоров используют для повышения уровня привилегии до 0-го уровня вызов прерывания с передачей управления на код обработчика с помощью "Interrupt Gate". Что то расписывать более подробно нет смысла, потому что это займет несколько страниц текста. Если есть конкретные вопросы то задавай их, а еще лучше обращайся к документации Intel для ихних процессоров (Intel Architecture Software Developer’s Manual Volume 3: System Programming).
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #45 : 23-04-2010 10:52 » |
|
как ни странно но ты даже с помощью ассемблерной инструкции 'mov' ничего не сможешь записать в сегментный регистр 'CS'.)))
Да почему это не сможешь, хоть mov, хоть push/pop. Просто в защищенном режиме так не делается. А в реальном восновном так и делалось. zloi7777, странные проблемы для человека который уже целую ОС написал.
|
|
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #46 : 23-04-2010 10:55 » |
|
zloi7777, странные проблемы для человека который уже целую ОС написал. в чем странность, что я незнал что компилер си неможет делать 48ми битны вызов?
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #47 : 23-04-2010 11:05 » |
|
Да почему это не сможешь, хоть mov, хоть push/pop. Просто в защищенном режиме так не делается. А в реальном восновном так и делалось.
Попробуй resource.)))
|
|
|
Записан
|
|
|
|
zloi7777
Постоялец
Offline
|
|
« Ответ #48 : 23-04-2010 11:09 » |
|
Serg79, вообщето я это и неспрашивалю
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #49 : 23-04-2010 11:11 » |
|
Serg79, так я еще под DOS всегда так делал, что тут пробовать. Яж говорю, что для реального режима это вообще нормальный ход
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #50 : 23-04-2010 11:13 » |
|
zloi7777, ну тогда я не знаю что ты спрашиваешь. Задавай более конкретизированные вопросы.
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #51 : 23-04-2010 11:17 » |
|
в чем странность, что я незнал что компилер си неможет делать 48ми битны вызов?
Вызовы делает не компиллер, а процессор. А странность в том, что это вообще какая-то слишком мелкая проблема (раз уж смог целую ОС сделать). ЗЫ если ты код пишешь так же как посты, то не понятно, как оно вообще скомпилилось
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #52 : 23-04-2010 11:17 » |
|
resource, ну ты сам подумай. Да же если бы ты смог записать любое значение в регистр 'CS' то какая инструкция ассемблера должна выполняться следующей? Если при этом процессор в качестве следующей инструкции исполнения использует адрес CS:IP.
Просто представь, куда при следующем такте процессора у тебя улетит цепочка исполнения команд сразу же, после записи произвольного значения в сегментный регистр 'CS'.
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #53 : 23-04-2010 11:19 » |
|
Кстати resource, а регистр команд 'IP' не доступен даже на чтение.)))
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #54 : 23-04-2010 11:21 » |
|
Serg79, почему произвольного? конкретный адрес. Каюсь, я вообще не про cs почему-то думал (когда говорил что так и делал), а про сегментные регистры вообще. Но и проблем с записью в cs тоже не вижу (для реального режима во всяком случае).
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #55 : 23-04-2010 11:21 » |
|
Serg79, да, я вцелом затупил. Ты прав. В том смысле что всё равно дальний jmp придется делать, чтоб IP установить. И cs при том же jmp указывается
|
|
« Последнее редактирование: 23-04-2010 11:23 от resource »
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #56 : 23-04-2010 11:22 » |
|
resource, ну сам подумай. Помимо сегмента тебе так же необходимо точно установить значение регистра 'IP' что бы цепочка команд началась выполняться правильно.)))
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #57 : 23-04-2010 11:53 » |
|
resource поэтому они и называются дальними переходами, что по мимо смещения им еще передается новое значение для загрузки в сегментный регистр 'CS'.
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #58 : 23-04-2010 12:41 » |
|
Serg79, да вопросов нет. Я ведь уже признался что был неправ
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #59 : 23-04-2010 12:47 » |
|
Это я так resource, что бы молодежь почем зря не тупила и пыль не пыталась в глаза пускать после того как узнала что x86 процессоры в защищенном режиме оказывается то же могут использовать сегменты (кстати не только могут а и используют так как без них никуда, только их размер выставляется равным 4 Гбайт-ам) примерно так же как и под Досом.)))
|
|
|
Записан
|
|
|
|
sss
Специалист
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
|
|
« Ответ #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
Специалист
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
Специалист
Offline
|
|
« Ответ #63 : 27-04-2010 00:49 » |
|
Вот нашел - разжевано даже очень ничего, вроде. Свой код я потерял давным давно - сгорел жесткий 14 лет назад . Глупо, но тогда я имел все в одном месте.... P.S.: Интересно, в современных обработчиках ISR, не установленных системными средствами в цепочку, тоже наверное надо извращаться...
|
|
« Последнее редактирование: 27-04-2010 00:54 от sss »
|
Записан
|
while (8==8)
|
|
|
|