Не получается использовать эту функцию, ман (http://wВw.linuxdoc.ru/manpages/man2/mmap.2.html) зачитал до дыр.
Задача следующая: надо поиметь возможность писать/читать в заданную область памяти (0×40000000). Это не на х86, но значения не имеет.
int fd;
byte readval;
void *map_base;
if((fd = open(«/dev/mem», O_RDWR | O_SYNC)) == -1) {
printf(«File dev.mem ne otkrqt \n»);
exit(-1);
}
/* Map one page */
map_base = mmap(0×0, 0xF, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0×0);
if(map_base == (void *) -1){
close(fd);
exit(-1);
}
Если плохо сформулировал, могу сформулировать по-другому.
(нужно писать и читать в пару байтов по адресу 0×40000000, они отвечают за управление lcd матрицей, как это сделать?
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ИМХО ты не можешь получить доступ к памяти другого процесса (если он не дочерний ессно).
BADC0DEh
для того чтобы через mmap добраться до 0×40000000, в адресном пространстве твоего процесса должен быть свободен непрерывный кусок такого и даже чуть большего размера. Ты уверен что он есть такой?
Но зачем тебе mmap? Чем тебе lseek, write и read не нравится?
Имея права рута можно делать всё что угодно.
Дело в том, что у меня отдельная от компа плата с процом ARM9200, я могу с ней общаться либо через RS232 или через Ethernet. Вот, я туда залил линух через RS, он некоторые устройства на плате проинициализировал. Я к разъему подключаю lcd матрицу. Она подключается на шину данных, на прямую. Обратиться к ней можно если обращаться к адресам с 0×40000000 по 0×4FFFFFFF. На самом деле там 2 адреса, для записи, чтения (регистры) — команды и данных. Если 3-й бит адреса установлен в данном адресном пространстве, это команда, если нет — данное. Вот, и у меня не получается туда записать.
Вроде, достаточно подробно изложил суть.
PS: Приложение я заливаю на плату через ftp, и запускаю под root.
Возможно у того Линукса который ты залил в АРМ есть какие-то специальные операции ввода-вывода?
Есть вариант реализовать такую функцию на ассемблере для АРМ. Я так понимаю у тебя какая-то производственная ЭВМ или контроллер. Какой?