I 实验题目
在linux-0.11上添加两个系统调用并测试
(1)iam()
原型为int iam(const char *name)
将字符串参数name的内容拷贝到内核下保存下来,如果name长度小于等于23,返回拷贝的字符数。如果name的字符个数超过了23,返回-1,置errno为EINVAL。
(2)whoami()
原型为int whoami(char *name, unsigned int size);
iam()保存的名字拷贝到name所指的地址空间。确保不对name越界访问。返回值是拷贝的字符数,如果size小于需要的空间,则返回“-1”,置errno为EINVAL。
II 操作步骤
1.include/unistd.h中添加系统调用号
//include/unistd.h
#define __NR_whoami 72
#define __NR_iam 73
2.kernel/system_call.s修改系统总调用数为74
//kernel/system_call.s
nr_system_calls = 74
3.include/linux/sys.h添加调用
//include/linux/sys.h
extern int sys_whoami();
extern int sys_iam();
fn_ptr_sys_call_table[]={
...sys_whoami,sys_iam}
4.编写kernel/who.c
//kernel/who.c
#include <linux/kernel.h>
#include <asm/segment.h>
#include <unistd.h>
#include <errno.h>
int wholen = 0;
char whobuf[30];
int sys_iam(const char* name){
int len; //计算输入字符串长度
for(len=0; len<24