当前课程知识点:Linux 内核分析与应用 > 第4章 内存管理 > 4.5 动手实践-Linux内存映射基础(上) > Video
大家好 今天给大家带来的是linux内存映射的演示
在开始之前先跟大家一起熟悉几个概念
首先是mmap文件映射 mmap是一种内存映射文件的方法
即将一个文件映射到进程的地址空间
建立文件磁盘地址和进程虚拟地址的一种对应关系
如此 进程就可以通过读写
相应的虚拟地址 而直接读写相应文件中的内容了
这样映射最大的好处是进程可以直接访问内存
避免了频繁的使用read write
等文件系统的系统调用
需要注意的是mmap并不分配物理内存
它所做的最重要的工作就是为进程映射区的虚拟地址建立页表项
从图上可以看出进程的虚拟地址空间 是由多个虚拟内存区域构成的
如图所示的text数据段 初始数据段
BSS数据段 堆和栈
都是一个个独立的虚拟内存区域
而为内存映射服务的地址空间处在堆和栈之间的空余部分
linux内核使用vm_area_struct结构来表示一个
独立的虚拟内存区域
由于每个虚拟内存区域功能和内部机制都不尽相同
因此一个进程会使用多个vm_area_struct结构来分别表示
不同类型的虚拟内存区域
也就是我们在上一页中看到的text数据段
bss数据段等等
每个vm_area_struct都对应虚拟地址空间上一段连续的地址
它们之间使用链表或者树形结构链接
方便进程进行快速的查找 访问
这里我们可以看到vm_area_struct结构中的一些字段
其中包括虚拟内存区的起始和结束的地址
vm_flags是该虚拟内存区的标志位
如果虚存区域映射的是磁盘文件或者设备文件的话
那么vm_inode指向该文件的inode索引节点
这里有一个重要的叫做vm_ops的字段
它是一个指向vm_operations_struct结构体的指针
在vm_operations_struct结构体中
定义了与该虚拟内存区操作相关的接口
其中包括了: open close fault等等这些操作
每个虚拟内存区域都必须在vm_operations
struct结构中实现这些操作
一个进程的全部虚拟地址空间由mm
struct结构体来管理的
它里面包括了进程虚拟空间的一些管理的信息
包括进程pgd页表的地址等等
另外呢它还有有一个指向
虚拟内存区链表的指针mmap
最后在进程描述符中有一个mm字段
指向mm_struct结构
这些共同组成了linux中
进程虚拟地址空间的抽象描述
最后是linux中有关设备驱动的概念
我们都知道 所有的设备在 Linux 里都是以设备文件的形式存在的
设备文件允许应用程序通过标准输入输出系统调用
与驱动程序进行交互
那么既然都是文件 当然也可以进行mmap映射
这也是一种操作设备的方法
有关设备和驱动的东西是一块很大的领域
感兴趣的同学可以下去了解
我们这里以今天要使用的字符设备驱动为例
简单的介绍下它的基本内容
在用户程序来看操控一个设备就是对设备文件的读写
而其具体的实现过程则是由相应的驱动程序来完成的
如图所示 这个方框中就是一个设备驱动的主要的内容
它其中自然少不了对模块的加载和卸载函数
他们是主要完成设备的初始化和删除的
它使用struct_cdev结构体来抽象描述一个字符设备
而每个cdev结构体呢
就由dev_t类型的设备号来唯一指定
设备号分为主(major)设备号和次设备号
主设备号用来表明设备类型 而次设备号用来表明其编号
这里我们可以看到有一个file_operations结构体
该结构体是Linux文件系统中一个非常重要的结构体
linux的VFS虚拟文件系统
它能够将不同类型的文件系统统一管理
并且为用户提供一个统一的接口就是通过
file_operations结构体实现的
而在设备文件中 它主要用来存储驱动模块提供的
对设备进行各种操作的函数的
对于普通文件的read write
驱动需要将其转化为对应的对设备的操作
就是通过该结构体完成的
它其中包含许多的钩子函数
包括read release mmap等等
read是进程在读设备文件时要做的
Release则是在进程调用close时
所要做的工作的 它用来释放一些系统资源 最后呢就是mmap
不同文件有自己定义的mmap钩子
比如ext3文件系统对应了一个叫做
generic_file_mmap的一个钩子函数
而我们今天要做的主要工作呢
就是为一个虚拟字符设备编写其驱动模块
在其驱动中完成设备空间也就是内核空间
到用户空间的内存映射
好了 接下来我们看一下代码
-1.1 Linux操作系统概述
-1.2 Linux内核结构以及内核模块编程
--Video
-1.3 Linux内核源码中的双链表结构
--Video
-1.4 源码分析-内核中的哈希表
--Video
-1.5 动手实践-Linux内核模块的插入和删除
--Video
-第1章 概述--章节测验
-2.1 内存管理之内存寻址
--Video
-2.2 段机制
--Video
-2.3分页机制
--Video
-2.4 动手实践-把虚拟地址转换成物理地址
--Video
-第2章 内存寻址--章节测验
-3.1 进程概述
--Video
-3.2 Linux进程创建
--Video
-3.3 Linux进程调度
--Video
-3.4 动手实践-打印进程描述符task_struct中的字段
--Video
-3.5工程实践-基于内核模块的负载监控
--Video
-第3章 进程管理--章节测验
-4.1 Linux内存管理机制
--Video
-4.2 进程用户空间管理机制
--Video
-4.3 物理内存分配与回收机制(上)
--Video
-4.4 物理内存分配与回收机制(下)
--Video
-4.5 动手实践-Linux内存映射基础(上)
--Video
-4.6 动手实践-Linux内存映射实现(中)
--Video
-4.7 动手实践-Linux内存映射测试(下)
--Video
-4.8 初学者对内存管理的常见疑惑
-第4章 内存管理--章节测验
-5.1 中断机制概述
--Video
-5.2 中断处理机制
--Video
-5.3 中断下半部处理机制
--Video
-5.4 时钟中断机制
--Video
-5.5 动手实践-中断上半部的代码分析及应用
--Video
-5.6 动手实践-中断下半部的代码分析及应用
--Video
-第5章 中断--章节测验
-6.1 Linux中的各种API
--Video
-6.2 系统调用机制
--Video
-6.3 动手实践-添加系统调用(系统调用日志收集系统)
--Video
-第6章 系统调用--章节测验
-7.1 内核同步概述
--Video
-7.2 内核同步机制
--Video
-7.3 动手实践-内核多任务并发实例(上)
--Video
-7.4 动手实践-内核多任务并发实例(下)
--Video
-第7章 内核同步--章节测验
-8.1 虚拟文件系统的引入
--Video
-8.2 虚拟文件系统的主要数据结构
--Video
-8.3 文件系统中的各种缓存
--Video
-8.4 页高速缓存机制以及读写
--Video
-8.5 动手实践-编写一个文件系统(上)
--Video
-8.6 动手实践-编写一个文件系统(中)
--Video
-8.7 动手实践-编写一个文件系统(下)
--Video
-第8章 文件系统--章节测验
-9.1 设备驱动概述
--Video
-9.2 I/O空间管理
--Video
-9.3 设备驱动模型
--Video
-9.4 字符设备驱动程序简介
--Video
-9.5 块设备驱动程序简介
--Video
-9.6 动手实践-编写字符设备驱动程序
--Video
-9.7工程实践-编写块设备驱动的基础(上)
--Video
-9.8 工程实践-块设备驱动程序分析(中)
--Video
-9.9 工程实践-块设备驱动程序实现(下)
--Video
-第9章 设备驱动--章节测验
-致谢与说明
--Video