moana_std 0.1.4

moana 用户标准库
Documentation
//! commpage(通信共享页)快速接口(零 syscall)
//!
//! 内核在每个用户地址空间创建时把 commpage 映射到固定地址(只读):全局区 [`CommGlobal`]
//! (时间 + 各核负载,内核 tick 更新)在 [`COMMPAGE_BASE`],每空间区 [`CommPerSpace`]
//! (`space_id`)在 [`COMMPAGE_PERSPACE_BASE`]。这里直接读该映射,无 syscall 开销。

use moa_cpumask::CpuId;
use moa_uapi::{
    commpage::{COMMPAGE_BASE, COMMPAGE_PERSPACE_BASE, CommGlobal, CommPerSpace},
    sched::SchedLoad,
    space::SpaceId,
    timer::ClockId,
};

fn global() -> &'static CommGlobal {
    // Safety: 内核在空间创建时已把全局区只读映射到 COMMPAGE_BASE,常驻有效。
    unsafe { &*(COMMPAGE_BASE as *const CommGlobal) }
}

fn per_space() -> &'static CommPerSpace {
    // Safety: 内核在空间创建时已把每空间区只读映射到 COMMPAGE_PERSPACE_BASE,常驻有效。
    unsafe { &*(COMMPAGE_PERSPACE_BASE as *const CommPerSpace) }
}

/// 读取当前单调时间(纳秒),从内核映射的共享时间页读取,零 syscall。
///
/// 当前实现为内核 tick 粒度更新的单调时间(设计 §17)。
pub fn clock_gettime(_clock: ClockId) -> u64 {
    // volatile:内核 tick 并发更新本字段,避免编译器缓存旧值。
    // Safety: time_ns 是已映射全局页内对齐的 u64,读取始终有效。
    unsafe { core::ptr::read_volatile(core::ptr::addr_of!(global().time_ns)) }
}

/// 返回当前地址空间 ID,从共享页读取,零 syscall。
pub fn space_self() -> SpaceId {
    per_space().spaceid
}

/// 读取指定 CPU 的运行队列负载(PELT),从共享页读取,零 syscall(设计 §29)。
pub fn sched_cpu_load(cpu: CpuId) -> SchedLoad {
    let g = global();
    let idx = cpu.raw();
    if idx < g.nr_cpus && idx < g.cpu_load.len() {
        g.cpu_load[idx]
    } else {
        SchedLoad { load_avg: 0, runnable_avg: 0, util_avg: 0 }
    }
}