1.Linux 中断( IRQ / softirq )基础:原理及内核实现
2.鸿蒙轻内核M核源码分析:中断Hwi
3.中断入口从哪个文件中可以找到
4.flv.js源码知识点(中)
5.搞懂 RTOS 需要哪些方面的和源知识储备?
6.undefined什么意思?
Linux 中断( IRQ / softirq )基础:原理及内核实现
中断(IRQ),尤其是码网软中断(softirq)的广泛用途之一是网络数据包的接收与发送,但其应用场景并非单一。络中本文将全面整理中断(IRQ)与软中断(softirq)的断和基础知识,这些内容与网络数据包处理虽无直接联系,源码但整理本文旨在更深入地理解网络数据包处理机制。网络乐丰网源码
什么是中断中断?
CPU 通过时分复用处理多任务,其中包括硬件任务,解决如磁盘读写、和源键盘输入,码网以及软件任务,络中如网络数据包处理。断和CPU 在任何时刻只能执行一个任务。源码当某个硬件或软件任务当前未被执行,网络但希望CPU立即处理时,中断会向CPU发送中断请求——希望CPU暂停手头工作,优先服务“我”。中断以事件形式通知CPU,因此常看到“在XX条件下会触发XX中断事件”的表述。
中断分为两类:
管理中断的设备:Advanced Programmable Interrupt Controller(APIC)。
硬中断的中断处理流程
中断随时发生,处理流程如下:
Maskable and non-maskable
Maskable interrupts 在x_上可以通过sti/cli指令来屏蔽(关闭)和恢复:
在屏蔽期间,这种类型的中断不会触发新的中断事件。大部分IRQ都属于这种类型。例如,网卡的收发包硬件中断。
Non-maskable interrupts 不可屏蔽,因此属于更高优先级的类型。
问题:执行速度与逻辑复杂性之间的矛盾
IRQ处理器的两个特点如下:
存在内在矛盾。
解决方式:中断的推迟处理(deferred interrupt handling)
传统解决方式是将中断处理分为两部分:
这种方式称为中断的推迟处理或延后处理。现在已是一个通用术语,涵盖各种推迟执行中断处理的方式。中断分为两部分处理:
在Linux中,有三种推迟中断(deferred interrupts):
具体细节将在后续介绍。
软中断与软中断子系统
软中断是内核子系统的一部分:
每个CPU上会初始化一个ksoftirqd内核线程,负责处理各种类型的softirq中断事件;
使用cgroup ls或ps -ef都能看到:
软中断事件的handler提前注册到softirq子系统,注册方式为open_softirq(softirq_id, handler)
例如,注册网卡收发包(RX/TX)软中断处理函数:
软中断占用了CPU的总开销:可以使用top查看,第三行倒数第二个指标是系统的软中断开销(si字段):
Linux内核源码分析学习地址:ke.qq.com/course/...
文章福利小编推荐自己的Linux内核源码分析交流群:点击加入整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!
主处理
smpboot.c类似于事件驱动的循环,会调度ksoftirqd线程执行pending的软中断。ksoftirqd内部会进一步调用到__do_softirq,
避免软中断占用过多CPU
软中断的潜在影响:推迟执行的部分(如softirq)可能会占用较长时间,在这段时间内,用户空间线程只能等待。反映在top中,追番动漫源码si占比。
不过softirq调度循环对此有所改进,通过budget机制来避免softirq占用过多CPU时间。
硬中断-软中断调用栈
softirq是一种推迟中断处理机制,将IRQ的大部分处理逻辑推迟在这里执行。有两条路径都会执行到softirq主处理逻辑__do_softirq():
1、CPU调度到ksoftirqd线程时,会执行到__do_softirq();
2、每次IRQ handler退出时:do_IRQ()->...
do_IRQ是内核中主要的IRQ处理方式。它执行结束时,会调用exiting_irq(),这会展开成irq_exit()。后者会检查是否pending有softirq,如果有,则唤醒:
进而会使CPU执行到__do_softirq。
软中断触发执行的步骤
总结,每个软中断会经过以下阶段:
以收包软中断为例,IRQ handler并不执行NAPI,只是触发它,在内部会执行到raiseNET_RX_SOFTIRQ;真正的执行在softirq,会调用网卡的poll()方法收包。IRQ handler中会调用napi_schedule(),然后启动NAPI poll()。
需要注意的是,虽然IRQ handler所做的工作很少,但处理这个包的softirq和IRQ在同一CPU上运行。这意味着,如果大量的包都放在同一个RX队列,虽然IRQ开销可能不多,但该CPU仍然会非常繁忙,都花费在softirq上。解决方式:RPS。它不会降低延迟,只是将包重新分配:RXQ->CPU。
三种推迟执行方式(softirq/tasklet/workqueue)
提到,Linux中的三种推迟中断执行方式:
其中:
前面已经看到,Linux在每个CPU上创建了一个ksoftirqd内核线程。
softirqs是在Linux内核编译时确定的,例如网络收包对应的NET_RX_SOFTIRQ软中断。因此是一种静态机制。如果想添加一种新softirq类型,需要修改并重新编译内核。
内部组织
内部由一个数组(或称为向量)管理,每个软中断号对应一个softirq handler。数组与注册:
在5.中所有类型的softirq:
也就是在cat /proc/softirqs看到的哪些。
触发(唤醒)softirq
以收包软中断为例,IRQ handler并不执行NAPI,类微博源码只是触发它,在内部会执行到raiseNET_RX_SOFTIRQ;真正的执行在softirq,会调用网卡的poll()方法收包。IRQ handler中会调用napi_schedule(),然后启动NAPI poll()。
如果对内核源码有一定了解,会发现softirq使用非常有限,原因之一是它是静态编译的,依赖内置的ksoftirqd线程来调度内置的9种softirq。如果想添加一种新功能,就得修改并重新编译内核,开发成本很高。
实际上,实现推迟执行的更常用方式是tasklet。它构建在softirq机制之上,具体来说就是使用了两种softirq:
换句话说,tasklet是在运行时(runtime)创建和初始化的softirq,
内核软中断子系统初始化了两个per-cpu变量:
tasklet再执行针对list的循环:
tasklet在内核中的使用非常广泛。不过,后面又出现了第三种方式:workqueue。
这也是一种推迟执行机制,与tasklet有些相似,但有显著不同。
使用场景
简而言之,workqueue子系统提供了一个接口,通过该接口可以创建内核线程来处理从其他地方enqueue过来的任务。这些内核线程称为worker threads,内置的per-cpu worker threads:
结构体
kworker线程调度workqueues,原理与ksoftirqd线程调度softirqs类似。然而,我们可以为workqueue创建新的线程,而softirq则不行。
参考资料引用链接
[1]
中断与中断处理:0xax.gitbooks.io/linux-...
作者:赵亚楠 原文:arthurchiao.art/blog/li...来源:云原生实验室
鸿蒙轻内核M核源码分析:中断Hwi
在鸿蒙轻内核源码分析系列中,本文将深入探讨中断模块,旨在帮助读者理解中断相关概念、鸿蒙轻内核中断模块的源代码实现。本文所涉及源码基于OpenHarmony LiteOS-M内核,读者可通过开源站点 gitee.com/openharmony/k... 获取。中断概念介绍
中断机制允许CPU在特定事件发生时暂停当前执行的任务,转而处理该事件。这些事件通常由外部设备触发,通过中断信号通知CPU。中断涉及硬件设备、中断控制器和CPU三部分:设备产生中断信号;中断控制器接收信号并发出中断请求给CPU;CPU响应中断,执行中断处理程序。中断相关的硬件介绍
硬件层面,中断源分为设备、熊猫遛娃源码中断控制器和CPU。设备产生中断信号;中断控制器接收并转发这些信号至CPU;CPU在接收到中断请求后,暂停当前任务,转而执行中断处理程序。中断相关的概念
每个中断信号都附带中断号,用于识别中断源。中断优先级根据事件的重要性和紧迫性进行划分。当设备触发中断后,CPU中断当前任务,执行中断处理程序。中断处理程序由设备特定,且通常以中断向量表中的地址作为入口点。中断向量表按中断号排序,存储中断处理程序的地址。鸿蒙轻内核中断源代码
中断相关的声明和定义
在文件 kernel\arch\arm\cortex-m7\gcc\los_interrupt.c 中定义了结构体、全局变量和内联函数。关键变量 g_intCount 记录当前正在处理的中断数量,内联函数 HalIsIntActive() 用于检查是否正在处理中断。中断向量表在中断初始化过程中设置,用于映射中断号到相应的中断处理程序。中断初始化 HalHwiInit()
系统启动时,在 kernel\src\los_init.c 中初始化中断。HalHwiInit() 函数在 kernel\arch\arm\cortex-m7\gcc\los_interrupt.c 中实现,负责设置中断向量表和优先级组,配置中断源,如系统中断和定时器中断。创建中断 HalHwiCreate()
开发者可通过 HalHwiCreate() 函数注册中断处理程序,传入中断号、优先级和中断模式。函数内部验证参数,设置中断处理程序,最终通过调用 CMSIS 函数完成中断创建。删除中断 HalHwiDelete()
中断删除操作通过 HalHwiDelete() 实现,接收中断号作为参数,调用 CMSIS 函数失能中断,设置默认中断处理程序,完成中断删除。中断处理执行入口程序
默认的中断处理程序 HalHwiDefaultHandler() 仅用于打印中断号后进行死循环。HalInterrupt() 是中断处理执行入口程序的核心,它包含中断数量计数、中断号获取、中断前后的操作以及调用中断处理程序的逻辑。开关中断
开关中断用于控制CPU是否响应外部中断。通过宏 LOS_IntLock() 关闭中断, LOS_IntRestore() 恢复中断状态, LOS_IntUnLock() 使能中断。这组宏对应汇编函数,电脑输出源码音频使用寄存器 PRIMASK 控制中断状态。小结
本文详细解析了鸿蒙轻内核中断模块的源代码,涵盖了中断概念、初始化、创建、删除以及开关操作。后续文章将带来更多深入技术分享。欢迎在 gitee.com/openharmony/k... 分享学习心得、提出问题或建议。关注、点赞、Star 和 Fork 到个人账户,便于获取更多资源。中断入口从哪个文件中可以找到
中断入口通常可以在操作系统的中断描述符表(Interrupt Descriptor Table,简称IDT)或者相应的中断处理代码中找到,但这并不直接对应于某个具体的“文件”,因为它涉及到的是底层系统架构和内核级别的实现。不过,如果我们从源代码的角度去看,中断处理的相关代码通常会在操作系统的内核源代码中找到。
详细来说,中断入口是操作系统响应硬件中断或软件异常时执行的代码的起始点。在x架构的计算机系统中,IDT是一个用于存储中断处理函数地址的数据结构,操作系统在初始化阶段会设置好这个表,并在运行时根据中断类型查找对应的处理函数。
例如,在Linux操作系统中,与中断处理相关的代码可以在内核源代码的arch/x/kernel/目录下的irq.c、apic.c等文件中找到。这些文件中定义了中断请求(IRQ)的处理流程、中断控制器的初始化等。对于软件异常,如除零错误、页面错误等,其处理代码通常位于内核源代码的其他部分,如entry.S(汇编代码文件)或traps.c等。
另外,设备驱动程序中也会包含与特定设备相关的中断处理代码。当设备产生中断时,操作系统会调用这些驱动程序中的中断处理函数。
因此,要找到中断入口的具体位置,需要查阅操作系统的内核源代码,并根据操作系统的类型、版本以及目标硬件平台的不同,在相应的文件中进行查找。同时,还需要对操作系统的中断处理机制有一定的了解,以便能够准确地定位到中断入口的代码。
flv.js源码知识点(中)
本文续接上篇,深入探讨flv.js的内部机制,特别是网速计算和数据缓存处理。在播放过程中,用户网速的稳定性对体验至关重要。flv.js通过statistics_info事件实时反馈当前网速,speed字段以KB/s为单位。计算过程巧妙地利用时间差值,确保准确反映最近一秒的数据传输速率,而非上一秒。
网速计算的关键在于addBytes方法,它通过比较当前时间和上一次计算时间的差异,来动态调整网速估计。currentKBps属性仅在durationSeconds大于0.5时使用,以减少误差。平均网速averageKBps会在网络中断或暂停时受到影响。
数据缓存处理涉及loader获取数据后至FLVDemuxer的中间环节。FLV格式数据以TAG为单位,因此需要将连续字节缓存起来,直到遇到完整的TAG。这个过程在IOController中实现,涉及ArrayBuffer的二进制缓存操作,如使用Uint8Array存储和处理数据。文章详细介绍了缓存扩展和消费的方法,以及如何根据网速动态调整缓存大小。
后续内容将涉及FLV格式的解析和位操作。请继续关注,以了解更多flv.js源码的深层次知识。
原文链接已删除,如果你对C++音视频开发感兴趣,可以搜索相关资源进行学习。
搞懂 RTOS 需要哪些方面的知识储备?
想要深入理解RTOS?首先,你需要掌握哪些关键知识?</ 如同学习驾驶前必须先掌握基础技能,理解RTOS并非一蹴而就,而是需要循序渐进。切勿急于求成,直接跳入理论深渊。就好比一位新手司机,若无驾驶基础,贸然学习修车只会事倍功半。首要步骤,是从实践出发,选择一个易于上手的平台,如μCOS-II。 建议的学习路径如下:首先,找一块已经移植了μCOS-II的微控制器,运行起来。仔细阅读示例代码,理解如何运用μCOS的基本功能,比如实现一个能控制三个不同频率闪烁的LED灯。
当对μCOS的API运用自如后,再逐步深入理论,阅读操作系统原理书籍。将抽象的概念如堆栈、上下文切换、调度器、锁、文件系统、网络、中断管理、线程和消息队列(邮件箱)等与实践相结合,尝试编写一个多任务的HTTP服务器,并用μCOS重构现有代码。
接下来,挑战自己,阅读μCOS早期版本的源代码,理解操作系统实现的核心原理。这时,操作系统原理的理论知识将为你的理解提供更坚实的基石。
当你有了初步的实战经验后,尝试将μCOS移植到新的芯片上,避免依赖搜索引擎,独立解决问题,锻炼解决问题的能力。
不要害怕改动,试着修改μCOS的原始代码,观察系统行为的变化,理解每一步改动的影响。
最后,查阅μCOS的版本演化历史,理解代码优化和设计选择背后的逻辑,这样你才能真正领悟到RTOS的精髓所在。
记住,学习RTOS是一个实践与理论相结合的过程,一步步脚踏实地,你将逐渐掌握这个强大工具的关键知识。undefined什么意思?
1、1undefined是指页面出现了未知错误的原因的2看一下页面源码,如果源码上也是undefined那就说明页面本来就是这样,如果源码的这部分是js代码,就说明js代码使用的数据有问题3提示undefined一般是在开发网站的时候定义。
2、undefined在计算机中是指没有找到或没有的意思,例如某个用户某个操作没有被获取到或者是获取错误,服务器没有找到用户操作的数据,或者数据本身表达失败,就会报undefined解决办法网页的话可以刷新试一试,客户端软件可以关闭。
3、1实际上, undefined指的是没有定义的和不明确的它一般是用来说明某一情形的不明确的理由计算机出现“undefined”错误是因为已接到“签到”指令,但是该页面的反馈程序却被打断了解决办法查看网页的原始程式码,若。
4、null与undefined null的类型是一个对象,用来表示一个变量没有任何数值,而undefined是指变量没有定义任何值在JavaScript中,关键字null表示空值的意思,它表示对象为空,或者变量没有引用任何对象如果当一个变量的值为null。
5、undefined是指页面出现了未知错误,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误,如果只是浏览网页,不必在乎,换个时间浏览网页undefined是一个特殊值,通常。
6、1undefined,一个特殊值,通常用于指示变量尚未赋值在高级程序设计语言设计应用程序时,用于指示变量尚未用单等号进行赋值常量未定义2undefined表示“未定义”,一个特殊值,通常用于指示变量尚未赋值对未定义值的。
7、1首先不管是在贴吧或者是在微博等其它签到的时候点击签到出现了undefined时,这意思就是签到了失败2把签到失败关闭,刷新网页,有的时候网络不好会出现签到失败,刷新也可以直接按F刷新后再次签到,如果还是出会现。
8、undefined是一个特殊值,通常用于指示变量尚未赋值对未定义值的引用返回特殊值其实大多数计算机语言,只有一个表示quot无quot的值,比如,C语言的NULL,Java语言的null,Python语言的None,Ruby语言的nilundefined 英 #。
9、粘贴刚复制这个贴吧的百度网址并访问一下7很顺利,画面直接弹出了“已签到”,问题解决结论问题是百度已经接收到签到命令,但是反馈到web页面过程被中断,所以我们的页面出现“undefined”错误,这是浏览器的责任。
、undefined是个计算机程序语句,一般使用于指示变量尚未赋值用于指示变量尚未用单等号进行赋值不少的朋友在浏览计算机专业论坛过程中,经常会发现undefined这个词组,究竟undefined代表着什么意思,它都有什么作用,下面让我们一起。
、“undefined”的意思是不明确的未下定义的 读音英 ##nd##fa#nd美 ##nd##fa#nd词性通常在句中用作形容词,修饰主语或宾语例句A。
、例句An undefined prefix is in use使用了未定义的前缀2undefined错误提示是我们上网,游戏,泡百度贴吧,微博,个人空间等经常碰到的问题,今天以百度贴吧为例,来简单说下undefined什么意思,是指什么,出现时怎么解决。
、未定义的例句The abstract superclass defines and may partially implement the behavior, but much of the class is undefined and unimplemented抽象的总纲而且下定义可能部份地履行行为,但是许多类别是未阐明的。
、不少的朋友在浏览计算机专业论坛过程中,经常会发现undefined这个词组,究竟undefined代表着什么意思,它都有什么作用,下面让我们一起去了解吧简要回答 undefined是个计算机程序语句,一般使用于指示变量尚未赋值用于指示变量。
、undefined 英ndfa?nd 美ndfa?ndadj 未阐明的 未限定的例句As we shall not deal with algorithmic problems, we leave the term quotefficientquot undefined因为不讨论算法问题,我们对“。
、就是未定义,如果说是Variable x is undefined,就是说变量x未定义解决嘛就是定义一个变量,名字定义成对应的变量名就可以了。
阿奇源码凌晨打不开怎么回事
阿奇源码凌晨打不开的原因可能有很多,但最常见的包括服务器维护、网络问题、系统过载等。
首先,服务器维护是常见的原因。许多网站和应用都需要定期进行维护和更新,以确保其正常运行和安全性。如果阿奇源码的服务器在凌晨时段安排了维护或更新操作,那么用户可能会在这段时间内无法访问。这种情况下,通常网站会提前发布通知,告知用户维护的时间和可能的影响。
其次,网络问题也可能是导致阿奇源码凌晨打不开的原因之一。网络不稳定或中断可能会阻止用户连接到服务器。这种问题可能是由于用户自己的网络环境造成的,也可能是由于服务器所在的网络环境出现了问题。如果是用户自己的网络问题,可以尝试重启路由器或联系网络服务提供商来解决。
此外,系统过载也可能导致阿奇源码凌晨无法访问。如果服务器在处理大量请求时超出了其处理能力,就可能出现访问延迟或无法访问的情况。这通常发生在网站或应用的高峰期,例如凌晨时段可能有很多用户同时访问阿奇源码。在这种情况下,服务器可能需要一段时间来恢复,或者网站管理员可能需要采取一些措施来优化服务器的性能。
总的来说,阿奇源码凌晨打不开可能是由于多种原因造成的。为了解决这个问题,用户可以尝试重新连接网络、等待一段时间再访问、查看网站公告或联系网站管理员寻求帮助。同时,网站管理员也应该密切关注服务器的运行状态和性能,及时采取措施来解决可能出现的问题。