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 在 无标准库
每月 2,821 次下载
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