ubuntu16.04增加系統調用(拷貝)


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

  

  參考了很多前輩的教程,這里簡略的總結一下:

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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM