一、IO端口与IO内存
x86体系和ARM体系的寻址方式是有差别的:
在x86下,为了能够满足CPU高速地运行,内存与CPU之间通过北桥相连并通过地址方式访问,而外设通过南桥与CPU相连并通过端口访问;两种总线对应的地址是分开的,采用IN/OUT指令访问
在ARM下也实现了类似的操作,通过两条不同的总线(AHB BUS和APB BUS)来连接不同访问速度的外设。但是它与x86不同,两种总线汇总在一起统一编址;无论是内存还是外设,ARM都是通过地址访问;
二、在x86中访问外设采用虚拟地址,采用IN/OUT指令访问,因为由iommu的存在;在arm中访问外设需要将io地址(总线地址)通过kernel的ioremap来映射成虚拟地址才可访问
三、使用IO内存流程
四、ioremap内核流程
ioremap()–>arch_ioremap_caller()–>__arm_ioremap_caller()–>__arm_ioremap_pfn_caller()–>type = get_mem_type(); struct vm_struct *area=get_vm_area_caller();ioremap_page_range()–>ioremap_p4d_range()