LDD3 study note 3

2023-11-02 05:33
文章标签 note study ldd3

本文主要是介绍LDD3 study note 3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LDD3 study note 3

-v0.1 2017.11.17 Sherlock init

这篇笔记记录驱动程序中mmap的写法,以及相关的调试过程。同样代码在:
https://github.com/wangzhou/scull.git

1. mmap

在linux用户态调用mmap函数可以把文件内容直接映射到内存,这样用户态程序可以像访问
内存一样访问文件。同样,使用mmap也可以把设备的一段IO空间映射到用户态,用户态程序
可以直接访问这个设备的寄存器。当然,要在程序驱动里添加mmap的对应支持。

2. 驱动实现

为了支持把设备的IO空间映射到用户态,驱动里要实现.mmap的回调,struct vm_area_struct
会把用户态想要映射到的用户态虚拟地址传到内核。在.mmap回调里需要把这些参数,连同
想要映射的实际物理地址传递给remap_pfn_range函数,这个函数帮助建立虚拟地址到物理
地址的映射。

下面的例子是在scull驱动里,申请了一段内核态的内存,我们可以通过下面的操作把它映射
到用户态。

int scull_mmap(struct file *file, struct vm_area_struct *vma)
{unsigned long page = virt_to_phys(scull_device->mmap_memory);unsigned long start = (unsigned long)vma->vm_start;unsigned long size = (unsigned long)(vma->vm_end - vma->vm_start);vma->vm_flags |= (VM_IO | VM_LOCKED | VM_DONTEXPAND | VM_DONTDUMP);if (remap_pfn_range(vma, start, page >> PAGE_SHIFT, size, PAGE_SHARED)) {printk(KERN_ALERT "remap_pfn_range failed!\n");return -1;}return 0;
}

LDD3上讲,remap_pfn_range只能映射IO空间和系统保留内存,但是上面例子的mmap_memory
实际在就是用get_free_page分配的(把get_free_page换成kmalloc也是可以做映射的), 测试
的结果是用get_free_page分配的内存也是可以被映射到用户态的。所以,实际上
remap_pfn_range也可以把系统内存映射到用户态。

内核用struct vm_area_struct管理进程空间的各个虚拟地址区域。cat /proc/pid/maps
可以看到一个进程所有的虚拟地址区域。在下面的例子中,我们可以看到测试程序(read.c)
的进程的各个地址区域。可以看到调用mmap创建起来的一个地址区域/dev/scull0.

estuary:/$ cat /proc/1251/maps
00400000-00401000 r-xp 00000000 00:01 882            /a.out
00410000-00411000 rw-p 00000000 00:01 882            /a.out
ffffae624000-ffffae634000 rw-p 00000000 00:00 0 
ffffae634000-ffffae764000 r-xp 00000000 00:01 629    /lib/aarch64-linux-gnu/libc-2.21.so
ffffae764000-ffffae773000 ---p 00130000 00:01 629    /lib/aarch64-linux-gnu/libc-2.21.so
ffffae773000-ffffae777000 r--p 0012f000 00:01 629    /lib/aarch64-linux-gnu/libc-2.21.so
ffffae777000-ffffae779000 rw-p 00133000 00:01 629    /lib/aarch64-linux-gnu/libc-2.21.so
ffffae779000-ffffae77d000 rw-p 00000000 00:00 0 
ffffae77d000-ffffae799000 r-xp 00000000 00:01 575    /lib/aarch64-linux-gnu/ld-2.21.so
ffffae7a1000-ffffae7a2000 rw-s 00000000 00:01 1385   /dev/scull0
ffffae7a2000-ffffae7a7000 rw-p 00000000 00:00 0 
ffffae7a7000-ffffae7a8000 r--p 00000000 00:00 0      [vvar]
ffffae7a8000-ffffae7a9000 r-xp 00000000 00:00 0      [vdso]
ffffae7a9000-ffffae7aa000 r--p 0001c000 00:01 575    /lib/aarch64-linux-gnu/ld-2.21.so
ffffae7aa000-ffffae7ac000 rw-p 0001d000 00:01 575    /lib/aarch64-linux-gnu/ld-2.21.so
fffff5f89000-fffff5faa000 rw-p 00000000 00:00 0      [stack]

这篇关于LDD3 study note 3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/328473

相关文章

(南京观海微电子)——GH7006 Application Note

Features ⚫ Single chip solution for a WXGA α-Si type LCD display ⚫ Integrate 1200 channel source driver and timing controller ⚫ Display Resolution: ◼ 800 RGB x 480 ◼ 640 RGB x 480 ⚫ Display int

chapter06 面向对象基础 知识点Note

文章目录 前言类的设计 属性和行为对象的内存解析 (堆 栈 方法区)类的成员之一 变量(属性) field类的成员之二 方法 method对象数组方法重载 overload可变个数的形参 语法糖方法的值传递机制递归关键字package importMVC设计模式import导入面向对象特征之一 封装类的成员之三 构造器JavaBeanUML类图 前言 ` 面向对象封装 面向

Study Plan For Algorithms - Part24

1. 包含min函数的栈 定义栈的数据结构,要求在该类型中实现一个 min 函数,能够获取栈的最小元素。在该栈中,调用 min、push 以及 pop 函数的时间复杂度均为 O (1)。 方法: class MinStack:def __init__(self):self.stack = []self.min_stack = [float('inf')]def push(self, x):sel

Cmake note

cmake 指定交叉编译工具 指定install安装目录 $CC=arm-linux-uclibcgnueabi-gcc cmake -DCMAKE_INSTALL_PREFIX=./output . $make $make install 删除camke cache文件: find . -iname ‘cmake’ -not -name CMakeLists.txt -exec rm -rf

chapter01 Java语言概述 知识点Note

JavaSE JavaEE JavaME 大数据 Java基础常用技术栈 mysql JDBC SSM spring+spring mvc+mybatis Linux nacos Hadoop Flink JAVA EE 消息队列 rabbitMQ docker 数据库 redis spring boot springcloud ssh struts + spring + hiber

chapter03 流程语句 知识点Note

@TOC 分支结构if-else 和 switch-case switch(表达式){case 常量值1:语句块1;//break;case 常量值2:语句块2;//break; // ...[default:语句块n+1;break;]} switch-case 执行过程: 第1步:根据switch中表达式的值,依次匹配各个case。如果表达式的值等于某个case中的常量值,则执行对

Study Plan For Algorithms - Part21

1. 二叉树的镜像 输入一个二叉树,输出它的镜像。 方法一: class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef mirrorTree(root):if not root:return Nonetemp, left,

work note

1:  sum_total 是什么意思?  没有百度出来 见proce:  rptMohthCdr

Self-study Python Fish-C Note20 P64to65

类和对象 (part 3) 本节主要介绍 类和对象的多态和鸭子类型、私有变量和 __slots__(原视频P64-65)\ 多态 多态是面向对象编程的三大特征之一,另外两个是封装和继承。多态是指同一个运算符、函数或对象,在不同场景下具有不同作用效果的情况。 Python 是一门动态语言,多态本来就是 Python的一种特性。 比如: 加号:两边都是数字的时候就是执行算术运算(相加),如果两边

note-Redis实战3 核心-数据安全与性能保障

助记提要 快照持久化的作用和缺点Redis创建快照的时机AOF文件同步的三种配置AOF文件重写的方式Redis复制的配置项和控制命令Redis复制过程 5步Redis主从链确认数据写入从服务器硬盘故障处理的两步Redis事务命令 5个Redis事务的特点 3点非事务型流水线使用性能测试工具评估客户端的性能 4章 数据安全与性能保障 持久化和复制 故障恢复 事务和流水线 4.1 快照持久