用户进程并不能直接调用系统调用,而是通过终端向量表实现.,
假设新的系统调用叫myservice
1, 编辑linux/arch/i386/kernel/entry.s
.data
ENTRY(sys_call_table)
.long SYMBOL_NAME(sys_ni_call) /* 0 */
.long SYMBOL_NAME(sys_exit)
.long SYMBOL_NAME(sys_fork)
...
.long SYMBOL_NAME(sys_vfork) /* 190 */
.long SYMBOL_NAME(sys_myservice) /*191*/
2, 生成stub这样一个普通用户程序可以可以调用你的系统调用. 编辑linux/include/asm/unistd.h
/*
* This file contains the system call numbers.
*/
#define __NR_exit 1
#define __NR_fork 2
...
#define __NR_vfork 190
添加:
#define __NR_myservice 191
3.编写源文件
目录linux/include/linux/ 存放独立于系统的调用
目录linux/include/asm/ 存放特定依赖书具体系统的调用,比如同步方法-
源文件放在linux/ipc(例如同步方法)或者linux/fs/(文件系统相关的)
修改原文件目录下的makefile, 添加
O_OBJS += ... myservice.o
4, 系统调用源文件基础
myservice.h:
#ifndef __LINUX_MYSERVICE_H
#define __LINUX_MYSERVICE_H
#include <linux/unistd.h>
#include <linux/linkage.h>
_syscall2(int, myservice, int, arg1, char*, arg2);
#endif
myservice.c:
#include <linux/myservice.h>
asmlinkage int sys_myservice (int arg1, char* arg2)
{
return(1);
}
myservice.h放置在linux/include/linux/下
5,添加初始化函数,为的是系统可以使用剥夺式方法?
在myservice.h:
...
#include <linux/init.h>
...
void __init myservice_init(void);
在myservice.c
void __init myservice_init(void)
{
/* initialize global variables used by myservice */
}
修改linux/init/main.c
...
/* Around line 89 */
extern void myservice_init(void);
...
/* Around line 1352 within "asmlinkage void __init start_kernel(void)" */
myservice_init();
6. 基本的内核库函数
收集到的一些信息:
Fedora 9 kernel 2.6.26 (i686) 的 arch/x86/kernel/ 下砸
syscall_table_32.S 变到了 Linux/arch/x86/syscalls/
参考
http://www.csee.umbc.edu/courses/undergraduate/CMSC421/fall02/burt/projects/howto_add_systemcall.html
http://hekimian-williams.com/?p=20
http://blog.techveda.org/index.php/adding-system-calls-linux-kernel-3-5-x/ //这个好像有操作命令
中文的:
http://www.verydemo.com/demo_c269_i1333.html
linux的目录树
http://lxr.free-electrons.com/source/fs/
http://www.cnblogs.com/wang_yb/archive/2012/09/17/2688263.html
2013年4月13日8:39:35
研究了一番,发现内核是不会调用C库的.所以只好自己写了,但是就算是写好了,怎么在编译之前知道自己是不是对的呢.
参考<linux内核设计与实现>57页
怎么测试自己的内核程序,现在有两种方案,解决编译问题.
一种是:从用户空间调用系统调用.
一种是:把自己的程序当成一个模块挂载到内核.
现在我选择后一种进行探索:
参考点击打开链接
2013年5月29日19:34:23
要做实验;
在unix环境高级编程里面,开始讲tellwait模型的是在 竞争条件中.
原文说的是在10.16节说明信号的一种实现, 15-3 会讲到管道的的一种实现.
那么我采取信号的方式.线程同步讲的是互斥量
http://www.myexception.cn/linux-unix/1051856.html
第一版本,因为没有互相唤醒