目录
一、 设计目的与要求
二、 设计内容
三、 设备与环境
四、 设计思想
五、 主要数据结构和流程
六、 实验测试结果及结果分析
七、 课程设计总结
附件1 课程设计答辩记录
附件2 源程序清单
一、设计目的与要求
该课设的设计目的是让学生了解Linux系统调用的实现原理,掌握Linux内核源代码的修改方法,以及掌握如何编写调用程序来调用新增的系统调用。要求学生能够独立完成该课设,并能够理解系统调用的概念和实现方法。
二、设计内容
采用编译内核法,重新编译Linux内核,在Linux中增加一个系统调用。
要求:(1)系统调用实现的功能:计算一个数字的三次方, 并打印出来。(2)另外写一个程序进行调用。
三、设备与环境
设备:VMware Workstation Pro
环境:Ubantu15.0.2
映像:ubuntu-16.04-desktop-amd64.iso
四、设计思想
4.1设计思路
修改Linux内核,增加一个新的系统调用来实现计算一个数字的三次方并打印出来的功能,包括下载Linux内核源代码,并进行修改编译修改后的Linux内核,并将其安装到系统中,编写一个调用这个新系统调用的程序。
4.2主要步骤
(1)查看原来内核:
(2)下载新内核:
wget https://mirror.bjtu.edu.cn/kernel/linux/kernel/v5.x/linux-5.6.15.tar.gz,然后回车。结果如图
(3)将下载好的安装包移动到 /usr/src 目录下,然后解压.,终端输入如下命令,结果如图
mv linux-5.6.15.tar.gz /usr/src
cd /usr/src
tar -xvf linux-5.6.15.tar.gz
(4)下载超级编辑器vim(此前已下载好),我这里已经下载好,若没下,可以使用sudo apt-get -y install vim进行下载
(5)新增系统调用:
添加调用函数声明:vim include/linux/syscalls.h
在#ifndef前加asmlinkage long sys_cube(int num);
注:i进入编辑模式,添加后Esc返回,最后shiift+:敲wq保存退出。
(6)添加调用函数定义,输入vim kernel/sys.c,在文末添加函数
SYSCALL_DEFINE1(cube,int,num){
int result = numnumnum;
printk(“The result is %d.\n”,result);
return result;
}
(7)添加系统调用号
输入vim arch/x86/entry/syscalls/syscall_64.tbl,在syscall_64.tbl文件中添加439项内容
(8)安装编译内核所需的依赖包:
apt-get -y install make
apt-get -y install libncurses5-dev
apt-get -y install flex
apt-get -y install bison
apt-get -y install libssl-dev
apt-get -y install libelf-dev
(9)配置内核
输入make menuconfig,在跳出的界面中依次执行【Save】—>【Ok】—>【Exit】—>【Exit】
(10)编译
在【终端】中键入make -j8(8个线程开始编译),大概一个小时左右,如图所示编译完成
键入make modules、make modules_install命令,分别完成模块的编译和安装操作。
(11)安装内核
【终端】输入make install
(12)重启系统
【终端】输入uname -r,查看内核版本,如图所示已对内核重新编译
编写调用程序:
保存后退出,在【终端】中依次执行gcc test.c -o test.out、./test.out即可得到测试结果
五、主要数据结构和流程
调用函数声明:
调用函数定义:
主要流程:
六、实验测试结果及结果分析
编写调用程序,保存后退出。
在【终端】中依次执行gcc test.c -o test.out、./test.out即可得到测试结果
如图程序测试结果,符合预期。
七、课程设计总结
本次课程设计为Linux中新增一个系统调用,并编写一个程序进行调用,实现计算一个数字的三次方并打印出来的功能。该课设是一项非常实用的课程设计,通过实践来加深了我对Linux系统调用的理解,提高自己的编程能力和实践能力。在实践中,需要注意修改内核源代码时需要谨慎操作,避免出现错误。同时,编写调用程序时需要注意调用系统调用的方法和参数。包括实现的步骤,包括修改内核源代码、编写系统调用代码和调用程序代码等。
通过本次课程设计,您学会了安装及使用以Linux为内核的Ubuntu系统,对其中使用到的命令也得到了更深刻的认识。比如,tar是解压命令,可以将压缩文件解压缩到指定目录下;vim是超级编译器,有着强大的功能,可以编辑各种类型的文件。此外,您还对“内核、系统调用”等概念有了更深的认识和理解。内核是操作系统的核心部分,负责管理系统资源、提供系统调用接口等。
通过该课程的学习,我基本掌握了Linux内核源代码的修改方法,这是非常重要的技能。通过了解系统调用的实现原理和调用方法,我更好地理解操作系统的工作原理,从而更好地进行系统调试和优化。此外,我还提高了自己的编程能力和实践能力,这对于我的职业发展和学术研究都非常有帮助。在未来的工作中,您可以更好地理解和优化系统,提高系统的性能和稳定性。同时,我还可以更好地进行系统开发和调试,提高自己的技术水平。总之,通过该课设的学习,我获得了非常宝贵的技能和经验,这将对我的职业发展和学术研究产生非常积极的影响。
附件1 课程设计答辩记录
选题:题目1:新增Linux系统调用
过程:首先,先下载新内核,解压,然后用超级编译器vim打开内核中的syscalls.h添加调用函数声明,打开sys.c添加调用函数的定义,打开syscall_64.tbl添加调用端口号,最后编译安装新内核,编写相应程序进行调用测试。
遇到的问题:一开始没有选好磁盘大小,导致编译内核时磁盘无存储空间报错。重新建虚拟机导致vmtools(能改善鼠标移动性和性能)用不了。打开相关配置文档时需要划动到文章底部,十分费劲。重新做到编译内核时又出现错误提示gcc相关错误。
如何解决:尝试无法通过更改磁盘大小解决后,选择重建虚拟机,把磁盘大小尽量调大又不影响性能,重建虚拟机添加国内源以及重新安装vmtools并执行相关命令,vmtools得以重新使用。可以借助快捷键在文档中滑动到底部。gcc问题仔细查询后原因为gcc版本过低导致编译失败,升级gcc版本后得以编译成功。
注意:函数的声明、调用和端口号需要写在正确的位置,在升级gcc以及编译内核过程较久,可能会持续一两个小时,可以设置屏幕永不息屏后开始编译,以免在编译过程中出现问题。
附件2 源程序清单
函数声明:asmlinkage long sys_cube(float num);
函数调用:
SYSCALL_DEFINE1(cube,float,num){
int result = numnumnum;
printk(“The result is %f.\n”,result);
return result;
}
测试程序:
include<stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>
void main(){
long a=syscall(439,3.0);
printf(“the result is %lf.\n”,a);
}