LINUX.ORG.RU

mmap и странный вывод strace


0

0

В коде делается mmap сразу на весь файл и дальше он читается. Оказалось что в выводе strace это выглядит как mmap на 1 страницу, а дальше серия read размером со страницу. Это такой всегда вывод strace или это особенность конкретной архитектуры/версии ОС?

★★★★★

ну то есть как бы понятно что там происходят page faults и подкачка из файла, но я не думал что это делается в libc и что эти вызовы read так явно видны в strace..

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

open(«romip2/d115216.txt», O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26130, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2ccd5d9000
read(3, «\n \320\237\321\200\320\260\320\262»..., 4096) = 4096
read(3, «\260\321\201\320\276\320\262\320\260\320\275\320\270\321\216)\n 4 \320\223»..., 4096) = 4096
read(3, «\271\320\273\320\276\320\262\320\270\321\207 \320\277\321\200\320\265\320\264\321\201\320\265\320\264\320\260\321\202\320\265»..., 4096) = 4096
read(3, «\320\271 \321\203\321\207\320\260\321\201\321\202\320\276\320\272 114\n »..., 4096) = 4096
read(3, «\320\270\320\262\320\275\320\276\321\201\321\202\320\270 \320\276\320\261\320\265\321\201\320\277\320\265\321\207\320\265\320\275»..., 4096) = 4096
read(3, «\265\321\202\320\265\321\200\320\261\321\203\321\200\320\263\320\260, \320\227\320\260\320\272\320\276\320\275\320\276\320\264»..., 4096) = 4096
read(3, «\207\320\260\320\265 \321\201\320\262\320\276\320\265\320\263\320\276 \320\276\321\202\321\201\321\203\321\202\321\201\321\202»..., 4096) = 1554
read(3, ""..., 4096) = 0
close(3) = 0
munmap(0x7f2ccd5d9000, 4096) = 0

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

1)Приведи кусок исходного текста 2)какая платформа - не спарк, случаем?

ttnl ★★★★★
()
Ответ на: комментарий от dilmah

тут видно, что на деле никакого mmap нет. Mmap'ится только анонимная память. Скорее всего это аллокатор выделил память под буфер, в которую читается файл.

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

fd3 - это обычно дескриптор образа с загрузчиком. Со всеми вытекающими. Так что чуда не будет :)

PS: Не говоря уже о том, что это анонимное отображение -> fd нет как класса -> read(3, ...) должно было навести на мысли, что читают явно не из отображаемого региона.

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>

int
main(int argc, char *argv[])
{
    size_t length = 4096 * 32;

    void *ptr = mmap(0, length, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    if (ptr == MAP_FAILED) perror("mmap() fails");

    size_t left;
    char *src;
    for (src = ptr, left = length; left; src++, left--) {
        *src = *src * 2;
    }

    munmap(ptr, length);

    return EXIT_SUCCESS;
}
$ cat /etc/redhat-release
CentOS release 5.4 (Final)

$ uname -a
Linux bee.local 2.6.18-164.9.1.el5 #1 SMP Tue Dec 15 20:57:57 EST 2009 x86_64 x86_64 x86_64 GNU/Linux

$ strace ./test01
execve("./test01", ["./test01"], [/* 53 vars */]) = 0
brk(0)                                  = 0x1811000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b71cdac9000
uname({sys="Linux", node="xxx.local", ...}) = 0
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=101808, ...}) = 0
mmap(NULL, 101808, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b71cdaca000
close(3)                                = 0
open("/lib64/libc.so.6", O_RDONLY)      = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\332\1D7\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1717800, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b71cdae3000
mmap(0x3744000000, 3498328, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3744000000
mprotect(0x374414d000, 2097152, PROT_NONE) = 0
mmap(0x374434d000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14d000) = 0x374434d000
mmap(0x3744352000, 16728, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x3744352000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b71cdae4000
arch_prctl(ARCH_SET_FS, 0x2b71cdae4210) = 0
mprotect(0x374434d000, 16384, PROT_READ) = 0
mprotect(0x3743e1b000, 4096, PROT_READ) = 0
munmap(0x2b71cdaca000, 101808)          = 0
mmap(NULL, 131072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b71cdae5000
munmap(0x2b71cdae5000, 131072)          = 0
exit_group(0)                           = ?
bibi
()
Ответ на: комментарий от Chumka

> тут видно, что на деле никакого mmap нет. Mmap'ится только анонимная память. Скорее всего это аллокатор выделил память под буфер, в которую читается файл.

да, я уже понял:) я просто ожидал увидеть mmap и поэтому позитивно воспринял первый увиденный mmap:)

В коде действительно используется read.

dilmah ★★★★★
() автор топика
Ответ на: комментарий от dilmah

Код на С++, поэтому так сразу не разберешь что где используется..

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