5. aCore - 正確寫入Buffer 的姿勢 - Volatile
2020-05-14
這篇文章之前已經打過一次, 但在開發的途中出現 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 的優化了。