HIT_OS_LAB4 系统调用

news2024/12/23 1:44:24

实验内容

编写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 = 12

nr_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.coloradmin.cn/o/1263061.html

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

相关文章

C语言数据结构-----栈和队列练习题(分析+代码)

前言 前面的博客写了如何实现栈和队列&#xff0c;下来我们来看一下队列和栈的相关习题。 链接: 栈和队列的实现 文章目录 前言1.用栈实现括号匹配2.用队列实现栈3.用栈实现队列4.设计循环队列 1.用栈实现括号匹配 此题最重要的就是数量匹配和顺序匹配。 用栈可以完美的做到…

【详细版】基于AWS EC2使用Docker安装部署Superset v2.0

文章目录 1. SuperSet介绍2. 实验说明3. 实验配置4. SSH连接云实例5. 系统版本查看6. 主机名映射7. Docker安装[可选] Docker Compose安装8. 安装superset9. 初始化superset容器10. 为superset加入连接Athena需要的依赖11. 为superset准备一个具有权限的IAM用户12. 添加此IAM用…

数据治理框架和成熟度模型

数据治理成熟度模型 一个企业的数据治理能力越高&#xff0c;所享受到数据治理带来的价值也会越多&#xff0c;如增加收入、减少成本、降低风险等。于是&#xff0c;很多企业想要准确地评估本公司的数据治理能力&#xff0c;可以利用数据治理成熟度模型方法&#xff0c;包括 D…

轻量级项目群管理

敏捷开发流程管理&#xff1a; Leangoo领歌是一款永久免费的专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo支持敏捷研发管理全流程&#xff0c;包括小型团队敏捷开发&#xff0c;…

Redis面试题:哨兵模式相关问题,以及脑裂问题

目录 面试官&#xff1a;怎么保证Redis的高并发高可用 面试官&#xff1a;你们使用redis是单点还是集群&#xff0c;哪种集群 面试官&#xff1a;redis集群脑裂&#xff0c;该怎么解决呢&#xff1f; 面试官&#xff1a;怎么保证Redis的高并发高可用 候选人&#xff1a;首先…

【沁恒蓝牙mesh】CH58x 将RTC时钟切换为LSE外部低速时钟

本文主要记录了【沁恒蓝牙mesh】CH58x 如何将RTC时钟切换为外部时钟 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博客主页&#x1f525;&#x1f389;…

堆的应用(堆排序、Top-K问题)

文章目录 1 堆排序2 Top-K问题 1 堆排序 堆排序是一种基于二叉堆&#xff08;通常使用数组实现&#xff09;的排序算法。 它的基本思想是利用堆这种数据结构的性质&#xff0c;通过建立一个堆&#xff08;大堆或小堆&#xff09;&#xff0c;使得堆的根节点是所有节点中的最大值…

14.Tomcat和HTTP协议-[一篇通]

文章目录 1.HTTP 协议1.1HTTP 是什么1.2理解 "应用层协议"1.3理解 HTTP 协议的工作过程1.4HTTP 协议格式1.4.1抓包工具的使用(Fiddler)1.4.2抓包工具的原理1.4.3抓包结果1.4.4协议格式总结 1.5HTTP 请求 (Request)1.5.1认识 URL1.5.1.1URL 基本格式1.5.1.2关于 URL e…

【算法每日一练]-图论(保姆级教程篇7 最小生成树 ,并查集模板篇)#村村通 #最小生成树

目录 题目&#xff1a;村村通 并查集 题目&#xff1a;最小生成树 kruskal算法 prim算法 先引入问题&#xff1a; 要在n个城市之间铺设光缆&#xff0c;主要目标是要使这 n 个城市的任意两个之间都可以通信&#xff0c;但铺设光缆的费用很高&#xff0c;且各个城市之间铺…

微信小程序nodejs+vue+uniapp视力保养眼镜店连锁预约系统

作为一个视力保养连锁预约的网络系统&#xff0c;数据流量是非常大的&#xff0c;所以系统的设计必须满足使用方便&#xff0c;操作灵活的要求。所以在设计视力保养连锁预约系统应达到以下目标&#xff1a; &#xff08;1&#xff09;界面要美观友好&#xff0c;检索要快捷简易…

【密码学】【安全多方计算】浅析隐私求交PSI

文章目录 隐私求交的定义隐私求交方案介绍1. 基于DH的PSI方案2. 基于OT的PSI方案3.基于OPRF的PSI方案 总结 隐私求交的定义 隐私集合求交使得持有数据参与方通过计算得到集合的交集数据&#xff0c;而不泄露任何交集以外的数据信息。 隐私求交方案介绍 1. 基于DH的PSI方案 …

漏电保护器工作原理

漏电保护器 漏电保护器是低压线路中最常用的保护器之一&#xff0c;简称漏保&#xff0c;又称漏电开关或漏电断路器。漏电保护器除了具有空开的所有保护功能外&#xff0c;还具备漏电保护功能。 需要了解 一根通电导线可以产生磁场&#xff0c;磁场与电流方向遵循右手螺旋关…

[Linux] Linux入门必备的基本指令(不全你打我)

一:ls指令 语法 &#xff1a; ls [选项] [目录或文件] 功能 &#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 ls不带选项就是显示当前目录下存在的子目录和文件 常用选项: (1). ls -l 功能: 列出…

Vue3-toRaw 和 markRaw 函数

Vue3-toRaw 和 markRaw 函数 toRaw(转换为原始)&#xff1a;将响应式对象转换为普通对象&#xff0c;只适用于 reactive 生成的响应式对象。markRaw(标记为原始)&#xff1a;标记某个对象&#xff0c;让这个对象永远都不具备响应式。一些集成的第三方库&#xff0c;会有大量的…

【解决方案】基于边缘计算技术的安科瑞综合管廊能效管理平台

平台背景 综合管廊一般是建于城市地下用于容纳两类及以上城市工程管线的构筑物及附属设施&#xff0c;将电力、自来水、热力、煤气、电信、网络等市政公用管线根据规划要求集中敷设在同一个构建物内&#xff0c;实施统一设计、施工、管理的市政公用隧道空间&#xff0c;并且还…

短剧小程序开发,短剧视频火热程序

近期&#xff0c;短剧以其独特的魅力在快节奏、忙碌的生活中迅速走红。在匆忙等待食物间隙&#xff0c;或想放松身心的片刻&#xff0c;短句成为人们难得的片刻宁静。 短剧小程序应运而生&#xff0c;在这个小巧的应用中&#xff0c;汇聚了多部丰富多样的正版短剧&#xff0c;为…

ELK---filebeat日志收集工具

filebeat也是日志收集工具&#xff0c;和logstash相同。 filebeat的特点 filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源小的多。 filebeat可以运行在非java环境&#xff0c;他可以代替logstash在非java环境上收集日志 缺…

电脑如何定时关机?

电脑如何定时关机&#xff1f;我承认自己是个相当粗心的人&#xff0c;尤其是在急于离开时经常会忘记关闭电脑&#xff0c;结果就是电量耗尽&#xff0c;导致电脑自动关机。而且&#xff0c;在我使用电脑的时候&#xff0c;经常需要进行软件下载、更新等任务。如果我一直坐等任…

ArkTS-共享元素转场动画

共享元素转场动画 在不同页面间&#xff0c;有使用相同的元素&#xff08;例如同一幅图&#xff09;的场景&#xff0c;可以使用共享元素转场动画衔接。为了突出不同页面间相同元素的关联性&#xff0c;可为它们添加共享元素转场动画。如果相同元素在不同页面间的大小有明显差异…

零信任安全:远程浏览器隔离(RBI)的重要性

引言 在当今数字化时代&#xff0c;网络安全已成为个人和企业关注的焦点。随着网络攻击和恶意软件的不断增加&#xff0c;远程浏览器隔离(RBI)SAAS系统变得至关重要。本文将深入探讨远程浏览器隔离系统的重要性&#xff0c;以及它如何帮助用户保护其网络免受恶意软件和网络攻击…