Linux内核的DMA-(1)

linux内核的内存管理

Linux内核中,地址分为以下的几种类型:用户虚拟地址、物理地址、总线地址、内核逻辑地址、内核虚拟地址。

用户虚拟地址

这种地址是用户所见的常规地址,一般32或64位。每个进程的都有自己独立的虚拟地址空间。

物理地址

这种地址在处理器和系统内存中间使用。在某些情况,32位系统可以使用64位物理内存(PAE?)。

总线地址

这个地址在外围总线和内存之间使用。一些计算机体系结构提供了I/O内存管理单元,实现了总线和主内存之间的重新映射。

内核逻辑地址

内核逻辑地址组成了内核的常规地址空间。这个地址映射了部分的内存,并经常视为物理地址。

内核虚拟地址

所有的逻辑地址都是内核虚拟地址。

物理地址和页

在linux系统中,许多对内存的操作都是基于单个页的,页的大小通常随体系结构的不同而不同,大多数系统都是4k。内存地址大多被分为一个页号和一个偏移量。4k的页,最后的12位是偏移量(2^12),剩下的高位指页号。页帧指去除地址的页偏移量,并将剩余的部分右移到右端的部分。

高端和低端内存

内核将4G的虚拟地址空间划分为用户空间和内核空间。一个典型的分割是3G用户空间,1G内核空间。对于使用了PAE的内核来说,内核必须建立明确的虚拟映射来使该页在内核地址空间中被访问。所以许多的内核数据必须被放置在低端内存中。高端内存更趋向分配给用户。

内存映射和页结构

为了支持高端内存(高端内存无法直接使用逻辑地址访问),内核中使用指向page结构的的指针来访问页面。page结构体的主要成员如下:

atomic int count; //对该页的访问计数。如果等于0,那么这个页将会被返回给空闲链表。
void *virtual;  //如果被映射,那么指向这一页的内核虚拟地址;如果没有被映射,那么指向NULL.低端内存页总是被映射,高端内存页通常不被映射。访问该成员请使用page_address宏。
unsigned long flags;    //描述页状态的一系列标志。PG_locked表示内存中的页被锁住,PG_reserved表示禁止MMU访问这个页。

虚拟内存区

进程的内存映射至少包含:

  • 程序的可执行代码区域(text)
  • 多个数据区,其中包含初始化数据(.data)、非初始化数据(.bss)以及程序堆栈
  • 与每个活动的内存映射对应的区域

可以通过查看/proc/<pid/maps>的方法了解的内存区域。该文件中的每一项对应vm_area_struct中的一个成员:
start-end perm offset major:minor inode image

  • start-end:该内存区域的起始处和结束处的虚拟地址
  • perm:内存区域的读写执行权限的位掩码
  • offset:内存区域在映射文件中的起始位置
  • major:minor:拥有映射文件的设备的主次设备号。对于设备映射来说,指包含设备的特殊文件的磁盘分区。
  • inode:被映射的文件的索引节点号。
  • image:被映射文件的名称。

vm_area_struct结构

vm_area_struct的结构如下所述。

unsigned long vm_start;
unsigned long vm_end;//该VMA的内存地址的起讫点
struct file *vm_file;//指向与该区域相关联的file结构指针
unsigned long vm_pgoff;//以页为单位,文件中该区域的偏移量。
unsigned long vm_flags;//描述该区域的一套标志。
struct vm_operations_struct *vm_ops;//内核能调用的一套函数。
void *vm_private_data;//驱动程序用来保存自身信息的成员。
void (*open) (struct vm_area_struct *vma);//内核调用这个函数来初始化VMA。
void (*close) (struct vm_area_struct *vma);//销毁一个区域时内核调用这个函数。注意,VMA没有引用计数,所以每个使用区域的进程只能打开或关闭一次。
struct page *(*nopage)(struct  vm_area_struct *vma, unsigned long address, int *type);//缺页调用此函数。
int (*populate)(struct vm_area_struct *vm, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock);//在用户空间访问页前,该函数允许内核将这些页预先装入内存。

mmap设备操作

mmap有以下的几个限制:串口和面向流的设备不能使用mmap,并且mmap必须以PAGE_SIZE为单位进行映射。起始地址也得是整数倍(不是强制)。
mmap是file_operations结构的一部分。
mmap通常有以下的原型:

mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset);

但是文件操作声明如下:

int (*mmap) (struct file *filp, struct vm_area_struct *vma);

建立页表有两种方法:remap_pfn_range一次性全部建立或者nopage VMA一次建立一个。如果驱动程序要把设备内存线性地址映射到用户地址空间中,只需要调用remap_pfn_range函数。具体代码参考书上。
当用户访问VMA中的页,而该页不在内存中时,使用nopage映射内存。该函数还调用get_page宏来增加使用页面的引用计数。对于PCI,必须使用remap_to_range.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351