Linux - 驱动开发 - RNG框架
说明
- 公司SOC上有一个新思的真随机数(TRNG)模块,Linux平台上需要提供接口给外部使用。
- 早期方式是提供一个独立的TRNG驱动,实现比较简单的,但是使用方式不open,为了加入Linux生态环境,对接linux原生的随机数框架。
硬件随机数框架(hwrng)
- 目录结构
drivers/char/hw_random/ // 框架根目录
core.c //框架核心代码
omap-rng.c // 各种类型的rng驱动
hisi-trng-v2.c
...
驱动适配
- 驱动结构体和需要实现接口定义如下:
// file: include/linux/hw_random.h
/*** struct hwrng - Hardware Random Number Generator driver* @name: Unique RNG name.* @init: Initialization callback (can be NULL).* @cleanup: Cleanup callback (can be NULL).* @data_present: Callback to determine if data is available* on the RNG. If NULL, it is assumed that* there is always data available. *OBSOLETE** @data_read: Read data from the RNG device.* Returns the number of lower random bytes in "data".* Must not be NULL. *OBSOLETE** @read: New API. drivers can fill up to max bytes of data* into the buffer. The buffer is aligned for any type* and max is a multiple of 4 and >= 32 bytes.* @priv: Private data, for use by the RNG driver.* @quality: Estimation of true entropy in RNG's bitstream* (in bits of entropy per 1024 bits of input;* valid values: 1 to 1024, or 0 for unknown).*/
struct hwrng {const char *name;int (*init)(struct hwrng *rng);void (*cleanup)(struct hwrng *rng);int (*data_present)(struct hwrng *rng, int wait);int (*data_read)(struct hwrng *rng, u32 *data);int (*read)(struct hwrng *rng, void *data, size_t max, bool wait);unsigned long priv;unsigned short quality;/* internal. */struct list_head list;struct kref ref;struct completion cleanup_done;
};
- 驱动实现需要在probe中定义一个struct hwrng对象,并按需实现相关接口,最后使用以下接口,向框架注册该驱动。
// file: include/linux/hw_random.h
/** Register a new Hardware Random Number Generator driver. */
extern int hwrng_register(struct hwrng *rng);
extern int devm_hwrng_register(struct device *dev, struct hwrng *rng);
/** Unregister a Hardware Random Number Generator driver. */
extern void hwrng_unregister(struct hwrng *rng);
extern void devm_hwrng_unregister(struct device *dve, struct hwrng *rng);
/** Feed random bits into the pool. */
extern void add_hwgenerator_randomness(const char *buffer, size_t count, size_t entropy);
- 具体实现比较简单,可以看下 hisi-trng-v2.c 实现。
- 接口说明:
- init:初始化接口,可以为NULL
- cleanup:清理接口,可以为NULL
- data_present/data_read: 获取数据接口(已过时),根据core.c rng_get_data函数可知早期使用先调用data_present做些处理确认是否可以获取随机数,可以再调用data_read获取随机数。
- read:获取数据新接口。
- 属性说明:
- name:设备名称(如果有多个,不能重复)
- priv:驱动私有数据,
- quality:返回随机数的质量评值,0表示未知;1~1024越大表示越随机。
框架核心(core.c)
- 框架module init时会创建缓存和注册misc设备节点(/dev/hwrng)。
- 设备节点(/dev/hwrng)一直存在,但是没有当前rng(current_rng)是不可用的。
hwrng注册
- 遍历rng链表(rng_list),如果rng name重复直接退出。
- 根据rng的quality值插入到的降序链表(rng_list)对应的位置。
- 若当前rng(current_rng)为空或者当前rng不为空(非用户设定),并且注册的rng quality大于当前rng,则将rng设置为current_rng, 并调用其init接口,做初始化等。
- 详细请看hwrng_register实现。
用户操作
- 用户可以通过以下文件节点,做些配置
~# ls -l /sys/devices/virtual/misc/hw_random/
total 0
-r--r--r-- 1 root root 4096 Jan 1 16:05 dev
-r--r--r-- 1 root root 4096 Jan 1 16:05 rng_available // 可选的rng,即rng list
-rw-r--r-- 1 root root 4096 Jan 1 16:05 rng_current // 当前rng设备名称,可以写入名称来选择指定rng设备
-r--r--r-- 1 root root 4096 Jan 1 16:05 rng_selected //是否由用户空间选择rng设备,1表示是
lrwxrwxrwx 1 root root 0 Jan 1 16:05 subsystem -> ../../../../class/misc
-rw-r--r-- 1 root root 4096 Jan 1 16:05 uevent
- 用户可以通过设备节点(/dev/hwrng)获取生成的随机数,如果当前rng为空,会返回错误(设备不存在)。
hwrng 初始化
- hwrng注册或者用户选择rng时,会做hwrng初始化(hwrng init),启动一个内核线程(hwrng),每隔10s读取当前hwrng生成的随机数,保存到缓存中,通过函数(add_hwgenerator_randomness)将硬件产生的随机数添加到inpu_pool熵池中,给/dev/random和/dev/urandom使用。
/dev/random和/dev/urandom
- 由于hwrng不一定可用,Linux提供了另外两个随机数发生器。
两者区别
- 熵是一种可以体现随机性的值,充当生成随机数时使用的种子,熵越随机越好,hwrng添加到inpu_pool熵池中的随机数就是给/dev/random和/dev/urandom使用,当然还有别的熵来源(如硬件噪声),这两个设备文件都使用熵池(entropy pool)来收集熵。
- /dev/random和/dev/urandom的区别主要在于它们如何收集并使用熵(entropy)。
- /dev/random 使用一个阻塞式的熵池,当熵池的熵耗尽时,它会阻塞读取操作,直到收集到足够的熵。这种行为使得 /dev/random 更适合生成高质量的随机数,如密钥、证书等。
- /dev/urandom 使用一个非阻塞式的熵池,当熵耗尽时,它不会阻塞,而是使用内部的伪随机数生成器(PRNG)继续生成随机数,这使得 /dev/urandom 在熵耗尽时仍能提供随机数,但生成的随机数可能没有 /dev/random 那么高的质量。
系统调用 getrandom()
- 默认是返回 /dev/urandom 中的 entropy。
相关文章:
Linux - 驱动开发 - RNG框架
说明 公司SOC上有一个新思的真随机数(TRNG)模块,Linux平台上需要提供接口给外部使用。早期方式是提供一个独立的TRNG驱动,实现比较简单的,但是使用方式不open,为了加入Linux生态环境,对接linux…...
qsort使用举例和qsort函数的模拟实现
qsort使用举例 qsort是C语言中的一个标准库函数,用于对数组或者其他数据结构中的元素进行排序。它的原型如下: void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); 我们可以去官网搜来看一看:…...
AttributeError: module ‘gradio‘ has no attribute ‘ClearButton‘解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
Kafka 集群如何实现数据同步?
哈喽大家好,我是咸鱼 最近这段时间比较忙,将近一周没更新文章,再不更新我那为数不多的粉丝量就要库库往下掉了 T﹏T 刚好最近在学 Kafka,于是决定写篇跟 Kafka 相关的文章(文中有不对的地方欢迎大家指出)…...
一本了解生成式人工智能
上周,发了一篇关于大语言模型图数据库技术相结合的文章,引起了很多朋友的兴趣。当然了,这项技术本身就让俺们很兴奋,比如我就是从事图研发的,当然会非常关注它在图领域的应用与相互促就啦。 纵观人类文明历史ÿ…...
git 相关指令总结(持续更新中......)
文章目录 一、git clone 相关指令1.1 clone 指定分支的代码 一、git clone 相关指令 1.1 clone 指定分支的代码 git clone -b 分支名 仓库地址...
windows 安装 Oracle Database 19c
目录 什么是 Oracle 数据库 下载 Oracle 数据库 解压文件 运行安装程序 测试连接 什么是 Oracle 数据库 Oracle数据库是由美国Oracle Corporation(甲骨文公司)开发和提供的一种关系型数据库管理系统,它是一种强大的关系型数据库管理系统…...
【数据结构】图的存储结构(邻接矩阵)
一.邻接矩阵 1.图的特点 任何两个顶点之间都可能存在边,无法通过存储位置表示这种任意的逻辑关系。 图无法采用顺序存储结构。 2.如何存储图? 将顶点与边分开存储。 3.邻接矩阵(数组表示法) 基本思想: 用一个一维数…...
kubernetes--Pod控制器详解
目录 一、Pod控制器及其功用: 二、pod控制器的多种类型: 1、ReplicaSet: 1.1 ReplicaSet主要三个组件组成: 2、Deployment: 3、DaemonSet: 4、StatefulSet: 5、Job: 6、Cronjob: …...
九、Linux用户管理
1.基本介绍 Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,让后以这个账号的身份进入系统 2.添加用户 基本语法 useradd 用户名 应用案例 案例1:添加一个用户 m…...
springboot项目中没有识别到yml文件解决办法
springboot项目中没有识别到yml文件解决办法 ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传] 1、这个意思就是没有配置数据库的数据源路径。所以需要配置数据源,比如mysql的驱动和路径。检查是否在properties或者yml文件中是否已经配置好。…...
[管理与领导-125]:一个IT人的思考:职场中、人际交往中,不要为他人的不良行为和言语买单,不要让自己的情绪被外界影响或掌控。
目录 前言: 一、是什么What 二、为什么Why? 三、怎么办How? 前言: 无论是职场中,还是人际交往中,我们的难免受到他人的影响,有积极正面的情绪影响,有消极负面的情绪影响。为什么我们自身的情绪会受到…...
【FPGA】IP核
一.IP核是什么 IP:知识产权,半导体产业中:在ASIC和FPGA中定义为预先设计好的电路功能模块。 在使用的时候其他用户可以直接调用IP核心。 二. 为什么要是有IP核 提高开发效率,减小设计和调试的时间,加速开发进程&am…...
吾爱破解置顶的“太极”,太好用了吧!
日常工作和娱乐,都需要用到不同类型的软件,哪怕软件体积不大,也必须安装,否则到用时找不到就非常麻烦了。 其实,很多软件不一定一样不剩地全部安装一遍,一方面原因是用的不多,另一方面多少有点…...
Postman接收列表、数组参数@RequestParam List<String> ids
示例如下: 接口定义如下: GetMapping(value "/queryNewMoviePath")public List<Map<String, Object>> queryNewMoviePath(RequestParam List<String> ids ) {return service.queryNewMoviePath(ids);}postman中测试如下: http://loc…...
qemu + busybox + 内核实验环境搭建(2023-11)
主要是参考网上的例子,网上的一些例子可能用的busybox 老旧,编译各种问题,以及rootfs hda的方式或者ramfs的方式。可能有些概念还是不清楚,以下是最终完成测试成功的案例。 下载kernel https://cdn.kernel.org/pub/linux/kernel…...
JavaScript管理HTMLDOM元素(增删改查)
本文主要讲解JavaScript如何通过管理HTML上的DOM元素,其中包括如何查询、创建、修改以及删除具体功能和源码讲解。 增加 首先我们准备一个HTML框架和简单CSS样式,我对其中元素作用和关系进行一个简单说明。 <!DOCTYPE html> <html><he…...
RE2文本匹配实战
引言 今天我们来实现RE2进行文本匹配,模型实现参考了官方代码https://github.com/alibaba-edu/simple-effective-text-matching-pytorch。 模型实现 RE2模型架构如上图所示。它的输入是两个文本片段,所有组件参数除了预测层和对齐层外都是共享的。上图…...
实在智能携手中国电信翼支付,全球首款Agent智能体亮相2023数字科技生态大会
11月10日-13日,中国电信与广东省人民政府联合主办的“2023数字科技生态大会”在广州隆重举行。本届大会以“数字科技焕新启航”为主题,邀请众多生态合作伙伴全方位展示数字科技新成果,包括数字新消费、产业数字化、智能电子、人工智能大模型等…...
安全框架springSecurity+Jwt+Vue-1(vue环境搭建、动态路由、动态标签页)
一、安装vue环境,并新建Vue项目 ①:安装node.js 官网(https://nodejs.org/zh-cn/) 2.安装完成之后检查下版本信息: ②:创建vue项目 1.接下来,我们安装vue的环境 # 安装淘宝npm npm install -g cnpm --registryhttps:/…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
