操作系统课程设计和实验

用户进程并不能直接调用系统调用,而是通过终端向量表实现.,
假设新的系统调用叫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


第一版本,因为没有互相唤醒


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值