Форум программистов, компьютерный форум CyberForum.ru

Как инициализировать указатель произвольным адресом? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
10.04.2013, 08:30     Как инициализировать указатель произвольным адресом? #1
Как инициализировать указатель произвольным адресом?
C++
int *ptr;
 
ptr = ? ; // КАК ЭТО СДЕЛАТЬ?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.04.2013, 11:04     Как инициализировать указатель произвольным адресом? #21
Цитата Сообщение от Pure Посмотреть сообщение
Виндовс, как и, предполагаю, линукс не дают доступа к железу.
Дело не в ОС, дело в том, что эти ОС работают в protected mode с включеным paging'ом, а он (protected mode) уже не даст лезть куда не просят. Т.е. защита на уровне процессора, а не на уровне ОС,

Цитата Сообщение от taras atavin Посмотреть сообщение
В dosе разве что, или ещё на какой однозадачной системе
Опять же дело не в ДОСе, а в том, что ДОС работает в real mode с сегментной организацией памяти, т.е. прибавив базу сегмента к смещению мы реально имеем физический адрес в ОЗУ.

Добавлено через 58 секунд
Цитата Сообщение от Kastaneda Посмотреть сообщение
protected mode с включеным paging'ом, а он (protected mode) уже не даст лезть куда не просят
то же относится к lond mode.

Добавлено через 54 секунды
И да, получить физический адрес таки можно, только вот потом ты с ним все равно ничего сделать не сможешь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Pure
 Аватар для Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
11.04.2013, 18:48     Как инициализировать указатель произвольным адресом? #22
Цитата Сообщение от Kastaneda Посмотреть сообщение
Дело не в ОС
ну так в ОС же дело. оне ж так сделаны что работают так как работают.
Цитата Сообщение от Kastaneda Посмотреть сообщение
И да, получить физический адрес таки можно
просим официальный способ
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.04.2013, 18:55     Как инициализировать указатель произвольным адресом? #23
Цитата Сообщение от Kastaneda Посмотреть сообщение
Т.е. защита на уровне процессора, а не на уровне ОС,
Процессор знать не знает, кого и куда не надо пускать. Сама ось, кстати, вообще не сможет работать без доступа везде. Так что защищает именно ось, но ось исполняется камнем.

Добавлено через 1 минуту
Цитата Сообщение от Kastaneda Посмотреть сообщение
Опять же дело не в ДОСе, а в том, что ДОС работает в real mode с сегментной организацией памяти, т.е. прибавив базу сегмента к смещению мы реально имеем физический адрес в ОЗУ.
Ну винда же работает в другом режиме, так что дело именно в досе. Точнее в том, для какого режима он писан. И где я назвал конкретный дос? TR-DOS тоже DOS, но там ничего складывать не нужно.

Добавлено через 3 минуты
Цитата Сообщение от Pure Посмотреть сообщение
просим официальный способ
Сама ось может, ей как бы разрешено.
Pure
 Аватар для Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
11.04.2013, 19:23     Как инициализировать указатель произвольным адресом? #24
Цитата Сообщение от taras atavin Посмотреть сообщение
Сама ось может, ей как бы разрешено.
так речь о юзере который работает на ОС. Я утверждаю что под управлением не реалтайм ос нет досупа к физике а вот товарисч пишет что есть. Будет интересно
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.04.2013, 21:25     Как инициализировать указатель произвольным адресом? #25
Цитата Сообщение от taras atavin Посмотреть сообщение
Процессор знать не знает, кого и куда не надо пускать. Так что защищает именно ось, но ось исполняется камнем.
Суть в следующем - защита происходит по CPL и по флагам в записи каталогах/таблицах страниц. Когда ОС только загружается, она загружается в real mode, в этом режиме формируются каталоги/таблицы страниц, где и выставляются нужные флаги. Потом код загрузчика переводит процессор в protected mode (если мы говорим о 32х битных ОС) и дальше уже загружается непостредственно ОС. Так вот, когда пользователь выполняет свою программу, она выполняется с CPL = 3, и когда эта программа попробует обратиться туда, куда не просят, то защита сработает на уровне процессора (будет GP exception), задача ОС всего лишь корректно обработать это исключение. Сама ОС защитой такого уровня не занимается.


Цитата Сообщение от taras atavin Посмотреть сообщение
Сама ось, кстати, вообще не сможет работать без доступа везде.
Да, тот же "Hello, World" требует нулевого CPL для записи в видеопамять. Поэтому код вывода строки в консоль работает на нулевом уровне привилегий, в котором есть возможность дотянутся туда, куда другим запрещено. Переход на нулевой уровень происходит, например, через шлюз прерывания (печать строки есть прерывание), при возврате из обработчика прерывания CPL восстанавливается.

Цитата Сообщение от taras atavin Посмотреть сообщение
TR-DOS тоже DOS, но там ничего складывать не нужно.
Незнаю, что такое TR-DOS, но в real mode нужно сложить базу из сегментного регистра умноженную на 16 со смещением, чтоб получить физический адрес. В других режимах все еще сложнее.


Цитата Сообщение от Pure Посмотреть сообщение
Я утверждаю что под управлением не реалтайм ос нет досупа к физике а вот товарисч пишет что есть.
Ты мои слова не правильно понял, я писал

Цитата Сообщение от Kastaneda Посмотреть сообщение
И да, получить физический адрес таки можно, только вот потом ты с ним все равно ничего сделать не сможешь.
Т.е. имея на руках виртуальный адрес можно вычислить какому физическому адресу он соответствует.
Я хорошо понимаю, как это сделать переключившись в real mode Но вот из protected mode нужно будет читать значения, имея на руках например физический адрес каталога страниц, который процессором воспримется как вритуальный, и в итоге прочитается не то, что нужно. Поэтому стандартными средствами С этого не сделать. Я где-то натыкался на сишный код под Linux, где происходит вычисление физического адреса при помощи gcc builtin функций. Если интересно, можно погуглить.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.04.2013, 12:52  [ТС]     Как инициализировать указатель произвольным адресом? #26
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
ptr=(int*)0x903280;
Я проверила, пишет "ошибка доступа"
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
12.04.2013, 12:56     Как инициализировать указатель произвольным адресом? #27
Цитата Сообщение от programina Посмотреть сообщение
Я проверила, пишет "ошибка доступа"
Дык это что за адрес? Просто от балды? Он может быть просто не мапирован.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.04.2013, 13:05  [ТС]     Как инициализировать указатель произвольным адресом? #28
Цитата Сообщение от Kastaneda Посмотреть сообщение
Дык это что за адрес? Просто от балды? Он может быть просто не мапирован.
О, точно! Нужно создать переменную, узнать ее адрес, этим адресом инициализировать указатель, и затем разыменовать его чтобы узнать будет ли в нем значение той переменной, у которой узнавали адрес.
Только как это провернуть?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
12.04.2013, 13:10     Как инициализировать указатель произвольным адресом? #29
Цитата Сообщение от programina Посмотреть сообщение
О, точно! Нужно создать переменную, узнать ее адрес, этим адресом инициализировать указатель, и затем разыменовать его чтобы узнать будет ли в нем значение той переменной, у которой узнавали адрес.
Только как это провернуть?
Запускаешь программу, выводишь адрес переменной, закрываешь. Вставляешь в свой код этот адрес, запускаешь и вуаля - ОС загрузила программу в другой участок памяти и адрес опять не валидный
Короче в общем случае никак, но можно надеятся на везение, конкретно на то, что адрес переменной останется валидным при перезапуске программы.

Но можно сделать по другому
C++
1
2
3
4
5
int value = 5;
long ptr = 0;
std::cout << (long) &value; // выводим адрес переменной
std::cin >> ptr; // считываем его в переменную
std::cout << *((int*)ptr); // выводим значение по этому адресу.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.04.2013, 13:36  [ТС]     Как инициализировать указатель произвольным адресом? #30
Цитата Сообщение от Kastaneda Посмотреть сообщение
Короче в общем случае никак, но можно надеятся на везение, конкретно на то, что адрес переменной останется валидным при перезапуске программы
А если наделать очень много однобайтовых переменных в весь обьем доступной памяти, то шансы угадать увеличатся?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2014, 15:25     Как инициализировать указатель произвольным адресом?
Еще ссылки по теме:

Почему указатель на указатель объявляется как float **A; C++
Передать указатель в функцию и там его инициализировать C++
C++ Как инициализировать массивы?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.05.2014, 15:25     Как инициализировать указатель произвольным адресом? #31
Цитата Сообщение от Kastaneda Посмотреть сообщение
Суть в следующем - защита происходит по CPL и по флагам в записи каталогах/таблицах страниц.
А кто каталоги формирует?

Добавлено через 1 минуту
Цитата Сообщение от Kastaneda Посмотреть сообщение
Когда ОС только загружается, она загружается в real mode, в этом режиме формируются каталоги/таблицы страниц, где и выставляются нужные флаги. Потом код загрузчика переводит процессор в protected mode (если мы говорим о 32х битных ОС) и дальше уже загружается непостредственно ОС.
А ничего, что без возможности манипулировать таблицами каталога страниц многозадачная ось не сможет дефрагментировать свободную память и быстро свалится?

Добавлено через 2 минуты
Цитата Сообщение от Kastaneda Посмотреть сообщение
и когда эта программа попробует обратиться туда, куда не просят, то защита сработает на уровне процессора (будет GP exception), задача ОС всего лишь корректно обработать это исключение. Сама ОС защитой такого уровня не занимается.
Нет. Задача оси распределить память. Кстати, а как вообще загружать пользовательский процесс, если вся память распределена ещё системным загрузчиком?

Добавлено через 5 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
Незнаю, что такое TR-DOS, но в real mode нужно сложить базу из сегментного регистра умноженную на 16 со смещением, чтоб получить физический адрес. В других режимах все еще сложнее.
Операционная система дисковой версии спектрума, чей камень вообще не знаком с режимами, а все адреса там физические. На спектруме вопрос о том, сегментная ли у него память, или плоская, - это лишь вопрос интерпретации адресного регистра в качестве регистровой пары восьмибитных регистров, или одиночного шестнаднцатибитного регистра, поддерживаются оба варианта инкремента/декремента адресов. Смещение восьмибитная, адрес шестнадцатибитный, множитель базы 256.

Добавлено через 6 минут
Цитата Сообщение от programina Посмотреть сообщение
А если наделать очень много однобайтовых переменных в весь обьем доступной памяти, то шансы угадать увеличатся?
Зачем вообще угадывать? Или читай маны по статическим адресам, или
C++
1
2
3
4
int x;
int *p;
p=&x;// Здесь программа сама помещает адрес переменной в указатель
std::cout<<*p; //А здесь по этому адресу читаем данные и выводим их в поток
, или
C++
1
2
3
4
int *p;
p=new int;// Здесь уже система помещает адрес переменной в указатель, при этом создавая переменную, имени такая переменная не имеет
std::cout<<*p; //А здесь по этому адресу читаем данные и выводим их в поток
delete p; // После использования надо переменную удалить, а указатель на неё освободить
.

Добавлено через 9 минут

Не по теме:

Прочитал надпись на заборе. Отсылку не понял.
Облака на небе сложились во фразу: «А чего сложного? <a href="иди в гугл">fdfds</a>.».



Добавлено через 2 часа 17 минут
И не забывайте о том, что ТС не сказала, что пишет. Если как раз ось, то физический адрес вполне доступен. А если ещё и реального режима, то ещё смешней.
Yandex
Объявления
17.05.2014, 15:25     Как инициализировать указатель произвольным адресом?
Ответ Создать тему
Опции темы

Текущее время: 14:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru