engintime linux lab 实验 增加系统调用函数max,Iam,Whoami
目录
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)!