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