get_cpu()/put_cpu()函数对

本文介绍了Linux内核中get_cpu()和put_cpu()函数的作用与使用方法。这两个宏用于禁止和启用任务抢占,确保关键代码段的执行过程中不会被其他任务打断。文章还提供了一个具体的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能:通过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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值