内存映射与DMA

 

内存管理

内核用来管理内存的数据结构

---------
地址内型

Linux是一个虚拟内存系统,即用户程序使用的地址与硬件使用的物理地址是不等同的。

虚拟内存引入了一个间接层,使得许多操作成为可能:
*有了虚拟内存,系统中运行的程序可以分配比物理内存更多的内存。
*虚拟地址还能让程序在进程的地址空间内使用更多的技巧,包括将程序的内存映射到设备内存上。

地址内型列表
*用户虚拟地址 每个进程都有自己的虚拟地址空间。
*物理地址 处理器访问系统内存时使用的地址。
*总线地址 在外围总线和内存之间使用。MMU可以实现总线和主内存之间的重新映射。
           当设置DMA操作时,编写MMU相关的代码是一个必需的步骤。
*内核逻辑地址
           内核逻辑地址组成了内核的常规地址空间,该地址映射了部分(或全部)内存,
           并经常被视为物理地址。在大多数体系架构中,逻辑地址与其相关联的物理地址
           的不同,仅仅在于它们之间存在一个固定的偏移量。kmalloc返回的内存就是
           内核逻辑地址。
*内核虚拟地址
           内核虚拟地址与逻辑地址相同之处在于,都将内核空间的地址映射到物理地址上。
           不同之处在于,内核虚拟地址与物理地址的映射不是线性的和一对一的。
           vmalloc返回一个虚拟地址,kmap函数也返回一个虚拟地址。

------------------
物理地址和页

物理地址被分为离散的单元,称之为页。

系统内部许多对内存的操作都是基于单个页的。

大多数系统都使用每页4096个字节,PAGE_SIZE <asm/page.h>给出指定体系架构下的页大小。

观察内存地址,无论是虚拟的还是物理的,它们都被分为页号和一个页内的偏移量。
如果每页4096个字节,那么最后的12位就是偏移量,剩余的高位则指定页号。

页帧数:将除去偏移量的剩余位移到右端,称该结果为页帧数。

-------------------
高端与低端内存

内核(在x86架构中)将4GB的虚拟地址空间分割为用户空间和内核空间。
一个典型的分割是将3GB分配给用户空间,1GB分配给内核空间。

占用内核地址空间最大的部分是物理内存的虚拟映射,
内核无法直接操作没有映射到内核地址空间的内存。

低端内存:
         只有内存的低端部分拥有逻辑地址。内核的数据结构必须放置在低端内存中。
高端内存:
         除去低端内存的剩余部分没有逻辑地址。它们处于内核虚拟地址之上。

--------------------
内存映射和页结构

内核使用逻辑地址来引用物理内存中的页。

为解决在高端内存中无法使用逻辑地址的问题,内核中处理内存的函数趋向于使用
指向page结构的指针<linux/mm.h>。

page结构用来保存内核需要知道的所有物理内存信息,对系统中的每个物理页,
都有一个page结构相对应。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值