实验三 系统调用

温馨提示

只会实现具体功能不涉及理论知识

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

实验到此结束

操作系统原理(哈工大-李治军老师)实验三系统调用相关推荐

  1. Linux0.11操作系统(哈工大李治军老师)实验楼实验1-引导

    Linux0.11操作系统(哈工大李治军老师)实验楼实验1-引导 实验源地址: https://www.lanqiao.cn/courses/115/learning/ 1.完成bootsect.s屏 ...

  2. Linux0.11操作系统(哈工大李治军老师)实验楼实验2-系统调用

    Linux0.11操作系统(哈工大李治军老师)实验楼实验2-系统调用 在 Linux 0.11 上添加两个系统调用iam()和whoami(),并编写两个简单的应用程序测试它们. 原理 1. 应用程序 ...

  3. 操作系统(哈工大李治军老师)

    L4 操作系统接口 操作系统接口 用户通过程序(应用软件)使用计算机 程序是普通代码加上一些重要的函数 如: 操作系统提供重要函数(重要函数就是操作系统接口,接口表现为函数调用,由系统提供,因此叫系统 ...

  4. 操作系统(哈工大李治军老师)32讲

    链接 https://www.bilibili.com/video/BV1d4411v7u7/?spm_id_from=333.788.recommend_more_video.0&vd_so ...

  5. 哈工大李治军老师的操作系统学习笔记

    文章目录 1 什么是操作系统 2 操作系统启动 3 操作系统接口 命令行发生了什么? 图形按钮怎么回事? 操作系统接口(系统调用) 4 操作系统调用 不应该随意访问内核 怎么不让你访问内核 不让我访问 ...

  6. 操作系统原理(哈工大-李治军老师)操作系统引导

    操作系统引导 开始试验之前先了解汇编语言为前提 第一步 完成 bootsect.s 的屏幕输出功能 进入目录 cd /home/shiyanlou/oslab 解压 tar -zxvf hit-osk ...

  7. 哈工大李治军老师操作系统笔记【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. ...

  8. 进一步学习操作系统 - 哈工大李治军老师 - 学习笔记 L26L27

    学习笔记-摘抄自老师书本内容 L26 I/O与显示器 L27 键盘 L26 I/O与显示器 使用外设: (1)向外设对应的端口地址发送 CPU 命令: (2)CPU 通过端口地址发送对外设的工作要求, ...

  9. 进一步学习操作系统 - 哈工大李治军老师 - 学习笔记 L22L23L24L25

    学习笔记 L22 多级页表与快表 总结 L23 段页结合的实际内存管理 L24 内存换入-请求调页 L25 内存换出 L22 多级页表与快表 总结 32位地址,最大内存为232 = 4G 页面尺寸为4 ...

  10. 进一步学习操作系统 - 哈工大李治军老师 - 学习笔记 L10L11L12

    这里写目录标题 L10 用户级线程 L11 内核级线程 L12 内核级线程实现 进程如何切换? L10 用户级线程 进程切换时,当前进程的CPU环境要保存,新进程的CPU环境要设置,线程切换时只须保存 ...

最新文章

  1. access突然需要登录_早知道早好,微信小程序登录开发需要注意的事项
  2. 青少年编程竞赛交流群第048次活动录播
  3. 关机时 ,提示其他用户登录到这台计算机,关闭WINDOWS会使他们丢失数据
  4. 创建可重用代码(C++)
  5. 这两天用到的Jmeter录制
  6. distinct作用于后面所有的列吗_InnoDB索引允许NULL对性能有影响吗
  7. 内存中的调用别的软件程序加密解密函数_公司加密软件哪个最好用?
  8. !JS实战之随机像素图
  9. OpenCV isContinuous()连续存储的问题
  10. 最可怕的企业“内卷化”,是走入以下10个误区而不自知
  11. 前端开发必备:js中的sort()排序函数
  12. python抓取网站图片_利用python抓取网站图片
  13. vscode生成代码图片_vs Code 快速生成代码
  14. 字符串类型日期时间转换为Date类型解析转换异常java.text.ParseException: Unparseable date: “2019-09-27T18:31:31+08:00”
  15. java开发资源下载链接
  16. Kafka_producer
  17. B 站崩了,总结下「高可用」和「异地多活」
  18. 一些技能点语法糖(上)
  19. Lorem ipsum乱数假文学习笔记
  20. 6-使用VMWARE虚拟机调试XPE的方法

热门文章

  1. Oracle执行计划
  2. 文件共享锁溢出 请增加MaxLocksperFile注册表项值
  3. spring boot企业合同管理系统毕业设计源码161456
  4. 仿金蝶电商ERP进销存系统多仓库版
  5. 全流程OA系统集成对接案例实例
  6. Windows 10 打印机驱动安装(以惠普M136 MFP为例)
  7. Unity Demo ——3D时钟
  8. 小学生十大计算机专业书排行,小学教辅十大排行榜2018 小学教辅书那些比较好...
  9. 数据库之战 | 寻找你心中的数据库漫威英雄
  10. Julia安装与配置Jupyter Notebook