Linux的线性地址空间为 0x00000000到0xffffffff 。Linux内核将这 4G字节的空间分为两个部分:将最高的 1G字节(0xc0000000 到0xfffffff)供内核使用,称之为内核空间。而将较低的 3G字节(0x00000000 到0xbfffffff),供各个进程使用,称之为用户空间。因为每个进程都可以通过系统调用进入内核,因此, linux内核由系统内的所有进程所共享。从而,每个进程都可以拥有 4G的线性地址空间。 设备通常会提供一组寄存器,如控制寄存器、数据寄存器和状态寄存器等等。这些寄存器可能位于 I/O空间,也可能位于内存空间。 当这些寄存器位于I/O空间时,通常被称为 I/O端口。 当这些寄存器位于内存空间时,对应的内存空间被称为 I/O内存 一般来说,在系统运行时,外设的 I/O内存资源的物理地址是已知的,由硬件的设计决定。但是 CPU并没有为这些已知的外设 I/O内存资源的物理地址预定义虚拟地址范围,驱动程序并不能直接通过物理地址访问 I/O内存资源,而必须将它们映射到内核的虚拟地址空间,然后才能根据映射所得的虚拟地址空间,通过访问指令访问这些 I/O资源。Linux 通过ioremap来将 I/O内存资源的物理地址映射到内核的虚拟地址空间( 3G~4G)中去。 但用户空间仍不能直接访问内核空间中映射的 I/O内存资源地址,必须把设备地址映射到用户空间中去才能实现用户空间态的访问。通过 mmap,我们可以讲用户空间的一段内存与设备内存相关联,当用户访问用户空间的这段地址范围时,就会转化为对设备的访问。
linux I/O内存映射
最新推荐文章于 2024-06-03 09:14:00 发布
