Linux设备驱动工程师之路——Linux内存管理机制及mmap方法
K-Style
转载请注明来自于衡阳师范学院08电2 Y-Kee http://blog.csdn.net/ayangke,QQ:843308498
一、重点知识
1. Linux内存管理机制
Linux 2.6.29内核为每种CPU提供统一的界面,采用四级页面管理构架。来兼容二级、三级、四级管理架构的CPU。通过页式管理机制完成虚拟地址(线性地址)到物理地址的映射。一般每个页大小为4K。cr3寄存器中保存了创建进程时分配的值。
Linux操作系统采用虚拟内存管理技术,使得每个进程都有独立的进程地址空间,该空间大小是3G,用户看到和接触的都是虚拟地址,无法看到实际的物理地址。利用这种虚拟地址不但能起到保护操作系统的作用,而且更重要的是用户程序可使用比实际物理内存更大的地址空间。
Linux将4G的虚拟地址空间划分为两个部分——用户空间与内核空间。用户空间从0到0xbfffffff,内核空间从3G到4G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间,例外是用户进程通过系统调用访问内核空间。
每个用户空间是完全独立的,互不想干的。用户空间对应进程,所有每当进程切换,用户空间就会跟着变化。
实际的物理内存只有当进程真的去访问新获取的虚拟地址时,才会由“请页机制”产生“缺页异常”,从而进入分配实际页框程序。
内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。
物理内存896MB以上的部分称之为高端内存。
2. mmap方法
实现mmap方法,驱动程序只需要为该地址范围建立合适的页表,并将vma->ops替换成一系列的新操作就可以了。
void *mmap(void *addr, size_t len, intprot, int flags, int fd, off_t offset)
内存映射函数,负责把文件内存映射到虚拟内存空间,返回映射地址空间地址。
参数说明:
addr:指定映射的起始地址,通常设为NULL,由系统指定。
length:映射到内存的文件长度
prot:映射区的保护模式,可以是PROT_EXEC(可执行)、PROT_READ(可读)、PROT_WRITE(可写)。
flag:映射区的特性,可以是
MAP_SHARED:写入映射区的数据会复制回文件,且允许其他映射该文件的进程共享。
MAP_PRIVATE:对映射区的写入操作会产生一个映射区的复制,对此区域的修改不会写回原文件。
fd:要映射的文件描述符
offet:以文件开始出的偏移量,通常为0,从文件头开始映射。
int munmap(void *start, size_t length)
解除映射。
struct vm_area_struct
内核用来描述虚拟内存区域的结构。
int remap_pfn_range(structvm_area_struct *vma, unsigned long virt_add, unsigned long pfn, unsigned longpfn, unsigned long size, pgprot_t prot)
int io_remap_page_range(structvm_area_struct *vma, unsignde long virt_add, unsigned long phys_add, unsignedlong size, pgprot_t prot)
mmap的核心函数。他们映射了物理地址中从pfn表示的页号开始的size个字节到虚拟地址virt_add上。相关虚拟地址的保护位在port中指定。如果目标地址在I/O地址空间的话,使用io_remap_page_range函数。
二、驱动代码
分享到:
相关推荐
Linux设备驱动之mmap设备操作,对mmap函数的解释,值得一看
而 Posix或系统V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。 mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问...
LINUX设备驱动第三版_ 前言 第一章 设备驱动程序简介 设备驱动程序的作用 内核功能划分 设备和模块的分类 安全问题 版本编号 许可证条款 加入内核开发社团 本书概要 第二章 构造和运行模块 设置测试系统 ...
1. Linux 设备驱动第三版 .................................................................................................................... 5 2. 第 1 章 设备驱动简介 ....................................
第1章 Linux内核简介 第2章 编写和运行模块 第3章 字符设备驱动程序 第4章 调试技术 第5章 字符设备驱动程序的扩展操作 第6章 时间流 第7章 获取内存 第8章 硬件管理 第9章 中断处理 第10章 合理使用数据类型 第11章...
介绍了嵌入式Linux的Mmap设备的原理和方法
第一天 1.Linux驱动简介 2.字符设备驱动程序设计 3.驱动调试技术 4. 并发与竞态 第二天 1.Ioctl型驱动 2.内核等待队列 3. 阻塞型驱动程序设计 4.Poll设备操作 第三天 1.Mmap设备操作 2. 硬件访问 3. 混杂...
详细的嵌入式linux设备驱动编写word文档 第1章 Linux内核简介 第2章 编写和运行模块 第3章 字符设备驱动程序 第4章 调试技术 第5章 字符设备驱动程序的扩展操作 第6章 时间流 第7章 获取内存 第8章 硬件管理 第9章 ...
mmap内存映射机制分析
介绍应用使用mmap以及到kernel内部的映射实现过程以及实例代码
linux下的内存映射函数mmap详解及示例代码.pdf
mmap作为Linux内存管理的关键之一.docx
有时候,应用层需要直接访问物理地址,这时应用层就需要调用应用层mmap接口继而调用驱动层的mmap接口将希望的物理地址映射成用户态能访问的虚拟地址。由于操作系统事先并没有创建这块物理地址与虚拟地址的映射关系,...
linux zero copy mmap
在linux下,用gpmc接口实现的lcd驱动及mmap接口的测试程序
linux 字符驱动函数,基于内存隐射--mmap。无需修改,可以运行。
这里面的代码提供了内核驱动的样例,并且提供了通过mmap,在用户态和内核态之间构建共享内存,来进行通信的方法
参考开源项目GSPCA/SPCA5xx,采纳Linux 内核建议并遵循Video4Linux 标准,提出双URB 分配策略和MMAP 内存映射机制以最大限 度地提高视频采集速度。在S3C2440AL_ARM 开发平台上设计并实现USB 摄像头的嵌入式Linux ...
Linux内核mmap保护机制研究.pdf