1 | |
Как инициализировать указатель произвольным адресом?10.04.2013, 08:30. Показов 4688. Ответов 30
Метки нет (Все метки)
0
|
10.04.2013, 08:30 | |
Ответы с готовыми решениями:
30
Как инициализировать указатель на структуру? Как объявить указатель на массив через typedef и как инициализировать такой тип Как считать матрицу из файла с произвольным типом элементов и произвольным размером матрицы Можно ли инициализировать указатель внутри условия? |
11.04.2013, 11:04 | 21 |
Дело не в ОС, дело в том, что эти ОС работают в protected mode с включеным paging'ом, а он (protected mode) уже не даст лезть куда не просят. Т.е. защита на уровне процессора, а не на уровне ОС,
Опять же дело не в ДОСе, а в том, что ДОС работает в real mode с сегментной организацией памяти, т.е. прибавив базу сегмента к смещению мы реально имеем физический адрес в ОЗУ. Добавлено через 58 секунд то же относится к lond mode. Добавлено через 54 секунды И да, получить физический адрес таки можно, только вот потом ты с ним все равно ничего сделать не сможешь.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
11.04.2013, 18:55 | 23 |
Процессор знать не знает, кого и куда не надо пускать. Сама ось, кстати, вообще не сможет работать без доступа везде. Так что защищает именно ось, но ось исполняется камнем.
Добавлено через 1 минуту Ну винда же работает в другом режиме, так что дело именно в досе. Точнее в том, для какого режима он писан. И где я назвал конкретный дос? TR-DOS тоже DOS, но там ничего складывать не нужно. Добавлено через 3 минуты Сама ось может, ей как бы разрешено.
0
|
11.04.2013, 21:25 | 25 |
Суть в следующем - защита происходит по CPL и по флагам в записи каталогах/таблицах страниц. Когда ОС только загружается, она загружается в real mode, в этом режиме формируются каталоги/таблицы страниц, где и выставляются нужные флаги. Потом код загрузчика переводит процессор в protected mode (если мы говорим о 32х битных ОС) и дальше уже загружается непостредственно ОС. Так вот, когда пользователь выполняет свою программу, она выполняется с CPL = 3, и когда эта программа попробует обратиться туда, куда не просят, то защита сработает на уровне процессора (будет GP exception), задача ОС всего лишь корректно обработать это исключение. Сама ОС защитой такого уровня не занимается.
Да, тот же "Hello, World" требует нулевого CPL для записи в видеопамять. Поэтому код вывода строки в консоль работает на нулевом уровне привилегий, в котором есть возможность дотянутся туда, куда другим запрещено. Переход на нулевой уровень происходит, например, через шлюз прерывания (печать строки есть прерывание), при возврате из обработчика прерывания CPL восстанавливается. Незнаю, что такое TR-DOS, но в real mode нужно сложить базу из сегментного регистра умноженную на 16 со смещением, чтоб получить физический адрес. В других режимах все еще сложнее. Ты мои слова не правильно понял, я писал Т.е. имея на руках виртуальный адрес можно вычислить какому физическому адресу он соответствует. Я хорошо понимаю, как это сделать переключившись в real mode Но вот из protected mode нужно будет читать значения, имея на руках например физический адрес каталога страниц, который процессором воспримется как вритуальный, и в итоге прочитается не то, что нужно. Поэтому стандартными средствами С этого не сделать. Я где-то натыкался на сишный код под Linux, где происходит вычисление физического адреса при помощи gcc builtin функций. Если интересно, можно погуглить.
0
|
12.04.2013, 13:05 [ТС] | 28 |
О, точно! Нужно создать переменную, узнать ее адрес, этим адресом инициализировать указатель, и затем разыменовать его чтобы узнать будет ли в нем значение той переменной, у которой узнавали адрес.
Только как это провернуть?
0
|
12.04.2013, 13:10 | 29 | |||||
Запускаешь программу, выводишь адрес переменной, закрываешь. Вставляешь в свой код этот адрес, запускаешь и вуаля - ОС загрузила программу в другой участок памяти и адрес опять не валидный
Короче в общем случае никак, но можно надеятся на везение, конкретно на то, что адрес переменной останется валидным при перезапуске программы. Но можно сделать по другому
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||
17.05.2014, 15:25 | 31 | ||||||||||
А кто каталоги формирует?
Добавлено через 1 минуту А ничего, что без возможности манипулировать таблицами каталога страниц многозадачная ось не сможет дефрагментировать свободную память и быстро свалится? Добавлено через 2 минуты Нет. Задача оси распределить память. Кстати, а как вообще загружать пользовательский процесс, если вся память распределена ещё системным загрузчиком? Добавлено через 5 минут Операционная система дисковой версии спектрума, чей камень вообще не знаком с режимами, а все адреса там физические. На спектруме вопрос о том, сегментная ли у него память, или плоская, - это лишь вопрос интерпретации адресного регистра в качестве регистровой пары восьмибитных регистров, или одиночного шестнаднцатибитного регистра, поддерживаются оба варианта инкремента/декремента адресов. Смещение восьмибитная, адрес шестнадцатибитный, множитель базы 256. Добавлено через 6 минут Зачем вообще угадывать? Или читай маны по статическим адресам, или
Добавлено через 9 минут Не по теме: Прочитал надпись на заборе. Отсылку не понял. Добавлено через 2 часа 17 минут И не забывайте о том, что ТС не сказала, что пишет. Если как раз ось, то физический адрес вполне доступен. А если ещё и реального режима, то ещё смешней.
0
|
17.05.2014, 15:25 | |
17.05.2014, 15:25 | |
Помогаю со студенческими работами здесь
31
Передать указатель в функцию и там его инициализировать Указатель а (типа int) был с адресом "1С96", вопрос — Какой адрес станет у а, после а+=2? Как получить ссылку на указатель или указатель на указатель в массиве? Возможно ли указатель производного класса инициализировать объектом базового класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |