記錄一下操作系統的課設過程

參考了很多前輩的教程,這里簡略的總結一下:
1.首先要確定內核與linux系統版本是否匹配(不匹配的話搗鼓半天not support這是最氣的),這里采用的是linux16.4版本的操作系統,linux 4.14.0版本的內核。具體的源碼可以在github上或者https://www/kernel.org/上面下載。
2.將下載下來的內核壓縮包解壓到/user/src目錄下

3.安裝輔助工具
sudo apt install bison flex pkg-config build-essential libncurses5-dev libssl-dev libelf-dev 【如果安裝出現問題重啟就好了】
3. 增加系統調用號
【使用gedit進行編輯】gedit ./arch/x86/entry/syscalls/syscall_64_tbl(由於本機是64位系統,需要修改的就是這個,如果是32位系統,修改syscall_32_tbl就可以了)


如圖所示,這里添加的系統調用號是333(隨便填個數字也行,但是必須確保系統調用號是獨一無二的)后面對common我猜是表示32位和64位都可以使用?【認真臉 當然寫64也行
4.聲明系統調用函數原型
gedit include/linux/syscall.h

加入的聲明代碼 : asmlinkage long sys_mycopy(const char *src_file, const char *copy_file);
5.添加系統調用函數的定義
gedit kernel/sys.c
文件位置如下(路徑有問題的可以直接找這個文件來修改):

在文件的最后增加函數定義(借鑒了前輩的代碼,優秀的代碼千篇一律,感謝前輩為開源社區做出的貢獻)

附代碼:
1 asmlinkage long sys_mycopy(const char *src_file,const char *copy_file){ 2 int infd,outfd,count; 3 char buf[256]; 4 mm_segment_t fs; 5 fs = get_fs(); 6 set_fs(get_ds()); 7 if((infd=sys_open(src_file,O_RDONLY,0)) == -1) { 8 return 1; 9 } 10 if((outfd=sys_open(copy_file,O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR))== -1){ 11 return 2; 12 } 13 while((count = sys_read(infd,buf,256))>0) 14 { 15 if(sys_write(outfd,buf,count)!= count) 16 return 3; 17 } 18 if(count == -1) return 4; 19 sys_close(infd); 20 sys_close(outfd); 21 set_fs(fs); 22 return 0; 23 }
【之前自己敲代碼的時候照着敲都敲錯了,二次編譯內核浪費了個把小時的時間,真菜啊,,,
6.最費時間的一步:編譯內核
沒啥說的,照着敲命令:
sudo make menuconfig 選擇save然后退出就行,生成.config文件
sudo make -j 2(這里之后系統就會編譯14.4的那個內核了,這里2是指你分配給系統2個線程來編譯內核,由於編譯時間很長,我2線程編譯了個把小時,為了省時間,你也可以按照自己的機器分配更多的線程,當然,不同處理器時間不同)
然后就開始開心的玩手機吧。。。。有些編譯步驟可能會卡住,花費一些時間,不要管,等着就行,千萬不要手殘去亂按。。。
7.sudo make modules_install安裝模塊
花費幾分鍾時間
8.sudo make install 安裝內核
同樣幾分鍾,最后一步啦。
9.重啟系統,然后長按shift進入引導界面,高級選項

選擇編譯好的內核: 注意區分版本,是新編譯好的版本是4.14.0,之前下載的那個是末尾有個old,我們選擇新編譯好的,進入系統。

10.檢驗系統調用是否成功:
寫一個小程序檢驗一下:將test.c的文件拷貝為名字叫222.c的文件
1 clude<linux/kernel.h> 2 #include<sys/syscall.h> 3 #include<unistd.h> 4 5 int main() 6 { 7 8 long int aaa=syscall(333,"test.c","222.c"); 9 printf("%ld\n",aaa); 10 return 0; 11 }
