自学内容网 自学内容网

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


原文地址:https://blog.csdn.net/hxiaowang/article/details/142954404

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!