惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
T
The Blog of Author Tim Ferriss
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
Engineering at Meta
Engineering at Meta
量子位
I
InfoQ
Jina AI
Jina AI
Microsoft Security Blog
Microsoft Security Blog
H
Help Net Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
G
Google Developers Blog
J
Java Code Geeks
Recent Announcements
Recent Announcements
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
V
V2EX
腾讯CDC
P
Proofpoint News Feed
A
About on SuperTechFans
爱范儿
爱范儿
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI

博客园 - 华腾智算

逐个注释 前端学习全景图 · HTML5 + CSS3 全部知识点 前端学习全景图 从零实现跨平台 3D 引擎架构方案 2026年的跨平台 GUI 开发趋势 杀毒 现代图形学的本质 C++快速掌握之一 rust控制流-各种循环 rust控制流 rust函数和注释 rust复核类型--元组tuple和数组 rust的类型 rust常量和变量 rust正确的猜数游戏 rust猜数游戏2 rust猜数游戏 字体选型 理解图形学之一入门 Rust 标准库 `std` 中最常用、最核心的模块和类型 Rust 标准库std RUST教程 rust理解一 rust多文件组织 - 华腾智算 Cargo.toml Rust 语言教程 C#常用 C#第六天异常 通俗易懂解释编程-适用于任何编程语言 C#第五天 快速理解整个框架和思想(四层结构,放在哪里,谁能用)
20260810代码
华腾智算 · 2026-08-10 · via 博客园 - 华腾智算
[package]
name = "bootable_graphics"
version = "0.1.0"
edition = "2021"

[dependencies]
uefi = "0.31"

[profile.dev]
panic = "abort"

[profile.release]
panic = "abort"
opt-level = "s"
lto = true
#![no_std]
#![no_main]

use uefi::prelude::*;
use uefi::proto::console::gop::{BltPixel, GraphicsOutput};
use uefi::table::boot::{OpenProtocolAttributes, OpenProtocolParams};
use uefi::table::runtime::ResetType;
use core::fmt::Write;

#[panic_handler]
fn panic_handler(_info: &core::panic::PanicInfo) -> ! {
    loop {}
}

#[entry]
fn main(image_handle: Handle, mut system_table: SystemTable<Boot>) -> Status {
    // ---- 将图形操作放在独立块中,结束后 gop 被释放 ----
    let (width, height) = {
        let gop_handle = system_table
            .boot_services()
            .get_handle_for_protocol::<GraphicsOutput>()
            .expect("此固件不支持图形输出协议 (GOP)");

        let mut gop = unsafe {
            system_table
                .boot_services()
                .open_protocol::<GraphicsOutput>(
                    OpenProtocolParams {
                        handle: gop_handle,
                        agent: image_handle,
                        controller: None,
                    },
                    OpenProtocolAttributes::GetProtocol,
                )
                .expect("无法打开图形输出协议")
        };

        let mode = gop.current_mode_info();
        let (w, h) = mode.resolution();
        let stride = mode.stride();
        let mut fb = gop.frame_buffer();

        // 蓝色背景
        let blue = BltPixel::new(0, 0, 255);
        unsafe {
            for y in 0..h {
                for x in 0..w {
                    let offset = y * stride + x * 4;
                    if offset + 4 <= fb.size() {
                        fb.write_value(offset, &blue);
                    }
                }
            }
        }

        // 中央红色矩形
        let rect_x = w / 4;
        let rect_y = h / 4;
        let rect_w = w / 2;
        let rect_h = h / 2;
        let red = BltPixel::new(255, 0, 0);
        unsafe {
            for y in rect_y..(rect_y + rect_h).min(h) {
                for x in rect_x..(rect_x + rect_w).min(w) {
                    let offset = y * stride + x * 4;
                    if offset + 4 <= fb.size() {
                        fb.write_value(offset, &red);
                    }
                }
            }
        }
        // gop 在这里离开作用域,对 system_table 的借用结束
        (w, h)
    };

    // ---- 文本输出(此时 system_table 已无借用) ----
    let stdout = system_table.stdout();
    stdout.reset(false).unwrap();
    stdout.clear().unwrap();

    write!(stdout, "=== Bare Metal Graphics ===\n").unwrap();
    write!(stdout, "Resolution: {}x{}\n", width, height).unwrap();
    write!(stdout, "Press any key to reboot...\n").unwrap();

    // ---- 等待按键 ----
    let stdin = system_table.stdin();
    while stdin.read_key().is_err() {}

    // ---- 冷重启 ----
    system_table.runtime_services().reset(
        ResetType::COLD,
        Status::SUCCESS,
        None,
    );
}