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 }

 

posted @ 2019-03-08 17:30  Stephen_A  阅读(3440)  评论(0编辑  收藏  举报