首先贴一段代码吧:
E:\整理分类\源码\linux-5.14.14\arch\arm64\kernel\process.c
/*
* Thread switching.
*/
__notrace_funcgraph struct task_struct *__switch_to(struct task_struct *prev,
struct task_struct *next)
{
struct task_struct *last;
fpsimd_thread_switch(next); /* 切换浮点寄存器 */
tls_thread_switch(next); /* 切换线程本地存储相关寄存器 */
hw_breakpoint_thread_switch(next); /* 切换调试寄存器 */
contextidr_thread_switch(next); /* 上下文标识符寄存器设置为下一个进程的进程号 */
entry_task_switch(next);
ssbs_thread_switch(next);
erratum_1418040_thread_switch(prev, next);
ptrauth_thread_switch_user(next);
compat_thread_switch(next);
/*
* Complete any pending TLB or cache maintenance on this CPU in case
* the thread migrates to a different CPU.
* This full barrier is also required by the membarrier system
* call.
*/
dsb(ish); /* 数据同步屏障,确保屏障前面的缓存维护操作和页表缓存维护操作执行完 */
/*
* MTE thread switching must happen after the DSB above to ensure that
* any asynchronous tag check faults have been logged in the TFSR*_EL1
* registers.
*/
mte_thread_switch(next);
/* avoid expensive SCTLR_EL1 accesses if no change */
if (prev->thread.sctlr_user != next->thread.sctlr_user)
update_sctlr_el1(next->thread.sctlr_user);
/* the actual thread switch */
last = cpu_switch_to(prev, next); /* 切换同用寄存器 */
return last;
}
#define dsb(opt) asm volatile("dsb " #opt : : : "memory")
主要看这个数据同步屏障
看这个关键字 volatile
D:\Program Files\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\xkeycheck.h
#if defined(volatile)
#define volatile EMIT WARNING C4005
#error The C++ Standard Library forbids macroizing the keyword "volatile". \
Enable warning C4005 to find the forbidden define.
#endif // volatile
禁止编译器优化,指令按需执行,去gcc里面看看编译器优化:
我先研究下。。。