sys.h
、unistd.h
、system_call.s
和Makefile
。include/unistd.h
中添加系统调用编号 __NR_iam
和 __NR_whoami
。#define __NR_iam 72
#define __NR_whoami 73
copy
include/linux/sys.h
中声明系统调用。extern int sys_iam();
extern int sys_whoami();
fn_ptr sys_call_table[] = { ..., sys_iam, sys_whoami };
copy
kernel/system_call.s
中修改系统调用数量。nr_system_calls = 74
copy
kernel/Makefile
中添加 who.c
的编译选项。OBJS = ... who.o
who.s who.o: who.c ../include/linux/kernel.h ../include/unistd.h
copy
who.c
#include <linux/kernel.h>
#include <errno.h>
#include <asm/segment.h>
char username[24], buf[24];
int sys_iam(const char* name) {
int i, flag;
for (i = 0, flag = 0; i < 24; i++) {
buf[i] = get_fs_byte(&name[i]);
if (buf[i] == '\0') {
flag = 1;
break;
}
}
if (!flag) {
return -(EINVAL);
}
else {
i = 0;
while (buf[i] != '\0') {
username[i] = buf[i];
i++;
}
username[i] = '\0';
}
return i;
}
int sys_whoami(char* name, unsigned int size) {
int i, flag;
for (i = 0, flag = 0; i < size; i++) {
if (username[i] == '\0') {
flag = 1;
break;
}
else {
put_fs_byte(username[i], &name[i]);
}
}
if (!flag) {
if (size != 0) {
put_fs_byte('\0', &name[size - 1]);
}
return -(EINVAL);
}
return i;
}
copy
iam.c
和 whoami.c
iam.c
测试系统调用 iam()
#define __LIBRARY__
#include "unistd.h"
#include "errno.h"
#include <stdio.h>
_syscall1(int, iam, const char*, name);
_syscall2(int, whoami, char*, name, unsigned int, size);
int main(int argc, char** argv) {
int n;
if (argc < 2) {
printf("Usage: %s [name]\n", argv[0]);
return 0;
}
n = iam(argv[1]);
return 0;
}
copy
whoami.c
测试系统调用 whoami()
#define __LIBRARY__
#include "unistd.h"
#include "errno.h"
#include <stdio.h>
char name[24];
_syscall1(int, iam, const char*, name);
_syscall2(int, whoami, char*, name, unsigned int, size);
int main() {
int n;
n = whoami(name, 24);
printf("%s\n", name);
return 0;
}
copy
iam.c
、whoami.c
、testlab2.c
和 testlab2.sh
复制到虚拟机中,以及修改后的 unistd.c
cd linux-0.11
make
cd ..
sudo ./mount-hdc
sudo cp iam.c ./hdc
sudo cp whoami.c ./hdc
sudo cp /home/teacher/testlab2.c ./hdc
sudo cp /home/teacher/testlab2.sh ./hdc
sudo cp ./linux-0.11/include/unistd.h ./hdc/usr/include
sudo umount hdc
copy
./run
copy
cd /
gcc -o iam iam.c -Wall
gcc -o whoami whoami.c -Wall
gcc -o testlab2 testlab2.c -Wall
testlab2
testlab2.sh
copy
运行 testlab2
和 testlab2.sh
,结果如下。
可以看到,运行结果完全正确,系统调用成功。
本次实验,我认识了系统调用接口,对系统调用的过程有了深入了解,可以自己添加、删除、修改系统调用接口,能控制系统调用的过程,学习到了新的调试内核的方式(printk()
函数),为后续实验做准备。
include/unistd.h
中加入 __NR_foo
的调用编号定义,然后在 include/linux/sys.h
中加入函数声明 extern void sys_foo();
和入口表项 fn_ptr sys_call_table[] = { ..., sys_foo };
,再在 kernel/system_call.s
中修改系统调用的数量,最后添加 foo.c
实现 sys_foo()
函数并在 Makefile
中添加此文件的编译选项(OBJS
中的 foo.o
和 foo.s foo.o
的依赖规则)。学习时间 330分钟
操作时间 248分钟
按键次数 14863次
实验次数 20次
报告字数 4592字
是否完成 完成