内存映射和DMA——Linux 的内存管理

内存映射和DMA——Linux 的内存管理
地址类型:
用户虚拟地址:这是用户空间程序能看到的常规地址。
物理地址: 该地址在处理器和系统内存之间使用
总线地址:该地址在外设总线和内存之间使用
内核逻辑地址:组成了内核的常规地址空间。该地至映射了部分内存,并经常被视为物理地址,在大多数体系结构中,逻辑地址与相关的物理地址的不同,仅仅在于它们之间相差一个固定的偏移量。逻辑地址通常保存在UNSIGNED LONG ,和void*这样的内存变量中,用kmalloc返回的内存地址,就是内核逻辑地址
内核虚拟地址:与逻辑地址相比,它与物理地址的映射不是线性和一一对应的。所有的逻辑地址都是虚拟地址,而虚拟地址不一定是逻辑地址。虚拟地址通常保存在指针变量中。
物理地址和页:
物理地址被分为很多离散单元称为页,ARM中一个页的大小为4096字节

/* PAGE_SHIFT determines the page size */
#define PAGE_SHIFT        12 移动12位即得页帧数
#define PAGE_SIZE        (1UL << PAGE_SHIFT)
#define PAGE_MASK        (~(PAGE_SIZE-1))

/* to align the pointer to the (next) page boundary */
#define PAGE_ALIGN(addr)    (((addr)+PAGE_SIZE-1)&PAGE_MASK)
以上是在include/arm/ page.h中定义
高端内存与低端内存
0~3G虚拟地址用户空间
3G~4G虚拟地址内核空间
内核所能访问到的最大物理内存=1G-内核源码所占空间
物理内存的底端部分,映射到内核空间后,形成的是逻辑地址,许多内核数据结构都保存在底端内存中,高端内存更倾向于保存用户空间的页。
定义:
低端内存:存在于内核空间上的逻辑地址内存
高端内存:指那些不存在逻辑地址的内存,它们处于内核虚拟地址之上
内存映射和页结构:
在高端内存中将无法使用逻辑地址,内存中处理内存的函数使用page结构的指针
page结构中与驱动相关的成员:
atomic—t count;对该页的访问计数
void *virtual: 如果该页被预设,则指向该页的虚拟地址,否则为NULL。
内核中维护一个或多个page数组,用来跟踪系统中的物理内存。

PAGE结构指针与虚拟地址之间的转换相关的宏:
struct page *virt_to_page(void *kaddr);
用来负责将逻辑地址转换为相应的page结构指针
struct page *pfn_to_page(int pfn);
通过给定的页祯号,返回page结构指针
void *page_address(struct page*page)
如果地址的话,返回该页的虚拟地址。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值