当用户空间需要实现驱动程序时, 需要操作底层的寄存器. 使用/dev/mem
映射io内存空间就是一种常用的方式. /dev/mem
一般都是使用其 mmap
函数. 将底层的寄存器映射到用户空间地址. 下面对 /dev/mem
的mmap
函数进行一下简单的分析.
/dev/mem
设备文件是由drivers/char/mem.c
驱动创建. 该设备文件的file_operations
为
static const struct file_operations __maybe_unused mem_fops = {
.llseek = memory_lseek,
.read = read_mem,
.write = write_mem,
.mmap = mmap_mem,
.open = open_mem,
#ifndef CONFIG_MMU
.get_unmapped_area = get_unmapped_area_mem,
.mmap_capabilities = memory_mmap_capabilities,
#endif
};
mmap_mem
定义为:
static int mmap_mem(struct file *file, struct vm_area_struct *vma)
{
size_t size = vma->vm_end - vma->vm_start;
if (!valid_mmap_phys_addr_range(vma->vm_pgoff, size))
return -EINVAL;
if (!private_mapping_ok(vma))
return -ENOSYS;
if (!range_is_allowed(vma->vm_pgoff, size))
return -EPERM;