【每CPU变量】

本文探讨了DVFS驱动中的一个重要概念:无锁计数器在网络子系统中的应用。通过将计数器放置于每CPU变量中,实现了在更新计数器时无需加锁和处理缓存的目的。

在接触dvfs驱动的时候时长涉及这一概念:


最显著的是在网络子系统中,将计数器放到每CPU-变量中,更新计数器的时候无须上锁和处理缓存。

在Linux内核中,`errno` 是用于表示系统调用或库函数执行失败时的错误代码。虽然 `errno` 本身是一个全局变量,但在多处理器(SMP)系统中,为了提高性能和减少锁竞争,某些与 CPU 相关的状态信息会被存储为 **每CPU变量**(per-CPU variables)。然而,`errno` 并不是一个 per-CPU 变量。 Linux 内核通过 `<asm/errno.h>` 和 `<linux/err.h>` 等头文件定义了标准的错误码,并确保它们可以在不同架构下统一使用。每个错误码都有一个宏定义,例如: - `EAGAIN` (Resource temporarily unavailable) - `ENOMEM` (Cannot allocate memory) - `EFAULT` (Bad address) - `EINVAL` (Invalid argument) 这些错误码是全局共享的整数值,并不绑定到特定的 CPU 上[^1]。因此,在 Linux 内核中并不存在所谓的 "per-cpu errno definitions" 的概念。 尽管如此,Linux 内核确实存在一些 per-CPU 变量用于调度、中断处理等底层机制,比如 `this_rq()` 获取当前 CPU 的运行队列,或者 `nr_running` 和 `nr_uninterruptible` 被用于计算系统负载(load average)中的活跃进程数[^1]。但这些与 `errno` 没有直接关系。 ### 错误码的获取与设置 在用户空间程序中,`errno` 是线程局部变量(Thread-local storage),这意味着每个线程拥有自己的 `errno` 值。而在内核空间中,错误码通常通过函数返回值传递给用户空间,例如系统调用返回 `-EFAULT` 来表示地址无效错误。 例如,在内核模块中,可以通过如下方式返回错误码: ```c #include <linux/errno.h> static ssize_t my_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { if (!buf || !count) return -EFAULT; // 返回错误码 ... } ``` 上述方式将错误码以负值形式返回,用户空间可通过 `strerror(errno)` 或 `perror()` 函数将其转换为可读字符串。 ### 小结 Linux 内核中并没有专门针对每个 CPU 定义不同的 `errno` 值。所有错误码都是全局定义的标准常量,用于描述系统调用或内核操作的失败原因。虽然内核广泛使用 per-CPU 变量来优化性能,如 `nr_running` 和 `nr_uninterruptible` 用于系统负载计算,但这与 `errno` 的定义和使用机制无关。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值