关于在Linux内核中使用不同延迟/休眠机制 【ChatGPT】

简介: 关于在Linux内核中使用不同延迟/休眠机制 【ChatGPT】

这篇文档提供了关于在Linux内核中使用不同延迟/休眠机制的信息,主要面向需要处理硬件延迟但对Linux内核内部工作机制不够熟悉的驱动程序编写人员。

插入延迟

首先需要问自己的问题是:“我的代码是否处于原子上下文中?”接着紧随其后的问题是:“它真的需要在原子上下文中延迟吗?”如果需要的话...

原子上下文:

  • 必须使用*delay函数族。这些函数使用jiffie估计的时钟速度,并将忙等待足够的循环周期以实现所需的延迟:
  • ndelay(unsigned long nsecs)
  • udelay(unsigned long usecs)
  • mdelay(unsigned long msecs)
  • 通常首选udelay API;在许多非PC设备上可能实际上不存在ndelay级别的精度。
  • mdelay是udelay的宏包装器,用于处理向udelay传递大参数时可能发生的溢出。一般来说,不建议使用mdelay,应重新设计代码以允许使用msleep。

非原子上下文:

  • 应该使用*sleep[_range]函数族。这里有更多的选项,虽然它们中的任何一个都可能正常工作,但使用“正确”的休眠函数将有助于调度程序、电源管理,并使您的驱动程序更好 😃
  • 由忙等待循环支持:
  • udelay(unsigned long usecs)
  • 由高精度定时器(hrtimers)支持:
  • usleep_range(unsigned long min, unsigned long max)
  • 由jiffies / legacy_timers支持:
  • msleep(unsigned long msecs)
  • msleep_interruptible(unsigned long msecs)

与*delay函数族不同,驱动每个调用的底层机制都不同,因此您应该了解其中的一些特殊情况。

休眠“几”微秒(< ~10us?):

  • 使用udelay
  • 为什么不使用usleep?
  • 在较慢的系统上(嵌入式系统,或者可能是速度递减的PC!),为usleep设置高精度定时器的开销可能不值得。这样的评估显然取决于您的具体情况,但这是需要注意的事项。

休眠~微秒或小毫秒(10us - 20ms):

  • 使用usleep_range
  • 为什么不使用msleep(1ms - 20ms)?
  • 在这里有原始解释:链接
  • msleep(120)可能不会产生调用者期望的效果,并且通常会休眠更长时间(对于120ms范围内给定的任何值,实际休眠时间可能约为20ms)。在许多情况下,这不是期望的行为。
  • 为什么没有“usleep” / 什么是一个好的范围?
  • 由于usleep_range是建立在高精度定时器之上的,唤醒将非常精确(大致如此),因此简单的usleep函数可能会引入大量不需要的中断。
  • 通过引入一个范围,调度程序可以自由地将您的唤醒与可能由于其他原因发生的任何其他唤醒合并,或者在最坏的情况下,为您的上限触发中断。
  • 您提供的范围越大,您不触发中断的机会就越大;这应该与您的特定代码路径的延迟/性能的可接受上限相平衡。这里的确切容忍度非常具体,因此由调用者确定一个合理的范围。

休眠更长的毫秒数(10ms+)

  • 使用msleep或可能是msleep_interruptible
  • 有什么区别?
  • msleep将当前任务设置为TASK_UNINTERRUPTIBLE,而msleep_interruptible在调度休眠之前将当前任务设置为TASK_INTERRUPTIBLE。简而言之,区别在于休眠是否可以被信号提前结束。一般来说,除非您知道需要可中断的变体,否则只需使用msleep。

灵活的休眠(任意延迟,不可中断)

  • 使用fsleep

以上是关于在Linux内核中使用不同延迟/休眠机制的详细信息。

相关文章
|
8月前
|
安全 网络协议 Linux
深入理解Linux内核模块:加载机制、参数传递与实战开发
本文深入解析了Linux内核模块的加载机制、参数传递方式及实战开发技巧。内容涵盖模块基础概念、加载与卸载流程、生命周期管理、参数配置方法,并通过“Hello World”模块和字符设备驱动实例,带领读者逐步掌握模块开发技能。同时,介绍了调试手段、常见问题排查、开发规范及高级特性,如内核线程、模块间通信与性能优化策略。适合希望深入理解Linux内核机制、提升系统编程能力的技术人员阅读与实践。
727 1
|
8月前
|
Ubuntu Linux
Ubuntu 23.04 用上 Linux 6.2 内核,预计下放到 22.04 LTS 版本
Linux 6.2 带来了多项内容更新,修复了 AMD 锐龙处理器设备在启用 fTPM 后的运行卡顿问题,还增强了文件系统。
|
8月前
|
Ubuntu Linux
Ubuntu 23.10 现在由Linux内核6.3提供支持
如果你想在你的个人电脑上测试一下Ubuntu 23.10的最新开发快照,你可以从官方下载服务器下载最新的每日构建ISO。然而,请记住,这是一个预发布版本,所以不要在生产机器上使用或安装它。
|
8月前
|
监控 Ubuntu Linux
什么Linux,Linux内核及Linux操作系统
上面只是简单的介绍了一下Linux操作系统的几个核心组件,其实Linux的整体架构要复杂的多。单纯从Linux内核的角度,它要管理CPU、内存、网卡、硬盘和输入输出等设备,因此内核本身分为进程调度,内存管理,虚拟文件系统,网络接口等4个核心子系统。
880 0
|
8月前
|
Web App开发 缓存 Rust
|
8月前
|
Ubuntu 安全 Linux
Ubuntu 发行版更新 Linux 内核,修复 17 个安全漏洞
本地攻击者可以利用上述漏洞,攻击 Ubuntu 22.10、Ubuntu 22.04、Ubuntu 20.04 LTS 发行版,导致拒绝服务(系统崩溃)或执行任意代码。
|
7月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
792 1
二、Linux文本处理与文件操作核心命令
|
7月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
461 137
|
7月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1237 58