操作系统课程设计和实验

来源:互联网 发布:数据库日志恢复 编辑:程序博客网 时间:2024/05/16 00:46
用户进程并不能直接调用系统调用,而是通过终端向量表实现.,假设新的系统调用叫myservice1, 编辑linux/arch/i386/kernel/entry.s  .dataENTRY(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.o4, 系统调用源文件基础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);#endifmyservice.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.cvoid __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.htmlhttp://hekimian-williams.com/?p=20http://blog.techveda.org/index.php/adding-system-calls-linux-kernel-3-5-x/ //这个好像有操作命令中文的:http://www.verydemo.com/demo_c269_i1333.htmllinux的目录树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


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