這篇文章之前已經打過一次, 但在開發的途中出現 Kernal Secrutiy Check Error

而且QEMU 好像碰到了閃重啟問題。所以如果可以的話 , 還是建議用整個Linux 來做開發。

Volatile

在C, C++, Java, C# 中都會看到這個變數標示, 通常我們會標示它給多線程讀取的變數, 但基礎意義上來說 , Volatile 這個字在他們中間卻有很大的分別。以下我都是以C 作為標準。

可能會有人聯想到Mutex 等臨界區保護的方案 , 但是Volatile 其實只是單純地讓編譯器不要把讀取這個變數時優化掉而已。並無任何的邏輯增減。

這是用到Volatile, 是因為我們現在要讀取的是VGA Buffer 而不是RAM , 所以編譯器並不知道這種讀寫是有意義的。 有關具體的優化的例子, 可以看這頁WIKI : https://zh.wikipedia.org/wiki/Volatile%E5%8F%98%E9%87%8F

(我覺得上次(當機前)講得好多了)

那麼, 在Cargo.toml 加入:

[dependencies]
volatile = "0.2.6"

vga_buffer.rs 的頂部加入 use volatile::Volatile; 並修改 Buffer 為 :

struct Buffer {
    chars: [[Volatile<ScreenChar>; BUFFER_WIDTH]; BUFFER_HEIGHT],
}

再把 fn write_byte 中間的幾句修改成:

                self.buffer.chars[row][col].write(ScreenChar {
                    ascii_character: byte,
                    color_code: color_code,
                });

這樣我們就可以用Volatile 這個Crate 來避開 rustc 的優化了。