这是一篇测试文章,其中的内容并没有什么意义。
指令集架构
指令集架构 Instruction Set Architecture, ISA是CPU和软件之间的桥梁。
特权级
- 用户态EL0:应用程序通常运行在用户态;
- 内核态EL1:操作系统通常运行在内核态;
- 虚拟机监控器EL2:在虚拟化场景中需要;
TrustZone
EL3:与安全特性相关;
其中用户态向内核态切换的情景为:
- 应用程序需要调用系统调用,此时执行
svc
(supervisor call)转移到内核态; - 应用程序触发异常(比如缺页异常);
- 其实调用
svc
也会被作为异常处理,只不过会区分不同原因。
- 其实调用
- 应用程序执行时,CPU受到来自外设的中断;
- 该种情况的特权级切换是异步的,因为不是由应用程序指令所导致的。
中断 & 内存映射
MMIO(CPU访问设备)和中断(设备通知CPU)这两种机制使得CPU与设备之间可以进行交互。
内存映射输入输出
MMIO是一种常见的CPU控制和访问设备的方式,将IO设备与物理内存一起编址,从而CPU可以通过与访存相同的指令来读写设备;设备会通过总线监听CPU分配给自己的地址,然后完成相应的CPU请求。
中断
IO设备编址后CPU能够读取其上的信息,却无法知道何时有信息。如果采用轮询的话过于耗费资源,因此采用中断机制,赋予设备通知CPU的能力,即向CPU发送一个中断,让CPU去处理。
- OS可以为不同设备发送的中断设置不同的处理函数。
- 中断还可用于CPU不同核心之间互相通知。
1 | 2 | 3 |
---|---|---|
1 | 2 | 3 |
#![no_std]
#![no_main]
#![feature(asm)]
#![feature(llvm_asm)]
#![feature(global_asm)]
#![feature(panic_info_message)]
#![feature(once_cell)]
#![feature(alloc_error_handler)]
#![feature(custom_test_frameworks)]
#![test_runner(crate::test_runner)]
#![reexport_test_harness_main = "test_main"]
use global_asm;
use log::*;
extern crate alloc;
extern crate bitflags;
#[macro_use]
mod console;
mod config;
mod drivers;
mod file;
mod lang_items;
mod memory;
mod sbi;
mod syscall;
mod task;
mod timer;
mod trap;
global_asm!(include_str!("entry.asm"));
global_asm!(include_str!("link_app.S"));
#[cfg(test)]
fn test_runner(tests: &[&dyn Fn()]) {
println!("Running {} tests", tests.len());
for test in tests {
test();
}
}
/// 清空bss段
fn clear_bss() {
extern "C" {
fn sbss();
fn ebss();
}
(sbss as usize..ebss as usize).for_each(|n| unsafe {
(n as *mut u8).write_volatile(0);
})
}
#[no_mangle]
fn rust_main() -> ! {
clear_bss();
console::init("trace");
println!("[kernel] Hello, world!");
memory::init();
memory::remap_test();
trap::init();
trap::enable_timer_interrupt();
timer::set_next_trigger();
file::list_apps();
task::add_initproc();
task::run_tasks();
unreachable!();
}