【Linux】内核线程创建 kthread_run 函数和内核中断

news2024/11/22 13:48:26

kthread_run函数详解

以PCIE的热插拔内核线程创建为例说明
注意:内核线程和RTOS的线程略有不同,这里Linux上创建以后直接运行,RTOS上有的是需要加入到调度队列中后才会执行,比如RT-Thread的系统
在这里插入图片描述

kthread_run 是 Linux 内核中的一个函数,用于创建和运行内核线程(Kernel Thread)。

在 Linux 内核中,线程是一种轻量级的执行单位,可以独立运行并共享进程资源。与用户空间线程(User Space Thread)不同,内核线程运行在内核态,具有更高的特权级别和更广泛的系统资源访问权限。

kthread_run 函数的作用是创建一个新的内核线程,并自动将其添加到内核线程调度器中进行调度。它接受两个参数:threadfn 和 data。

threadfn 是一个函数指针,表示要在新线程中执行的函数。这个函数应该没有任何参数,并且返回类型为 int。通常,开发者会在 threadfn 函数中编写新线程需要执行的代码逻辑。

data 是一个指针,表示传递给 threadfn 函数的参数。开发者可以使用 data 参数来传递自定义的数据结构或其他信息给新线程。

kthread_run 函数会创建一个新的内核线程,并将指定的 threadfn 函数作为新线程的入口点。然后,新线程会开始执行 threadfn 函数中的代码。开发者可以在 threadfn 中编写自定义的逻辑,例如执行某些任务、处理中断、驱动硬件等。

kthread_run 是用于创建并运行内核线程的一个函数,它接受一个函数指针作为线程的入口,并可以传递参数给线程函数。通过使用 kthread_run,开发者可以在 Linux 内核中创建和管理自己的线程,实现各种类型的异步任务处理和并发操作。

schedule_timeout_idle 空闲状态下执行超时调度函数

作用

通常情况下,当一个任务调用 schedule_timeout 函数进行休眠时,它将被视为负载贡献者,即会对系统的负载平均值(load average)产生影响。然而,有些特定的任务可能希望在休眠期间不被计算为系统负载的一部分;

/*
 * Like schedule_timeout_uninterruptible(), except this task will not contribute
 * to load average.
 */
signed long __sched schedule_timeout_idle(signed long timeout)
{
	__set_current_state(TASK_IDLE);
	return schedule_timeout(timeout);
}

schedule_timeout_idle 函数中,首先调用 __set_current_state 函数将当前任务的状态设置为 TASK_IDLE,表示该任务处于空闲状态。然后,通过调用 schedule_timeout 函数,在指定的超时时间内进行休眠。

schedule_timeout 函数会将当前任务挂起,并根据指定的超时时间(以嘀嗒数为单位)来决定任务何时被唤醒。当超时时间到达或者有其他引起任务唤醒的事件发生时,被挂起的任务将被重新调度执行。

schedule_timeout_idle 函数是一个特殊的休眠函数,它将当前任务的状态设置为 TASK_IDLE,使得任务在休眠期间不会被计算为系统负载的一部分。然后,它与标准的 schedule_timeout 函数一起使用,实现在指定超时时间内进行休眠并重新调度的功能。

request_threaded_irq 请求线程中断

用于请求一个带有线程化处理的中断

在这里插入图片描述

 */
int request_threaded_irq(unsigned int irq, irq_handler_t handler,
			 irq_handler_t thread_fn, unsigned long irqflags,
			 const char *devname, void *dev_id)
{

参数说明如下:

irq:要请求的中断号。 handler:指向顶半部(top half)中断处理程序的函数指针。当中断被触发时,由内核调用此处理程序来进行快速的中断处理操作。
thread_fn:指向底半部(bottom half)中断处理程序的函数指针。当中断被触发时,内核将创建一个内核线程,并调度执行该处理程序。这个线程会在中断上下文之外运行,可以执行一些较长或需要睡眠的处理操作。
irqflags:中断标志,用于指定中断请求的属性和行为。可以使用预定义的中断标志宏来设置。
devname:设备名称,用于标识请求中断的设备。 dev_id:设备ID,将传递给中断处理程序的参数。
request_threaded_irq 函数用于请求一个带有线程化处理的中断,并将中断处理函数 handler 和底半部处理函数
thread_fn分别关联到该中断上。这样,在中断触发时,首先会调用顶半部处理程序进行快速的中断响应,然后内核会创建一个内核线程,并调度执行底半部处理程序,以完成较长或需要睡眠的处理操作。

这种线程化中断处理机制可以提高中断处理的实时性和可伸缩性,使得中断处理函数能够更灵活地执行复杂的操作而不阻塞其他重要任务的执行。

共享中断的限制和注意事项

在这里插入图片描述

1、 共享中断需要传递一个真正的设备ID(dev-ID)作为参数。如果没有提供真实的设备ID,后续将难以确定哪个中断对应于哪个设备,可能会导致中断释放逻辑等出现问题。

2、 禁用自动使能(auto enable)与共享中断不兼容。在禁用状态下,共享中断可能会请求启用,然后永远等待中断的到来,从而导致问题。

3、 IRQF_COND_SUSPEND 只有在共享中断时才有意义,并且不能与 IRQF_NO_SUSPEND 同时设置。IRQF_COND_SUSPEND 是用于中断在挂起(suspend)期间的条件处理,它表示仅当某些条件满足时,中断才会被挂起。而 IRQF_NO_SUSPEND 表示中断不会挂起。

以上注释说明了共享中断的一些限制和使用注意事项。要确保共享中断的正确性和可靠性,需要满足这些要求。

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

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

相关文章

人类与机器的分类不同

分类能力也是智能的重要标识之一。通过分类,我们可以将事物或概念进行归类和组织,从而更好地理解和处理信息。分类在人类认知和智能发展中起到了重要的作用,它有助于我们对世界进行认知、记忆、推理和决策。在机器智能领域,分类同…

企业服务器器中了360后缀勒索病毒怎么解决,勒索病毒解密数据恢复

随着网络威胁的增加,企业服务器成为黑客攻击的目标之一。近期,上海某知名律师事务所的数据库遭到了360后缀的勒索病毒攻击,导致企业服务器内的数据库被360后缀勒索病毒加密。许多重要的数据被锁定无法正常读取,严重影响了企业的正…

基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(2)----驱动STSPIN220

基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220----2.驱动STSPIN220 套件概述样品申请STSPIN220描述STSPIN220所有功能基础配置REF电流配置细分配置IO配置定时器配置初始化mode 套件概述 本文档的目标是提供关于使用STM32CubeMX驱动低压步进电机驱动器STSPIN220的详尽信息…

vue2中使用mock数据发送请求

1.安装 npm i mockjs1.1 2.准备json数据 说明:mock数据需要的图片放置到public文件夹中(原封不动的打包到dist文件夹) [{"id": "1","imgUrl": "/images/banner1.jpg"},{"id": "2&qu…

每天一道leetcode: 57.和为s的两个数字

今日份题目: 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。 示例1 输入:nums [2,7,11,15], target 9 输出:[2,7] 或者 …

一文带你快速了解【在树莓派上搭建web网站---并在外网可访问】

文章目录 概述使用 Raspberry Pi Imager 安装 Raspberry Pi OS测试 web 站点安装静态样例站点 将web站点发布到公网安装 Cpolarcpolar进行token认证生成cpolar随机域名网址生成cpolar二级子域名将参数保存到cpolar配置文件中测试修改后配置文件配置cpolar服务开机自启动 概述 …

Gson 添加数据默认值问题记录

问题:在用Gson add(key(string类型),value(必须是JsonElement子类))时发现,value 传了 "" 空字符串(非null),默认解析后返回null&#…

机器学习笔记 - 关于GPT-4的一些问题清单

一、简述 据报道,GPT-4 的系统由八个模型组成,每个模型都有 2200 亿个参数。GPT-4 的参数总数估计约为 1.76 万亿个。 近年来,得益于 GPT-4 等高级语言模型的发展,自然语言处理(NLP) 取得了长足的进步。凭借其前所未有的规模和能力,GPT-4为语言 AI​​设立了新标准,并为机…

11. 使用tomcat中碰到的一些问题

文章目录 问题一:Tomcat的startup.bat启动后出现乱码问题二:一闪而退之端口占用问题三:非端口问题的一闪而退问题四:服务器的乱码和跨域问题问题五: 在tomcat\webapps\下创建文件夹为什么tomcat重启就会丢失问题六:Tom…

18 | 基于DDD的微服务设计实例

为了更好地理解 DDD 的设计流程,这篇文章会用一个项目来带你了解 DDD 的战略设计和战术设计,走一遍从领域建模到微服务设计的全过程,一起掌握 DDD 的主要设计流程和关键点。 项目基本信息 项目的目标是实现在线请假和考勤管理。功能描述如下…

适配器模式(C++)

定义 将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 应用场景 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象 ”放在新的环境中应用,但是新环境要求…

Codeforces Round 890 (Div. 2) D. More Wrong(交互题 贪心/启发式 补写法)

题目 t(t<100)组样例&#xff0c;长为n(n<2000)的序列 交互题&#xff0c;每次你可以询问一个区间[l,r]的逆序对数&#xff0c;代价是 要在的代价内问出最大元素的位置&#xff0c;输出其位置 思路来源 neal Codeforces Round 890 (Div. 2) supported by Constructo…

python:isdigit()、isalpha()、isalnum() 三个函数的区别和注意点

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 一、isdigit() python关于 isdigit() 内置函数的官方定义&#xff1a; S.isdigit() -> bool Return True if all characters in S are digitsand there is at least one character in S, False otherwise.翻…

文心一言 VS 讯飞星火 VS chatgpt (72)-- 算法导论7.1 3题

三、请简要地证明:在规模为 n 的子数组上&#xff0c;PARTITION 的时间复杂度为 Θ(n)。 文心一言&#xff1a; 首先&#xff0c;我们需要明确PARTITION函数的具体定义。PARTITION函数通常用于快速排序算法中&#xff0c;它将一个数组分为两个子数组&#xff0c;使得一个子数…

【TypeScript】交叉类型联合类型(四)

【TypeScript】交叉类型&联合类型&#xff08;四&#xff09; 【TypeScript】交叉类型&联合类型&#xff08;四&#xff09;一、简介二、交叉类型2.1 交叉类型使用的注意点2.2 基本数据类型交叉2.3 对象类型交叉 三、联合类型四、类型缩减 一、简介 TypeScript 中的交…

【二】SPI IP核的使用

【一】SPI IP核使用&#xff1a;传送门 基于qsys通过spi外部总线协议对sd卡进行读写操作 一、实验平台与实验的目的&#xff1a; ​ 正点原子开拓者、芯片型号&#xff1a;EP4CE10F17C8&#xff1b;还需要一张sd卡。 ​ 该实验主要是利用SPI IP核驱动SD卡来实现读写实验&am…

主成分分析学习笔记

概述 主成分分析&#xff08;Principal Component Analysis&#xff09;是一种常见的数据分析方式&#xff0c;常用于高维数据的降维&#xff0c;提取数据的主要特征分量&#xff0c;其数学推导可以从最大可分性和最近重构性两个角度着手&#xff0c;前者的优化条件为划分后方…

MySQL-NoSQL整体笔记---持续输出中

MySQL部分 一、搭建 MySQL 数据库服务器 1、下载并上传glibc版本的Mysql 2、新建用户以安全方式运行进程 [roottemplate ~]# groupadd -r -g 306 mysql [roottemplate ~]# useradd -g 306 -r -u 306 mysql3、安装并初始化mysql [roottemplate ~]# tar xf mysql-5.7.36-linu…

【Azure Developer】使用 Microsoft Graph API 获取 AAD User 操作示例

问题解答 使用Microsoft Graph API&#xff0c;演示如何获取AAD User信息&#xff0c;因参考文档是针对Global Azure&#xff0c;所以文档种的URL为&#xff1a; // Global Azure Microsoft Graph API Host GET https://graph.microsoft.com/v1.0/me 需要修改为 // 中国区A…

iperf 安装与使用

iperf命令是一个网络性能测试工具&#xff0c;可以测试TCP和UDP带宽质量。同时也可以通过UDP测试报告网丢包率或者发包性能&#xff0c;是一个非常实用的工具 1.windwos安装 可以直接通过官网下载对应系统版本进行安装&#xff08;https://iperf.fr/iperf-download.php&#…