您的位置:首页 > 运维架构 > Linux

LINUX内核剖析与改进:(系统调用实现的功能:计算一个数字的三次方,并打印出来)

qq_43216427 2020-05-05 12:20 375 查看 https://blog.csdn.net/qq_43216

一、设计内容
新增linux系统调用:
1、需要重新编译linux内核;
2、增加一个linux的系统调用;
3、另外写一个程序运行调用。

二、设备与环境
1、设备:普通PC机;
2、环境:
(1)win7上的虚拟机VMware Workstation 9、ubuntu(64位)12.04系统
(2)原内核版本:3.13.0
(3)编译的新内核版本:3.16.57

三、设计思想
实验步骤:
1、准备工作:
(1)首先在PC机上安装VMware Workstation 9:这个安装过程还比较顺利,没有遇到很大的问题,安装完成后如图1所示:

图1
(2)然后再创建新的虚拟机(这里选取几张主要的截图进行说明):
(a)这里我选择的是自定义的,方便更改SCSI适配器和虚拟磁盘类型,如图2所示:

图2
(b)这里我选择的是以后再安装操作系统(建立虚拟空白磁盘后在编辑虚拟机设置中进行设置图4),如图3所示:

图3
如图4所示选择CD/DVD(IDE),然后在右侧选择使用IOS映像文件:

图4
(c)选择虚拟机当前容量由为重要,一开始我选择的是2GB,但在编译完内核后内存空间就不够用了,如图5所示,选择推荐最大内存量:

图5
(3)下载内核:这里我下载的是3.16.57版本如图6,下载后保存文件如图7,可以在主文件夹下的下载里找到对应文件:

图6

图7
(4) 打开终端获得权限,并输入su输入设置的密码,切换到root权限,如图8所示:

图8
(5)移动文件并解压,如图9所示:

图9
(6)解压成功,如图10所示:

图10
(7)可在对应目录中看到解压后的文件,如图11所示:

图11
2、增加一个linux的系统调用:
(1)添加系统调用函数:如下图,首先利用命令sudo gedit sys.c调出sys.c如图12,然后在末尾endif前添加一个系统调用函数,最后保存、关闭,如图13所示:

图12

图13
(2)添加调用函数声明:首先利用命令sudo gedit syscalls.h调出如图14,然后在末位endif前添加函数声明,最后保存、关闭,如图15所示:

图14

图15
(3)添加系统调用号:首先利用命令sudo gedit syscall_64.tbl调出如图16,然后在317这添加,最后保存关闭,如图17所示:

图16

图17
3、编译内核
(1)安装基本编译器套件如图18、19所示:

图18

图19
(2)编译:
(a)make mrproper清除以前配置,若是第一次编译,不用执行此操作;
(b)make menuconfig 配置内核如图20、21、22所示:

图20

图21

图22
(c)make baImage编译内核,如图23所示,如图24编译完成:

图23

图24
(d)make modules编译模块:
(e)安装模块到正确目录:make modules_install;
(f)安装:make install;
(g)更新开机启动项:update-grub;
(h)重启:reboot;
(i)uname -a查看当前内核详细信息,可以看到内核更新时间如图25所示:

图25
4、另外写一个程序运行调用:
(1)测试函数,如图26所示:

图26
(2)编译并运行测试函数得出结果:这里是求3的三次方,结果为27,如图27所示:

图27
四、主要数据结构和流程(这里我大概说明一下实验的过程):
1、数据结构:
(1)添加的系统调用函数:
asmlinkage long sys_ln1(long n){
return nnn;
}
(2)添加的函数声明:
asmlinkage long sys_ln1(long n);
(3)测试程序:
#include <stdio.h>
void main()
{
long t=syscall(317,3);
printf(“%ld”,t);
}
五、实验测试结果及结果分析
1、实验测试结果:27(3^3);
2、结果分析:在添加系统调用时,首先添加系统调用函数,返回一个数的的三次方;然后添加函数声明,声明求一个数的三次方的函数;最后添加系统调用号,在测试程序t=syscall(317,3)中的317是在syscall_64.tbl中添加的调用号,3代表求的是3的三次方,故为27。

七、课程设计总结
1、实验中遇到的问题及解决办法:
(1)在选择虚拟机内存时,第一次我选择的是2048MB,但在第一次编译结束安装模块时没有了可用空间;然后我尝试重新划分分区,又遇到了新的问题,不能进入虚拟机的桌面,尝试了各种方法后我只能重建虚拟机,重新安装,选择推荐最大,如图29所示:

图29
(2)在重启虚拟机后遇到过桌面上没有任何快捷方式甚至黑屏的情况,解决方式是: (a)在下图中,点击用户名后那个圆形图标如图30,然后选择ubuntu 2D如图31;

图30

图31
(b)在有的资料中也有说可以通过在虚拟机设置中,取消如32图中3D图形加速前面的选择,但可能是版本的问题,我不能取消。

图32
(3)在解压下载的文件时,首先需要在终端通过mv ‘/home/zyp下载/linux-3.16.57’ ‘/usr/src’,把下载的文件移动到新的目录下,但新的目录下面任然没有这个文件,我的解决方式是:先手动复制一份文件到新的目录下,然后进行移动并解压;
(4)在添加系统调用时,首先在终端编辑sys.c时,由于出现错误,sys.c中是空白,经过仔细检查发现我在下载内核时由于未出现如图33的进度框,不能了解文件是否下载完成,而由于保存了文件,所以主文件夹中下载中能够找到相应的文件,但文件时不完整的。

图33
(5)在终端编辑sys.c时,出现错误如图34:解决方式:编辑sys.c时,用命令sudo gedit sys.c(由于一开始进入root权限时用的是su命令).

图34
(6)在make menuconfig 时出现错误提示:
*** Unable to find the ncurses libraries orthe
…….
Make[1]😗** [scripts/kconfig/dochecklxdialog]错误1
Make:*** [menuconfig]错误2
解决方式:sudo apt-get install libncueses*,安装ncurses。
(7)在第一次编写程序运行调用时,发现一个数的三次方结果是-1,经过检查发现,在添加系统调用号时,应该是在syscall_64.tbl中添加,而我在syscall_32.tbl中添加了(因为下载的64位的),解决方法是重新编辑文件、添加系统调用。

qq_43216427 原创文章 3获赞 0访问量 507 关注 私信
标签: 
相关文章推荐