在内核中添加系统调用
前面我们学习了在内核中添加自己的代码,这次我们在内核中添加一个自己的系统调用,就像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
在内核中添加系统调用相关推荐
- MIPS(loongson)linux 中添加系统调用
在基于MISP(loongson)架构处理器与基于 x86 架构处理器的 linux 内核中添加系统调用时更改的文件是不同的,x86 中需要更改 arch/x86/kernel/syscall_tab ...
- linux内核syscall_define6,linux中添加系统调用
1)在内核里添加系统调用,函数形式是:asmlinkage type sys_func_name(...) 2)在文件include/asm-arm/unistd.h里面添加 define __NR_ ...
- linux 3.5.0-23-generic内核版本系统调用数目,Linux操作系统分析(三)- 更新内核与添加系统调用...
环境:Ubuntu 12.10 学号:SA****199 1.更新内核: 直接安装的系统内核版本一般不是最新,用 uname -a 查看一下 自己的版本,OK,我的是: Linux chenh ...
- Linux-0.11内核学习-添加系统调用
1.参考资料 赵炯博士的网站oldlinux Linux内核完全注释 Linux0.11 源码 2.概要 操作系统作为软件应用层和底层硬件之间的部分,向下提供服务,向上提供接口.系统调用便是操作系统向 ...
- i.MX 6ULL 驱动开发 二十九:向 Linux 内核中添加自己编写驱动
一.概述 Linux 内核编译流程如下: 1.配置 Linux 内核. 2.编译 Linux 内核. 说明:进入 Linux 内核源码,使用 make help 参看相关配置. 二.make menu ...
- 【内核驱动】 内核驱动中添加系统调用
开发环境: Redhat6.5 开发板: Tiny4412 (ARM Cortex A9) 1. 系统调用概述 系统调用请点击 系统调用概述 2. 实现系统调用的步骤 添加一个系统调用比较简单,下面以 ...
- 操作系统作业:向内核中添加一个系统调用
本文主要突出操作中遇到的问题及解决方案,关于详细过程不做过多展示,大家可以参考 https://blog.csdn.net/qq_41175905/article/details/80529245 h ...
- 西电软工操作系统实验:编译Ubuntu18.04新内核并添加系统调用(含代码以及详细分析)
西电软工操作系统实验一:编译Linux内核 目录 (一)前言 (二)实验内容 (三)实验环境 (四)实验过程 4.1安装虚拟机 4.2虚拟机换源 4.3 添加系统调用内核 4.4 下载编译所需的软件依 ...
- 粤嵌实验板 linux 环境,粤嵌linux基础入门学习 linux系统中添加系统调用
linux系统中添加系统是怎样调用的?从linux基础入门学习出发,一起来看看: 1.每个体系下面均有对应的系统调用列表: arch/arm/kernel/calls.S 在最后添加一个新的系统调用标 ...
最新文章
- 渐进式迭代教学法--PHP
- 【测试】ABAP直连外部数据库
- Android集成三方浏览器之Crosswalk
- interface关键字
- vue,computed,计算属性
- Android开发笔记(五十五)手机设备基本操作
- cf不能全屏win7的解决方法_win10玩cf不能全屏的解决方法教程
- 2019.2.18接口2
- PlistEdit Pro for Mac(Plist编辑器)
- 在 Chrome 浏览器中安装印象笔记·剪藏插件
- Photoshop 合并序列帧图片单张多帧图片
- 直播教学系统16项功能
- 枕头里面加进这些小宝贝能治高血压!快告知你父母~
- photoshop--PS拼图
- 阻击黑客,你需要了解这些云安全“潜规则”
- 1.2 Unity3D 的注册
- 基于Thinkphp5+EasyWeChat+fastadmin微信小程序授权登录获取手机号微信公众号网页---联合授权登录
- javaweb第三天JavaScript知识点(来自广陵散老师)
- 【行为分析】(二)前端埋点实现及原理分析
- 输出一个 n 阶的方阵