【操作系统】实验四 增加Linux系统调用

简介: 【操作系统】实验四 增加Linux系统调用

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢支持!!!

实验四

实验内容

  1. 实验名称:增加Linux系统调用
  2. 实验任务:

学习如何产生一个系统调用以及怎样同过往内核中增加一个新函数从而在内核空间中实现对用户空间的读/写。
部分A
添加一个新的内核系统调用,具体完成某个你希望实现的功能。
部分B
重新编译内核,使你的系统调用可用。
部分C
编写一个用户态的程序,验证你增加的系统调用。

实验过程

部分A: 添加新的内核系统调用

在最新版本的 Linux 内核源代码中,系统调用入口表通常不再在 entry_64.S文件中。系统调用入口表的位置在不同的内核版本中可能会有所变化。通常,它会在 arch/x86/entry/syscalls/syscall_64.tbl 文件中定义。

新下载一个内核源代码,然后解压再进行下面步骤:

  1. 打开终端并进入内核源代码目录。根据内核版本,可能会有所不同:
    cd /usr/src/linux-6.0.1 # 根据你的内核版本进入相应的目录
  2. 查找系统调用入口表的位置。可以使用以下命令找到它:

find . -name syscalls.h

这将在整个内核源代码目录中搜索 syscalls.h文件,如图所示。

vim ./arch/x86/include/asm/syscalls.h

图1 找到的syscalls.h 文件

打开找到的 syscalls.h 文件,在里面声明自己的系统调用函数,如图2所示。

图2打开syscalls.h文件

  1. 添加asmlinkage long sys_helloworld(void);声明,如图3所示。

    图3 添加声明
  2. 添加系统调用id:文件为 syscall_64.tbl它包含系统调用号和系统调用函数之间的映射,如图4所示。
vim ./arch/x86/entry/syscalls/syscall_64.tbl

图4 添加系统调用

在文件中找到一个空的系统调用入口,通常为sys_ni_syscall

使用命令 /sys_ni_syscall 搜索,找到以后回车,然后 点击 i 即可修改

修改内容,如图5所示。:

图5 添加系统调用入口

这表示将系统调用号 156映射到名为 sys_my_call 的系统调用函数。

  1. 保存文件并退出编辑器。
:wq

编写新的系统调用函数,先打开sys.c文件,如图6所示。

图6 打开sys.c文件

6. 在内核源代码目录中,打开文件 kernel/sys.c 以编辑,如图7所示。

图7 执行 vim kernel/sys.c命令

7. 在文件末尾添加你的新系统调用函数 sys_my_call的定义。例如,你可以添加一个简单的示例系统调用,如图8所示。

asmlinkage long sys_helloworld(void) {
printk(“hello world”);
return 1; 
}

图8 添加系统调用

注意:这里函数定义部分有些教程中使用的是 asmlinkage helloworld(void)在高版本的内核中很可能会出现以下报错:

arch/x86/entry/syscall_64.o:(.rodata+0xa78):undefined reference to '__x64_sys_helloworld'

在我的版本下使用如下函数形式,如图9所示。

SYSCALL_DEFINE0(helloworld) {
Printk(“hello world!\n”);
return 0; 
}

图9 添加系统调用

8. 保存文件并退出编辑器。

:wq

部分B: 重新编译和安装内核

  1. 在终端中编译内核:
  2. 在此之前需要 make clean 清理一下旧文件
  3. 重新配置.config文件 make menuconfig

make menuconfig 时将general setup -> localversion 修改成新的名称,如 “wikiKernel”

  1. 然后make -j8 编译内核 (时间较长)
    编译成功,没有报错信息,如图10所示。

图10 编译内核完毕

  1. 安装内核
    编译成功,没有报错信息,如图11所示。

图11 执行sudo make modules_install命令安装内核成功

图12 执行sudo make install命令

图13 reboot重启机器

部分C编写一个用户态的程序

验证系统调用,如图14、15所示。

新建hello.c文件,编写程序如下:

#include <stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>
 
int main()
{
       long int a = syscall(156);
       printf("System call sys_helloworld return %ld\n", a);
       return 0;
}

图14 验证系统调用的代码

编译:

Gcc -o a hello.c

运行:

./a.out

图15 执行命令,验证系统调用添加成功

实验小结

在本次实验中,我成功地增加了Linux系统调用,并通过重新编译内核和编写用户态程序的方式实现了对用户空间的读/写功能。在实验过程中,我遇到了以下一些问题和挑战:

存在问题:

  1. 在添加新的系统调用时,需要深入理解Linux内核的机制和源代码,对于初学者来说有一定的难度。
  2. 在重新编译内核时,需要安装并配置相应的编译工具和环境,对于操作系统的了解和熟练掌握程度有一定要求。
  3. 在编写用户态程序时,需要熟悉Linux的系统调用接口,以及如何与内核交互,需要进行比较深入的学习和理解。

注意事项:

  1. 在整个实验过程中,要特别注意安全性原则,避免操作系统内核被破坏或者数据被篡改。
  2. 在修改和编译内核时,务必备份原有的内核文件,以防止操作失误导致系统无法启动。
  3. 在进行用户态程序开发时,需要考虑异常情况的处理和错误信息的输出,确保程序的健壮性和可靠性。

有待提高的能力:

  1. 理解并掌握操作系统的内核机制和体系结构,提高对内核源代码的理解和阅读能力。
  2. 熟悉Linux系统调用的接口和使用方法,能够灵活地进行系统调用操作。
  3. 学会使用编译工具和环境,能够独立完成内核的编译和安装过程。
  4. 提高代码的编写能力和调试技巧,加强对程序异常情况的处理能力。
  5. 培养独立思考和解决实际问题的能力,寻找并探索更多的实践机会,不断提高自己的技术水平和能力。

相关文章
|
1月前
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
128 10
|
17天前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
1月前
|
Linux
Linux 操作系统
在 Linux 中,UID(用户 ID)是标识用户身份的重要概念。UID 唯一标识每个用户,通过 UID 可区分不同用户类别:UID 0 为超级用户,1-999 为系统用户,1000 及以上为普通用户。因此,正确选项为:UID 标识用户、可区分用户类别、普通用户 UID 大于 1000。
|
24天前
|
NoSQL Unix Linux
Linux 操作系统的诞生与发展历程
步探索与准备: 1991年初,林纳斯·托瓦兹开始在一台386sx兼容微机上学习minix操作系统。通过学习,他逐渐不能满足于minix系统的现有性能,并开始酝酿开发一个新的免费操作系统。
60 8
Linux 操作系统的诞生与发展历程
|
1月前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
78 34
|
2月前
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
89 7
|
2月前
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
115 6
|
2月前
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享
|
3天前
|
Linux
Linux 常用文件查看命令
`cat` 命令用于连接文件并打印到标准输出,适用于快速查看和合并文本文件内容。常用示例包括:`cat file1.txt` 查看单个文件,`cat file1.txt file2.txt` 合并多个文件,`cat &gt; filename` 创建新文件,`cat &gt;&gt; filename` 追加内容。`more` 和 `less` 命令用于分页查看文件,`tail` 命令则用于查看文件末尾内容,支持实时追踪日志更新,如 `tail -f file.log`。
21 5
Linux 常用文件查看命令

热门文章

最新文章