Странный код выделения памяти в C, как это работает? - PullRequest
0 голосов
/ 26 мая 2011

Как работает этот код ???

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *addr = (int*) 0x4888d0;
    *addr = 30;
    printf("%i %p\n", *addr, addr);

    return 0;
}

Ответы [ 4 ]

6 голосов
/ 26 мая 2011

Работает, предполагая, что 0x4888d0 является адресом записываемого блока памяти размером не менее sizeof(int) байтов, который не влияет на функциональность printf или системы времени исполнения C.

Вернее, это не работает, по крайней мере, в моей системе (Segmentation fault).

0 голосов
/ 26 мая 2011

Как указано выше, это приводит к сегментации значения или повреждению нормальных приложений. Тем не менее,

Современные компьютеры, как правило, имеют зарезервированные адреса памяти, которые выполняют магические функции, такие как управление вводом-выводом, установка режимов ЦП, обновление карт памяти и т. Д. Страницы памяти с такими «реальными» адресами, которые не отображаются в виртуальной памяти, которую получают обычные приложения , Так ядро ​​связывается с аппаратными контроллерами. Тот факт, что предоставленный фрагмент перенаправляет память в ячейку и затем быстро считывает ее обратно, типичен для запроса у контроллера какого-либо типа статуса и последующего возврата состояния (любая запись в магическое слово может обновить состояние, которое контроллер делает доступным для программное обеспечение ... значение может не иметь значения).

Таким образом, если этот код взят из пространства ядра, или он находится в каком-то микроконтроллере или другой странной системе, адреса волшебной памяти могут быть доступны. Другая возможность состоит в том, что привилегированное приложение запросило у ядра специальное сопоставление виртуальной памяти, которое также может открыть для него магические страницы. Это может показаться странным, поскольку в то время, когда приложение запрашивает сопоставление чего-либо с расположением в виртуальной памяти, включая 0x4888d0, страница реальной памяти может быть совершенно иной (и недоступной для приложения).

0 голосов
/ 26 мая 2011

int *addr = (int*) 0x4888d0; даст адресу адрес =0x4888d0.Этот адрес может быть действительным адресом.Но нет гарантии, что это будет всегда работать.

0 голосов
/ 26 мая 2011

В этом нет ничего странного, однако это кажется довольно опасным.Эта программа пытается написать 30 в определенном месте.то есть Местоположение, адрес которого содержится в 0x4888d0.

Почему этот код написан именно так и почему именно этот адрес, ну, это все догадки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...