首页 > 编程知识 正文

c语言底层开发,新增linux系统调用

时间:2023-05-04 08:18:29 阅读:153730 作者:4389

Linux内核分析课程大作业1向主题Linux内核添加系统调用,创建相应的Linux APP应用程序。 使用该系统调用,可以遍历系统当前所有进程的任务描述符,并针对每个进程父子关系将对应于这些描述符的进程id(PID )组织成树结构进行显示。

2前提知识概要在Linux系统中,除了系统启动后的最初进程外,剩下的进程必须通过现有的进程来创建。 新制作的流程称为子流程,制作子流程的流程称为父流程。 系统启动和初始化完成后,Linux自动创建的过程称为根过程。 pid为0。 根进程是Linux上所有进程的祖先,其馀进程是根进程的后代。 具有相同父进程的进程称为兄弟进程。

Linux内核通过称为进程描述符的task_struct结构来管理进程。 此结构包含进程所需的所有信息。 这是在include/linux/sched.h文件中定义的。 task_struct结构的一部分如图2-2所示。

其中一些字段的意思是以下:

tasks :为了整理所有的流程

pid:进程的唯一标识符。

parent和real_parent:是进程的父进程。

children :进程的子进程链接列表。

sibling :进程的同级链表。

comm进程正在其中运行的可执行文件的名称。

3设计思路3.1设计思路在Linux内核中,通过task_struct结构组织进程,在task_struct结构的children字段中保存当前进程的子进程,以及所有Linux进程通用的祖先进程—— 从根进程出发,通过使用深度优先的思想,可以利用递归实现对当前Linux系统所有进程的遍历。

3.2实验步骤(1)下载Linux内核源代码

)2)修改内核源代码

)3)重新编译内核

)4)使用新编译的内核

(5)编写测试代码

4实验内容4.1下载Linux内核源代码(1)查看Ubuntu内核版本

)从http://FTP.sjtu.edu.cn/sites/FTP.kernel.org/pub/Linux/kernel /下载内核源代码,由自己编译的内核和系统持有

4.2修改内核源(1)修改/usr/src/Linux-4.16.2/kernel/sys.c将printchildren函数和sys_printAllInfo函数添加到文件中。

)修改2/usr/src/Linux-4.16.2/arch/x86/entry/syscalls/syscall _ 64.TBL文件以添加系统呼叫号码。

)修改3/usr/src/Linux-4.16.2/arch/x86/include/ASM/syscalls.h文件以添加系统调用函数声明。

4.3重新编译内核(1)做好准备工作,在命令行上执行以下命令

sudo apt-getupdatesudoapt-getinstallibncurses5- dev libssl-devsudoapt-getinstallbuild-essentialopensslsudoapt-get it pt-getinstallflexbisoncd/usr/src/Linux-4.16.2 (2)删除一些不需要的文件

sudomakemrpropersudomakecleansudomakemenuconfig (3)编译新内核

sudo make -j4 //j4表示用4个线程进行编译

(4)安装新内核

sudomakemodules _ installsudomakeinstall

4.4使用新编译的内核重新启动ubuntu,然后长按shift键选择重新编译的内核进入ubuntu。

4.5创建测试代码(1)创建测试文件(test.c )如下所示:

)2)编译测试代码

gcc test.c -o test.out 5的实验结果运行test.out程序,使用dmesg命令时,程序的部分执行结果如下所示。

6实验中遇到的问题1 :最初没有使用编译内核的方法,而是修改了内核的符号表,试图通过劫持系统调用来实现。 由于Linux内核2.6及更高版本不支持导出内核符号表,所以我尝试了各种方法查找系统调用表的地址,但最终选择了编译内核的方法。

q2 :编译内核后,执行自己编写的系统调用函数,没有输出信息。 经过调查,原因是系统上搭载的内核不是自己重新编译的内核,而是重新启动后选择自己编译的内核后得到解决的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。