内存空间与I/O空间
一、编址方式
外设都是通过读写设备上的寄存器来进行工作的,外设寄存器也称为“IO端口”,而IO端口的编址方式有两种,独立编址和统一编址。
统一编址:外设接口中的IO寄存器(即IO端口)与主存单元一样看待,每个端口占用一个存储单元的地址,将主存的一部分划出来用作IO地址空间。
独立编址:为端口地址单独开辟一部分地址空间,其访问指令也需要使用单独的指令(不同于内存访问指令)。
根据CPU体系结构的不同,CPU对IO端口的编址方式有两种:
(1)I/O映射方式(I/O-mapped)
典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元。
(2)内存映射方式(Memory-mapped)
RISC指令系统的CPU(如ARM、PowerPC、MIPS等)通常只实现一个物理地址空间,外设I/O端口成为内存的一部分。此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。
内核中的使用,往往是为某个设备预留一块内存,当使用的时候需要在board中定义这个设备的内存resource。通过 platform_get_resource获得设备的起始地址后,可以对其进行request_mem_region和ioremap等操作,以便应用程序对其进行操作。
为了使软件访问I/O内存,必须为设备分配虚拟地址.这就是ioremap的工作.这个函数专门用来为I/O内存区域分配虚拟地址(空间)。
二、内存管理单元MMU
- 定义:高性能处理器一般会提供一个内存管理单元(MMU),该单元辅助操作系统进行内存管理,提供虚拟地址和物理地址的映射、内存访问权限保护和cache缓存控制等硬件支持。
- TLB:转换旁路缓存,TLB是MMU的核心部件,它缓存少量的虚拟地址与物理地址的关系,是转换表的Cache,因此也被称为“快表”。
- TTW:即转换表漫游,当TLB中没有缓冲区对应的地址转换关系时,需要通过内存中转换表的访问来获得虚拟地址和物理地址的对应关系。
- MMU具有虚拟地址和物理地址的转换、内存访问权限保护等功能,这将使得Linux系统能单独为系统的每个用户进程分配独立的内存空间并保护用户不能访问内核空间的地址,为操作系统的虚拟内存管理模块提供硬件基础。
- 用户空间内存动态申请(malloc()/free())
- 内核空间内存动态申请:kmalloc(),_get_free_pages(),vmalloc()。
- slab缓存:驻留任意数目全部同样大小的后备缓存。kmem_cache_alloc,kmem_cache_free,kmem_cache_destroy。
- 虚拟地址和物理地址关系:virt_to_phys() , phys_to_virt()
- 设备IO端口和IO内存的访问:读写字节端口,inb、outb。读写字端口,inw/outw
-
申请与释放设备IO端口和IO内存:
struct resource *request_region();
void release_region(); -
IO内存申请:
struct resource *request_mem_region();
void release_mem_region()
本文地址:https://blog.csdn.net/zfzhangfan/article/details/107890646