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

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

ru
Offline 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
Деятель
Команда клуба

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

« Ответ #1 : 21-04-2010 10:41 » 

Какой компилятор, какая целевая процессорная платформа?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zloi7777
Постоялец

ru
Offline Offline

« Ответ #2 : 21-04-2010 11:31 » 

Borland (CodeGear)
bcc32
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 22-04-2010 03:03 » 

1. какая-то неувязочка
Borland (CodeGear)
bcc32
и
Но как сишному компилятору сказать что функция test имеет 48-ми битный адрес???

2. как данные
Код: (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]

3. и моё самое любимое:)  Зачем? Что ты с этого получишь и зачем пытаться перехитрить компилятор?

PS: не долгое гугление привело нас сюда http://www.codenet.ru/progr/cpp/4/r77_1.php
всё подробно расписано (поищи в тексте фразу "Объявление ближних или дальних функций ")
да и вообще всё это для старого доброго доса и реального режима, как это связано с защищённым режимом не понятно
« Последнее редактирование: 22-04-2010 03:56 от Алексей1153++ » Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 22-04-2010 03:57 » 

LogRus, с форматированием был косячок - я поправил
Записан

zloi7777
Постоялец

ru
Offline 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
Молодой специалист

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

« Ответ #6 : 22-04-2010 06:23 » 

А где про такое написано? Можно ссылку (или название книги)?
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 22-04-2010 06:37 » 

я про программировании защищенного режима 0, так что пара вопросов

В данных описан адрес функции.

т.е. функция на этапе кодирования знает свой адрес?
не всё ли ей равно, как её вызывают (говорим про stdcall, не fastcall), дёрнул ret и был таков?

Алексей1153++, спасибо. Улыбаюсь
Записан

Странно всё это....
zloi7777
Постоялец

ru
Offline Offline

« Ответ #8 : 22-04-2010 06:52 » 

Цитата
т.е. функция на этапе кодирования знает свой адрес?
не всё ли ей равно, как её вызывают (говорим про stdcall, не fastcall), дёрнул ret и был таков?

Это указатель на функцию. Я в первом посте про это написал.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #9 : 22-04-2010 07:10 » 

ах, вот оно что.
так вот в C++ указатели всегда одного размера 32 бита (на x86), этого вполне достаточно для покрытия всего адресного пространства и дополнительных 16 бит тут не нужно.
Записан

Странно всё это....
zloi7777
Постоялец

ru
Offline Offline

« Ответ #10 : 22-04-2010 07:19 » 

Цитата
ах, вот оно что.
так вот в C++ указатели всегда одного размера 32 бита (на x86), этого вполне достаточно для покрытия всего адресного пространства и дополнительных 16 бит тут не нужно.

Его достаточно для работы в пределах одного сегмента ( короткий переход ), для вызова функции из другого сегмента надо 48 бит: 32 (как при коротком переходе ) это смещение и 16 селектор сегмента.
Записан
resource
Молодой специалист

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

« Ответ #11 : 22-04-2010 07:23 » 

Ну походу никак такое не сделаешь. Напиши inline функцию или максрос и всё
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #12 : 22-04-2010 07:29 » 

быыырррр

ладно вернём к главному вопросу, какая цель иметь длинные переходы, какую задачу ты решаешь?
Записан

Странно всё это....
zloi7777
Постоялец

ru
Offline Offline

« Ответ #13 : 22-04-2010 07:35 » 

Цитата
Ну походу никак такое не сделаешь. Напиши inline функцию или максрос и всё

енто понятно и написано  Улыбаюсь, но выглядин не так красиво....
Записан
resource
Молодой специалист

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

« Ответ #14 : 22-04-2010 07:36 » 

LogRus, он видимо хочет переключить задачу в защищенном режиме

zloi7777, нормально выглядит. Если пишешь такие вещи, то без ассемблера полюбому не обойтись.
« Последнее редактирование: 22-04-2010 07:37 от resource » Записан
zloi7777
Постоялец

ru
Offline Offline

« Ответ #15 : 22-04-2010 07:44 » 

Цитата
ладно вернём к главному вопросу, какая цель иметь длинные переходы, какую задачу ты решаешь?

шлюз вызова, сегмент задачи ( прога под свою ос)
Записан
resource
Молодой специалист

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

« Ответ #16 : 22-04-2010 07:51 » 

zloi7777, какой формат исполняемых файлов в "своей" ОС ?
« Последнее редактирование: 22-04-2010 07:54 от resource » Записан
zloi7777
Постоялец

ru
Offline Offline

« Ответ #17 : 22-04-2010 07:59 » 

Цитата
Если пишешь такие вещи, то без ассемблера полюбому не обойтись.

ясен пень  Улыбаюсь
все написано и работает, осдалось оформить хедер файл для кончного пользования, которы будит писать свои проги на Си используя указатели на мои функции..., и тут встала затыка в указателях на 48бит. Жаль
понятно что можно написать:
Код:
#define test_cpp() asm { call [PWORD PTR test_asm] } 

с параметрами чуть страшнее.

Или написать функция на ассемблере, но это лишнии операции и размер.
 
Записан
zloi7777
Постоялец

ru
Offline Offline

« Ответ #18 : 22-04-2010 08:00 » 

Цитата
какой формат исполняемых файлов в "своей" ОС ?

exe (PE)
Записан
resource
Молодой специалист

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

« Ответ #19 : 22-04-2010 08:05 » 

Переключать задачи должна только ОС. Программам это не нужно (нельзя) делать.
PE ? Что PE лодер написал? Уже целую ОС наверное сделал... ну что-то PE уж какой-то чисто виндовый формат.
Записан
zloi7777
Постоялец

ru
Offline Offline

« Ответ #20 : 22-04-2010 08:15 » 

Цитата
Переключать задачи должна только ОС. Программам это не нужно (нельзя) делать.
PE ? Что PE лодер написал? Уже целую ОС наверное сделал... ну что-то PE уж какой-то чисто виндовый формат.

шлюзы вызова, вызова функций ядра из ring0.
a PE,там с бесяток полей нужны, а дальше простое копирование.
а bcc32 - компилятор тоже виндовый
Записан
resource
Молодой специалист

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

« Ответ #21 : 22-04-2010 08:43 » 

Обрывками фраз разговаривать это как-то некрасиво, и что самое главное - не понятно. И оверквотинг всё таки нехорошее дело
Записан
Serg79
Команда клуба

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

WWW
« Ответ #22 : 22-04-2010 15:32 » 

Я как раз и использую защищенный режим, и 48-ми битная адресация функции нужна для межсигментного вызова в защищенном режиме.
Ты правильно сказал что для дальнего вызова требуется помимо смещения указать селектор нового сегмента. В твоих примерах на ассемблере я не увидел и намека на присутствие селекторов в вызовах подпрограмм.

Если ты делаешь вид что разбираешься в данной теме и говоришь что реализовал основной функционал ядра, то должен знать что на данный момент нет актуальных компиляторов языка 'C' которые поддерживали бы создание программы для защищенного режима с использованием нескольких сегментов как кода так и данных. Скажу больше, не один современный и актуальный компилятор языка 'C' даже не пытается оперировать, если конечно не прибегать к помощи ассемблерных вставок, сегментными регистрами микропроцессора. Это все о x86 архитектуре.
Записан
Serg79
Команда клуба

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

WWW
« Ответ #23 : 22-04-2010 15:33 » 

ИМХО, тему лучше перенести в "Ассемблер", здесь мало что к "С" относиться.
Записан
sss
Специалист

ru
Offline 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
Постоялец

ru
Offline Offline

« Ответ #25 : 23-04-2010 05:47 » 

Цитата
Ещё вариант -  межсегментный вызов это обращение к сервисной функции ОС ? Ну тогда вызов через обработчик прерывания ( 0x2E например)... Или "библиотека - заглушка" вызывающая прерывание...
Я какраз и пытался обойтись без "библиотека - заглушка", но как видно несудьба... Жаль
Цитата
интересно, подкачка страниц тоже реализована? А переключение задач?
подкачка страниц - нет (из флеш уж больно медленно это все делать Жаль ), переключение задач - да
Цитата
Ты правильно сказал что для дальнего вызова требуется помимо смещения указать селектор нового сегмента. В твоих примерах на ассемблере я не увидел и намека на присутствие селекторов в вызовах подпрограмм.
в самом первом посте - _test_seg
Цитата
Если ты делаешь вид что разбираешься в данной теме и говоришь что реализовал основной функционал ядра, то должен знать что на данный момент нет актуальных компиляторов языка 'C' которые поддерживали бы создание программы для защищенного режима с использованием нескольких сегментов как кода так и данных. Скажу больше, не один современный и актуальный компилятор языка 'C' даже не пытается оперировать, если конечно не прибегать к помощи ассемблерных вставок, сегментными регистрами микропроцессора. Это все о x86 архитектуре.
Но вот пока несталкнулся с данной проблемой незнал я этого  Отлично Жаль
Записан
sss
Специалист

ru
Offline Offline

« Ответ #26 : 23-04-2010 06:04 » 

zloi7777, так как с тем, что бы использовать линейную адресацию?
Записан

while (8==8)
zloi7777
Постоялец

ru
Offline Offline

« Ответ #27 : 23-04-2010 06:18 » 

Цитата
zloi7777, так как с тем, что бы использовать линейную адресацию?
как раз от нее и пытаюсь отойти, при линейной все просто и быстро, и проблем с сишными компилятовами нет, но защита при этом хромает.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #28 : 23-04-2010 06:20 » 

так и подумал...
Записан

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

ru
Offline Offline

« Ответ #29 : 23-04-2010 06:33 » 

zloi7777, а если заглушка cpp файл, создаваемый разработчиками ОС, внедряемый в каждый проект? Не надо париться с загрузчиком exe... Я так понимаю, адреса функций железно задаются?
« Последнее редактирование: 23-04-2010 06:36 от sss » Записан

while (8==8)
zloi7777
Постоялец

ru
Offline Offline

« Ответ #30 : 23-04-2010 06:53 » 

Заглушка на exe некак не влияет (кроме размера), селекторы функций ядра известы заранее (покрайней мере у меня), а exe полюбому надо размешать в сегментах, и память под них выделять
Записан
sss
Специалист

ru
Offline Offline

« Ответ #31 : 23-04-2010 07:00 » 

zloi7777, я вообще про механизм загрузки dll... Если использовать dll-заглушку, надо после загрузки exe в оперативную память  прописать адреса в IAT... Не понял. А что по твоему из себя представляет запись
Код:
extern "C" void (*test)(void);

? Ведь, как я понял, собираться exe будет в "нормальной" ОС?
Записан

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

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

WWW
« Ответ #32 : 23-04-2010 07:03 » 

sss на сколько я знаю, на текущий момент нет ни одной реализации OS в которой бы реализовывалась поддержка нескольких сегментов кода или данных в 32-х разрядном защищенном режиме. Эта фишка x86 процессоров так и осталась не востребованной. Хотя может где то в лабораториях институтов и существуют подобные системы.

Serg79, надо уточнить однако... Он, компилятор, считает что для кода используется селектор cs, для данных ds, стека ss... Если человек создал код ОС создающий и управляющий процессами (!) - я вообще проблемы не вижу. Просто, примерно как в windows, использовать линейную модель при переводе процессора в защищенный режим: настроить GDT так, что все селекторы пусть ссылаются на один и тот же дескриптор и ВСЁ.
sss, компилятор ничего не считает.)) Он реализует код для той аппаратной платформы для которой он создан. И если в x86 регистр 'CS' используется в качестве обозначения сегмента или селектора выполняемого кода, то ты хоть какую ОС пиши, а изменить предназначение регистра 'CS' не сможешь.))
Записан
sss
Специалист

ru
Offline Offline

« Ответ #33 : 23-04-2010 07:13 » 

Serg79, что за гон. В msdos в обработчике прерывания всегда использовал cs как сегмент данных для сохранения других селекторов... Он единственный был в правильном контексте. Блин они тогда не назывались селекторами  Жаль
« Последнее редактирование: 23-04-2010 07:16 от sss » Записан

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

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

WWW
« Ответ #34 : 23-04-2010 07:24 » 

Цитата
zloi7777, так как с тем, что бы использовать линейную адресацию?
как раз от нее и пытаюсь отойти, при линейной все просто и быстро, и проблем с сишными компилятовами нет, но защита при этом хромает.
Кто тебе сказал что защита в каком то месте хромает? Приведи пример?))

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

Да и вообще сегментная модель управления процессами очень не удобная в плане управления памятью процесса. Если процессу требуется 50 Мб. памяти, то ему необходимо будет выделить сегмент размером в 50 Мб и отобразить этот сегмент на непрерывный участок физической памяти размерностью в 50 Мб. Как в таком случае обеспечивать выгрузку страниц в SWAP не понятно, короче нигде не используется сегментная модель управления памятью.
Записан
Serg79
Команда клуба

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

WWW
« Ответ #35 : 23-04-2010 07:31 » 

Serg79, что за гон. В msdos в обработчике прерывания всегда использовал cs как сегмент данных для сохранения других селекторов... Он единственный был в правильном контексте. Блин они тогда не назывались селекторами  Жаль
sss, извени но при всем твоем желании 'CS' не может использоваться для чего либо отличного чем от хранения сегмента кода (в msdos) или селектора кода (в PM). Так как он участвует в выборке следующей команды (CS:IP) для исполнения процессором.)))
Записан
resource
Молодой специалист

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

« Ответ #36 : 23-04-2010 07:43 » 

Цитата
zloi7777, так как с тем, что бы использовать линейную адресацию?
как раз от нее и пытаюсь отойти, при линейной все просто и быстро, и проблем с сишными компилятовами нет, но защита при этом хромает.

О какой защите идет речь? Что, у страниц памяти уже отсутствует защита?
Записан
zloi7777
Постоялец

ru
Offline Offline

« Ответ #37 : 23-04-2010 08:29 » 

Упс, извеняюсь, фигню написал про линейную адресацию, мой косяк. Просто думал о своем.....

Откатываясь назад. Как она может мне помоч в моей проблеме?
Записан
zloi7777
Постоялец

ru
Offline 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
Команда клуба

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

WWW
« Ответ #39 : 23-04-2010 08:55 » 

Упс, извеняюсь, фигню написал про линейную адресацию, мой косяк. Просто думал о своем.....

Откатываясь назад. Как она может мне помоч в моей проблеме?
Знаешь zloi7777, помимо того что ты написал как ты выразился фигню, так ты еще здесь очень много пыли в глаза напускал. Ну да ладно, пускай это будет на твоей совести.)))

Если по существу касаемо твоего вопроса. Как я уже было выше сказано, современные компиляторы языка 'C' не умеют генерировать код для 32-разрядных программ защищенного режима, используемых несколько сегментов кода или данных. На мой взгляд есть два выхода из этой ситуации:

  • Первое. Реализовать свой (или подправить существующий открытый) компилятор который будет уметь создавать такой код.
  • Второе. Обеспечить "плоский режим" среды выполнения пользовательских приложений со стороны ядра. Как ты это будешь делать, с использованием разных сегментов для задач или одного но со страничной организацией, это уже не суть важно.

Если кто может предложить еще какие то пути решения позволяющие запускать программы, генерируемые современными компиляторами. То дополните данный список.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #40 : 23-04-2010 08:58 » 

Serg79 но ведь ничто не мешает использовать CS как сегмент данных... Ладно это демагогия... Я просто хотел сказать, что селекторы неявно все же используются компиляторами C++.

zloi7777 я, честно перестал понимать. При чем здесь near? Это все работало в 16 битном исполнении.... У тебя защищенный 32(64?)  битный режим... Я хотел сказать, что компилятор c++ при
вызове функций внешних библиотек использует значения из IAT, заполняемые загрузчиком процесса...


Записан

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

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

WWW
« Ответ #41 : 23-04-2010 09:09 » 

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

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

ru
Offline Offline

« Ответ #42 : 23-04-2010 09:29 » 

Цитата
Если по существу касаемо твоего вопроса. Как я уже было выше сказано, современные компиляторы языка 'C' не умеют генерировать код для 32-разрядных программ защищенного режима, используемых несколько сегментов кода или данных. На мой взгляд есть два выхода из этой ситуации:


•Первое. Реализовать свой (или подправить существующий открытый) компилятор который будет уметь создавать такой код.
•Второе. Обеспечить "плоский режим" среды выполнения пользовательских приложений со стороны ядра. Как ты это будешь делать, с использованием разных сегментов для задач или одного но со страничной организацией, это уже не суть важно.
Про компиляторы я понял, как сделать - постом выше написал, я непойму, как способ организации памяти(линейная адресация) может мне помоч вызвать сервисную функцию ОС из пользовательской программы используя шлюз вызова? Улыбаюсь
Записан
zloi7777
Постоялец

ru
Offline Offline

« Ответ #43 : 23-04-2010 09:40 » 

Цитата
zloi7777 я, честно перестал понимать. При чем здесь near? Это все работало в 16 битном исполнении.... У тебя защищенный 32(64?)  битный режим... Я хотел сказать, что компилятор c++ при
вызове функций внешних библиотек использует значения из IAT, заполняемые загрузчиком процесса...

Я какраз и вызываю описанным выше способом
Цитата
Функции внешних библиотек
ОС, селекторы шлюзов вызовов известны заранее (определены в GDT или LDT).
А у near что в 16, что 32 значение одинаковое - используется только в пределах сегмента.
Записан
Serg79
Команда клуба

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

WWW
« Ответ #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
Молодой специалист

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

« Ответ #45 : 23-04-2010 10:52 » 

как ни странно но ты даже с помощью ассемблерной инструкции 'mov' ничего не сможешь записать в сегментный регистр 'CS'.)))

Да почему это не сможешь, хоть mov, хоть push/pop. Просто в защищенном режиме так не делается. А в реальном восновном так и делалось.

zloi7777, странные проблемы для человека который уже целую ОС написал.
Записан
zloi7777
Постоялец

ru
Offline Offline

« Ответ #46 : 23-04-2010 10:55 » 

Цитата
zloi7777, странные проблемы для человека который уже целую ОС написал.
в чем странность, что я незнал что компилер си неможет делать 48ми битны вызов?
Записан
Serg79
Команда клуба

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

WWW
« Ответ #47 : 23-04-2010 11:05 » 

Да почему это не сможешь, хоть mov, хоть push/pop. Просто в защищенном режиме так не делается. А в реальном восновном так и делалось.
Попробуй resource.)))
Записан
zloi7777
Постоялец

ru
Offline Offline

« Ответ #48 : 23-04-2010 11:09 » 

Serg79, вообщето я это и неспрашивалю
Записан
resource
Молодой специалист

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

« Ответ #49 : 23-04-2010 11:11 » 

Serg79, так я еще под DOS всегда так делал, что тут пробовать. Яж говорю, что для реального режима это вообще нормальный ход
Записан
Serg79
Команда клуба

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

WWW
« Ответ #50 : 23-04-2010 11:13 » 

zloi7777, ну тогда я не знаю что ты спрашиваешь. Задавай более конкретизированные вопросы.
Записан
resource
Молодой специалист

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

« Ответ #51 : 23-04-2010 11:17 » 

в чем странность, что я незнал что компилер си неможет делать 48ми битны вызов?

Вызовы делает не компиллер, а процессор. А странность в том, что это вообще какая-то слишком мелкая проблема (раз уж смог целую ОС сделать).

ЗЫ если ты код пишешь так же как посты, то не понятно, как оно вообще скомпилилось
Записан
Serg79
Команда клуба

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

WWW
« Ответ #52 : 23-04-2010 11:17 » 

resource, ну ты сам подумай. Да же если бы ты смог записать любое значение в регистр 'CS' то какая инструкция ассемблера должна выполняться следующей? Если при этом процессор в качестве следующей инструкции исполнения использует адрес CS:IP.

Просто представь, куда при следующем такте процессора у тебя улетит цепочка исполнения команд сразу же, после записи произвольного значения в сегментный регистр 'CS'.
Записан
Serg79
Команда клуба

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

WWW
« Ответ #53 : 23-04-2010 11:19 » 

Кстати resource, а регистр команд 'IP' не доступен даже на чтение.)))
Записан
resource
Молодой специалист

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

« Ответ #54 : 23-04-2010 11:21 » 

Serg79, почему произвольного? конкретный адрес.
Каюсь, я вообще не про cs почему-то думал (когда говорил что так и делал), а про сегментные регистры вообще. Но и проблем с записью в cs тоже не вижу (для реального режима во всяком случае).
Записан
resource
Молодой специалист

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

« Ответ #55 : 23-04-2010 11:21 » 

Serg79, да, я вцелом затупил. Ты прав. В том смысле что всё равно дальний jmp придется делать, чтоб IP установить. И cs при том же jmp указывается
« Последнее редактирование: 23-04-2010 11:23 от resource » Записан
Serg79
Команда клуба

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

WWW
« Ответ #56 : 23-04-2010 11:22 » 

resource, ну сам подумай. Помимо сегмента тебе так же необходимо точно установить значение регистра 'IP' что бы цепочка команд началась выполняться правильно.)))
Записан
Serg79
Команда клуба

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

WWW
« Ответ #57 : 23-04-2010 11:53 » 

resource поэтому они и называются дальними переходами, что по мимо смещения им еще передается новое значение для загрузки в сегментный регистр 'CS'.
Записан
resource
Молодой специалист

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

« Ответ #58 : 23-04-2010 12:41 » 

Serg79, да вопросов нет. Я ведь уже признался что был неправ  Улыбаюсь
Записан
Serg79
Команда клуба

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

WWW
« Ответ #59 : 23-04-2010 12:47 » 

Это я так resource, что бы молодежь почем зря не тупила и пыль не пыталась в глаза пускать после того как узнала что x86 процессоры в защищенном режиме оказывается то же могут использовать сегменты (кстати не только могут а и используют так как без них никуда, только их размер выставляется равным 4 Гбайт-ам) примерно так же как и под Досом.)))
Записан
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