zoukankan      html  css  js  c++  java
  • 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
    ",aaa);
    10     return 0;
    11 }
  • 相关阅读:
    多线程(5)async&await
    多线程(4)Task
    多线程(3)ThreadPool
    多线程(2)Thread
    多线程(1)认识多线程
    泛型
    反射(4)反射性能问题:直接调用vs反射调用
    反射(3)反射应用:一个插件项目
    反射(2)使用反射
    反射(1)认识反射
  • 原文地址:https://www.cnblogs.com/xingzhuan/p/10496716.html
Copyright © 2011-2022 走看看