当前位置: 首页 > article >正文

engintime linux lab 实验 增加系统调用函数max,Iam,Whoami

目录

1. 添加新的系统调用号

2. 修改系统调用总数

3. 声明内核函数原型

4. 添加系统调用函数指针

5. 实现内核函数

6.在新系统调用

编辑main.c文件中的源代码

编辑iam.c

 编辑whoami.c


1. 添加新的系统调用号

在 include/unistd.h 文件中,添加新的系统调用号:

#define __NR_max  87
#define __NR_Iam  88
#define __NR_Whoami 89

2. 修改系统调用总数

在 kernel/system_call.s 文件中,修改系统调用总数:

.nr_system_calls = 90

这样注意⚠️:总调用数要大于调用号  也就是 最后一个 #define __NR_Whoami 89 

大于89 这里写成90 

如果写成等于 编译也能通过,但是最后结果没有值,断点调试也无法进入 sys_Whoami

3. 声明内核函数原型

在 include/linux/sys.h 文件中,声明新的内核函数原型:

extern int sys_max();
extern int sys_Iam();
extern int sys_Whoami();

4. 添加系统调用函数指针

在 sys_call_table[] 数组中,添加新的系统调用函数指针:

sys_call_table[
前边省略...
sys_max,			//87
sys_Iam,			//88
sys_Whoami			//89
]

⚠️分隔符逗号 

5. 实现内核函数

在 kernel/sys.c 文件中,实现新的内核函数:

#define MAX_NAME_LEN 33
char msg[MAX_NAME_LEN]; // 32 个字符 + 1 个终止符 '\0'

// Iam 系统调用
int sys_Iam(const char *name)
{
    int i;
    char tmp[MAX_NAME_LEN + 1]; // 额外一个字符用于 '\0'
    for (i = 0; i < MAX_NAME_LEN; i++) {
        tmp[i] = get_fs_byte(name + i);
        if (tmp[i] == '\0') break;
    }

    // 检查长度并复制字符串
    if (i >= MAX_NAME_LEN) {
        errno = EINVAL;
        return -1;
    }
    tmp[i] = '\0'; // 确保字符串以 '\0' 结尾
    strcpy(msg, tmp);
    return i;
}

// Whoami 系统调用
int sys_Whoami(char *name, unsigned int size)
{
    int len = 0;
    while (msg[len] != '\0') len++;
    if (len > size) {
        errno = EINVAL;
        return -1;
    }

    int i;
    for (i = 0; i < size; i++) {
        put_fs_byte(msg[i], name + i);
        if (msg[i] == '\0') break;
    }

    return i;
}

// 返回最大值
int sys_max(int a, int b, int c)
{
    int max = a;
    if (b > max) max = b;
    if (c > max) max = c;
    return max;
}

6.在新系统调用

编辑main.c文件中的源代码

其中,需要定义 __LIBRARY__ 宏及包含unistd.h头文件,

还需要再次定义 __NR_max 宏,

并使用 _syscall2宏对系统调用函数进行定义

#define __LIBRARY__
#include<unistd.h>
#define __NR_max 87
_syscall2( int, max, int, max1, int, max2 )
int main(){
    int i=max(100,200,120);
    printf("the max of %d and %d and %d is %d\n", 100,200,120,i);
    return 0;
}
编辑iam.c

#define __LIBRARY__
#include<unistd.h>
#include<stdio.h>
#define __NR_Iam  88

_syscall1(int, iam, const char*, name);

int main(int argc, char ** argv)
{
    iam(argv[1]);
    return 0;
}
 编辑whoami.c

#define __LIBRARY__
#include<unistd.h>
#include<stdio.h>
#define __NR_Whoami 89

_syscall2(int, whoami, char *, name, unsigned int, size);

int main()
{
    char s[33];
    whoami(s, 33);
    printf("your name:  %s\n", s);
    return 0;
}

7.编译和测试

gcc -o Iam iam.c


http://www.kler.cn/news/356058.html

相关文章:

  • PetaLinux工程的常用命令——petalinux-create
  • 【工具变量】上市公司企业公共数据开放及ZF数据开放-含代码及数据(2023-2008年)
  • 面试题:被问的几率最大的前端面试题!!
  • 互联网语言 互联网开发 互联网架构
  • Safari 中 filter: blur() 高斯模糊引发的性能问题及解决方案
  • c/c++中void定义的空类型指针(void* p)要怎么使用(强制类型转换)以及使用场景(函数指针)
  • Flink 06 聚合操作入门学习,真不难
  • 智慧校园电子班牌系统全套源码,SpringBoot框架结合Java后端,Vue.js前端,移动端小程序使用原生语言开发,电子班牌固件基于Android系统
  • 面试题收集-Redis的关键知识点
  • U盘不显示文件但有占用空间:深度解析与高效恢复策略
  • VSCode中的TypeScript教程
  • adb devices没找到安卓设备的解决办法
  • Therabody携第二代沉浸式身心平衡眼环引领放松黑科技
  • JavaWeb 23.一文速通npm的配置和使用
  • 开源 AI 智能名片 2+1 链动模式 S2B2C 商城小程序的场景营销架构探索
  • 名词释义:通风天窗喉口宽度
  • 前端面试题17 | 什么是vue的响应式?
  • el-table修改指定列字体颜色 ,覆盖划过行的高亮显示文字颜色
  • 【CS常见问题】你用的是VS2019,最高支持.NET5.0,但是项目将.NET6.0设为目标无法运行,怎么办?
  • 【java面经thinking】二