[Fw]How to Add a System Call(Fedora Core 6 Kernel : 2.6.18)
How to Add a System Call
Kernel : 2.6.18
編譯環境 : Fedora Core 6
假設要加的system call為 sys_project, 有一個int的輸入參數
一、在linux source code的部份(以 linux 代表source code的根目錄)
- linux/arch/i386/kernel/syscall_table.S的最後面加上要新增的system call名稱
如果syscall_table.S的最後面長得像這樣.
.
.long sys_tee /* 315 */
.long sys_vmsplice
.long sys_move_pages那麼要加入sys_project就要把它改成這樣, 這裡的".long"是必須的, 它並不是代表回傳的型態, 而是Linux Assembly的一個語法
.
.
.long sys_tee /* 315 */
.long sys_vmsplice
.long sys_move_pages
.long sys_project /* 318 */而所加的定義在檔案中的順序, 其實也就是這個system call的system call number, 此例中是318
- linux/include/asm/unistd.h裡面加上自己的define
unistd.h裡面會有一段跟syscall_table.S很像的define, 不過在這裡system call是以"__NR_"開頭, 而其後跟著的數值則是system call number, 如果在它定義的最後一個system call附近像這樣.
.
#define __NR_vmsplice 316
#define __NR_move_pages 317#ifdef __KERNEL__
#define NR_syscalls 318
.
.因為 NR_syscalls 的值必須等於最大的system call加 1, 所以在根據syscall_table.S中的順序修改unistd.h之後, 不要忘了修改NR_syscalls的值
.
.
#define __NR_vmsplice 316
#define __NR_move_pages 317
#define __NR_project 318#ifdef __KERNEL__
#define NR_syscalls 319
.
. - linux/include/linux/syscalls.h裡面加上函式的定義
函式定義前面必須加上asmlinkage以確保編譯時連結的正確性, 所以加完後的狀況大概像這樣.
.
asmlinkage long sys_set_robust_list(struct robust_list_head __user *head,
size_t len);
asmlinkage long sys_project( int i );#endif
- 將system call的實作檔放入source code tree中
原則上, 實作檔應該根據 syscall 的類型放在相對應的資料夾中, 然後再將實作檔編譯後的.o檔檔名加入該資料夾下的Makefile的obj-y之中, 假設實作檔的source code為project.c, 放在linux/kernel/, 那linux/kernel/Makefile改完後大概長這樣.
.
obj-y = project.o sched.o fork.o exec_domain.o panic.o printk.o profile.o \
.
.而在撰寫實作檔的時候, 請記得將"#include <linux/linkage.h>"加進去, 否則編譯將會發生問題, 以下是一個實作檔的範例
project.c
#ifndef __LINUX_PROJECT
#define __LINUX_PROJECT#include <linux/linkage.h>
#include <linux/kernel.h>asmlinkage long sys_project( int i ){
printk( "Success!! -- %d\n", i );
return 0;
}#endif
- 在/usr/include/asm/unistd.h中加入定義讓User能呼叫
其實在上一步驟整個system call已經算是加好了, 但此時User只能以system call number呼叫(此例中是318), 為了讓User能以system call的名字呼叫, 所以要修改/usr/include/asm/unistd.h,改完結果像這樣.
.
#define __NR_vmsplice 316
#define __NR_move_pages 317
#define __NR_project 318#endif /* _ASM_I386_UNISTD_H_ */
- 重新編譯Kernel---->大功告成!!!
二、如何呼叫System call
要呼叫system call, 必須加入"#include<syscall.h>", 並以syscall( __NR_[system call的名字], [參數1, 參數2,...] )來呼叫, 如果沒有做步驟 5, 則必須以syscall( [system call number], [參數1, 參數2,...] )來呼叫, 以下是一個範例
#include<syscall.h>
int main(){
syscall( __NR_project, 2 );
/* 如果沒有做步驟 5, 就用syscall( 318, 2 ); 代替 */
return 0;
}
執行結果
[root@localhost test]# ./a.out
[root@localhost test]# dmesg
.
.
.
Success!! -- 2
[root@localhost test]#
---------
linux/include/linux/syscalls.h
task_struct
asmlinkage long sys_project(char *test_array,char *test_array_tail,int operation);
----------
How to Add a System Call
假設要加的system call為 sys_project, 有一個int的輸入參數
注意有些地方該是sys_開頭(syscalls.h)
In source code 的根目錄:
arch/i386/kernel/syscall_table.S
include/asm-i386/unistd.h
include/linux/syscalls.h
kernel/Makefile
系統根目錄
/usr/include/asm/unistd.h
來源:
http://adl.csie.ncu.edu.tw/~ernieshu/syscall_2_6_35.htm
http://adl.csie.ncu.edu.tw/~ernieshu/syscall.htm
[Fw]How to Add a System Call(Fedora Core 6 Kernel : 2.6.18)的更多相关文章
- System.ArgumentException: 已添加了具有相同键的项。(An item with the same key has already been added) 在 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) 在 System.Web.Mvc.Js
最近将一个项目从ASP.NET MVC 3升级至刚刚发布的ASP.NET MVC 5.1,升级后发现一个ajax请求出现了500错误,日志中记录的详细异常信息如下: System.ArgumentEx ...
- Entity Framework优化一:引发了“System.Data.Entity.Core.EntityCommandExecutionException”类型的异常
错误信息: “System.Data.Entity.Core.EntityCommandExecutionException”类型的异常在 EntityFramework.SqlServer.dll ...
- 使用EF6.0出现:CS0029 无法将类型“System.Data.Entity.Core.Objects.ObjectContext”隐式转换为“System.Data.Objects.ObjectContext”错误
这是因为EF6.0重构了一些命名空间后,和VS原有的实体数据模型模板不一致了(ObjectContext context = ((IObjectContextAdapter)dataContext). ...
- System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.InvalidOperationException: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
2017/8/15 20:55:21 [AgentPayQuery_205506102_1BBBB]系统异常:System.Data.Entity.Core.EntityException: The ...
- EF Core中关于System.Linq.Dynamic.Core的使用(转载)
项目中经常用到组合条件查询,根据用户配置的查询条件进行搜索,拼接SQL容易造成SQL注入,普通的LINQ可以用表达式树来完成,但也比较麻烦.有个System.Linq.Dynamic.Core用起来比 ...
- Fedora Core 11 Alpha试用视频(由于youtube问题暂时无法访问)
1.系统安装: http://www.youtube.com/watch?v=QcDy5eRQZ20 2.重启后配置 3.体验Fedora 11 Gnome2.25和Kde 4.2 http: ...
- System.Data.Entity.Core.EntityException: 可能由于暂时性失败引发了异常。如果您在连接到 SQL Azure 数据库,请考虑使用 SqlAzureExecutionStrategy。
代码异常描述 ************** 异常文本 **************System.Data.Entity.Core.EntityException: 可能由于暂时性失败引发了异常.如果 ...
- Error message: Failed to spawn: unable to access process with pid 413 due to system restrictions; try `sudo sysctl kernel.yama.ptrace_scope=0`, or run Frida as root
Android 8.0 在frida中使用 -f 参数报错, Error message: Failed to spawn: unable to access process with pid 413 ...
- Add a system call on Ubuntu 13.04(x64) with x86_64
We added a system call to modify idt table, then programed it in modify_idt.c 1. Put our modify_idt. ...
随机推荐
- webpack打包配置中出现的问题
第一个错误: One CLI for webpack must be installed. These are recommended choices, delivered as separate p ...
- 查看x86主機是否支援64bit in Linux
$cat /proc/cpuinfo 查看flags 欄位中是否有 lm (long mode)
- POJ 2412 /// 空间几何 经纬度转三维坐标 角度转弧度 法向量
题目大意: 给定半径6378km的球上的 多个地点 及其 经纬度 多个询问 给定三个地点 A B C A与B的等距点在球上形成一个大圆 即球面上有一个到两点距离相等的大圆 且大圆所在平面垂直两点连线 ...
- 附: K8S入门系列之集群健康检查
Kubernetes的kubectl常用命令 1. pod操作 # 获取所有的pod kubectl get pods --all-namespaces -o wide # 使用yaml文件创建pod ...
- VIM编辑器使用及插件配置
1.VIM的三种模式: 普通模式.插入模式.命令行模式2.三种模式的转换: 2.1进入普通模式 ①打开VIM默认为普通模式 ②处于插入模式/命令行模式时,按ESC进入普通模式 2.2进入插入模式: A ...
- js常用扩展方法
在日常的开发过程中,经常会碰到javaScript原生对象方法不够用的情况,所以经常会对javaScript原生方法进行扩展.下面就是在实际工作时,经常使用的一些方法,做一下记录,有需要的可以拿去. ...
- js转换成布尔类型boolean
/** * js转换成布尔值 * a.转换方法:Boolean(var) * b.数字转换成布尔,除了0与NaN,其余都是true * c.字符串转换成布尔,除了空串"",其余都是 ...
- 第五组postmortem报告
为期近半年的软工课程顺利收工了.这一个学期的网站制作中, 憧憬过.懊恼过.兴奋过,回顾整个制作过程,我们按老师的要求来一份验尸报告. 1. 每个成员在beta 阶段的实践和alpha 阶段有何改进? ...
- 小白struts2 札记
struts2里面的filter 也就是起个过滤作用的 1 过滤request 请求2 过滤文件类型 禁用的文字等
- OpenCV常用基本处理函数(5)图像模糊
2D卷积操作 cv.filter2D() 可以让我们对一幅图像进行卷积操作, 图像模糊(图像平滑)使用低通滤波器可以达到图像模糊的目的.这对与去除噪音很有帮助.其实就是去除图像中的高频成分(比如:噪音 ...