HIT_OS_LAB4 系统调用

实验内容

编写iam.c和whoami.c

iam.c

#define __LIBRARY__
#include <unistd.h>// 定义系统调用 iam,参数为字符串 name
_syscall1(int, iam, const char*, name);int main(int argc, char **argv) {int wlen = 0;// 检查命令行参数数量if (argc < 2) {printf("Not enough arguments!\n");return -2;}// 调用系统调用 iam,传递参数 argv[1](字符串 name)wlen = iam(argv[1]);return wlen;
}

whoami.c

#define __LIBRARY__
#include <unistd.h>// 定义系统调用 whoami,参数为字符串 name 和无符号整数 size
_syscall2(int, whoami, char*, name, unsigned int, size);int main() {char s[30];int rlen = 0;// 调用系统调用 whoami,传递参数 s(字符串 name)和 30(无符号整数 size)rlen = whoami(s, 30);// 打印结果printf("%s\n", s);return rlen;
}

在内核的 include/unistd.h 添加系统调用号

#define __NR_whoami 72
#define __NR_iam    73

修改系统调用表和调用总数

# offsets within sigaction
sa_handler = 0
sa_mask = 4
sa_flags = 8
sa_restorer = 12nr_system_calls = 74

编写who.c

who.c

#define __LIBRARY__
#include <asm/segment.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>char msg[24];  // 存储用户输入的字符串,长度为24// 实现系统调用 iam,用于将用户空间的字符串 name 复制到内核空间的 msg 中
int sys_iam(const char *name) {int i;char tmp[30];for (i = 0; i < 30; i++) {tmp[i] = get_fs_byte(name + i);if (tmp[i] == '\0') break;  // 遇到字符串结束符则跳出循环}i = 0;while (i < 30 && tmp[i] != '\0') i++;  // 计算字符串长度int len = i;if (len > 23) {// 如果字符串过长,返回错误码return -(EINVAL);}// 将用户空间的字符串复制到内核空间的 msg 中strcpy(msg, tmp);return i;
}// 实现系统调用 whoami,用于将内核空间的 msg 复制到用户空间的 name 中
int sys_whoami(char *name, unsigned int size) {int len = 0;// 计算 msg 的长度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 文件

编译运行

./iam bds
./whoami

在这里插入图片描述

程序测试

iam.cwhoami.c分别编译成iamwhoami。然后将testlab2.shtestlab2.c(位于/home/teacher目录下)拷贝到虚拟机目录oslab/hdc/usr/root。拷贝完成后,需要进行卸载挂载操作,并启动Bochs:

sudo umount hdc
./run

在Bochs中执行以下命令:

gcc -o testlab2 testlab2.c sync
./testlab2

执行结果如图所示。接着执行testlab2.sh脚本,使用以下命令为脚本增加执行权限:

chmod +x testlab2.sh

然后运行:

./testlab2.sh

在这里插入图片描述

Q1:Linux 0.11 的系统调用参数限制和扩大限制的描述:

在 Linux 0.11 中,系统调用最多能传递3个参数。这是因为在系统调用的宏定义_syscall3(type,name,atype,a,btype,b,ctype,c)中可以看到,Linux 0.11 的系统调用通过寄存器ebxecxedx传递参数,最多支持3个参数。

为了扩大参数传递的限制,可以采取以下方法:

  1. 使用结构体: 将多个参数封装到一个结构体中,然后将结构体的指针传递给系统调用。这样可以通过一个参数传递更多的信息。
  2. 使用参数数组: 将参数保存在数组中,然后将数组的地址传递给系统调用。系统调用可以根据需要访问数组中的元素。

Q2:向 Linux 0.11 添加系统调用 foo() 的步骤:

  1. include/unistd.h中:

    • 添加系统调用号,例如:#define __NR_foo 224,确保没有重复的号码。
  2. kernel/system_call.s中:

    • 修改总调用数,即在文件中加入相应的宏定义,例如:#define NR_syscalls 225,确保包括了新添加的系统调用。
  3. include/linux/sys.h中:

    • 添加系统调用的声明,例如:asmlinkage int sys_foo(void);
  4. kernel/Makefile中:

    • 添加对新系统调用的编译规则,确保在syscall_table.o中包含了新系统调用的地址。
  5. 在内核文件中实现新系统调用,例如:kernel/foo.c

    • 编写系统调用的具体实现,例如:asmlinkage int sys_foo(void) { /* 实现代码 */ }
  6. 重新编译系统:

    • 运行make all重新编译内核,确保包含了新的系统调用。
    • 使用gcc编译用户态程序,确保调用了新添加的系统调用,例如:gcc -o test_program test_program.c -D__NR_foo=224

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/227616.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Appium PO模式UI自动化测试框架——设计与实践

1. 目的 相信做过测试的同学都听说过自动化测试&#xff0c;而UI自动化无论何时对测试来说都是比较吸引人的存在。相较于接口自动化来说&#xff0c;它可以最大程度的模拟真实用户的日常操作与特定业务场景的模拟&#xff0c;那么存在即合理&#xff0c;自动化UI测试自然也是广…

【随笔】OpenFlow概述

SDN之前的网络结构 硬件 操作系统 网络功能(交换机、路由器、防火墙、VPN、NAT、OSPF、BGP、Traffic Engineering) 北向是SDN应用 SDN控制器 底层是SDN数据面(通用硬件) openflow OPEN NETWORKING FOUNDATION 支持开放的SDN平台&#xff0c;一直使用的是openflow协议。 op…

【C数据(一)】数据类型和变量你真的理解了吗?来看看这篇

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

反射、枚举以及lambda表达式

1. 反射 1.1 定义 java的.class文件在运行时会被编译为一个Class对象&#xff0c;既然是对象&#xff0c;那么我们就可以通过一定的方式取到这个对象&#xff0c;然后对于这个对象进行一系列操作&#xff08;改变原本类的属性、方法&#xff09;。 这个操作就是反射&#xf…

5面试题--redis

慢查询⽇志&#xff1a;⽤于记录执⾏时间超过给定时⻓的命令请求&#xff0c;⽤户可以通过这个功能产⽣的⽇志来监视和 优化查询速度。 布隆过滤器&#xff1a;⼆进制数组进⾏存储&#xff0c;若判断元素存在则可能实际存在&#xff0c;若判断不存在则⼀定不存在。 redis中inc…

HelpLook可以作为wordpress的替代品,帮助企业快速搭建博客

博客作为一个非常有价值的平台&#xff0c;在当今的数字时代具有重要的意义。对于个人和企业来说&#xff0c;选择一款适合自己需求的专业博客搭建软件至关重要。本篇文章将会通过对比两个专业的博客搭建软件——HelpLook和WordPress&#xff0c;看看为什么我说HelpLook可以作为…

别再让假的fiddler教程毒害你了,来看这套最全最新的fiddler全工具讲解

fiddler界面工具栏介绍 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; &#xff08;1&#xff09;WinConfig&#xff1a;windows 使用了一种叫做“AppContainer”的隔离技术&#xff0c;使得一些流量无法正常捕获&#xff0c;在 fiddler中点击 WinConfig…

某东大厂面试js手写题【手写代码附带注释,放心食用,博主亲测】

文章目录 前言js实现push方法js实现订阅发布手写防抖节流手写reduce方法深拷贝es5去重数组多维数组去重排序简单递归实现树形结构输出遍历后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端面试 &#x1f431;‍&#x1f453;博主在前…

【用unity实现100个游戏之17】从零开始制作一个类幸存者肉鸽(Roguelike)游戏3(附项目源码)

文章目录 本节最终效果前言近战武器控制近战武器生成升级增加武器伤害和数量查找离主角最近的敌人子弹预制体生成子弹发射子弹参考源码完结 本节最终效果 前言 本节紧跟着上一篇&#xff0c;主要实现武器功能。 近战武器 新增Bullet&#xff0c;子弹脚本 public class Bull…

windows系统mobaxterm远程执行linux上ssh命令

命令如下 start "" "%~dp0\MobaXterm_Personal_23.4.exe" -newtab "sshpass -p root ssh root192.168.11.92 mkdir 33" -p 是密码 左边是用户名&#xff0c;右边是服务器ip 后面跟的是服务器上执行的命令 第一次执行的时候要设置mobaxt…

使用Python实现SVM来解决二分类问题

下面是一个使用Python实现SVM来解决二分类问题的例子&#xff1a; # 导入所需的库 from sklearn.datasets import make_blobs from sklearn.model_selection import train_test_split from sklearn.svm import SVC import matplotlib.pyplot as plt# 生成一个二分类数据集 X, …

web:NewsCenter

题目 打开页面显示如下 页面有个输入框&#xff0c;猜测是sql注入&#xff0c;即search为注入参数点&#xff0c;先尝试一下 返回空白显示错误 正常显示如下 是因为单引号与服务端代码中的’形成闭合&#xff0c;输入的字符串hello包裹&#xff0c;服务端代码后面多出来一个‘导…