percpu 类、宏

RuxOS 在链接脚本中预留了 per-CPU 相关数据的内存空间,有专门的架构相关的寄存器指向对应位置,X64中使用GS_BASE,A64中使用TPIDR_EL1,Rv64中由于没有相应的专用寄存器,因此暂时使用了GP寄存器。

使用方法如下所示:

#![allow(unused)]
fn main() {
#[percpu::def_percpu]
static CPU_ID: usize = 0;

// initialize per-CPU data for 4 CPUs.
percpu::init(4);
// set the thread pointer register to the per-CPU data area 0.
percpu::set_local_thread_pointer(0);

// access the per-CPU data `CPU_ID` on the current CPU.
println!("{}", CPU_ID.read_current()); // prints "0"
CPU_ID.write_current(1);
println!("{}", CPU_ID.read_current()); // prints "1"
}

#[percpu::def_percpu] 提供了便捷的宏定义,将指定的静态变量定义为 per-CPU 数据类型。