ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

ubuntu16.04增加系统调用(拷贝)

2019-03-08 17:41:30  阅读:237  来源: 互联网

标签:ubuntu16.04 调用 return sys 编译 fs 内核 file 拷贝


  记录一下操作系统的课设过程  

  

  参考了很多前辈的教程,这里简略的总结一下:

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 }

 

标签:ubuntu16.04,调用,return,sys,编译,fs,内核,file,拷贝
来源: https://www.cnblogs.com/xingzhuan/p/10496716.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有