Вопрос или проблема
Я нашел несколько связанных постов:
Как увидеть информацию внутри структуры данных inode
Можно ли найти физический адрес файла на диске?
Но ничего не отвечает на мой вопрос. У меня есть процесс, который непрерывно читает файл, и я хотел бы получить физический адрес файла, который он читает. Я знаю, какой файл он читает. Обсуждаемый процесс не использует mmap
.
Как я могу получить физический адрес этого файла? Я предполагаю, что могу получить его адрес в оперативной памяти. Предпочтительно, если возможно, используя командные утилиты вместо того, чтобы писать приложение на C.
Обсуждаемый процесс:
int main(void)
{
int iFd = open("/some/path/file.txt",O_RDWR);
if (iFd < 0)
{
fprintf(stderr, "Не удалось открыть файл: %s\n", strerror(errno));
return -1;
}
while(1)
{
uint8_t tmp[10]={0};
read(iFd, tmp, sizeof tmp);
(void) tmp;
}
close(iFd);
return 0;
}
Я смотрел в /proc
, но файл там не отображается:
# cat /proc/<PID процесса>/maps
555fa58000-555fa59000 r-xp 00000000 b3:02 34817 /some/path/myProcess
555fa68000-555fa69000 r--p 00000000 b3:02 34817 /some/path/myProcess
555fa69000-555fa6a000 rw-p 00001000 b3:02 34817 /some/path/myProcess
7fb3970000-7fb3ac3000 r-xp 00000000 b3:02 786 /lib/libc-2.31.so
7fb3ac3000-7fb3ad3000 ---p 00153000 b3:02 786 /lib/libc-2.31.so
7fb3ad3000-7fb3ad6000 r--p 00153000 b3:02 786 /lib/libc-2.31.so
7fb3ad6000-7fb3ad9000 rw-p 00156000 b3:02 786 /lib/libc-2.31.so
7fb3ad9000-7fb3adc000 rw-p 00000000 00:00 0
7fb3adc000-7fb3afd000 r-xp 00000000 b3:02 778 /lib/ld-2.31.so
7fb3b04000-7fb3b06000 rw-p 00000000 00:00 0
7fb3b0a000-7fb3b0b000 r--p 00000000 00:00 0 [vvar]
7fb3b0b000-7fb3b0c000 r-xp 00000000 00:00 0 [vdso]
7fb3b0c000-7fb3b0d000 r--p 00020000 b3:02 778 /lib/ld-2.31.so
7fb3b0d000-7fb3b0f000 rw-p 00021000 b3:02 778 /lib/ld-2.31.so
7ff5eb9000-7ff5eda000 rw-p 00000000 00:00 0 [stack]
Физический адрес в оперативной памяти не имеет значения, кроме как для ядра и физической оперативной памяти. Если вы не используете логический зонд для материнской платы или не пытаетесь диагностировать неисправную память или что-то подобное, физический адрес не имеет значения и не полезен для чего-либо. Нет API пользовательского пространства, который позволял бы вам получить доступ к физической памяти или использовать физический адрес. Ядро раньше имело (очень традиционное) устройство для доступа к физической памяти, но это было удалено давно как риск безопасности и не очень полезно.
Другим исключением будет, если вы работаете в ядре, в этом случае есть API ядра для получения этой информации.
Без mmap, если файл вообще находится в физической памяти, он там только эфемерно, и эти страницы могут быть освобождены в любой момент. Любое возможное использование физического адреса вне ядра будет соревнованием условий.
Главная цель mmap – назначить виртуальный адрес частям файла. Просто потому, что вы сопоставили файл по-прежнему не означает, что у него есть физический адрес или что какая-либо часть файла находится в памяти. Только когда вы пытаетесь получить доступ к этой виртуальной памяти, она физически загружается в память, и даже тогда она по-прежнему будет эфемерной.
Имело бы больше смысла спросить, как определить, какие дисковые блоки использует файл. А затем возможно, было бы интересно узнать, какая память кеширует эти блоки, но это все равно будет эфемерным и не очень полезным.
Ответ или решение
Получение физического адреса файла в оперативной памяти (ОП) — это вопрос, который требует глубокого понимания архитектуры операционных систем и работы с памятью. Рассмотрим, как это сделать, а также связанные с этим ограничения и сложности.
1. Виртуальная и физическая память
Современные операционные системы используют механизм виртуальной памяти, в котором каждое приложение работает в своем виртуальном адресном пространстве. Это означает, что физические адреса памяти не являются статичными и напрямую недоступны программам, работающим в пространстве пользователя. Вместо этого, процесс получает доступ к виртуальным адресам, которые управляются операционной системой.
2. Почему получение физического адреса сложно?
Как упоминается в вопросе, прямое получение физического адреса файла в ОП в пространстве пользователя невозможно. Основные причины:
- Безопасность: Операционные системы ограничивают доступ к физической памяти для предотвращения несанкционированного доступа и улучшения безопасности.
- Эфемерность данных: Данные в ОП могут изменяться, например, если ОС освобождает ресурсы или выгружает данные из памяти. Это делает любой полученный физический адрес непостоянным.
3. Возможные подходы и инструменты
Хотя доступ к физическим адресам в пользовательском пространстве и ограничен, можно использовать некоторые инструменты для работы с виртуальной памятью и получения информации о занятых страницах:
a. Использование /proc
С помощью командной строки можно просмотреть информацию о работающих процессах и их использовании памяти. Например, команда:
cat /proc/<PID>/maps
позволяет увидеть отображение памяти, которое использует ваш процесс. Однако, вы не получите физические адреса, а только виртуальные.
b. pmap
Еще одним инструментом является pmap
, который показывает распределение памяти процесса:
pmap <PID>
Это предоставит вам информацию о виртуальных адресах, но снова без физических адресов.
4.Физическая адресация через ядро
Как уже упоминалось, физические адреса чаще доступны в контексте разработки ядра или в случаях отладки. Для этого нужно либо написать модуль ядра, который обращается к необходимым API, либо использовать инструменты для отладки ядра, такие как gdb
в сочетании с kallsyms
, если вы разрабатываете модуль или работаете на уровне ядра.
5. Заключение
Для большинства приложений и сценариев работы с файлами в памяти получение физического адреса не является жизненно важным и может даже привести к ненадежному поведению. Вместо этого лучше сосредоточиться на использовании виртуальных адресов и управления ресурсами через API операционной системы. Если ваша цель связана с производительностью, подумайте о том, как оптимизировать использование кешей и работу с файловой системой, а не о том, чтобы искать физические адреса.
Если у вас остались вопросы или требуется дополнительная информация, не стесняйтесь обращаться для получения дальнейших пояснений.