linux设备驱动--内存和I/O访问

1、内存和I/O的硬件机制,主要涉及内存空间、I/O空间和MMU

1.1 I/O空间和内存空间

X86处理器中存在I/O空间的概念

ARM和Power PC并不提供I/O空间,I/O空间挂接在内存空间,通过访问内存空间可以访问I/O空间

1.2 内存管理单元MMU

TLB:转换旁缓存

TTW:即转换漫游表

 

2、linux的内存管理、内存区域的分布、常规内存和高端内存的区别

在3~4GB之间的内核空间中,从低地址到高地址依次为:

物理内存映射区——隔离带——vmalloc虚拟内存分配器——隔离带——高端内存映射区——专用页面映射区——保留区

(在物理内存和高端内存之间为虚内存分配区(VMALLOC_START~VMALLOC_END),用于vmalloc函数)

图示:

3、linux内存存取的方法,主要涉及内存动态申请,以及通过虚拟地址存取物理地址的方法

3.1 用户空间内存动态申请

malloc()和free()成对出现

3.2 内核空间内存动态申请

linux内核空间中申请内存的3个函数:

kmalloc() :申请的内存位于物理映射区,而且在物理上也是连续的,他们与真实的物理地址只有一个固定的偏移

_ _get_free_pages():和kmalloc函数一样

vmalloc():在虚拟的内存空间给出一块连续的内存空区,实质上,这这片连续的虚拟内存在物理内存中并不一定连续

(1)、kmalloc()申请、kfree()释放

(2)、_ _get_free_pages()

(3)、vmalloc()申请 、vfree()释放

(4)、slab 与内存池

!创建slab缓存:kmem_cache_create()用于创建一个slab缓存

!分配slab缓存:kmem_cache_alloc()

!释放slab缓存:kmem_cache_free()

!收回slab缓存:kmem_cache_destroy()

!!创建内存池:mempool_create()

!!分配和回收对象:mempool_alloc()和 mempool_free()

!!回收内存池:mempool_destroy()

3.3 虚拟地址与物理地址关系 

 

4、设备I/O内存和I/O端口的访问流程

5、设备驱动中的DMA与CACHE一致性问题 以及DMA的编程方法

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(linux设备驱动--内存和I/O访问)