Можно ли получить исходный код Linux для mmap и исходный код Windows для MapViewOfFile? - PullRequest
0 голосов
/ 27 мая 2011

Goog днем, я недавно загрузил www.kernel.org mainline 2.6.39 дистрибутив исходного кода ядра Linux. Мы ищем исходный код Linux для void mmap (void start, size_t length, int prot, int flags, int fd, off_t offset). После распаковки дистрибутива tar.bz2 мы обнаружили файл mmap.c, который содержит исходный код для отображения памяти. Однако мы не смогли получить исходный код Linux для void mmap (void start, size_t length, int prot, int flags, int fd, off_t offset) в mmap.c. Знают ли инженеры или администраторы Linux, где мы получаем исходный код Linux для void mmap (void start, size_t length, int prot, int flags, int fd, off_t offset)? Также нас интересует исходный код Windows для MapViewOfFile. Я знаю, что это натянуто, потому что исходный код ОС Microsoft не находится в домене с открытым исходным кодом. В случае, если кому-то интересно, зачем нам нужен этот исходный код, мы пытаемся оптимизировать производительность во время выполнения прототипа дедуплицирующей программы на C ++, используя реализацию файла с отображением в кэшированной памяти на 32-битной архитектуре. Мы хотим понять, как использовать mmap и MapViewOfFile для оптимизации производительности нашего прототипа во время выполнения? Спасибо.

Ответы [ 5 ]

3 голосов
/ 27 мая 2011

Чтобы получить реализацию Win32 MapViewOfFile, вам придется заплатить дорогую подписку, подписать юридические соглашения о неразглашении и т. Д.

linux mmap общедоступно. Однако вы должны знать, что есть две части: функция mmap в glibc и соответствующий системный вызов в ядре, где находятся все интересные биты. Сигнатура, которую вы указали, предназначена для функции glibc, не ожидайте, что системный вызов будет иметь точно такие же параметры.

Но вы можете «понять, как использовать mmap и MapViewOfFile», не читая реализацию.

3 голосов
/ 27 мая 2011

Извлечение из исходного кода Android;

#include <unistd.h>
#include <errno.h>
#include <sys/mman.h>

extern void*  __mmap2(void*, size_t, int, int, int, size_t);

#define  MMAP2_SHIFT  12
void*   mmap( void*  addr,  size_t  size, int  prot, int  flags, int  fd,  long  offset )
{
    if ( offset & ((1UL << MMAP2_SHIFT)-1) ) {
    errno = EINVAL;
    return MAP_FAILED;
  }

    return __mmap2(addr, size, prot, flags, fd, (size_t)offset >> MMAP2_SHIFT);
}

Источник: mmap.c

Теперь фактический вызов __mmap2 имеет сборку, поэтому он будет зависеть от вашей арки. Вот версия для x86:

/* autogenerated by gensyscalls.py */
#include <sys/linux-syscalls.h>

    .text
    .type __mmap2, @function
    .globl __mmap2
    .align 4

__mmap2:
    pushl   %ebx
    pushl   %ecx
    pushl   %edx
    pushl   %esi
    pushl   %edi
    pushl   %ebp
    mov     28(%esp), %ebx
    mov     32(%esp), %ecx
    mov     36(%esp), %edx
    mov     40(%esp), %esi
    mov     44(%esp), %edi
    mov     48(%esp), %ebp
    movl    $__NR_mmap2, %eax
    int     $0x80
    cmpl    $-129, %eax
    jb      1f
    negl    %eax
    pushl   %eax
    call    __set_errno
    addl    $4, %esp
    orl     $-1, %eax
1:
    popl    %ebp
    popl    %edi
    popl    %esi
    popl    %edx
    popl    %ecx
    popl    %ebx
    ret

Источник: __ mmap2.S

2 голосов
/ 27 мая 2011

Мое непосредственное предположение могло бы состоять в том, что попытка выяснить, как лучше использовать их из исходного кода для функций, вероятно, будет (в лучшем случае) очень окольным способом получить большую часть чего угодно.В частности, вам, вероятно, придется взглянуть на гораздо больший / другой код, чтобы получить что угодно.Когда вы приступите к этому, код в mmap / MapViewOfFile, скорее всего, будет иметь минимальную помощь (в лучшем случае), а другой код (например, в драйвере файловой системы и файловом кеше), вероятно, будет гораздо более значимым.

Когда вы приступите к этому, у mmap и MapViewOfFile есть относительно простые задания: настройте дескрипторы страниц, которые сопоставляют диапазон виртуальных адресов с некоторыми частями некоторого файла.

Не многоиначе / больше происходит, пока вы не попытаетесь получить доступ к одной из этих страниц.Это вызовет ошибку «не присутствует».Обработчик ошибок будет использовать подсистему ввода-вывода для считывания соответствующих данных с диска и возврата, чтобы выполнить исходную инструкцию.Тем не менее, это не очень интересно.

По крайней мере, с точки зрения оптимизации, момент, когда все становится интересным, находится внутри подсистемы ввода / вывода.Это может (например) отслеживать историю сбоев страниц и использовать ее для прогнозирования того, какие страницы, скорее всего, понадобятся в ближайшее время (и, если это так, проблемы чтения для предсказанных страниц до того, как произойдет сбой).

В лучшем случае, однако, исходный код mmap / MapViewOfFile не будет вести напрямую к частям подсистемы ввода-вывода, о которой вы, вероятно, заботитесь (на самом деле, они, вероятно, будут почти полностью бесполезны в этом отношении).

2 голосов
/ 27 мая 2011

Для MapViewOfFile я бы проверил Winbase.h , но это могут быть просто объявления, иначе вам придется обратиться к обратному инжинирингу, который считается незаконным в большинстве стран.

Я нашел обширную статью здесь о MMAP и о том, как она работает.Может быть, это поможет.

1 голос
/ 20 сентября 2017

Забавно, но мне тоже нужен был источник mmap ...:)

Пока что я мог найти ответ только на NetBSD. На основании этого комментария :

  • Функция libc находится в src / lib / libc / sys / mmap.c
  • Соответствующая функция ядра находится в src / sys / uvm / uvm_map.c :

    int uvm_map (struct vm_map * map, vaddr_t startp / IN / OUT * /, размер vsize_t, struct uvm_object * uobj, voff_t uoffset, выравнивание vsize_t, флаги uvm_flag_t)

Фактические ссылки соответствуют версии 8 NetBSD, но вы можете заменить ее любой другой версией.

Привет.

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