计算机组成原理
2021年12月27日senpai3分钟

这是一篇测试文章,其中的内容并没有什么意义。

指令集架构

指令集架构 Instruction Set Architecture, ISA是CPU和软件之间的桥梁。

特权级

  • 用户态EL0:应用程序通常运行在用户态;
  • 内核态EL1:操作系统通常运行在内核态;
  • 虚拟机监控器EL2:在虚拟化场景中需要;
  • TrustZoneEL3:与安全特性相关;

其中用户态向内核态切换的情景为:

  • 应用程序需要调用系统调用,此时执行svc(supervisor call)转移到内核态;
  • 应用程序触发异常(比如缺页异常);
    • 其实调用svc也会被作为异常处理,只不过会区分不同原因。
  • 应用程序执行时,CPU受到来自外设的中断
    • 该种情况的特权级切换是异步的,因为不是由应用程序指令所导致的。

中断 & 内存映射

MMIO(CPU访问设备)和中断(设备通知CPU)这两种机制使得CPU与设备之间可以进行交互。

内存映射输入输出

MMIO是一种常见的CPU控制和访问设备的方式,将IO设备与物理内存一起编址,从而CPU可以通过与访存相同的指令来读写设备;设备会通过总线监听CPU分配给自己的地址,然后完成相应的CPU请求。

中断

IO设备编址后CPU能够读取其上的信息,却无法知道何时有信息。如果采用轮询的话过于耗费资源,因此采用中断机制,赋予设备通知CPU的能力,即向CPU发送一个中断,让CPU去处理。

  • OS可以为不同设备发送的中断设置不同的处理函数。
  • 中断还可用于CPU不同核心之间互相通知。
\sum
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!();
}

observer@王博伟