Linux驱动开发 问题随笔

1、内核空间与用户空间数据交换方式

分两种情况:
1> 需要交换的数据量较大时;
2> 需要交换的数据量较小时;

第一种情况使用以下的函数:

unsigned long copy_to_user(void __user* to, const void* from, unsigned long n);
unsigned long copy_from_user(void* to, const void __user* from, unsigned long n);

返回值表示成功拷贝的字节数。

第二种情况则使用以下所示的宏定义:

#include <asm/uaccess.h>
put_user(local, user);
get_user(local, user);

2、MKDEV申请的设备号与register_chrdev_region申请的设备号有什么区别?

两种方式所描述的“设备号”是相同的。其区别用一句话概括就是:是否得到了系统的承认。

MKDEV(ma, mi) 是一个宏定义,其作用就是将参数 major 和 minor 由两个分散的数值组合成统一的 dev_t 类型(unsigned long)。执行此宏定义后得到的“设备号”表示你想要得到这个设备号,想向全世界声明它属于我,不过此时它仅仅是你单方面的声明而已。

register_chrdev_region() 的用法通常是将 MKDEV() 出来的设备号作为参数传入。可以理解成是在开发者单方面声明想独占某个设备号后,将此设备号交由操作系统审批。当函数返回值为0时,表示Linux系统通过了开发者的申请,前面由 MKDEV() 出来的设备号就得到开发者以及操作系统的共同认可。

3、register_chrdev_region() 与 alloc_chrdev_region() 有什么区别?

两函数的原型分别如下所示:

int register_chrdev_region(dev_t from, unsigned int count, const chr* name);
int alloc_chrdev_region(dev_t* dev, unsigned int baseminor, unsigned int count, const char* name);

两个函数的目的一样,都是从系统中得到(申请)一个专属设备号。但前者用于“静态申请”,而后者用于“动态申请”。

静态申请则表示开发者为某设备静态指定一个设备号,直接提交给系统审批。

但设备号资源是有限的,对某些动态加载的驱动来说可能会遇到静态指定的设备号已被占用的情况。此时最好的解决办法就是直接向系统申请一个可用的设备号。

4、创建内核线程

可以使用 kthread_run 宏定义来创建。其原型如下
#define kthread_run(threadfn, data, namefmt, …)
  参数 threadfn 表示用于在子线程中执行的函数名。子线程函数的原型为:int (*threadfn)(void *data)
  参数 data 表示要传递到子线程函数去的数据地址。
  参数 namefmt 及后面的可变长度个参数用于组合成此子线程的名称。
  
  此宏定义返回值为一个 struct task_struct 结构体地址。可以用 IS_ERR(ts)来判断子线程是否成功创建。

5、内核中的内存分配

内核开发中常见的分配内存的函数有两个:

static inline void* kmalloc(size_t size, gfp_t flags);
void* vmalloc(unsigned long size);

kmalloc函数与malloc函数类似,它所分配的内存空间在物理上是地址连续型的。但是它在内核中最大只能分配128KB的内存空间。此函数第二个参数常用的值有两个:1、GFP_KERNEL;2、GFP_ATOMIC;分别对应于在内存不足是是否阻塞调用。
vmalloc函数分配的内存空间在虚拟地址上是连续的,但是在物理地址上却不一定。因此此函数可用于分配大内存空间,最大可达1GB。

如果在内核开发中要涉及到频繁的申请与释放内存空间的,为避免产生内存碎片,可以使用内存池技术来解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/153661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升 Python 执行速度:Codon、C/C++、Rust、Numba(JIT)、Taichi、Nuitka、MatxScript

几种流行的 Python 性能加速方案对比&#xff1a;https://zhuanlan.zhihu.com/p/604519817 对于一般通用场景用户&#xff0c;对性能没有那么强烈的诉求&#xff0c;紧跟官方步伐&#xff0c;升级到最新版本的 Python 既可&#xff0c;或者使用 PyPy。Numba、Codon、Taichi 等这…

【蓝桥杯选拔赛真题23】C++计算24 第十二届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

C/C++计算24 第十二届蓝桥杯青少年创意编程大赛C++选拔赛真题 一、题目要求 1、编程实现 “计算 24”是一个流传已久的数字游戏,小蓝最近对此痴迷不已 游戏规则是:从 1~10 之间的自然数任意拿出 4 个数(4 个数各不相同,顺序随机),进行加、减、乘三种运算(使用某种运算…

汇编-MOVSXD64位带符号扩展传送

允许源操作数为32位的寄存器或内存操作数 ExitProcess PROTO .code main PROCmov ebx, 0FFFFFFFFh movsxd rax, ebx ;RAX FFFFFFFFFFFFFFFFhmov ebx, 01FFFFFFFh movsxd rdx, ebx ;RDX 000000001FFFFFFFhmov ecx,0 ;结束程序call ExitProcess main ENDP E…

Spring学习之注解@Autowired、@Qualifier、@Resource

Spring学习之注解Autowired、Qualifier、Resource 在Spring框架中&#xff0c;注解&#xff08;Annotation&#xff09;是一种用于依赖注入&#xff08;DI&#xff09;的机制。 Autowired: Autowired 是Spring提供的注解&#xff0c;用于自动注入依赖。当Spring创建一个bean时…

【前端知识】Node——文件流的读写操作

四种基本流类型: 1.Writable: 可以向其写入数据的流 2.Readable: 可以从中读取数据的流 3.Duplex&#xff1a;同时为Readable 和 Writable 4.Transform: Duplex可以在写入和读取数据时修改或转换数据的流 一、Readable const fs require(fs);// 创建文件的Readable const rea…

ADB安装及使用介绍

一、ADB简介 1、什么是adb ADB 全称为 Android Debug Bridge&#xff0c;起到调试桥的作用&#xff0c;是一个客户端-服务器端程序。其中客户端是用来操作的电脑&#xff0c;服务端是 Android 设备。 ADB 也是 Android SDK 中的一个工具&#xff0c;可以直接操作管理 Android …

CRM系统的客户细分有什么作用?

我们常常说&#xff0c;企业想要开展有针对性的营销活动&#xff0c;就需要进行客户细分。通过特定条件&#xff0c;将客户分为几类&#xff0c;从而对不同类型的客户提供不同的产品和服务。下面我们就针对这里来详细说说&#xff0c;CRM中客户细分是什么&#xff1f;如何细分客…

微信小程序如何使用scss,less

搜到很多都是先VSCode安装好…插件…。这都是很久之前的方法了&#xff0c;所以想写这篇文章 一、修改project.config.json配置文件 "setting": {"useCompilerPlugins": ["sass"]},二、然后就可以删除 .wxss 文件了&#xff0c;就用 .scss 文件…

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A卷

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A卷 2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A卷A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&#xff09;A-2&#…

算法设计与分析算法实现——删数问题

通过棋盘输入一个高精度的正整数n(n的有效位数<=240)去掉其中任意s个数字后,剩下的数字按原左右次序将组成一个新的正整数。变成对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小。 输入:n,s 输出:最后剩下的最小数 输入实例: 178543 4 输出示例: 13 首先…

Java stream流 常用记录

根据列表中的某个字段进行去重 // 根据roleKey对列表去重return roleList.stream().map(AccountRole::getRoleKey).distinct().map(roleKey -> roleList.stream().filter(role -> role.getRoleKey().equals(roleKey)).findFirst().orElse(null)).filter(Objects::nonNul…

重建大师跑图瓦片失败,一般是什么原因?

答&#xff1a;一般是边缘瓦块失败比较多的情况会出现&#xff0c;其他一些正常瓦块失败&#xff0c;重新提交基本上也都可以解决。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0c;输入倾斜照片&#xff0c;激光点云&#xff0c;POS信息及像…

为什么我学了 6 个月 Python,还是找不到工作?

在知乎上有一个特别火的问题&#xff1a; 为什么学了Python&#xff0c;我还是找不到工作&#xff1f; 有人说Python语言不行&#xff0c;有人说中国Python根本就没公司用。在大家群嘲的背后&#xff0c;我们来分析一下&#xff1a; 为什么大家都不看好Python&#xff1f; 学…

申请注册苹果iOS企业级开发者证书需要公司拥有什么规模条件

在全球范围内&#xff0c;iOS应用市场的规模和影响力不断增长&#xff0c;企业级应用在其中扮演着重要角色。为了在苹果设备上开发和发布内部应用&#xff0c;企业需要获取苹果的iOS企业级开发者证书。文章旨在探讨企业在申请此证书时需要满足的条件、注册流程&#xff0c;以及…

车载毫米波雷达行业发展2——产业

2.1 车载毫米波雷达产业链结构 2.1.1 毫米波雷达系统结构 毫米波雷达主要包括雷达射频前端、数字信号处理器、后端算法三部分。其中&#xff0c;射频前端由天线、射频前端 MMIC 芯片构成。射频前端 MMIC 芯片和数字信号处理芯片是毫米波雷达 的两大功能性器件。此外&#xff0…

全国见!飞桨星河社区五周年,邀你共赴大模型盛宴!

自2018年对外发布以来&#xff0c;飞桨星河社区已汇集660万AI开发者。感谢大家一路见证了飞桨星河社区的成长&#xff0c; 也很荣幸飞桨星河社区陪伴了大家的AI开发旅程。 在这个大模型时代&#xff0c; 飞桨星河社区期待可以帮助开发者们实现自我价值&#xff0c; 获得更多成长…

滴滴组建大模型团队;生成式AI没有第二幕;给编程新手的4个锦囊;AI高手成长路线图(2023);Stanford CS224S 课程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f440; 滴滴组建大模型团队&#xff0c;将落地部分个人出行和企业差旅场景 https://www.36kr.com/p/2519217183041289 11月15日&#xff0c;3…

【快应用】快应用学习之兄弟组件通信

【关键词】 兄弟组件通信、Publish/Subscribe模式 【实现方案】 这里介绍利用框架本身提供的事件绑定接口来模拟Publish/Subscribe模式实现兄弟组件通信的方法。 一、实现步骤及代码 1、一个子组件定义Sub 端的逻辑处理&#xff0c;有processMessage、customEventInVm2&…

【CLion】CLion的cmake-build-release/debug位置变更

[CLion] CLion的cmake-build-debug和cmake-build-release位置变更 CLion IDE的cmake-build-release/debug位置是根目录下&#xff0c;虽然可以ignore这个文件&#xff0c;但是还是有点看起来不爽&#xff0c;按照这个方式就可以&#xff0c;干掉他&#xff0c;更改方式如下。 …

.skip() 和 .only() 的使用

.skip() 和 .only() 的使用 说明 在做自动化测试中&#xff0c;跳过执行某些测试用例&#xff0c;或只运行某些指定的测试用例&#xff0c;这种情况是很常见的Cypress中也提供了这种功能 如何跳过测试用例 通过describe.skip() 或者 context.skip() 来跳过不需要执行的测试…