Библиотечный вызов 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 устройства.