孟伟丽 L12 2018-04-13 17:41:00 系统调用
658 0

“操作系统原理与实践(南阳理工学院)”实验报告

系统调用

代码的修改和补充

include/linux/sys.h:

添加声明:

extern int sys_iam(); extern int sys_whoam(); 在sys_call_table数组的最后增加两个元素:

..., sys_iam, sys_whoami} include/unistd.h:

定义调用号宏:

define __NR_iam 72

define __NR_whoami 73

声明供用户调用的函数:

int iam(const char *name); int whoami(char *name, unsigned int size); kernel/system_call.s:

修改调用个数(从72改为74,调用号从0开始计数):

nr_system_calls = 74 +kernel/who.c:

添加此文件,实现系统调用:

复制代码 图片描述

图片描述

图片描述

图片描述

图片描述

define LIBRARY

include <asm/segment.h>

include <errno.h>

include <unistd.h>

define MAX_SIZE 23

char username[MAX_SIZE+1];

int sys_iam(const char *name) { int i; for(i=0; get_fs_byte(name+i)!='\0'; i++);      // 注解1:get_fs_byte() printk("sys_iam:\n\t name size is:%d \n", i); if(i>MAX_SIZE) return -EINVAL; for(i=0; (username[i]=get_fs_byte(name+i))!='\0'; i++); return i; }

int sys_whoami(char *name, unsigned int size) { int i; for(i=0; put_fs_byte(username[i], name+i), username[i]!='\0'; i++); printk("sys_whoami:\n\t username size is:%d \n\t given size is:%d\n", i, size); if(i>size) return -EINVAL; return i; }

kernel/Makefile:

修改Makefile,补充与who.c相关规则:

复制代码 OBJS = ... who.o ......

Dependencies:

who.s who.o: who.c ../include/unistd.h
../include/asm/segment.h ../include/errno.h ...... 复制代码 测试

添加测试用例

运行oslab目录下的mount-hdc,挂载虚拟硬盘:

cd ~/workspace/oslab sudo ./mount-hdc cd hdc/usr/root 添加测试文件:

sudo vim iam.c iam.c具体内容:

复制代码 #include <stdio.h> #define LIBRARY  # 在unistd.h中,调用号与_syscall*宏函数都是在定义了__LIBRARY__的前提下才定义的 #include <unistd.h> _syscall1(int,iam,const char ,name)  # 注解2:_syscall()

int main(int argc, char *argv[]) { if(argc<=1) { printf("error: input your name, please! \n "); return -1; } if(iam(argv[1])==-1) { printf("error: length limit is 23. \n"); return -1; } return 0; } 复制代码 sudo vim whoami.c 复制代码 #include <stdio.h> #define LIBRARY #include <unistd.h> _syscall2(int,whoami,char *,name,unsigned int,size)

int main(int argc, char *argv[]) { char name[24]; if(whoami(name, 23)==-1) { printf("error while reading name..."); return -1; } printf("%s\n", name); return 0; } testlab2.c testlab2.sh ,也将它们下载放到当前目录下。

替换部分库文件:

由于挂载的虚拟硬盘为oslab目录下的hdc-0.11.img,里面的文件不会随着内核的编译而改变,我们手动替换改动的库文件:

sudo cp ~/oslab/linux-0.11/include/linux/sys.h ~/oslab/hdc/usr/include/linux/sys.h sudo cp ~/oslab/linux-0.11/include/unistd.h ~/oslab/hdc/usr/include/unistd.h OK,我们现在可以卸载hdc了:

cd ~/oslab sudo umount hdc 编译与运行

cd linux-0.11 make ../run

开启时默认的目录即为/usr/root。

编译C文件:

gcc -o iam iam.c gcc -o whoami whoami.c gcc -o testlab2 testlab2.c sync 在bochs上的linux-0.11中产生或修改的文件需要手动写入硬盘,否则关闭虚拟机后不会保存。

./iam ./whoami

./testlab2

最新评论
暂无评论~