当前位置: 首页 > news >正文

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 实现。
  • 接口说明:
  1. init:初始化接口,可以为NULL
  2. cleanup:清理接口,可以为NULL
  3. data_present/data_read: 获取数据接口(已过时),根据core.c rng_get_data函数可知早期使用先调用data_present做些处理确认是否可以获取随机数,可以再调用data_read获取随机数。
  4. read:获取数据新接口。
  • 属性说明:
  1. name:设备名称(如果有多个,不能重复)
  2. priv:驱动私有数据,
  3. quality:返回随机数的质量评值,0表示未知;1~1024越大表示越随机。

框架核心(core.c)

  • 框架module init时会创建缓存和注册misc设备节点(/dev/hwrng)。
  • 设备节点(/dev/hwrng)一直存在,但是没有当前rng(current_rng)是不可用的。

hwrng注册

  1. 遍历rng链表(rng_list),如果rng name重复直接退出。
  2. 根据rng的quality值插入到的降序链表(rng_list)对应的位置。
  3. 若当前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 相关的文章(文中有不对的地方欢迎大家指出)…...

一本了解生成式人工智能

上周,发了一篇关于大语言模型图数据库技术相结合的文章,引起了很多朋友的兴趣。当然了,这项技术本身就让俺们很兴奋,比如我就是从事图研发的,当然会非常关注它在图领域的应用与相互促就啦。 纵观人类文明历史&#xff…...

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中测试如下&#xff1a; http://loc…...

qemu + busybox + 内核实验环境搭建(2023-11)

主要是参考网上的例子&#xff0c;网上的一些例子可能用的busybox 老旧&#xff0c;编译各种问题&#xff0c;以及rootfs hda的方式或者ramfs的方式。可能有些概念还是不清楚&#xff0c;以下是最终完成测试成功的案例。 下载kernel https://cdn.kernel.org/pub/linux/kernel…...

JavaScript管理HTMLDOM元素(增删改查)

本文主要讲解JavaScript如何通过管理HTML上的DOM元素&#xff0c;其中包括如何查询、创建、修改以及删除具体功能和源码讲解。 增加 首先我们准备一个HTML框架和简单CSS样式&#xff0c;我对其中元素作用和关系进行一个简单说明。 <!DOCTYPE html> <html><he…...

RE2文本匹配实战

引言 今天我们来实现RE2进行文本匹配&#xff0c;模型实现参考了官方代码https://github.com/alibaba-edu/simple-effective-text-matching-pytorch。 模型实现 RE2模型架构如上图所示。它的输入是两个文本片段&#xff0c;所有组件参数除了预测层和对齐层外都是共享的。上图…...

实在智能携手中国电信翼支付,全球首款Agent智能体亮相2023数字科技生态大会

11月10日-13日&#xff0c;中国电信与广东省人民政府联合主办的“2023数字科技生态大会”在广州隆重举行。本届大会以“数字科技焕新启航”为主题&#xff0c;邀请众多生态合作伙伴全方位展示数字科技新成果&#xff0c;包括数字新消费、产业数字化、智能电子、人工智能大模型等…...

安全框架springSecurity+Jwt+Vue-1(vue环境搭建、动态路由、动态标签页)

一、安装vue环境&#xff0c;并新建Vue项目 ①&#xff1a;安装node.js 官网(https://nodejs.org/zh-cn/) 2.安装完成之后检查下版本信息&#xff1a; ②&#xff1a;创建vue项目 1.接下来&#xff0c;我们安装vue的环境 # 安装淘宝npm npm install -g cnpm --registryhttps:/…...

Qt Windows自定义GUI界面自动化测试——uiautomatio通过树节点属性定位控件

Qt Windows自定义GUI界面自动化测试 提示&#xff1a;点击链接跳转其他相关文章 Windows自定义GUI界面自动化测试框架选择 autoit uiautomatio基本使用 uiautomatio通过树节点属性定位控件 uiautomatio通过树节点属性定位控件Qt Windows自定义GUI界面自动化测试前言一、实现方式…...

yaml-cpp终极内存优化指南:5个提升缓存命中率的实现技巧

yaml-cpp终极内存优化指南&#xff1a;5个提升缓存命中率的实现技巧 【免费下载链接】yaml-cpp A YAML parser and emitter in C 项目地址: https://gitcode.com/gh_mirrors/ya/yaml-cpp yaml-cpp是一个高性能的C YAML解析器和发射器&#xff0c;完全遵循YAML 1.2规范。…...

零root权限+40%成本下降!OpenClaw Podman容器化部署全攻略,AWS Graviton+ECR打造AI Agent生产环境

本文已收录于《OpenClaw 实战指南》专栏&#xff0c;所有方案均经过AWS生产环境反复验证&#xff0c;覆盖从环境初始化到高可用集群部署全流程&#xff0c;附可直接复制的标准化部署脚本、Dockerfile模板、IAM权限配置与高频踩坑解决方案&#xff0c;适合AI Agent开发者、DevOp…...

LLM 怎么生成回答?揭秘“思考“过程

系列&#xff1a;大语言模型原理科普&#xff08;5 篇&#xff09; 本篇&#xff1a;第 3 篇 难度&#xff1a;⭐⭐ 零基础 浅显技术 字数&#xff1a;约 9500 字 阅读时间&#xff1a;20 分钟&#x1f4d6; 开篇&#xff1a;你输入问题后&#xff0c;发生了什么&#xff1f; …...

炉石传说脚本终极指南:3小时变8分钟的智能游戏体验

炉石传说脚本终极指南&#xff1a;3小时变8分钟的智能游戏体验 【免费下载链接】Hearthstone-Script Hearthstone script&#xff08;炉石传说脚本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 还在为炉石传说每日任务耗费大量时间而烦…...

Ostrakon-VL-8B赋能微信小程序:开发餐饮AI点餐助手

Ostrakon-VL-8B赋能微信小程序&#xff1a;开发餐饮AI点餐助手 你有没有过这样的经历&#xff1f;走进一家新餐厅&#xff0c;面对琳琅满目的菜单&#xff0c;却不知道哪道菜合自己口味&#xff0c;或者担心食材里有自己过敏的东西。又或者&#xff0c;正在控制饮食的你&#…...

BilibiliDown终极指南:3个专业技巧实现B站视频高效下载与无损音频提取

BilibiliDown终极指南&#xff1a;3个专业技巧实现B站视频高效下载与无损音频提取 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.c…...

MinIO权限配置踩坑实录:从‘策略不生效’到‘安全加固’的完整排错指南

MinIO权限配置实战&#xff1a;从策略失效到精细化管控的深度解析 那天下午&#xff0c;运维团队突然收到业务部门的紧急反馈——用户A无法从指定存储桶下载关键报表文件。这个看似简单的权限问题&#xff0c;却让我们团队花了整整三个小时排查。本文将还原这次故障排查的全过程…...

哥伦比亚AI中心四项教师研究奖

机器学习 哥伦比亚人工智能技术中心宣布四项新教师研究奖 第三轮年度奖项表彰探索人工智能领域一系列挑战的创新研究。 作者&#xff1a;Staff writer 2023年7月25日 4分钟阅读 哥伦比亚工程学院与某机构宣布了哥伦比亚人工智能技术中心&#xff08;CAIT&#xff09;的四项…...

@Value赋值踩的坑

Spring Boot 配置文件中的科学计数法陷阱 ⚠️ 警惕&#xff1a;YAML 配置中的字符串被误解析为数字的问题 &#x1f4cb; 问题场景 1. 配置文件示例 # 测试环境配置 ✅ xunfei:appid: 0e1d789dapisecret: NzE5ZmExxxxxxxTFkNmY1ZWJjZTA1apikey: d228r7t8xxxxxxxc0bebb17e377…...