在Linux Kernel內新增一个System Call(转)[@more@]本文作者: gpmoney

使用 system call 去呼叫系統的函式是非常好玩的,但是要如何寫出一個自己的system call 呢?這邊有以下數個步驟,如果你是自己想要呼叫 system call 那可以跳過 (1) (2) 直接到第三項這邊假設你己經熟悉 kernel 的 compile 和如何利用新 compile 的 kernel 重新開機

(1) 設定 include 檔內的 syscall function

首先,找到 /usr/inlcude/asm/unistd.h 這個檔案,在這一行

#define __NR_getdents64 220

#define __NR_fcntl64 221

的後面加上 :

#define __NR_myfunc 222

然後找到 /usr/include/bits/syscall.h 這個檔案,再加上一行 :

#define SYS_myfunc __NR_myfunc

找到 /usr/src/linux/arch/i386/kernel/entry.S 這個檔案也是在最後面加上並修改標記為紅色的這二行

.long SYMBOL_NAME(sys_getdents64) /* 220 */

.long SYMBOL_NAME(sys_fcntl64)

.long SYMBOL_NAME(sys_myfunc) --&gt 增加這一行

#ifdef CONFIG_TUX

.long SYMBOL_NAME(__sys_tux)

#else

# ifdef CONFIG_TUX_MODULE

.long SYMBOL_NAME(sys_tux)

# endif

#endif

/*

* NOTE!! This doesn't have to be exact - we just have

* to make sure we have _enough_ of the "sys_ni_syscall"

* entries. Don't panic if you notice that this hasn't

* been shrunk every time we add a new system call.

*/

.rept NR_syscalls-222 ----&gt 改成 NR_syscalls-223

.long SYMBOL_NAME(sys_ni_syscall)

.endr

(2) 撰寫 syscall 的範例程式

假設你的 linux kernel code 在 /usr/src/linux 下找到 /usr/src/linux/kernel/sys.c

加上以上這幾行 :

asmlinkageintsys_myfunc(int input){

printk("<1> Input value is : %d

",input);

return input*10;

}

改完以後,就可以重新 compile kernel 並且重新開機了。

(3) 撰寫 user space 的小程式

use_syscall.c

#include

#include

#include

static inline _syscall1(int,myfunc,int,a)

int main(void){

printf("Return Value: %d

",myfunc(10));

}

這樣執行完以後,你就可以看到這個程式輸出 100

如果你還有興趣,可以使用 tail -f /var/log/message 會出現類似的訊息,表示你的程式有經由 printk 印到畫面上

Sep 3 22:02:02 private kernel: Input value is : 10

_syscall1 是一個 macro 指令,事實上是 _syscallN 的指令 , N 代表系統呼叫所需要用到的參數個數

_syscallN(arg1,arg2,arg3,arg4) :

arg1 : 代表的是傳回值

arg2 : 代表的是要呼叫的 syscall name

arg3 : 代表的是傳入參數的型態

arg4 : 代表的是傳入參數的名稱

系統總共定義了 6 個 _syscallN , 從 _syscall0 到 _syscall5 . 因為這是呼叫 int 0x80 的限制,各位大概發現了一件事,這個只是協助各位去呼叫 int 0x80 這個系統中斷函式,不過 linux 幫我們包的很好

(4) 編譯程式

#gcc -O2 use_syscall.c use_syscall

#./use_syscall

Return Value: 100

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10617731/viewspace-950450/,如需转载,请注明出处,否则将追究法律责任。

linux 内核 call,在Linux Kernel內新增一个System Call(转)相关推荐

  1. Linux 内核 4.20 圣诞发布!新增硬件支持,性能有所改进

    就在圣诞节前夕,Linus Torvalds于12月23日正式宣布发布Linux 内核4.20.在官方声明中,Linus Torvalds表示他不会考虑再延迟一周,因为所有人都要休假了. 我鼓励大家及 ...

  2. 手机linux内核版本了解,Linux内核版本介绍与查询

    Linux内核版本命名在不同时期有着不同的规范,在涉及到Linux版本问题时经常容易混淆,主线版本/稳定版/长期支持版本经常搞不清楚,本文主要记录下内核版本命名的规则以及如何查看Linux系统版本信息 ...

  3. 【Linux 内核】编译 Linux 内核 ⑤ ( 查看 .config 编译配置文件 | 正式编译内核 )

    文章目录 一.查看 .config 编译配置文件 二.正式编译内核 一.查看 .config 编译配置文件 在上一篇博客 [Linux 内核]编译 Linux 内核 ④ ( 打开 Linux 内核编译 ...

  4. 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的 Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 )

    文章目录 一.下载 Linux 内核 1.下载最新版本 Linux 内核 2.下载指定版本 Linux 内核 二.Linux 内核版本号含义 一.下载 Linux 内核 1.下载最新版本 Linux ...

  5. qemu debug linux内核,qemu调试linux内核

    2012.03.19 网上时间过早的讲编译内核的文章完全不用看,比如什么讲kgdb的,现在这个东西早就被集成到内核里了.还有调试内核的一些允许kernel debugging的选项,在新版本中也早已是 ...

  6. linux内核能否扩展,Linux内核用到的GCC扩展

    GNC CC是一个功能非常强大的跨平台C编译器,它对C 语言提供了很多扩展,这些扩展对优化.目标代码布局.更安全的检查等方面提供了很强的支持.本文把支持GNU 扩展的C 语言称为GNU C. Linu ...

  7. 简述arm linux内核启动流程,Linux内核启动过程和Bootloader(总述)

    1.Linux内核启动过程概述 一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux 内核,文件系统,应用程序.其中 Bootloader是系统启 ...

  8. 武汉linux内核好找吗,Linux内核入门

    Linux内核入门 收藏 如何获取Linux内核源代码 下载Linux内核当然要去http://www.kernel.org/了,网站提供了两种文件下载,一种是完整的Linux内核,另一种是内核增量补 ...

  9. linux 内核优化实战,Linux编译优化必须掌握的几个姿势总结

    01.编译选项和内核编译 Linux内核(英语:linux kernel),是一种计算机操作系统内核,已C语言和汇编语言写成,匹配POSIX标准,以GNU通用公共许可证发布.从技术上说Linux只是一 ...

最新文章

  1. POJ 1414 Life Line(搜索)
  2. 图解Windows网络命令使用实例
  3. linux安装磁盘分区设置,Linux安装与磁盘分区.doc
  4. python合并两个数据框_python 学习的第五天 数据框合并
  5. SpringBoot的端口配置server.port没办法设置成Linux的环境变量
  6. Linux禁用user01账户,Linux 管理用户 useradd
  7. 链接聚合是将一组物理接口_500字描述华为VLAN聚合工作原理 你看懂了吗?
  8. raid 物理盘缓存状态_使用MegaCli工具查看Raid磁盘阵列状态
  9. 介绍一种 Python 更方便的爬虫代理池实现方案
  10. 深入理解K8S网络原理上
  11. 从技术到应用实践,揭秘京东区块链布局全景
  12. 病毒名称:Hacktool (正当追杀+旁门左道)
  13. Unity3D动态加载FBX文件
  14. 显示器偏色测试软件,显示器显示偏色
  15. 数据特征分析:帕累托分析(贡献度分析)
  16. 数据分析-np、pd常用函数
  17. 在论文中加入(制作)目录方法
  18. 用python找出400多万次KDJ金叉死叉,胜率有多高?附代码
  19. 错误检测的奇偶校验方法
  20. 针对好玩游戏物品清单

热门文章

  1. 重磅!OpenMMLab 更新啦!分类/检测/分割/3D等项目全面升级
  2. Intellij Idea创建一个简单的java项目
  3. Chemistry.AI | 基于线性回归预测分子特性
  4. RDKit | 基于相似图可视化原子贡献
  5. SQL基本语法和书写格式
  6. CentOS7(64位)下运行IPython3出错解决办法
  7. 柚子小姐,Happy Birthday
  8. qchart画完以后删除_Unity2019基础教程:TileMap搭建像素画场景关卡
  9. 专业的秘密 | 南方医科大学生物信息学专业
  10. MS:中山大学丁涛/吴忠道-肠道菌群调控血吸虫病传播媒介光滑双脐螺适生性的新机制...