每乙個蹩腳的c++程式設計師都有一顆做作業系統核心的心。我從大學畢業開始就對作業系統核心感興趣,將其看作是術之盡頭,可惜那時候一直在無憂無慮的忙著玩網遊,也就擱置了。隨著時間的推移,逐漸就將其淡忘了,但無憂無慮的日子終有到頭的時候,在這個寒冬,不情願的放了個假,也終於有時間來完成乙個簡陋的核心。
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 $)
括號內第一項 helloworld 指的是可執行檔名稱
後面的項 helloworld.c 和 $ 是編譯所需的原始檔
所有應用程式都應該包含 $,因為這裡面定義了系統api。
然後就可以開啟helloworld.c進行編輯。
跟在linux環境編寫c語言**類似:
#include "stdio.h"
intmain(int argc, const char **argv)
然後就可以編譯了,編譯方法請參照專案readme
注:printf()本身不是乙個系統呼叫,而是通過write()系統呼叫實現的乙個函式。
最後,感謝趙炯博士的寶書:《linux核心完全剖析-基於0.12核心》
前五章對我幫助很大,尤其是第四章,
如果沒有這本書,以我蹩腳的英語,不可能看懂x86的保護模式。
如何熟悉乙個開源專案?
如何熟悉乙個開源專案?你去了解某個東西。怎麼下手呢?如何開始呢?我的習慣是這樣 1.首先,查詢和閱讀該項目的部落格和資料,通過google你能找到某個專案大體介紹的部落格,快速閱讀一下就能對專案的目的 功能 基本使用有個大概的了解。2.閱讀專案的文件,重點關注類似 getting started e...
如何熟悉乙個開源專案?
你有個任務,需要用到某個開源專案 或者老大交代你乙個事情,讓你去了解某個東西。怎麼下手呢?如何開始呢?我的習慣是這樣 1.首先,查詢和閱讀該項目的部落格和資料,通過google你能找到某個專案大體介紹的部落格,快速閱讀一下就能對專案的目的 功能 基本使用有個大概的了解。4.執行了第乙個example...
開源乙個C C 日誌類
日誌類可以作為乙個練手專案,實現乙個好的日誌類並不容易,這裡先出第乙個版本,後期持續優化。功能簡單對於新手非常友好,歡迎指正錯誤。該日誌類我命名為cclog,第乙個c是class的意思,忽略這一點的話可以叫clog。作用當然是日誌記錄,寫日誌操作是執行緒安全的,支援類似字串format的形式。基於w...