• LKD: Chapter 5 System Call


      在Linux中,处理器所作的事可以归纳为3种情况:

    1、In user-space, executing user code in a process;

    2、In kernel-space, in process context, executing on behalf of a specific process;

    3、In kernel-space, in interrupt context, not associated with a process, handling an interrupt.

      而在user-space中想要和内核交互的唯一办法就是通过system call,简称syscall。

    System Call Implementation:

      A meme related to interfaces in Unix is "Provide mechanism, not policy."

      参数检测:内核代码不应随意接受指向user-space的指针,此时必须使用一下两种方法中的一种来检测。

        1、写入user-space时,使用copy_to_user();

        2、从user-space读入时,使用copy_from_user()。

    下面来尝试实现一个system call:

      1、首先在arch/x86/ia32/ia32entry.S最后添加上自己的syscall:

      可见我们这里sys_foo的编号是337。

      2、在arch/x86/include/asm/unistd_32.h中定义syscall number:

      这里出了点意外,不知下面怎么多了两行#ifdef .... #define ...,还把我的337给用了在前面添加我的#define __NR_foo   337后,将后面NR_syscalls的337改成338.  

      3、最后,我们在kernel/sys.c中定义实际的foo()这个syscall:

      这就算完成了。

      接着编译安装内核:

    # cd linux-2.6.32.68
    # make menuconfig(按默认配置就行)
    # make all(要等超级久的啊。。)
    # make modules_install
    # make install
    # update-grub
    # reboot

      结果编译不通过,才明白在第3步kernel/sys.c中添加的代码不应该在开头添加。将其移动到最后后,继续编译!

      可是昨晚已经弄到了23点多了,干脆睡觉去了。一早醒来提示说磁盘空间不够了。对于virtualbox的vdi映像,可以用如下命令扩容:

    VBoxManage modifyhd "cloned.vdi" --resize 16000  //这里的单位是M

      但是我一直觉得centos不太满足我的要求,所以索性重装了个ubuntu 14.04,虚拟机就是方便!

      接下来我们要从user-space中调用这个syscall。我们通过linux提供的macros来包装这个syscall。

      这些macros命名为_syscalln(),其中最后一个n是指参数个数,在0到6间。

      新建文件test.c:

    #define __NR_foo 337
    __syscall0(long, foo)
    
    int main()
    {
        long stack_size;
    
        stack_size = foo();
        printf("The kernel stack size is %ld
    ", stack_size);
    
        return 0;
    }

      编译显示__syscall0那里出错了:unknown type name 'foo'

      网上查是说syscall0这个macro已经过时了,使用syscall()代替。

      成功调用了syscall:

      但是我虚拟机中的ubuntu不知怎么不能和宿主机共享剪贴板,干脆再装个32位的fedora23算了。

  • 相关阅读:
    后缀表达式
    约瑟夫环
    能手进阶:Linux操作琐细驱动编译与运转
    VLC 0.8.5
    Gimpshop 2.2.11
    Blender 2.42
    有助于数据确立平安环境的次要效率阐明');
    DivFix 0.20
    Ubuntu Dapper 提速脚本
    你值得知道的五佳非主流阅读器
  • 原文地址:https://www.cnblogs.com/justforfun12/p/5058664.html
Copyright © 2020-2023  润新知