通過修改Linux 0.11系統文件, 實現增加一個簡單的系統調用
在Ubuntu20.04.1虛擬機上, 用Bochs運行Linux0.11編譯出的image文件編譯Linux0.11需要32位gcc環境, 附一個簡單可行的環境配置鏈接: https://gitee.com/cn-guoziyang/oslab
通過修改Linux 0.11系統文件(使用Bochs運行), 實現增加一個簡單的系統調用此處是調用nameout.c輸出”Hello, I'm lwh”
在用戶層面編寫程序nameout.c,通過syscall這個宏開啟調用系統函數的窗口,調用sys_nameout系統函數。 編寫函數sys_nameout,以name.c的文件格式保存在了linux0.11系統kernel中; sys_nameout調用了printk()完成打印輸出。 修改Makefile文件讓我們添加的kernel/who.c 可以和其它Linux 代碼編譯鏈接到一起

詳細步驟: 添加iam和whoami系統調用編號的宏定義(_NR_xxxxxx)
文件路徑:/linux-0.11/**include/unistd.h ** 
修改系統調用總數文件路徑:/linux-0.11/**kernel/system_call.s ** 
為新增的系統調用添加系統調用名並維護系統調用表文件路徑:/linux-0.11/ include/linux/sys.h

為新增的系統調用編寫代碼實現,創建一個文件name.c文件路徑**: /linux-0.11/kernel**

name.c中寫入printk(”Hello, I'm lwh”)
修改Makefile
要想讓我們添加的kernel/who.c 可以和其它Linux 代碼編譯鏈接到一起,必須要修改Makefile 文件
文件路徑: / linux-0.11/kernel/Makefile

編寫測試程序
到此為止,內核中需要修改的部分已經完成,接下來需要編寫測試程序來驗證新增的系統調用是否已經被編譯到linux-0.11內核可供調用
文件路徑:/oslab/namein.c /oslab/nameout.c

/* nameout.c */
#define LIBRARY
#include <unistd.h>
#include <errno.h>
#include <asm/segment.h>
#include <linux/kernel.h>
#include <stdio.h>
_syscall2(int, nameout,char *,name,unsigned int,size);
int main(int argc, char *argv[])
{
char username[64] = {0};
/調用系統調用nameout() /
nameout(username, 24);
printf("%sn", username);
return 0;
}
採用掛載方式實現宿主機與虛擬機操作系統的文件共享,在oslab目錄下執行以下命令掛載hdc目錄到虛擬機操作系統上

編譯linux內核文件路徑: /oslab/linux
終端執行make命令
Make成功
運行Bochs虛擬機文件路徑: /oslab/ 終端執行run命令
為linux-0.11新增調用號文件路徑: 虛擬機中/usr/include/unistd.h(也可以掛載後在圖形界面中修改) 
(若在虛擬機中修改)
(若掛載後在主機的圖形界面中修改)

gcc運行成功輸出案例文字


使用FIFO(先來先服務)、SSTF(最短尋道優先)以及SCAN(電梯調度算法)進行磁盤調度
顯示調度順序, 計算出平均移動磁道數
使用文件系統調用編寫一個文件工具filetools,使其具有以下功能:
創建新文件, 寫文件, 讀文件, 修改文件權限, 查看當前文件權限, 退出
使用管道來實現父子進程之間的進程通信
產生320條指令序列
將指令序列變換成頁地址流
分別計算先進先出(FIFO)頁面置換算法,最近最久未使用(LRU)頁面置換算法,最佳(Optimal)頁面置換算法在不同內存頁塊下的命中率
使用管道來實現父子進程之間的進程通信
使用消息緩衝隊列來實現client 進程和server 進程之間的通信
使用共享存儲區來實現兩個進程之間的進程通信