LINUX.ORG.RU

/dev/kmem


0

1

кто-нибудь успешно читал /dev/kmem под x86_64?
трабла в том, что для x86_64 
loff_t = typedef (long long), т. е знаковый размером 8b
а адресное пространство ядра - это диапазон 0xFFFFFFFF80000000+, т. е с точки зрения long long - значение адресов - отрицательные
в rw_verify_area() (sys_read()->vfs_read()->rw_verify_area()) идет проверка

int retval = -EINVAL;
if (unlikely((pos < 0) || (loff_t) (pos + count) < 0))
                 return retval;

т. к pos - отрицательный (выставленный через lseek()), идет возврат -EINVAL

Можно попытаться сделать 2 раза seek с SEEK_CUR. А вообще read/write для /dev/kmem и /dev/mem не работает на ARM например. Поэтому самый универсальный способ --- это воспользоваться mmap.

anonymous
()
Ответ на: комментарий от anonymous

>Можно попытаться сделать 2 раза seek с SEEK_CUR. А вообще read/write для /dev/kmem и /dev/mem не работает на ARM например.

А вообще я похоже сторомозил, двукратный seek не поможет, и на ARMe у меня read не работал по той же причине, что и у тебя -- я пытался читать регистры устройств, отображенные на самый конец адресного пространства. Так что mmap --- единственный вариант.

anonymous
()
Ответ на: комментарий от klalafuda

>man lseek64

Вопрошающему это не поможет, у него и так 64-битная система, а смещение в lseek64 все равно целое _со знаком_.

anonymous
()
Ответ на: комментарий от anonymous

> Вопрошающему это не поможет, у него и так 64-битная система, а смещение в lseek64 все равно целое _со знаком_.

в таком случае mmap, как и советовали. если система конечно разрешит отобразить всю память, т.к. offset в mmap() то же со знаком.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от Chumka

Что-то мне очень подсказывает что виртуальный адресс 0xFFFFFFFF81000000 к примеру лежит в файле со смещением 0x81000000 и никакие FFFFFFF нафиг не сдались.

anonymous
()
Ответ на: комментарий от anonymous

>Что-то мне очень подсказывает что виртуальный адресс 0xFFFFFFFF81000000 к примеру лежит в файле со смещением 0x81000000

А где тогда лежит виртуальный адрес 0x81000000 ?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.