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

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines