由于一时疏忽,导致who.c的代码不能通过部分测试数据,现已经改正。
今天整理了一下实验报告
在unistd.h中可以看到现在Linux 0.11 支持3个参数的传递。添加参数的方法大概有3条
1.可以采用ESI,EDI,EBP,ESP这几个寄存器传递参数。
2.可以采用《Linux 0.11注释》中提到的系统调用门的办法。
3.可以开辟一块用户态的空间,允许内核态访问,传递参数时,只需传递此空间的首地址指针即可。
向linux 0.11添加一个系统调用foo()的步骤:
首先。在内核中编写系统调用处理函数。
其次。在include/unistd.h中添加系统调用的功能号(#define __NR_foo **)
并且相应的在include/linux/sys.h中声明新的系统调用处理函数以及添加系统
调用处理程序指针数组表中该项的索引值。在make file中添加新系统调用所在
文件的编译、链接规则(依赖关系)。修改system_call.s中系统调用总数。
最后。在应用程序中提供接口,调用系统调用。
这次试验,需要用c来写,比上次要简单一些。
需要改写unistd.h sys.h system_call.s makefile 4个文件
而且需要自己写出 who.c iam.c whoami.c 3个文件
sys.h在 linux-0.11/include/linux 之中,源文件关键处如下
extern int sys_ssetmask();
extern int sys_setreuid();
extern int sys_setregid();
fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read,
sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,
sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod,
sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount,
sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm,
sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access,
sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,
sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid,
sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys,
sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit,
sy