为Linux0.11添加系统调用
- 一,在 include/unistd.h 中为iam和whoami增加系统调用号:
- 二,修改 kernel/system_call.s 中的系统调用总数:
- 三,在include/linux/sys.h中sys_call_table函数表中增加两个函数引用
- ==将include/linux/sys.h,include/unistd.h复制到hdc/usr/include对应目录下,否则编译不通过==
- 四:在 kernal/ 中新增who.c实现sys_iam与sys_whoami:
- 五,修改 kernal/ 中的 Makefile
- 六,在linux-0.11目录下执行make all。
- 七,在oslab/hdc/usr/root中增加测试程序:
- 八,编译并测试
哈工大李治军老师:实验楼 linux0.11源代码在这里
1.操作系统之——为Linux0.11添加系统调用
2.操作系统—linux0.11系统调用
3.在ubuntu20.04中配置Linux0.11实验环境
本文主要总结以上文章,对出错的地方进行校正
一,在 include/unistd.h 中为iam和whoami增加系统调用号:
#define __NR_whoami 72
#define __NR_iam 73
二,修改 kernel/system_call.s 中的系统调用总数:
nr_system_calls = 74
三,在include/linux/sys.h中sys_call_table函数表中增加两个函数引用
增加两个函数引用 ——sys_iam 和 sys_whoami。
与第一步的添加顺序一定要对应,否则编译出错
将include/linux/sys.h,include/unistd.h复制到hdc/usr/include对应目录下,否则编译不通过
cd /home/shiyanlou/oslab/oslab
sudo ./mount-hdc
cd hdc/usr/include
四:在 kernal/ 中新增who.c实现sys_iam与sys_whoami:
#include <errno.h>
#include <unistd.h>
#include <asm/segment.h>
#include <linux/kernel.h>
#define MAXLEN 23
char username[MAXLEN+1] = {0};
int sys_iam(const char* myname)
{
printk("sys_iam is running...\n");
unsigned int i = 0;
unsigned int namelen = 0;
while(get_fs_byte(myname+namelen)!='\0')
++namelen;
if(namelen > MAXLEN){
errno = EINVAL;
return -1;
}
printk("namelen: %d\n", namelen);
while(i < namelen){
username[i] = get_fs_byte(myname+i);
++i;
}
username[i] = '\0';
printk("username: %s\n", username);
return namelen;
}
int sys_whoami(char* myname, unsigned int size)
{
printk("sys_whoami is running...\n");
unsigned int i = 0;
unsigned int namelen = 0;
while(username[namelen] != '\0')
++namelen;
if(size < namelen){
errno = EINVAL;
return -1;
}
for(; i<=namelen; i++){
put_fs_byte(username[i], myname+i);
}
printk("namelen: %d\n", namelen);
return namelen;
}
五,修改 kernal/ 中的 Makefile
六,在linux-0.11目录下执行make all。
七,在oslab/hdc/usr/root中增加测试程序:
cd /home/shiyanlou/oslab/oslab
sudo ./mount-hdc
cd hdc/usr/root
iam.c
#define __LIBRARY__
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
_syscall1(int, iam, const char*, myname)
int main(int argc, char** argv)
{
int res = iam(argv[1]);
if(res == -1){
printf("systemcall failed\n");
}
else{
printf("systemcall success\n");
}
return 0;
}
whoami.c
#define __LIBRARY__
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
_syscall2(int, whoami, char*, myname, unsigned int, size)
#define SIZE 23
int main(int argc, char** argv)
{
char myname[SIZE+1] = {0};
int res = whoami(myname, SIZE+1);
if(res == -1)
printf("systemcall failed\n");
else{
/* printf("systemcall success\n");*/
printf("%s\n", myname);
}
return 0;
}
八,编译并测试
sudo umount hdc
oslab目录下#./run
必须在linux0.11中编译
gcc iam.c -o iam
gcc whoami.c -o whoami
至此编译后无错误即表示之前步骤正确