#中断 #内核 #apic

nightly 无std x2apic

Rust对x2apic中断架构的接口

10个版本

0.4.3 2023年9月19日
0.4.2 2023年2月7日
0.4.1 2022年8月4日
0.4.0 2021年10月11日
0.1.0 2019年6月25日

#143无标准库

Download history 1311/week @ 2024-03-13 1121/week @ 2024-03-20 1319/week @ 2024-03-27 1397/week @ 2024-04-03 1252/week @ 2024-04-10 644/week @ 2024-04-17 1596/week @ 2024-04-24 1062/week @ 2024-05-01 1734/week @ 2024-05-08 823/week @ 2024-05-15 901/week @ 2024-05-22 1566/week @ 2024-05-29 673/week @ 2024-06-05 682/week @ 2024-06-12 725/week @ 2024-06-19 590/week @ 2024-06-26

每月 2,821 次下载

MIT/Apache

43KB
936

x2apic-rs

Rust对x2apic中断架构的接口。

此crate处于早期阶段,仅在QEMU上进行了测试;欢迎代码贡献和错误报告。

如果CPU支持,它将使用x2APIC模式,否则将回退到xAPIC模式。

用法

本地APIC的初始化如下

use x2apic::lapic::{LocalApic, LocalApicBuilder, xapic_base};

let apic_physical_address: u64 = unsafe { xapic_base() };
let apic_virtual_address: u64 = <convert from physical address>

let lapic = LocalApicBuilder::new()
    .timer_vector(timer_index)
    .error_vector(error_index)
    .spurious_vector(spurious_index)
    .set_xapic_base(apic_virtual_address)
    .build()
    .unwrap_or_else(|err| panic!("{}", err));

unsafe {
    lapic.enable();
}

这将以默认配置初始化并启用本地APIC计时器。计时器可以使用构建器或直接在APIC上配置。

IOAPIC的初始化如下

use x2apic::ioapic::{IoApic, IrqFlags, IrqMode, RedirectionTableEntry};

// !!! Map the IOAPIC's MMIO address `addr` here !!!

unsafe {
    let ioapic = IoApic::new(addr);

    ioapic.init(irq_offset);

    let mut entry = RedirectionTableEntry::default();
    entry.set_mode(IrqMode::Fixed);
    entry.set_flags(IrqFlags::LEVEL_TRIGGERED | IrqFlags::LOW_ACTIVE | IrqFlags::MASKED);
    entry.set_dest(dest); // CPU(s)
    ioapic.set_table_entry(irq_number, entry);

    ioapic.enable_irq(irq_number);
}

请参阅文档以获取更多详细信息。

依赖关系

~1MB
~20K SLoC