Linux-0.11操作系统实验2-系统调用

Helena ·
更新时间:2024-11-13
· 500 次阅读

实验环境:实验楼之系统调用

本文仅记录实验操作步骤,原理省略

内核层面的修改:

修改kernel/system_call.s 文件

nr_system_calls = 74 # 新增2个系统调用

修改 include/linux/sys.h 文件,进行extern声明,以及添加新的系统调用函数指针

extern int sys_whoami(); extern int sys_iam();

如下图所示:
在这里插入图片描述

修改添加 kernel/who.c 文件 编写实现 sys_iam函数和sys_whoami函数

#include #include #include char msg[24]; //23个字符 +'\0' = 24 int sys_iam(const char * name) /*** function:将name的内容拷贝到msg,name的长度不超过23个字符 return:拷贝的字符数。如果name的字符个数超过了23,则返回“­-1”,并置errno为EINVAL。 ****/ { int i; //临时存储 输入字符串 操作失败时不影响msg char tmp[30]; for(i=0; i<30; i++) { //从用户态内存取得数据 tmp[i] = get_fs_byte(name+i); if(tmp[i] == '\0') break; //字符串结束 } //printk(tmp); i=0; while(i 23) { // printk("String too long!\n"); return -(EINVAL); //置errno为EINVAL 返回“­-1” 具体见_syscalln宏展开 } strcpy(msg,tmp); //printk(tmp); return i; } int sys_whoami(char* name, unsigned int size) /*** function:将msg拷贝到name指向的用户地址空间中,确保不会对name越界访存(name的大小 由size说明) return: 拷贝的字符数。如果size小于需要的空间,则返回“­-1”,并置errno为EINVAL。 ****/ { //msg的长度大于 size int len = 0; for(;msg[len]!='\0';len++); if(len > size) { return -(EINVAL); } int i = 0; //把msg 输出至 name for(i=0; i<size; i++) { put_fs_byte(msg[i],name+i); if(msg[i] == '\0') break; //字符串结束 } return i; }

修改Makefile ,将 who.c 编译进内核
在这里插入图片描述

进入linux-0.11目录,内核重新编译,出现sync就成功了

应用层面的修改:

在ubuntu下实现iam.c和whoami.c的文件编写
注意
(1). 在linux0.11系统中的应用程序中,注释不能写//,必须要写/* */
(2). 不能在中间对变量定义,比如使用循环时的i要在开始定义,所有变量都必须要在一开始统一定义。

#include #define __LIBRARY__ #include #include _syscall1(int, iam, const char*, name); int main(int argc,char ** argv) { iam(argv[1]); return 0; } #include #define __LIBRARY__ #include _syscall2(int, whoami,char*,name,unsigned int,size); int main() { char s[30]; whoami(s,30); printf("%s",s); return 0; }

进行文件交换前,先不启动linux-0.11内核,执行挂载命令,拷贝对应文件,然后卸载

sudo ./mount-hdc cp ./iam.c whoami.c ./hdc/usr/root/ sudo umount hdc

启动0.11内核,就发现/usr/root/目录下有对应的文件,然后进行编译之前先修改/usr/include/unistd.h文件(可以使用0.11带的vi进行修改,也可以退出0.11系统,通过./mount-hdc挂载后在ubuntu在./hdc/usr/include/unistd.h进行修改)
对 __NR_whoami 和 __NR_iam 两个宏进行定义

/* 添加系统调用号 */ #define __NR_whoami 72 #define __NR_iam 73

编译:

gcc -o whoami whoami.c gcc -o ami ami.c

测试

$ ./iam lizhijun $ ./whoami lizhijun

参考文章:哈工大李治军老师操作系统实验-系统调用


作者:蓁叶



Linux 调用 操作系统 系统 系统调用

需要 登录 后方可回复, 如果你还没有账号请 注册新账号