How to Add a System Call

Kernel : 2.6.18
編譯環境 : Fedora Core 6


假設要加的system call為 sys_project, 有一個int的輸入參數
一、在linux source code的部份(以 linux 代表source code的根目錄)

  1. 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

  2. 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
            .
            .

  3. 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

  4. 將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

  5. 在/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_ */

  6. 重新編譯Kernel---->大功告成!!!

二、如何呼叫System call
要呼叫system call, 必須加入"#include<syscall.h>", 並以syscall( __NR_[system call的名字], [參數1, 參數2,...] )來呼叫, 如果沒有做步驟 5, 則必須以syscall( [system call number], [參數1, 參數2,...] )來呼叫, 以下是一個範例

test.c

#include<syscall.h>

int main(){
        syscall( __NR_project, 2 );
        /* 如果沒有做步驟 5, 就用syscall( 318, 2 ); 代替 */
        return 0;
}

執行結果

[root@localhost test]# gcc test.c
[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

最新文章

  1. MongoDB win安装后无法远程连接访问
  2. JMeter学习(一)工具简单介绍
  3. 5.toogleButton以及Switch
  4. g++
  5. C# 获取字符串中的数字
  6. 01-05-01-1【Nhibernate (版本3.3.1.4000) 出入江湖】延迟加载及其class和集合(set、bag等)的Lazy属性配置组合对Get和Load方法的影响
  7. IT讲师韩顺平:我为什么辞去百万年薪,自己创业?
  8. 使用C#动态生成Word文档/Excel文档的程序测试通过后,部署到IIS服务器上,不能正常使用的问题解决方案
  9. Android基础笔记(十)- 帧动画、补间动画具体解释、对话框
  10. java web基础 --- URL重定向Filter
  11. 《HelloGitHub》第 18 期
  12. keras实现简单性别识别(二分类问题)
  13. hdu-1043 bfs+康拓展开hash
  14. mint18.3 升级linux-libc-dev_4.4.0-102.132 导致外接显示屏无法旋转,设置分辨率
  15. (转)c#反射
  16. Kali安装nessus
  17. 基于HA机制的MyCat架构——配置HAProxy
  18. C#编程(二十三)----------实现继承
  19. SVN的Hooks功能--强制添加注释
  20. VC++ PathFindFileName函数,由文件路径获得文件名

热门文章

  1. ABAP字符串处理
  2. Dubbo 系列(07-3)集群容错 - 负载均衡
  3. spring, spring mvc, mybatis整合文件配置详解
  4. Apache Shiro 会话+缓存+记住我(三)
  5. 【ARC076F】 Exhausted
  6. 深入Spring:自定义IOC
  7. 【记录】spring boot 整合mybatis 实体类返回日期格式化
  8. shell变量及相关命令
  9. Web 请求之--性能相关
  10. go语言从例子开始之Example23.通道缓冲