smash:一個類unix核心

Super Flanky發表於2018-12-09

前言

每一個蹩腳的C++程式設計師都有一顆做作業系統核心的心。我從大學畢業開始就對作業系統核心感興趣,將其看作是術之盡頭,可惜那時候一直在無憂無慮的忙著玩網遊,也就擱置了。隨著時間的推移,逐漸就將其淡忘了,但無憂無慮的日子終有到頭的時候,在這個寒冬,不情願的放了個假,也終於有時間來完成一個簡陋的核心。

簡介

專案地址:https://github.com/wangzq0807/smash

smash是一個類Unix的核心,實現了基於分段和分頁的記憶體管理,單個程式最大4GB虛擬地址空間,支援minix-v2l檔案系統,實現了寫實複製(fork),管道等機制。

專案演示(請忽略我蹩腳的英語…):

smash

具體的編譯安裝方法請參照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

 

相關文章