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.mzph.cn/news/178311.shtml

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

相关文章

ELK+Filebeat

Filebeat概述 1.Filebeat简介 Filebeat是一款轻量级的日志收集工具&#xff0c;可以在非JAVA环境下运行。 因此&#xff0c;Filebeat常被用在非JAVAf的服务器上用于替代Logstash&#xff0c;收集日志信息。实际上&#xff0c;Filebeat几乎可以起到与Logstash相同的作用&…

Android11编译第八弹:root用户密码设置

问题&#xff1a;user版本增加su 指令以后&#xff0c;允许切换root用户&#xff0c;但是&#xff0c;root用户默认没有设置密码&#xff0c;这样访问不安全。 需要增加root用户密码。 一、Linux账户管理 1.1 文件和权限 Linux一切皆文件。文件和目录都有相应的权限&#x…

函数式编程:简洁与效率的完美结合

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

还在担心发抖音没素材跟文案?[腾讯云HAI] AIGC带你蹭热度“今年你失去了什么?”

目录 &#x1f433;前言&#xff1a; &#x1f680;了解高性能应用服务 HAI &#x1f47b;即插即用 轻松上手 &#x1f47b;横向对比 青出于蓝 &#x1f424;应用场景-AI作画 &#x1f424;应用场景-AI对话 &#x1f424;应用场景-算法研发 &#x1f680;使用HAI进行…

蓝桥杯day01——根据给定数字划分数组

题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 pivot 。请你将 nums 重新排列&#xff0c;使得以下条件均成立&#xff1a; 所有小于 pivot 的元素都出现在所有大于 pivot 的元素 之前 。所有等于 pivot 的元素都出现在小于和大于 pivot 的元素 中间 。小于 piv…

orcad模块化绘制电路

当我们的板子上需要绘制大量的重复电路的时候&#xff0c;手动去绘制就很浪费时间。 orcad 的软件可以进行模块化绘制&#xff0c;将几个原理图包装成一个模块&#xff0c;然后直接去复制模块就可以。 相对来说大大的简化了原理图的设计麻烦程度 下面就是整个的操作流程 最后做…

一天之内“三个离职群都满了”;飞行出租车的时代就此开启?丨 RTE 开发者日报 Vol.94

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

每日一练 | 华为认证真题练习Day138

1、IPv6地址FE80::2EO:FCFF:FE6F:4F36属于哪一类&#xff1f; A. 组播地址 B. 任播地址 C. 链路本地地址 D. 全球单播地址 2、如果IPv6的主机希望发出的报文最多经过10台路由器转发&#xff0c;则应该修改IPv6报文头中的哪个参数&#xff1f; A. Next Header B. Version …

【考研or就业】关键的时间节点,暑期实习/秋招/春招大揭秘(文末附时间线图)

【考研or就业】关键的时间节点&#xff0c;暑期实习/秋招/春招大揭秘 一些引言考研初复试暑期实习秋招春招 【考研or就业】关键的时间节点&#xff0c;暑期实习/秋招/春招大揭秘&#xff08;视频版&#xff09; 一些引言 ● 之前我个人的选择是比较离谱的那种&#xff0c;考研…

【实验】配置用户通过IPv6方式上网

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【微/信/公/众/号&#xff1a;厦门微思网络】 组网需求 运营商为企业分配了WAN侧的IPv6地址11…

SageMath安装

Sagemath工具是免费开源的&#xff0c;针对数学计算的一个工具。 网页版免安装&#xff1a;https://sagecell.sagemath.org/ Sagemath是根据Linux系统编写的&#xff0c;所以Windows上使用的话&#xff0c;会创建一个Linux系统运行。 1. 安装 Windows本地安装参考&#xff1…

oracle闪回恢复表数据

oracle闪回恢复表数据 1.打开监听和数据库&#xff0c;进入需要操作的表的所属用户下 [oraclemydb ~]$ lsnrctl start [oraclemydb ~]$ sqlplus / as sysdba SQL> startup SQL> conn test/123456 SQL> select * from test1&#xff1b;2.删除任意数据&#xff1a; …

WIFI模块(esp-01s)实现天气预报代码实现

目录 前言 实现图片 一、串口编程的实现 二、发送AT指令 esp01s.c esp01s.h 三、数据处理 1、初始化 2、cjson处理函数 3、核心控制代码 四、修改堆栈大小 前言 实现图片 前面讲解了使用AT指令获取天气与cjson的解析数据&#xff0c;本章综合将时间显示到屏幕 一、…

MyBatis的解析和运行原理

文章目录 MyBatis的解析和运行原理MyBatis的工作原理 MyBatis的解析和运行原理 MyBatis编程步骤是什么样的&#xff1f; 1、 创建SqlSessionFactory 2、 通过SqlSessionFactory创建SqlSession 3、 通过sqlsession执行数据库操作 4、 调用session.commit()提交事务 5、 调用…

lettcode 1089. 复写零

代码&#xff1a; class Solution {public void duplicateZeros(int[] arr) {int cur 0, dest -1, n arr.length;// 1. 先找到最后⼀个需要复写的数while (cur < n) {if (arr[cur] 0) dest 2;else dest 1;if (dest > n - 1) break;cur;}// 2. 处理⼀下边界情况if …

智能优化算法应用:基于多元宇宙算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于多元宇宙算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于多元宇宙算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.多元宇宙算法4.实验参数设定5.算法结果6.参考…

激光器温度,波长变化

940&#xff0c;波长变化0.3nm/C

LeetCode Hot100 226.翻转二叉树

题目&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 递归&#xff1a;深度优先遍历 迭代&#xff1a;广度优先遍历 方法&#xff1a;迭代 class Solution {public TreeNode invertTree(TreeNode root) {if (root null…

深度学习早停机制(Early Stopping)与早退机制(Early exiting)

早停机制&#xff0c;一种机器学习模型调优策略&#xff0c;提升调优效率 下图损失值明显经过了欠拟合到过拟合 使用早停机制后&#xff0c;模型不再过拟合 模型早停是面向模型训练过程的。而在模型内部&#xff0c;也会出现类似的现象&#xff0c;这一现象被叫做过度思考(Ove…

SAP 调用OO类发送邮件测试(可发送表格和附件)

原文链接&#xff1a;https://blog.csdn.net/sapliumeng/article/details/134152739 在SAP实施中&#xff0c;邮件发送功能在很多项目都会用到&#xff0c;而且往往是把内表以Excel或者CSV的格式发送附件&#xff0c;最好是这个表格也可以显示在正文中&#xff0c;这样的话如果…