一、实验目标
- 建立对系统调用接口的深入认识;
- 掌握系统调用的基本过程;
- 能添加自定义系统调用,完成系统调用的全面控制;
- 为后续实验做准备。
二、实验内容和结果
1. 添加系统调用
首先在 kernel/
下创建 who.c
,实现两个系统调用的处理函数:
#include <linux/kernel.h>
#include <asm/segment.h>
#include <errno.h>
#include <string.h>
char myname[24];
int mylen;
int sys_iam(const char * name)
{
int len = 0, i;
char str[30] = "";
for(i=0;;i++) {
str[i] = get_fs_byte(&name[i]);
if(str[i]=='\0' || i>23)
break;
len++;
}
if(len <= 23) {
strcpy(myname, str);
mylen = len;
return mylen;
}
return -EINVAL;
}
int sys_whoami(char * name, unsigned int size)
{
if(mylen >= size) {
return -EINVAL;
}
int i;
for(i=0; i<mylen; i++) {
put_fs_byte(myname[i], name+i);
}
return mylen;
}
name指针的字符串是用户空间的数据,在内核态无法直接访问,只能通过
include/asm/segment.h
中的get_fs_byte()
、get_fs_word()
等函数进行访问。同样地,内核要将数据传输到用户空间需要使用put_fs_byte()<