get_cpu()/put_cpu()函数对

功能:通过get_cpu()/put_cpu()函数禁止/启用任务的抢占,获取cpu id

kernel中的解释
/*
* Even if we don’t have any preemption, we need preempt disable/enable
* to be barriers, so that we don’t have things like get_user/put_user
* that can cause faults and scheduling migrate into our preempt-protected
* region.
*/
即使当前没有任何的抢占,我们也需要对抢占进行disable/enable,这样的话就不会向get_user/put_user那样导致错误迁移进我们对抢占进行保护的区域。

1.get_cpu() :禁止任务抢占

#define get_cpu() ({ preempt_disable(); smp_processor_id(); })
#define smp_processor_id() raw_smp_processor_id()

2.put_cpu() : 启用任务抢占

#define put_cpu() preempt_enable()

例子:

get_cpu();
on_each_cpu(setup_broadcast_timer, (void *)true, 1);
put_cpu();
#define on_each_cpu(func,info,retry,wait)   ({   local_irq_disable();   func(info);   local_irq_enable();   0;   })
static void setup_broadcast_timer(void *arg)
{
        unsigned long reason = (unsigned long)arg;
        int cpu = raw_smp_processor_id();

        reason = reason ?
                CLOCK_EVT_NOTIFY_BROADCAST_ON : CLOCK_EVT_NOTIFY_BROADCAST_OFF;

        clockevents_notify(reason, &cpu);
}
`DEFINE_PER_CPU_SHARED_ALIGNED()` 是 Linux 内核中用于定义一个共享的、对齐的 per-CPU 变量的宏。在多核系统中,每个 CPU 都有自己的寄存器和缓存,这些资源可以用于存储一些与 CPU 相关的变量,以便提高访问速度和并发性。`per-CPU` 变量就是一种特殊的变量类型,它可以让每个 CPU 都拥有独立的变量副本,并且可以通过一些特殊的函数接口进行访问。这样,就可以避免多个 CPU 访问同一个变量时的竞争和同步问题。 `DEFINE_PER_CPU_SHARED_ALIGNED()` 宏用于定义一个共享的、对齐的 per-CPU 变量。它包含三个参数: - `type`:变量的数据类型。 - `name`:变量的名称,可以是任意合法的 C 语言标识符。 - `align`:变量需要对齐的字节数。通常使用 `sizeof(type)` 来作为对齐字节数。 宏的具体实现比较复杂,它会使用一些内核中的数据结构和机制来实现 per-CPU 变量的定义和访问。具体来说,它会定义一个 `__typeof__(type)` 类型的指针数组,数组的大小等于 CPU 的个数。然后,它会使用 `__aligned__(align)` 宏来对数组进行对齐,以保证每个变量副本都被正确地对齐。最后,宏会定义一个访问变量的宏,以便在内核代码中使用。 使用 `DEFINE_PER_CPU_SHARED_ALIGNED()` 宏定义的 per-CPU 变量可以通过一些特殊的函数接口进行访问,如 `get_cpu_var()`、`put_cpu_var()` 和 `this_cpu_ptr()` 等等。这些函数会根据当前 CPU 的编号来选择相应的变量副本,并返回对应的指针。这样,每个 CPU 都可以独立地访问自己的变量副本,而不会产生竞争和同步问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值