前面我们学习了在内核中添加自己的代码,这次我们在内核中添加一个自己的系统调用,就像open/close一样的函数!

当我们应用程序调用open close函数时: open close函数是经过libc.so 库调用syscall函数,然后syscall函数再经过SWI调用内核的系统调用的;

所有我们写了一个系统调用之后,也要实现这样一个过程,才能让应用层正常调用系统调用.

  vim  calls.S  为自己的函数注册系统调用号378

385                 CALL(sys_syncfs)
386                 CALL(sys_sendmmsg)
387 /* 375 */       CALL(sys_setns)
388                 CALL(sys_process_vm_readv)
389                 CALL(sys_process_vm_writev)
390 /* 378 */       CALL(sys_my_add)
391 #ifndef syscalls_counted
392 .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
393 #define syscalls_counted
394 #endif
395 .rept syscalls_padding
396                 CALL(sys_ni_syscall)
397 .endr

 vim arch/arm/include/asm/unistd.h 声明自己的系统调用函数 407行

403 #define __NR_sendmmsg                   (__NR_SYSCALL_BASE+374)
404 #define __NR_setns                      (__NR_SYSCALL_BASE+375)
405 #define __NR_process_vm_readv           (__NR_SYSCALL_BASE+376)
406 #define __NR_process_vm_writev          (__NR_SYSCALL_BASE+377)
407 #define __NR_my_add                     (__NR_SYSCALL_BASE+378)
408
409 /*
410  * The following SWIs are ARM private.
411  */
412 #define __ARM_NR_BASE                   (__NR_SYSCALL_BASE+0x0f0000)
413 #define __ARM_NR_breakpoint             (__ARM_NR_BASE+1)
414 #define __ARM_NR_cacheflush             (__ARM_NR_BASE+2)
415 #define __ARM_NR_usr26                  (__ARM_NR_BASE+3)

  在 arch/arm/kernel目录下创建一个mysyscall文件夹: 并在文件夹内:touch mysyscall.c mysyscall.h Makefile三个文件,写入如下代码,然后编译内核,并刷机,这样就把自己的syscall编译到内核了.

  mysyscall.c

  

  1 #include <linux/init.h>2 #include <linux/sched.h>3 #include <linux/module.h>4 #include "mysyscall.h"5 /* asmlinkage long sys_arm_fadvise64_64(int fd, int advice,6                                       loff_t offset, loff_t len)7  {8          return sys_fadvise64_64(fd, offset, len, advice);9  }                                                          */10 //asmlinkage:表示将来这段代码是要由汇编来调用的。11  asmlinkage long sys_my_add(int a,int b)12  {13         printk("this is liuye's syscall!\n");14          return a+b;15  }16 17 //module_init(sys_my_add);18 MODULE_LICENSE("GPL");

  mysyscall.h

  1 #ifndef __MYSYSCALL_H_2 #define __MYSYSCALL_H_3 4  asmlinkage long sys_my_add(int a,int b);5 6 7 #endif

  makefile

  1 obj-y += mysyscall.o

  vim ../Makefile

 74 AFLAGS_iwmmxt.o                 := -Wa,-mcpu=iwmmxt75 obj-$(CONFIG_ARM_CPU_TOPOLOGY)  += topology.o76 # 在这层malefile中添加下一曾Makefile路径77 obj-y  += mysyscall/78 

  之后 make -j4 利用SD卡刷机 系统调用添加到内核中了;

  然后我们要制作一个包含mysyscall的库:在PC机上随便找一个文件夹:touch my_add.c my_add.h 写入如下代码.并编译成动态库:

  vim my_add.c

  1 //这三行是为了调用syscall而包含的头文件和宏定义:可以man syscall查看2 #define _GNU_SOURCE         /* See feature_test_macros(7) */3 #include <unistd.h>4 #include <sys/syscall.h>   /* For SYS_xxx definitions */5 #include <stdio.h>6 int my_add(int a ,int b)7 {8         printf("this is liuye's app\n");9         return  syscall(378,a,b);10 11 }

  vim my_add.h

  1 #ifndef __MY_ADD_H_2 #define __MY_ADD_H_3 4 extern int my_add(int a, int b);5 6 #endif

  把上面的my_add.c my_add.h制作成动态库:生成libadd.so

[liuye@LiuYe 01syscall]$>arm-linux-gcc -fPIC -c -o my_add.o my_add.c
[liuye@LiuYe 01syscall]$>arm-linux-gcc my_add.o -shared -o libadd.so

  然后写一个应用程序来调用下我们系统调用:touch test.c

  vim test.c

  1 #include <stdio.h>2 #include "my_add.h"3 //#include <my_add.h>4 int main(void)5 {6         int sum;7         sum = my_add(1,2);8         printf("sum = %d\n",sum);9         return 0;10 }

77     使用arm-linux-gcc编译test.c代码,需要链接动态库 -L指定路径  -l指定库名
78     生成可执行文件:arm-linux-gcc test.c -o test -L./ -ladd
79     复制库文件和可执行文件到共享文件夹:cp libadd.so test /myroot
81     把新编译的内核copy到SD卡,刷机;
82     PC端:1 开启共享服务
83           2 minicom链接开发板
84             mount -t nfs -o nolock,rw 192.168.1.10:/myroot /mnt
85             cd /mnt
86             cp libadd.so /lib/ 放到根下lib下,在运行的时候不用指定路径
87             ./test  运行即

root@board liuye_dir#./test
this is liuye's app
[ 1817.020000] this is liuye's syscall!
sum = 3
root@board liuye_dir#

  以上就完成了一个系统调用的全过程,相信同学们即学会了如何在内核中添加一个系统调用,也学会了应用程序调用系统调用的全过程了,是不是觉得很赞?!!!!!!!!!!哈哈哈哈反正我觉得是有收获的!

转载于:https://www.cnblogs.com/axjlxy/p/8964389.html

在内核中添加系统调用相关推荐

  1. MIPS(loongson)linux 中添加系统调用

    在基于MISP(loongson)架构处理器与基于 x86 架构处理器的 linux 内核中添加系统调用时更改的文件是不同的,x86 中需要更改 arch/x86/kernel/syscall_tab ...

  2. linux内核syscall_define6,linux中添加系统调用

    1)在内核里添加系统调用,函数形式是:asmlinkage type sys_func_name(...) 2)在文件include/asm-arm/unistd.h里面添加 define __NR_ ...

  3. linux 3.5.0-23-generic内核版本系统调用数目,Linux操作系统分析(三)- 更新内核与添加系统调用...

    环境:Ubuntu 12.10     学号:SA****199 1.更新内核: 直接安装的系统内核版本一般不是最新,用 uname -a 查看一下 自己的版本,OK,我的是: Linux chenh ...

  4. Linux-0.11内核学习-添加系统调用

    1.参考资料 赵炯博士的网站oldlinux Linux内核完全注释 Linux0.11 源码 2.概要 操作系统作为软件应用层和底层硬件之间的部分,向下提供服务,向上提供接口.系统调用便是操作系统向 ...

  5. i.MX 6ULL 驱动开发 二十九:向 Linux 内核中添加自己编写驱动

    一.概述 Linux 内核编译流程如下: 1.配置 Linux 内核. 2.编译 Linux 内核. 说明:进入 Linux 内核源码,使用 make help 参看相关配置. 二.make menu ...

  6. 【内核驱动】 内核驱动中添加系统调用

    开发环境: Redhat6.5 开发板: Tiny4412 (ARM Cortex A9) 1. 系统调用概述 系统调用请点击 系统调用概述 2. 实现系统调用的步骤 添加一个系统调用比较简单,下面以 ...

  7. 操作系统作业:向内核中添加一个系统调用

    本文主要突出操作中遇到的问题及解决方案,关于详细过程不做过多展示,大家可以参考 https://blog.csdn.net/qq_41175905/article/details/80529245 h ...

  8. 西电软工操作系统实验:编译Ubuntu18.04新内核并添加系统调用(含代码以及详细分析)

    西电软工操作系统实验一:编译Linux内核 目录 (一)前言 (二)实验内容 (三)实验环境 (四)实验过程 4.1安装虚拟机 4.2虚拟机换源 4.3 添加系统调用内核 4.4 下载编译所需的软件依 ...

  9. 粤嵌实验板 linux 环境,粤嵌linux基础入门学习 linux系统中添加系统调用

    linux系统中添加系统是怎样调用的?从linux基础入门学习出发,一起来看看: 1.每个体系下面均有对应的系统调用列表: arch/arm/kernel/calls.S 在最后添加一个新的系统调用标 ...

最新文章

  1. 渐进式迭代教学法--PHP
  2. 【测试】ABAP直连外部数据库
  3. Android集成三方浏览器之Crosswalk
  4. interface关键字
  5. vue,computed,计算属性
  6. Android开发笔记(五十五)手机设备基本操作
  7. cf不能全屏win7的解决方法_win10玩cf不能全屏的解决方法教程
  8. 2019.2.18接口2
  9. PlistEdit Pro for Mac(Plist编辑器)
  10. 在 Chrome 浏览器中安装印象笔记·剪藏插件
  11. Photoshop 合并序列帧图片单张多帧图片
  12. 直播教学系统16项功能
  13. 枕头里面加进这些小宝贝能治高血压!快告知你父母~
  14. photoshop--PS拼图
  15. 阻击黑客,你需要了解这些云安全“潜规则”
  16. 1.2 Unity3D 的注册
  17. 基于Thinkphp5+EasyWeChat+fastadmin微信小程序授权登录获取手机号微信公众号网页---联合授权登录
  18. javaweb第三天JavaScript知识点(来自广陵散老师)
  19. 【行为分析】(二)前端埋点实现及原理分析
  20. 输出一个 n 阶的方阵

热门文章

  1. C++ typeid操作符
  2. 中小企业实施ERP更多是需要发展的眼光与坚定的决策
  3. Tomcat中两个不同项目共享Session
  4. Win系统复制粘贴失效解决办法
  5. VS2010配置OpenCV
  6. C++ 读取两行不确定数量的整数
  7. 数据结构源码笔记(C语言):Huffman树字符编码
  8. Pandas简明教程:六、Pandas条件查询
  9. 模糊数学笔记:五、模糊聚类
  10. 非监督HMP算法的物体识别