#cpu-permission #cpu-privilege #ring-layer #ring-level

no-std privilege_level

快速简单地获取CPU当前权限级别

2个版本

0.1.1 2021年9月24日
0.1.0 2021年9月24日

#683 in 嵌入式开发

MIT许可证

18KB
105

privilege_level

这个crate是一个快速简单的工具,用于获取CPU的当前权限级别。这个工具的主要用途可能是在内核中,你可能需要知道你的权限级别以便根据权限级别执行不同的操作。

支持的架构

定义了一个简单通用的API,允许你获取任何架构上的当前权限级别。主要的API不区分不同的架构,并且将特定架构的代码转换为架构无关的结构。这样你只需要关注代码运行在什么上下文中,而无需担心支持每个架构。

以下是当前支持的架构

  • x86_64

寻找帮助!

目前只支持x86_64。这个项目是为sanders项目开发的,目前它仅仅是在尝试起飞。虽然我还在构建它并添加功能,但为了简单起见,我只关注x86_64。最终,我将开始添加对更多架构的支持,但暂时我只关注x86_64

然而,这并不会阻止其他人贡献!如果你知道其他架构或需要支持不同的架构,请随意通过pull request添加对该架构的支持!任何帮助都将非常感激!

平台特定

如果你需要或想要特定架构的权限级别区分,提供了相关设施!所有架构都提供了特定的函数和结构,以便你具有符号设施来区分当前权限级别。目的是允许你区分公共API不显示的架构特定细节(例如,x86上的环1和环2之间的差异)。

注意:这些函数和结构会根据配置标志从不支持的平台中移除,因此请确保正确设置你的调用代码。

示例

打印当前权限级别

use privilege_level::{privilege_level, PrivilegeLevel};

fn print_privilege_level() {
    match privilege_level() {
        PrivilegeLevel::Hypervisor => println!("Currently running as the hypervisor"),
        PrivilegeLevel::Kernel => println!("Currently running as the kernel"),
        PrivilegeLevel::Driver => println!("Currently running as a driver"),
        PrivilegeLevel::User => println!("Currently running as a user program"),
    }
}

获取当前x86环级别

use privilege_level::{x86_64_privilege_level, x86_64PrivilegeLevel};

fn print_ring_level() {
    match x86_64_privilege_level() {
        x86_64PrivilegeLevel::Ring0 => println!("Currently in ring 0"),
        x86_64PrivilegeLevel::Ring1 => println!("Currently in ring 1"),
        x86_64PrivilegeLevel::Ring2 => println!("Currently in ring 2"),
        x86_64PrivilegeLevel::Ring3 => println!("Currently in ring 3"),
    }
}

保护函数免受未经授权的访问

use privilege_level::{privilege_level, PrivilegeLevel};

fn protected_function() {
    if privilege_level() > PrivilegeLevel::Driver {
        panic!("This function needs to run at driver level or higher!");
    }
    
    // do things with driver level permissions...
}

许可证

privilege_level 库和 s&ers 项目 采用 MIT 许可证。

依赖项

约 565KB
约 11K SLoC