записывать жестко в RAM по определенному физическому адресу - PullRequest
0 голосов
/ 06 октября 2019

Я хочу написать что-нибудь в программе пользователя, например: записать значение 3 в физический адрес 0xF7F4900(260MB) из начального адреса 0x0, в то время как все ядро ​​находится в диапазоне 0-240 МБ. Как я могу это сделать? Любая идея, пожалуйста?

С наилучшими пожеланиями.

Я думал, что использовать Mmap, но я думаю, что он получает мне виртуальный адрес.

memfd = open("/dev/mem", O_RDWR);
map = mmap(0xF7F4900, sizeof(int), PROT_WRITE, MAP_SHARED, memfd, 0);
*map = 3;

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Рассматривайте /dev/mem как файл и записывайте со смещением 0xF7F4900 в этом файле:

char value = 3;
int fd = open("/dev/mem", O_RDWR);
lseek(fd, 0xF7F4900, SEEK_SET);
write(fd, &value, 1);
close(fd);

Если вы хотите mmap, применяется то же самое. Вы не должны пытаться сопоставить его с 0xF7F4900 в вашем процессе, вместо этого вы должны сопоставить его с произвольным местоположением и написать в map[0xF7F4900], если вы отображаете со смещением 0 или map[0x900], если вы отображаете изграница страницы 0xF7F4000.

Обратите внимание, что произвольный доступ к /dev/mem может потребовать специальной настройки ядра и полностью отключается при безопасной загрузке UEFI.

0 голосов
/ 06 октября 2019

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

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