Связь между пользователем мкарта вызова mmap вызов ядра

Я пытаюсь понять, как работает 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 ответов


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

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

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

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