代码的修改和补充
include/linux/sys.h:
添加声明:
extern int sys_iam(); extern int sys_whoam(); 在sys_call_table数组的最后增加两个元素:
..., sys_iam, sys_whoami} include/unistd.h:
定义调用号宏:
声明供用户调用的函数:
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:
添加此文件,实现系统调用:
复制代码
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 ......
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
学习时间 139分钟
操作时间 81分钟
按键次数 2576次
实验次数 1次
报告字数 3136字
是否完成 完成