操作系统原理(哈工大-李治军老师)实验三系统调用
实验三 系统调用
温馨提示
只会实现具体功能不涉及理论知识
1.添加iam和whoami系统调用编号的宏定义
文件路径:/oslab/linux-0.11/include/unistd.h 在131行代码之后添加一下内容:
#define __NR_whoami 72
#define __NR_iam 73
2.修改系统调用总数,
文件:kernel/system_call.s
nr_system_calls = 72 改为
nr_system_calls = 74
3.为新增的系统调用添加系统调用名并维护系统调用表
文件:include/linux/sys.h
extern int sys_whoami();
extern int sys_iam();
注!
要在fn_ptr sys_call_table[]添加以上内容
4.为新增的系统调用编写代码实现
在linux-0.11/kernel目录下,创建一个文件 who.c 并添加以下代码
#include <asm/segment.h>
#include <errno.h>
#include <string.h>char _myname[24];int sys_iam(const char *name)
{char str[25];int i = 0;do{// get char from user inputstr[i] = get_fs_byte(name + i);} while (i <= 25 && str[i++] != '\0');if (i > 24){errno = EINVAL;i = -1;}else{// copy from user mode to kernel modestrcpy(_myname, str);}return i;
}int sys_whoami(char *name, unsigned int size)
{int length = strlen(_myname);printk("%s\n", _myname);if (size < length){errno = EINVAL;length = -1;}else{int i = 0;for (i = 0; i < length; i++){// copy from kernel mode to user modeput_fs_byte(_myname[i], name + i);}}return length;
}
4.修改 Makefile
要想让我们添加的 kernel/who.c 可以和其它 Linux 代码编译链接到一起,必须要修改 两处Makefile 文件。路径:kernel/Makefile
第一处
vim +27 Makefile
OBJS = sched.o system_call.o traps.o asm.o fork.o \panic.o printk.o vsprintf.o sys.o exit.o \signal.o mktime.o
修改为
OBJS = sched.o system_call.o traps.o asm.o fork.o \panic.o printk.o vsprintf.o sys.o exit.o \signal.o mktime.o who.o
修改结果:
原基础添加了 who.o
第二处
### Dependencies:
exit.s exit.o: exit.c ../include/errno.h ../include/signal.h \../include/sys/types.h ../include/sys/wait.h ../include/linux/sched.h \../include/linux/head.h ../include/linux/fs.h ../include/linux/mm.h \../include/linux/kernel.h ../include/linux/tty.h ../include/termios.h \../include/asm/segment.h
修改为:
### Dependencies:
who.s who.o: who.c ../include/linux/kernel.h ../include/unistd.h
exit.s exit.o: exit.c ../include/errno.h ../include/signal.h \../include/sys/types.h ../include/sys/wait.h ../include/linux/sched.h \../include/linux/head.h ../include/linux/fs.h ../include/linux/mm.h \../include/linux/kernel.h ../include/linux/tty.h ../include/termios.h \../include/asm/segment.h
修改结果。添加…/include/linux/kernel.h …/include/unistd.h
Makefile 修改后和往常一样 make all 就能自动把 who.c 加入到内核中了。
shiyanlou@41a34909ea01:~/oslab/linux-0.11$ make all
到此,内核修改部分完成,接下来是编写测试程序了
5.编写测试程序 iam.c,whoami.c
/* iam.c */
#define __LIBRARY__
#include <unistd.h>
#include <errno.h>
#include <asm/segment.h>
#include <linux/kernel.h>
_syscall1(int, iam, const char*, name);int main(int argc, char *argv[])
{/*调用系统调用iam()*/iam(argv[1]);return 0;
}
/* whoami.c */
#define __LIBRARY__
#include <unistd.h>
#include <errno.h>
#include <asm/segment.h>
#include <linux/kernel.h>
#include <stdio.h>_syscall2(int, whoami,char *,name,unsigned int,size);int main(int argc, char *argv[])
{char username[64] = {0};/*调用系统调用whoami()*/whoami(username, 24);printf("%s\n", username);return 0;
}
然后把编写好的测试程序通过挂载到虚拟机操作系统
shiyanlou@41a34909ea01:~/oslab$ sudo ./mount-hdc
shiyanlou@41a34909ea01:~/oslab$ cp iam.c whoami.c hdc/usr/root
执行脚本./run 进入虚拟机操作系统修改虚拟机系统调用号跟第一步是一样的
#define __NR_whoami 72
#define __NR_iam 73
在虚拟机 gcc 编译执行测试程序
[/usr/root]# gcc -o iam iam.c
[/usr/root]# gcc -o whoami whoami.c
[/usr/root]# ./iam wcf
[/usr/root]# ./whoami
实验到此结束
操作系统原理(哈工大-李治军老师)实验三系统调用相关推荐
- Linux0.11操作系统(哈工大李治军老师)实验楼实验1-引导
Linux0.11操作系统(哈工大李治军老师)实验楼实验1-引导 实验源地址: https://www.lanqiao.cn/courses/115/learning/ 1.完成bootsect.s屏 ...
- Linux0.11操作系统(哈工大李治军老师)实验楼实验2-系统调用
Linux0.11操作系统(哈工大李治军老师)实验楼实验2-系统调用 在 Linux 0.11 上添加两个系统调用iam()和whoami(),并编写两个简单的应用程序测试它们. 原理 1. 应用程序 ...
- 操作系统(哈工大李治军老师)
L4 操作系统接口 操作系统接口 用户通过程序(应用软件)使用计算机 程序是普通代码加上一些重要的函数 如: 操作系统提供重要函数(重要函数就是操作系统接口,接口表现为函数调用,由系统提供,因此叫系统 ...
- 操作系统(哈工大李治军老师)32讲
链接 https://www.bilibili.com/video/BV1d4411v7u7/?spm_id_from=333.788.recommend_more_video.0&vd_so ...
- 哈工大李治军老师的操作系统学习笔记
文章目录 1 什么是操作系统 2 操作系统启动 3 操作系统接口 命令行发生了什么? 图形按钮怎么回事? 操作系统接口(系统调用) 4 操作系统调用 不应该随意访问内核 怎么不让你访问内核 不让我访问 ...
- 操作系统原理(哈工大-李治军老师)操作系统引导
操作系统引导 开始试验之前先了解汇编语言为前提 第一步 完成 bootsect.s 的屏幕输出功能 进入目录 cd /home/shiyanlou/oslab 解压 tar -zxvf hit-osk ...
- 哈工大李治军老师操作系统笔记【10】:内核级线程实现(Learning OS Concepts By Coding Them !)
文章目录 0 回顾 1 实现 1.1 int 0x80 fork(中断入口) 1.2 进入核心态 1.3 system_call(中断切换中间三段) 1.4 中断出口 1.3 switch_to 1. ...
- 进一步学习操作系统 - 哈工大李治军老师 - 学习笔记 L26L27
学习笔记-摘抄自老师书本内容 L26 I/O与显示器 L27 键盘 L26 I/O与显示器 使用外设: (1)向外设对应的端口地址发送 CPU 命令: (2)CPU 通过端口地址发送对外设的工作要求, ...
- 进一步学习操作系统 - 哈工大李治军老师 - 学习笔记 L22L23L24L25
学习笔记 L22 多级页表与快表 总结 L23 段页结合的实际内存管理 L24 内存换入-请求调页 L25 内存换出 L22 多级页表与快表 总结 32位地址,最大内存为232 = 4G 页面尺寸为4 ...
- 进一步学习操作系统 - 哈工大李治军老师 - 学习笔记 L10L11L12
这里写目录标题 L10 用户级线程 L11 内核级线程 L12 内核级线程实现 进程如何切换? L10 用户级线程 进程切换时,当前进程的CPU环境要保存,新进程的CPU环境要设置,线程切换时只须保存 ...
最新文章
- access突然需要登录_早知道早好,微信小程序登录开发需要注意的事项
- 青少年编程竞赛交流群第048次活动录播
- 关机时 ,提示其他用户登录到这台计算机,关闭WINDOWS会使他们丢失数据
- 创建可重用代码(C++)
- 这两天用到的Jmeter录制
- distinct作用于后面所有的列吗_InnoDB索引允许NULL对性能有影响吗
- 内存中的调用别的软件程序加密解密函数_公司加密软件哪个最好用?
- !JS实战之随机像素图
- OpenCV isContinuous()连续存储的问题
- 最可怕的企业“内卷化”,是走入以下10个误区而不自知
- 前端开发必备:js中的sort()排序函数
- python抓取网站图片_利用python抓取网站图片
- vscode生成代码图片_vs Code 快速生成代码
- 字符串类型日期时间转换为Date类型解析转换异常java.text.ParseException: Unparseable date: “2019-09-27T18:31:31+08:00”
- java开发资源下载链接
- Kafka_producer
- B 站崩了,总结下「高可用」和「异地多活」
- 一些技能点语法糖(上)
- Lorem ipsum乱数假文学习笔记
- 6-使用VMWARE虚拟机调试XPE的方法