3-08 Linux系统调用

(本节笔记的实验代码,在这里


1.  系统调用(sys_call)的作用与介绍

  系统调用并不是由C库或其他库中实现的,用户空间的应用程序用到的系统调用函数sys_call的实现来源于内核空间中。


2.  系统调用工作流程
        从用户空间调用(read)时,将执行SWI指令,Linux系统从用户空间切换到内核空间,在切换前,会把read函数要执行的系统调用所对应的系统调用编号传入R7寄存器,等切换完成之后,再根据R7寄存器的值来查找对应的内核中该系统调用的实现代码。

        调用SWI指令的实现函数位于内核源码\arch\arm\kernel\entry-common.S中的ENTRY(vector_swi)函数中,把R7的值传进scno参数中。(该函数并不需要修改)根据scno,在位于内核源码\arch\arm\kernel\calls.S中的sys_call_table中找出编号所对应的调用函数名。


3.  实现新的系统调用
        实现新的系统调用,名称为pk,功能为打印一条信息。
        1)因为所要实现的系统调用的功能是打印信息,因此把代码加入printk.c中(位于内核源码\kernel\printk.c中)

  void sys_pk
  {
    printk("This is a new sys call!\n");
  }

                                                              』


        2)修改位于内核源码\arch\arm\kernel\calls.S,在sys_call_table的最后加入

  CALL(sys_pk)

                                                              』


  3)修改位于内核源码\arch\arm\include\asm\unistd.h,在system call numbers的最后加入

  #define __NR_pk           (__NR_SYSCALL_BASE+363)
//每个内核的系统调用编号都不一样,不一定就是363号!
                                                              』

  4)重新编译内核,编译前线make clean,然后make uImage ARCH=arm CROSS_COMPILE=arm-linux-,把编译完成的uImage复制到tftp中。


  5)编写应用程序,touch syscall.c

  void pk()
  {
    __asm__(
    "ldr r7,=363 \n"
    "swi \n"
    :
    :
    :"memory");
  }
  int main()
  {
    pk();
    return 0;
  }
                                                              』

  采用静态方式编译syscall.c,arm-linux-gcc -static syscall.c -o syscall


  6)复制到rootfs并在开发板中运行测试该应用程序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值