添加系统调用号
/* 添加的系统调用号 */ #define __NR_sem_open 72 #define __NR_sem_wait 73 #define __NR_sem_post 74 #define __NR_sem_unlink 75
文件位置:oslab/linux-0.11/include/unistd.h
改写系统调用数
nr_system_calls = 76
文件位置:oslab/linux-0.11/kernel/system_call.s
添加系统调用的定义
/* ... */ extern int sys_setregid(); /* 添加的系统调用定义 */ #include <linux/sem.h> extern i sys_sem_open(); extern int sys_sem_wait(); extern int sys_sem_post(); extern int sys_sem_unlink(); /* 在sys_call_table数组中添加系统调用的引用: */ fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read,……, sys_sem_open, sys_sem_wait, sys_sem_post, sys_sem_unlink},
文件位置:oslab/linux-0.11/include/linux/sys.h
修改工程文件的编译规则
/* 第一处 */ OBJS = sched.o system_call.o traps.o asm.o fork.o \ panic.o printk.o vsprintf.o sys.o exit.o \ signal.o mktime.o sem.o /* 第二处 */ ### Dependencies: sem.s sem.o: sem.c ../include/linux/kernel.h ../include/unistd.h \ ../include/linux/sem.h ../include/linux/sched.h exit.s exit.o: exit.c ../include/errno.h ../include/signal.h \ ../include/sys/types.h ../include/sys/wait.h ../include/linux/sched.h \ ../include/linux/head.h ../include/linux/fs.h ../include/linux/mm.h \ ../include/linux/kernel.h ../include/linux/tty.h ../include/termios.h \ ../include/asm/segment.h
文件位置:oslab/linux-0.11/kernel/Makefile
Debug
反复查看 sem.h 中的代码,找不到错误。后来看了一下 sem.h 文件,发现拙劣的拼写错误
修改后,编译成功!
挂载文件
将已经修改的 unistd.h 和 sem.h 文件以及用户文件 pc.c 拷贝到linux-0.11系统中,用于测试实现的信号量
sudo ./mount-hdc cp ./linux-0.11/include/unistd.h ./hdc/usr/include/ cp ./linux-0.11/include/linux/sem.h ./hdc/usr/include/linux/ cp ./pc.c ./hdc/usr/root/ sudo umount hdc/
测试
启动新编译的linux-0.11内核,用pc.c测试实现的信号量
gcc -o pc pc.c ./pc > wcf.txt sync
结果展示:
天道酬勤
Debug好几天,也看不出来哪里有问题,索性完全复制了一份别人的,这是做的最失败的一次实验,只能保证运行结果成功。