Связь между пользователем мкарта вызова 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 устройства.