地址类型:
用户虚拟地址:这是用户空间程序能看到的常规地址。
物理地址:该地址在处理器和系统内存之间使用。
总线地址:该地址在外设总线和内存之间使用。
内核逻辑地址:组成了内核的常规地址空间。该地至映射了部分内存,并经常被视为物理地址,在大多数体系结构中,逻辑地址与相关的物理地址的不同,仅仅在于它们之间相差一个固定的偏移量。逻辑地址通常保存在UNSIGNED LONG ,和void*这样的内存变量中,用kmalloc返回的内存地址,就是内核逻辑地址。
内核虚拟地址:与逻辑地址相比,它与物理地址的映射不是线性和一一对应的。所有的逻辑地址都是虚拟地址,而虚拟地址不一定是逻辑地址。虚拟地址通常保存在指针变量中。
物理地址和页:
物理地址被分为很多离散单元称为页,ARM中一个页的大小为4096字节/* PAGE_SHIFT determines the page size */
#define PAGE_SHIFT 12 移动12位即得页帧数
#define PAGE_SIZE (1UL 低端内存:存在于内核空间上的逻辑地址内存。
高端内存:指那些不存在逻辑地址的内存,它们处于内核虚拟地址之上。
内存映射和页结构:
在高端内存中将无法使用逻辑地址,内存中处理内存的函数使用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);
如果地址的话,返回该页的虚拟地址。
相关推荐
内存映射和DMA 本章研究 Linux 内存管理的部分, 重点在对于设备驱动作者有用的技术. 许多 类型的驱动编程需要一些对于虚拟内存子系统如何工作的理解; 我们在本章涉 及到的材料来自手头, 而不是象我们曾进入更加复杂...
将大文件通过文件映射的方式进行逆序!非常好的方法!
2.3 Linux页面级内存管理 72 2.3.1 分配一组页面 73 2.3.2 释放一组页面 80 2.4 每CPU页面高速缓存 81 2.4.1 数据结构 81 2.4.2 通过每CPU 页高速缓存分配页面 82 2.4.3 释放页面到每CPU 页面高速缓存 83 2.5 slab...
mmap系统调用并不是完全为了... mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。
很好的内存映射的说明,讲述了X86在linux上是怎么进行物理内存到虚拟内存的映射的
对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。 进程的4GB内存空间被人为的分为两个部分--...
linux内核管理 linux内核的内存映射方式,和管理方式
实际工作中遇到超大文件读写时很多系统需要等待较长时间,给用户体验不佳。本文结合源码讲解了超大文件的内存映射读写方式。内存映射方式极大的提高了读写效率,提升用户体验感。
内存映射技术在Linux驱动程序中的应用和实现.pdf
一个简单的嵌入式linux内存映射例子,包括静态映射和动态映射。
通过使用“内存映射文件”,实现内存共享 代码包含如何定义共享的内存结构、如何创建共享内存映射文件、如何多程序调用共享内存映射文件、如何由非创建方程序来释放共享内存映射文件
这篇文章描述的在linux下设备驱动的内存映射
CPU访问内存的过程 Linux内存映射的标准实现 Linux内存三级映射的实现 Linux内存页属性更改的实现
qt 内存 映射 大文件读写
通过内存映射实现的小型数据库,并将数据存储到磁盘
本文介绍利用内存映射文件修改大文件:在大文件内存前加入一段数据,若要使用内存映射文件,必须执行下列操作步骤: 1.创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件; 2.创建一个文件...
使用每行的字符个数统计和 MD5 两个算法比较内存映射和分块直接读取文件的速度。
关于内存映射文件读写文件的方法,大家学习了解一下
一段读写内存映射数据的代码,对内存映射区域进行读写操作
利用内存映射文件技术实现进程间通信,自pudn程序员联合开发网下载