350|3

171

帖子

10

TA的资源

一粒金砂(高级)

《Rust实战》读书笔记——第11章,内内内内核 [复制链接]

郭德纲说于谦办了个VIP 中P,这章作者写的内核那叫一个短小精悍,那真是最里面的那层核,就一个字——能跑。

前3页比较有用——搭建环境。需要用到qemu(虚拟机容器)、bootimage包(构建引导映像),rust源码和llvm-tools(生成编译器)、以及cargo的辅助包。

然后作者写了第0版OS,非常短主要功能是很暴力的直接写内存,按VGA字符标准显示一色块:

#![no_std]
#![no_main]
#![feature(core_intrinsics)] 

use core::intrinsics;
use core::panic::PanicInfo;

#[panic_handler]
#[no_mangle]
pub fn panic(_info: &PanicInfo) -> ! {
  intrinsics::abort();
}

#[no_mangle]
pub extern "C" fn _start() -> ! {
  let framebuffer = 0xb8000 as *mut u8;
  unsafe {
    framebuffer
      .offset(1)
      .write_volatile(0x30); 
  }
  loop {}
}

注意,由于#![no_std],导致很多标准特性都不再可用。

为了在loop中,让cpu能喘口气、处理中断、节点能,在第1版里,加了x86_64::instructions::{hlt},然后在loop里用一句话用来暂时挂起:

hlt();

第2版,加了几行用来处理异常:

#[lang = "eh_personality"]
#[no_mangle]
pub extern "C" fn eh_personality() { }

第3版,作者实现了可以输出彩色字符:

#[allow(unused)]
#[derive(Clone,Copy)]
#[repr(u8)]
enum Color {
  Black = 0x0,    White = 0xF,
  Blue = 0x1,     BrightBlue = 0x9,
  Green = 0x2,    BrightGreen = 0xA,
  Cyan = 0x3,     BrightCyan = 0xB,
  Red = 0x4,      BrightRed = 0xC,
  Magenta = 0x5,  BrightMagenta = 0xD,
  Brown = 0x6,    Yellow = 0xE,
  Gray = 0x7,     DarkGray = 0x8
}

struct Cursor {
  position: isize,
  foreground: Color,
  background: Color,
}

impl Cursor {
  fn color(&self) -> u8 {
    let fg = self.foreground as u8;
    let bg = (self.background as u8) << 4;
    fg | bg
  }

  fn print(&mut self, text: &[u8]) {
    let color = self.color();

    let framebuffer = 0xb8000 as *mut u8;

    for &character in text {
      unsafe {
        framebuffer.offset(self.position).write_volatile(character);
        framebuffer.offset(self.position + 1).write_volatile(color);
      }
      self.position += 2;
    }
  }
}

第4版,use core::fmt::Write实现了格式化输出:

#![feature(core_intrinsics)]
#![feature(lang_items)]
#![no_std]
#![no_main]

use core::fmt;
use core::panic::PanicInfo;
use core::fmt::Write;

use x86_64::instructions::{hlt};

#[allow(unused)]
#[derive(Copy, Clone)]
#[repr(u8)]
enum Color {
  Black = 0x0,    White = 0xF,
  Blue = 0x1,     BrightBlue = 0x9,
  Green = 0x2,    BrightGreen = 0xA,
  Cyan = 0x3,     BrightCyan = 0xB,
  Red = 0x4,      BrightRed = 0xC,
  Magenta = 0x5,  BrightMagenta = 0xD,
  Brown = 0x6,    Yellow = 0xE,
  Gray = 0x7,     DarkGray = 0x8
}

struct Cursor {
  position: isize,
  foreground: Color,
  background: Color,
}

impl Cursor {
  fn color(&self) -> u8 {
    let fg = self.foreground as u8;
    let bg = (self.background as u8) << 4;
    fg | bg
  }

  fn print(&mut self, text: &[u8]) {
    let color = self.color();

    let framebuffer = 0xb8000 as *mut u8;

    for &character in text {
      unsafe {
        framebuffer.offset(self.position).write_volatile(character);
        framebuffer.offset(self.position + 1).write_volatile(color);
      }
      self.position += 2;
    }
  }
}

impl fmt::Write for Cursor {
  fn write_str(&mut self, s: &str) -> fmt::Result {
    self.print(s.as_bytes());
    Ok(())
  }
}

#[panic_handler]
#[no_mangle]
pub fn panic(info: &PanicInfo) -> ! {
  let mut cursor = Cursor {
    position: 0,
    foreground: Color::White,
    background: Color::Red,
  };
  for _ in 0..(80*25) {
    cursor.print(b" ");
  }
  cursor.position = 0;
  write!(cursor, "{}", info).unwrap();

  loop { unsafe { hlt(); }}
}

#[lang = "eh_personality"]
#[no_mangle]
pub extern "C" fn eh_personality() { }

#[no_mangle]
pub extern "C" fn _start() -> ! {
  panic!("help!");
}

所以,最后实现的效果是一段只有底层特性的程序,不太费电,能马马虎虎对付异常,万一出错了能输出。

11_03.png

第369页总结“费了很大的劲实现了这个什么都不会做的功能”,但是我觉得至少搭了个OS的helloworld。

 

 

 

此帖出自编程基础论坛

最新回复

加一堆 #[] 和不安全操作,为啥不用 C ?   详情 回复 发表于 2024-6-24 14:29

回复
举报

6139

帖子

0

TA的资源

五彩晶圆(高级)

由于#![no_std],导致很多标准特性都不再可用

#![no_std]这玩意是个啥

此帖出自编程基础论坛

点评

std是标准库,标准库会调用操作系统进行内存分配。由于这一章本来就是要做个OS内核,所以是在裸机启动的,不能依赖操作系统,所以用这个形式把标准库禁用。  详情 回复 发表于 2024-6-20 12:37

回复

171

帖子

10

TA的资源

一粒金砂(高级)

Jacktang 发表于 2024-6-20 07:26 由于#![no_std],导致很多标准特性都不再可用 #![no_std]这玩意是个啥

std是标准库,标准库会调用操作系统进行内存分配。由于这一章本来就是要做个OS内核,所以是在裸机启动的,不能依赖操作系统,所以用这个形式把标准库禁用。

此帖出自编程基础论坛

回复

7166

帖子

2

TA的资源

五彩晶圆(中级)

加一堆 #[] 和不安全操作,为啥不用 C ?

此帖出自编程基础论坛
个人签名

默认摸鱼,再摸鱼。2022、9、28


回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表