2012-03-21 2 views
5

Я пытаюсь понять, как работает mmap. Вызов уровня пользователя mmap выглядит как показано ниже.Связь между вызовом пользователя mmap на вызов ядра mmap

void *mmap(void *addr, size_t len, int prot, int flags, 
     int fildes, off_t off); 

, но на уровне ядра ММАП для конкретного драйвера устройства выглядит следующим образом:

int <device_name>_mmap(struct file*fp, struct vm_area_struct *vma) 

Я также посмотрел на исходный код, но я не могу найти связь между ними.

Как mmap для конкретного устройства получает свои аргументы "struct vm_area_struct * vma"? Можете ли вы, пожалуйста, помочь мне понять это? Ценю вашу помощь.

+0

Фактически я не смог найти соединение – vindyz

+0

'vm_area_struct' содержит информацию о диапазоне виртуальных адресов для отображения в пользовательском процессе и смещении на устройстве, которое приложение хочет сопоставить. Аргумент 'file' соответствует файловому дескриптору на стороне пользователя. –

+0

Пример минимального запускаемого модуля ядра: https://stackoverflow.com/questions/10760479/how-to-mmap-a-linux-kernel-buffer-to-user-space/45645732#45645732 –

ответ

12

Библиотечный вызов mmap() реализован libc, который преобразует смещение в байтах в смещение на страницах, а затем вызывает системный вызов mmap_pgoff().

Системный вызов mmap_pgoff() выбирает struct file *, соответствующий аргументу дескриптора файла, и вызывает do_mmap_pgoff().

do_mmap_pgoff() вычисляет фактический адрес и длину, которые будут использоваться на основе подсказки и доступного адресного пространства, преобразует предоставленные флаги в флаги VM и проверяет разрешение на выполнение сопоставления. Затем он вызывает mmap_region().

mmap_region() удаляет любые предшествующие отображения в области заменяется новым отображением, выполняет учет памяти и создает новый struct vm_area_struct, описывающий область адресного пространства привязывается (это инкапсулирует адрес, длина, смещение и VM флаги отображение). Затем он вызывает реализацию файла ->mmap(), передавая struct file * и struct vm_area_struct *. Для файлов устройств это будет вызов функции реализации mmap устройства.

+0

Его очень хорошо объяснили. где можно найти такое объяснение для других функций ядра. Есть ли что-нибудь, что я могу назвать помимо исходного кода. – vindyz

+0

@vinay: Думаю, вам просто нужно практиковать чтение исходного кода - это действительно не так сложно. [lxr.linux.no] (http://lxr.linux.no/) подходит для отслеживания через источник. Для точек входа в системный вызов найдите 'SYSCALL_DEFINE'. – caf

+0

@caf - Итак, правильно ли вывести, что в случае текстовых файлов, сохраненных на диске, реализация file's-> mmap() выполняется файловой системой? Например, реализация ext4 mmap будет вызвана mmap_region(), если файл, сохраненный на диске (отформатированный с помощью ext4), mmaped? – bornfree

Смежные вопросы