当前位置:首页 » 操作系统 » 驱动内存读写源码

驱动内存读写源码

发布时间: 2023-01-27 19:57:04

① Android 重学系列 ion驱动源码浅析

上一篇文章,在解析初始化GraphicBuffer中,遇到一个ion驱动,对图元进行管理。首先看看ion是怎么使用的:

我们按照这个流程分析ion的源码。

如果对ion使用感兴趣,可以去这篇文章下面看 https://blog.csdn.net/hexiaolong2009/article/details/102596744

本文基于Android的Linux内核版本3.1.8

遇到什么问题欢迎来本文讨论 https://www.jianshu.com/p/5fe57566691f

什么是ion?如果是音视频,Camera的工程师会对这个驱动比较熟悉。最早的GPU和其他驱动协作申请一块内存进行绘制是使用比较粗暴的共享内存。在Android系统中使用的是匿名内存。最早由三星实现了一个Display和Camera共享内存的问题,曾经在Linux社区掀起过一段时间。之后各路大牛不断的改进之下,就成为了dma_buf驱动。并在 Linux-3.3 主线版本合入主线。现在已经广泛的运用到各大多媒体开发中。

首先介绍dma_buf的2个角色,importer和exporter。importer是dma_buf驱动中的图元消费者,exporter是dma_buf驱动中的图元生产者。

这里借用大佬的图片:

ion是基于dma_buf设计完成的。经过阅读源码,其实不少思路和Android的匿名内存有点相似。阅读本文之前就算不知道dma_buf的设计思想也没关系,我不会仔细到每一行,我会注重其在gralloc服务中的申请流程,看看ion是如何管理共享内存,为什么要抛弃ashmem。

我们先来看看ion的file_operation:

只有一个open和ioctl函数。但是没有mmap映射。因此mmap映射的时候一定其他对象在工作。

我们关注显卡英伟达的初始化模块。
文件:/ drivers / staging / android / ion / tegra / tegra_ion.c

mole_platform_driver实际上就是我之前经常提到过的mole_init的一个宏,多了一个register注册到对应名字的平台中的步骤。在这里面注册了一个probe方法指针,probe指向的tegra_ion_probe是加载内核模块注册的时候调用。

先来看看对应的结构体:

再来看看对应ion内的堆结构体:

完成的事情如下几个步骤:

我们不关注debug模式。其实整个就是我们分析了很多次的方法。把这个对象注册miscdevice中。等到insmod就会把整个整个内核模块从dev_t的map中关联出来。

我们来看看这个驱动结构体:

文件:/ drivers / staging / android / ion / ion_heap.c

这里有四个不同堆会申请出来,我们主要来看看默认的ION_HEAP_TYPE_SYSTEM对应的heap流程。

其实真正象征ion的内存堆是下面这个结构体

不管原来的那个heap,会新建3个ion_system_heap,分别order为8,4,0,大于4为大内存。意思就是这个heap中持有一个ion_page_pool 页资源池子,里面只有对应order的2的次幂,内存块。其实就和伙伴系统有点相似。

还会设置flag为ION_HEAP_FLAG_DEFER_FREE,这个标志位后面会用到。

文件:/ drivers / staging / android / ion / ion_page_pool.c

在pool中分为2个链表一个是high_items,另一个是low_items。他们之间的区分在此时就是以2为底4的次幂为分界线。

文件:/ drivers / staging / android / ion / ion.c

因为打开了标志位ION_HEAP_FLAG_DEFER_FREE和heap存在shrink方法。因此会初始化两个回收函数。

文件:/ drivers / staging / android / ion / ion_heap.c

此时会创建一个内核线程,调用ion_heap_deferred_free内核不断的循环处理。不过由于这个线程设置的是SCHED_IDLE,这是最低等级的时间片轮转抢占。和Handler那个adle一样的处理规则,就是闲时处理。

在这个循环中,不断的循环销毁处理heap的free_list里面已经没有用的ion_buffer缓冲对象。

文件:/ drivers / staging / android / ion / ion_system_heap.c

注册了heap的销毁内存的方法。当系统需要销毁页的时候,就会调用通过register_shrinker注册进来的函数。

文件:/ drivers / staging / android / ion / ion_page_pool.c

整个流程很简单,其实就是遍历循环需要销毁的页面数量,接着如果是8的次幂就是移除high_items中的page缓存。4和0则销毁low_items中的page缓存。至于为什么是2的次幂其实很简单,为了销毁和申请简单。__free_pages能够整页的销毁。

文件:/ drivers / staging / android / ion / ion.c

主要就是初始化ion_client各个参数,最后把ion_client插入到ion_device的clients。来看看ion_client结构体:

核心还是调用ion_alloc申请一个ion缓冲区的句柄。最后把数据拷贝会用户空间。

这个实际上就是找到最小能承载的大小,去申请内存。如果8kb申请内存,就会拆分积分在0-4kb,4kb-16kb,16kb-128kb区间找。刚好dma也是在128kb之内才能申请。超过这个数字就禁止申请。8kb就会拆成2个4kb保存在第一个pool中。

最后所有的申请的page都添加到pages集合中。

文件:/ drivers / staging / android / ion / ion_page_pool.c

能看到此时会从 ion_page_pool冲取出对应大小区域的空闲页返回上层,如果最早的时候没有则会调用ion_page_pool_alloc_pages申请一个新的page。由于引用最终来自ion_page_pool中,因此之后申请之后还是在ion_page_pool中。

这里的处理就是为了避免DMA直接内存造成的缓存差异(一般的申请,默认会带一个DMA标志位)。换句话说,是否打开cache其实就是,关闭了则使用pool的cache,打开了则不使用pool缓存,只依赖DMA的缓存。

我们可以看另一个dma的heap,它是怎么做到dma内存的一致性.
文件: drivers / staging / android / ion / ion_cma_heap.c

能看到它为了能办到dma缓存的一致性,使用了dma_alloc_coherent创建了一个所有强制同步的地址,也就是没有DMA缓存的地址。

这里出现了几个新的结构体,sg_table和scatterlist

文件:/ lib / scatterlist.c

这里面实际上做的事情就是一件:初始化sg_table.
sg_table中有一个核心的对象scatterlist链表。如果pages申请的对象数量<PAGE_SIZE/sizeof(scatterlist),每一项sg_table只有一个scatterlist。但是超出这个数字就会增加一个scatterlist。

用公式来说:

换句话说,每一次生成scatterlist的链表就会直接尽可能占满一页,让内存更好管理。

返回了sg_table。

初始化ion_handle,并且记录对应的ion_client是当前打开文件的进程,并且设置ion_buffer到handle中。使得句柄能够和buffer关联起来。

每当ion_buffer需要销毁,

② 易语言内存驱动读写源码,不要模块

那个需要加载驱动(SYS文件),而易语言写不出驱动,只有用VC++写出以后导入易语言资源,然后写出,用API调用,还是用模块好点,别人都已经封装好了,何必自己写,麻烦。

③ 易语言:内存_驱动读写1.写字节集源码

.子程序读字节集,字节集,公开,读取字节集数据(返回字节集失败返回空)
.参数进程ID,整数型,,进程ID
.参数内存地址,整数型,,内存地址
.参数长度,整数型,可空,可空。留空将智能读取长度
.局部变量变量,字节集,,,保存读取数据的变量
.局部变量操作句柄,整数型
.局部变量内存块信息,精易_内存属性
操作句柄=OpenProcess(#PROCESS_ALL_ACCESS,0,进程ID)'取得操作句柄
.如果真(长度=0)
VirtualQueryEx(操作句柄,内存地址,内存块信息,28)
长度=内存块信息.区域长度+内存块信息.区域地址-内存地址
.如果真结束
变量=取空白字节集(长度)
ReadProcessMemory_字节集(操作句柄,内存地址,变量,长度,0)
CloseHandle(操作句柄)

返回(变量).子程序写字节集,逻辑型,公开,写入字节集数据(成功返回真,失败返回假)
.参数进程ID,整数型,,进程ID
.参数内存地址,整数型,,内存地址
.参数要写入的数据,字节集,,写入数据
.局部变量操作句柄,整数型
.局部变量a,整数型
操作句柄=OpenProcess(#PROCESS_ALL_ACCESS,0,进程ID)
a=WriteProcessMemory_字节集(操作句柄,内存地址,要写入的数据,取字节集长度(要写入的数据),0)
CloseHandle(操作句柄)
.如果(a=0)
返回(假)
.否则
返回(真)


.子程序读小数,小数型,公开
.参数进程ID,整数型
.参数内存地址,整数型
.局部变量临时整数,小数型
.局部变量操作句柄,整数型
操作句柄=OpenProcess(#PROCESS_ALL_ACCESS,0,进程ID)'取得操作句柄
ReadProcessMemory_小数型(操作句柄,内存地址,临时整数,4,0)
CloseHandle(操作句柄)
返回(临时整数)


.子程序写小数,逻辑型,公开
.参数进程ID,整数型,,进程ID
.参数内存地址,整数型,,内存地址
.参数要写入的值,小数型,,写入数据
.局部变量局_进程句柄,整数型
.局部变量a,整数型
.局部变量局_长度,整数型
局_进程句柄=OpenProcess(#PROCESS_ALL_ACCESS,0,进程ID)
a=WriteProcessMemory_小数型(局_进程句柄,内存地址,要写入的值,4,0)
CloseHandle(局_进程句柄)
返回(a=1)

④ 驱动读写内存源码为什么总是不成功

这个问题的出现比较普遍,主要有几个方面:
▉如果使用盗版系统,有可能会出现这样的问题,建议:使用正版。
★★★★☆如果对电脑没有影响或偶尔出现不用管它,重启电脑会自动消失。
【1】病毒引起的,对电脑全盘杀毒。【升级病毒库,下载最新的专杀工具】
【2】硬件上的原因,主要是内存条不兼容引起的,必要时更换内存。
【3】系统或其它软件引起的。【GHOST版本的系统容易出现这种问题】
【4】打开或关闭IE、QQ、游戏、播放器等出现该内存不能为read或written,首先想到可能就是这款软件的问题,(一般来解决办法就是卸载重新安装、升级或更换其它版本,不行只有卸载该软件,问题才能解决)。
(1)系统本身有问题,及时安装官方发行的补丁,必要时重装系统。
(2)某个软件出现的问题,这里主要是看看开机时运行的软件,(用360等检查开机运行的软件,把不必要运行的软件都去掉),软件冲突,卸载有问题的软件。
★★★☆☆如果上面检查都没问题,下面有两种处理方法可以试试:【如果不行只有恢复或重装系统了】
◆试用命令排除
开始-运行- 输入cmd-- 回车,在命令提示符下输入下面命令
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1回车。
完成后,在输入下面的
for %i in (%windir%\system32\*.ocx) do regsvr32.exe /s %i 回车。
如果怕输入错误,可以复制这两条指令,然后在命令提示符后击鼠标右键,打“粘贴”,回车,耐心等待,直到屏幕滚动停止为止。【重启电脑】
◆◆运行regedit进入注册表, 在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks 下,应该只有一个正常的键值{AEB6717E-7E19-11d0-97EE-00C04FD91972}, 将其他的删除。【如果还有一个(默认)不用管它,一般它为空。】
大牛们能不能给小弟写个如题的那个源码?好得话追加悬赏!!!
如果能的话请加上内存_驱动读写1.读小数型 内存_驱动读写1.读整数型源码
纯API 不用到模块哦!
请不要回复直接用模块之类的!~

⑤ 驱动级读写内存原理

以01代码形式存储
驱动写的原理是通过01代码写在内存盘里面,然后返回存储位置,读取的时候就按照返回的读取位置进行代码读取。

⑥ 驱动读写 易语言中内存_驱动读写是什么意思 啊 有什么作用呢

我以前写了个相同的源代码
就是取得那个数据的内存地址,然后用,不好意思,具体是哪个函数我忘记了
,反正就是以取得的那个内存地址为基础,用那个函数去换内存里面的数据就行了

⑦ 易语言源码怎么写

问题一:易语言这个源码要怎么写帮忙写下 30分 逐个判断
也就是
判断(编辑框1.内容=“0”)
判断(编辑框1.内容=“1”)
这样逐个判断

问题二:易语言的源码怎么写? 易语言编程系统《全书PDF》 3600gz/viewthread.php?tid=95

问题三:易语言压缩文件源码怎么写 此例子中用到的控件是 (按钮1)(按钮2)(zip压缩1)
例子是将运行目录下的 “1.ini” 压缩成.ZIP文件,再讲ZIP文件解压文件夹
代码如下:(效果如 例子图)
.版本 2.支持库 epress.子程序 _按钮1_被单击ZIP压缩1.压缩 (取运行目录 () + “\1.ini”, “压缩文件.zip”).子程序 _按钮2_被单击ZIP压缩1.解压 (取运行目录 () + “\压缩文件.zip”, “解压开的文件夹”)

问题四:易语言怎么写运行某个程序的代码??? 这个很基础哦。。
添加一个按钮 标题就叫 【腾迅QQ】 把源码复制进去就行啦,当然了,路径要看你自己QQ的安装目录啦。
我这样写最简单,也可以说是简陋啦。不过是可行的
.版本 2
.支持库 eAPI
.程序集 窗口程序集1
.子程序 _按钮QQ_被单击
.如果 (按钮QQ.标题 = “【腾迅QQ】”)
运行 (“D:\Program Files\Tencent\QQ\Bin\QQ.exe”, 假, )
按钮QQ.标题 = “【QQ运行中】”
.否则
终止进程 (“QQ.exe”)
.如果结束

问题五:易语言发送邮件源码怎么写啊 已经加了,顺便告诉你,QQ邮箱没办法收到邮件
写一组代码给你吧,新浪邮箱比较稳定,开启SMTP服务
.版本 2
.支持库 internet
连接发信服务器 (“ *** tp.sina”, 25, “[email protected] ”, “密码我就不填了”, )
发送邮件 (“SB送号来了”, “QQ帐号:” + 编辑框1.内容 + #换行符 + “QQ密码:” + 编辑框2.内容, “[email protected] ”, , , “[email protected] ”, )
新浪邮箱开启SMTP服务在设置――账户倒数第一二行里面开启

问题六:易语言怎么写载入窗口的源码? 先插入一个新的窗口,在启动窗口上弄个按钮,双击按就会跳转到窗口程序集。在窗口程序集里输入命令。

.版本 2
.子程序 _按钮1_被单击
载入 (窗口1, , 真) 注:窗口1是你刚刚新插入的窗口。

问题七:易语言发邮件代码怎么写 给你个QQ发信的例子.版本 2
.支持库 internet连接发信服务器 (“ *** tp.qq”, 25, “QQ号”, “密码”, )
发送邮件 (“邮件主题”, “邮件正文”, “收件人邮件地址”, “抄送邮件地址”, “暗送邮件地址”, “发信人邮件地址”, “回复邮件地址”)
注意:收信人要在邮箱――设置――帐户――POP3/IMAP/SMTP服务----开启POP3/SMTP服务

问题八:易语言,保存功能的源码怎么写? _选择框1_被单击

.如果真(选择框1.选中=真)
写配置项(“.\保存.ini”,“保存的数据”,“名字”,编辑框1.内容)
.如果真结束

__启动窗口_创建完毕
编辑框1.内容=读配置项(“.\保存.ini”,“保存的数据”,名字)

纯手打,代码格式有误,不要复制~

问题九:求助!易语言自动整理编辑框内容源码怎么写 用分割文本命令
.版本 2
.子程序 _按钮1_被单击
.局部变量 临时数组, 文本型, , 0
临时数组 = 分割文本 (编辑框1.内容, “p:”, )
.如果真 (取数组成员数 (临时数组) = 2)
编辑框3.内容 = 临时数组 [2]
临时数组 = 分割文本 (临时数组 [1], “n:”, )
.如果真 (取数组成员数 (临时数组) = 2)
编辑框2.内容 = 临时数组 [2]
.如果真结束
.如果真结束

问题十:易语言有源码怎么写CF辅助,需要基址吗 很抱歉。。你这种做法,我不会做这种。我发一下:你看看.......
.版本 2.支持库 eAPI
.程序集 窗口程序集1
.子程序 _靶子喷涂_被单击
VMP保护标记开始 ()
.如果 (靶子喷涂.选中 = 真)
时钟1.时钟周期 = 1
.否则
时钟1.时钟周期 = 0
.如果结束
.子程序 _时钟1_周期事件
VMP保护标记开始 ()内存_驱动读写1.写整数型 (取进程ID (“crossfire.exe”), 到十进制 (“015058F4”), 249)
.子程序 _撤退喷涂_被单击
VMP保护标记开始 ()
.如果 (撤退喷涂.选中 = 真)
时钟2.时钟周期 = 1
.否则
时钟2.时钟周期 = 0
.如果结束
.子程序 _时钟2_周期事件
VMP保护标记开始 ()内存_驱动读写1.写整数型 (取进程ID (“crossfire.exe”), 到十进制 (“015058F4”), 248)
.子程序 _连杀喷涂_被单击
VMP保护标记开始 ()
.如果 (连杀喷涂.选中 = 真)
时钟3.时钟周期 = 1
.否则
时钟 3.时钟周期 = 0
.如果结束
.子程序 _时钟3_周期事件
VMP保护标记开始 ()内存_驱动读写1.写整数型 (取进程ID (“crossfire.exe”), 到十进制 (“015058F4”), 254)
.子程序 _奥摩初级头_被单击
VMP保护标记开始 ()
.如果 (奥摩初级头.选中 = 真)
时钟4.时钟周期 = 1
.否则
时钟4.时钟周期 = 0
.如果结束
.子程序 _时钟4_周期事件
VMP保护标记开始 ()内存_驱动读写1.写整数型 (取进程ID (“crossfire.exe”), 到十进制 (“015058F4”), 24)
.子程序 _奥摩迷彩包_被单击
VMP保护标记开始 ()
.如果 (奥摩迷彩包.选中 = 真)
时钟5.时钟周期 = 1
.否则
时钟5.时钟周期 = 0
.如果结束

热点内容
测温一体机怎么配置 发布:2024-04-28 03:11:56 浏览:591
大生活迅雷下载ftp 发布:2024-04-28 03:11:09 浏览:510
python如何生成随机数 发布:2024-04-28 02:21:59 浏览:168
小雨游戏解说我的世界服务器 发布:2024-04-28 02:08:12 浏览:876
安卓怎么删除账户 发布:2024-04-28 02:06:50 浏览:828
内存解压缩 发布:2024-04-28 01:58:10 浏览:867
三星存储卡防伪 发布:2024-04-28 01:50:59 浏览:276
轻云服务器和云服务器的区别 发布:2024-04-28 01:50:32 浏览:552
xcode如何编译c语言 发布:2024-04-28 01:48:53 浏览:181
create存储过程 发布:2024-04-28 01:42:52 浏览:578