開源專案 乙個類unix核心

2021-09-02 22:20:47 字數 2130 閱讀 9056

每乙個蹩腳的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...