#freebsd #api-bindings #kernel-module #kpi

nightly no-std freebsd-kpi-13-1

FreeBSD 13.1 内核编程接口

4 个版本

0.1.4 2022年10月11日
0.1.3 2022年9月29日
0.1.2 2022年9月21日
0.1.1 2022年9月21日

#407 in 操作系统

自定义许可

3MB
57K SLoC

FreeBSD 13.1 Rust 内核编程接口

此仓库仅包含对内核的绑定!

这是不安全的,只是一个绑定!

它还没有经过测试(因为现在正在执行结构对齐测试,请参阅内核编程接口测试

有关“安全”和Rust兼容的实现,请参阅内核模块接口

内核模块接口依赖于此crate。


变量(功能自动配置)

为了构建针对FreeBSD内核的crate,需要使用位于/usr/src/sys/<arch>/conf的conf文件来自动配置功能

  • 禁用default_features
  • 设置功能BUILD_CONFIG_KERNEL
  • 设置环境变量KPI_PLATFORM_CFG_PATH

[dependencies]
freebsd-kpi-13-1 = { path = "../rsandbox_kmod", defailt_features = false, features = ["BUILD_CONFIG_KERNEL"] }

[env]
KPI_PLATFORM_CFG_PATH = "/usr/src/sys/amd64/conf/GENERIC"

如果未设置KPI_PLATFORM_CFG_PATH,则将使用默认路径/usr/src/sys/amd64/conf/GENERICGENERIC

移植指南

请参阅Rustonomicon

私有函数

/// defined in <path to file with filename>:line number
#[repr(C)]
pub struct turnstile 
{
    _data: [u8; 0],
    _marker:
        core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
}

外部函数和变量

extern "C"
{
    #[no_mangle]
    pub 
    fn vmem_create(name: *const c_char, base: vmem_addr_t, size: vmem_size_t, 
        quantum: vmem_size_t, qcache_max: vmem_size_t, flags: c_int) -> *mut vmem_t;

    #[no_mangle]
    #[link_name = "wdog_software_attach"]
    pub static mut wdog_software_attach: Option<unsafe extern "C" fn()>;
}

函数指针

一个像fointer这样的函数

void (*func)()

Option<unsafe extern "C" fn()>

函数

特殊属性

  • C __returns_twice,Rust #[ffi_returns_twice]
  • C __no_return,Rust !
  • C __weak_symbol,Rust #[linkage = "extern_weak"]

其他

  • volatile参数或字段应具有注释/// VOLATILE!并使用core::ptr::read_volatilecore::ptr::write_volatile进行访问
  • C offsetof对于Rust有宏:offsetof.rs offset_of!()
  • C typeof在Rust中没有替代品。

样式

有关格式化和移植的一些指南。

不要使用rustfmt

换行和格式

通常行长度不应超过120个字符。但最多可以到160。

函数格式

// #[ATTRIBUTES] \n
// #[ATTRIBUTES] \n
// [FUNCTION MODIFIERS] \n
// [FUNCTION] [FUNCTION_NAME] [GENERICS][ARGUMENTS] [RETURN_DATA]\n
// [{]
//      [...]
// [}]
//
// where [ARGUMENTS] may be formatted as following:
// ([ARG], [ARG], [ARG])
// -- OR --
// (
//    [ARG],
//    [ARG]
// )
// -- OR --
// ([ARG], [ARG], [ARG],
//  [ARG], [ARG])

#[inline]
pub unsafe
fn function_name<B, C, D>(arg1: u64, arg2: u64, arg3: B, arg4: C, arg5: D) -> u64
where B: SomeTrait, C: SomeTrait, D: SomeTrait
{}

#[inline]
pub unsafe
fn function_name<B, C, D>(
    arg1: u64, 
    arg2: u64,
    arg3: B,
    arg4: C,
    arg5: D
) -> u64
where B: SomeTrait, C: SomeTrait, D: SomeTrait
{}

#[inline]
pub unsafe
fn function_name<B, C, D>(arg1: u64, arg2: u64, 
    arg3: B, arg4: C, arg5: D) -> u64
where   // optiinal \n 
    B: SomeTrait, C: SomeTrait, D: SomeTrait
{}

常量/类型格式

// [VISIBILITY] [CONST] [NAME][:] [DATATYPE] [=] [DATA]
// [VISIBILITY] [TYPE] [TYPE_NAME] = [TYPE]

pub const RW_VAL: u8 = 9;
const D_VAL: &[u8] = b"d_value\0";
const B_VAL: &[&[u8]] = & // \n if list if large, otherwise same line
[
    D_VAL,
    "blabla\0",
];

pub type uint32_t = u32;
pub type callback_fn = // \n if long difinition
    Option<
        unsafe extern "C"
        fn(my_var: u64) -> u64
    >;

pub type callback_fn = unsafe extern "C" fn(my_var: u64) -> u64;
pub type callback_fn = Option<unsafe extern "C" fn() -> u64>;

赋值

//...
let var: u64 = some_struct.read().unwrap();

let var2: Option<Arc<RefCell<MyStructLongName>>> = 
    some_s.get_instance().get_sourcer().read().unwrap();

let var3: Arc<RefCell<MyStructLongName>> =
    io_source.instance()
            .grab()
            .set_source()
            .set_name()
            .start();
//...

结构体

//[DERIVES/MODIFIERS]
//[VISIBILITY][struct][name] \n
//[{] \n
//\t    [field][:] [data][,]
//[}]\n

#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct StructName
{
    field: u64,
    field1: Option<Arc<Mutex<MyData>>>,
}

匹配/如果

if var1 == 8
{

}
else
{

}

if var1 == 8 || var_with_long_name > 6 ||
    var_with_anothr_name > 100 ||
    var5 != 8
{

}
else if var2 < 6
{

}
else
{

}

match myvar
{
    3 => return 5,
    6 =>
    {
        something
    },
    9 => return 1,
    _ =>
}

match myvar.get_instance().foo()
    .bar().foobar()
{
    StateA0V1H3
        {
            field1: ...,
            field2: ...,
            field3: ...
        } =>
    {

    },
    StateA4N6(a,b,c,d,e) =>
    {

    },
    StateA5K3B6R3blabla =>
    {

    }
}

安全性

我正在尽我所能控制推送到这个仓库的内容。不允许其他人向这个仓库提交!这个crate主要包含结构体。但有时'.h'文件中包含一些静态函数。这些函数中的代码必须与原始'.h'文件中的代码匹配!否则,任何更改都必须突出显示,并在注释部分说明更改原因。同时,必须提及更改的作者!

请求

请求实现某事或修复某事,并尽快处理,都会被拒绝。

只有得到赞助才能处理。

依赖项