ioremap和mmap区别
ioremap
和 mmap
都是 Linux 操作系统中用于内存映射的函数,但它们在用途和工作方式上有一些区别。
一、区别
- ioremap:
ioremap
是 Linux 内核中的一个函数,用于将设备内存(通常是外设的内存)映射到内核的虚拟地址空间。- 它主要用于硬件设备的内存访问,特别是当这些设备不支持常规的内存访问方法时。
ioremap
通常用于驱动程序开发,因为它允许内核代码直接访问硬件设备的内存。- 这个函数不涉及用户空间,因此它不适用于用户级应用程序。
- mmap:
mmap
是一个系统调用,既可以在用户空间也可以在内核空间使用。- 它用于将文件或其他对象(如设备文件)映射到进程的虚拟地址空间,从而允许进程像访问普通内存一样访问这些对象。
mmap
常用于提高文件访问的效率,因为它允许操作系统使用内存分页机制来优化文件的读取和写入操作。- 用户级应用程序可以通过
mmap
系统调用将文件映射到内存中,以便进行高效的文件操作。
主要区别:
- 使用场景:
ioremap
主要用于内核空间中的硬件设备内存访问,而mmap
既可以用于内核空间也可以用于用户空间,用于文件或其他对象的内存映射。 - 目的:
ioremap
用于将设备内存映射到内核地址空间,而mmap
用于将文件或其他对象映射到进程的地址空间。 - 用户空间访问:
ioremap
不适用于用户空间,而mmap
可以在用户空间中使用。 - 性能优化:
mmap
可以利用内存分页机制来提高文件访问的效率,而ioremap
则主要用于直接访问硬件设备的内存。
二、函数原型
-
ioremap
void * ioremap(unsigned long phys_addr, size_t size);
参数:
phys_addr
:要映射的起始的物理 I/O 地址。size
:要映射的空间的大小。
返回值:
- 返回一个指向内核虚拟地址的指针,通常位于内核虚拟内存空间的高端部分(3GB-4GB)。
使用
iounmap
函数来释放:void iounmap(void * addr); -
mmap
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
参数:
addr
:指定映射到进程地址空间的地址。如果为NULL
,内核将选择映射区域的地址。length
:映射区域的长度。prot
:映射区域的保护方式,可以是以下几种方式的组合:PROT_EXEC
(可执行)、PROT_READ
(可读)、PROT_WRITE
(可写)、PROT_NONE
(不可访问)。flags
:控制映射区域的特性,常用的标志有:MAP_SHARED
(对映射区域的修改会反映到文件上)、MAP_PRIVATE
(私有的copy-on-write映射)、MAP_ANONYMOUS
(匿名映射,不与任何文件关联)等。fd
:文件描述符,表示要映射的文件。offset
:文件中映射的起始位置,通常为文件大小的整数倍。
返回值:
- 调用成功时返回指向映射区域的指针
- 失败时返回
-1
并设置errno
以指示错误类型。
使用
munmap
函数来释放:int munmap(void *addr, size_t length);