前言
每一個蹩腳的C++程式設計師都有一顆做作業系統核心的心。我從大學畢業開始就對作業系統核心感興趣,將其看作是術之盡頭,可惜那時候一直在無憂無慮的忙著玩網遊,也就擱置了。隨著時間的推移,逐漸就將其淡忘了,但無憂無慮的日子終有到頭的時候,在這個寒冬,不情願的放了個假,也終於有時間來完成一個簡陋的核心。
簡介
專案地址:https://github.com/wangzq0807/smash
smash是一個類Unix的核心,實現了基於分段和分頁的記憶體管理,單個程式最大4GB虛擬地址空間,支援minix-v2l檔案系統,實現了寫實複製(fork),管道等機制。
專案演示(請忽略我蹩腳的英語…):
具體的編譯安裝方法請參照README
編寫應用程式
目前已開發的API一共18個:
// 程式退出 extern int exit(int code); // fork一個程式,父程式返回子程式的id,子程式返回0 extern int fork(void); // 讀檔案 extern int read(int fd, char *buf, int count); // 寫檔案 extern int write(int fd, const char *buf, int count); // 開啟檔案 extern int open(const char *pathname, int flags, int mode); // 關閉檔案 extern int close(int fd); // 等待指定程式結束 extern int waitpid(int pid, int *status, int options); // 建立檔案 extern int creat(const char *pathname, int mode); // 建立硬連結 extern int link(const char *oldpath, const char *newpath); // 刪除硬連結或刪除檔案 extern int unlink(const char *pathname); // 執行一個可執行程式 extern int execve(const char *pathname, char *const argv[], char *const envp[]); // 變更當前路徑 extern int chdir(const char *pathname); // 建立目錄 extern int mkdir(const char *pathname, int mode); // 刪除目錄 extern int rmdir(const char *pathname); // 切換到其他程式執行 extern int pause(void); // 獲取當前程式id extern int getpid(void); // 建立管道 extern int pipe(int fd[2]); // 複製檔案描述符 extern int dup(int fd);
以 helloworld 為例,要編寫一個應用程式首先要在usr/CMakeLists.txt檔案中追加一行:
add_executable (helloworld helloworld.c ${CORE_SRCS})
括號內第一項 helloworld 指的是可執行檔名稱
後面的項 helloworld.c 和 ${CORE_SRCS} 是編譯所需的原始檔
所有應用程式都應該包含 ${CORE_SRCS},因為這裡面定義了系統API。
然後就可以開啟helloworld.c進行編輯。
跟在linux環境編寫c語言程式碼類似:
#include "stdio.h" int main(int argc, const char **argv) { printf("Hello,World! ");return 0; }
然後就可以編譯了。
注:printf()本身不是一個系統呼叫,而是通過write()系統呼叫實現的一個函式。
感謝
最後,感謝趙炯博士的寶書:《Linux核心完全剖析-基於0.12核心》
前五章對我幫助很大,尤其是第四章,
如果沒有這本書,以我蹩腳的英語,不可能看懂x86的保護模式。
ps:有對核心感興趣的可以一起交流,我的微信wangzq0807