Связь между вызовом пользователя mmap и вызовом ядра mmap - PullRequest
7 голосов
/ 21 марта 2012

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

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

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

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

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

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

1 Ответ

14 голосов
/ 21 марта 2012

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

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

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

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

...