您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 关于Linux系统增加系统调用的方法
Linux系统增加系统调用之前的一段时间就做过Linux系统的系统调用的实验,但是一直无法最终实现,这几天又重新捣鼓了一下,最终终于成功实现了在Linux中增加系统调用,在此本人使用的Linux系统为RedHatLinux9.0,系统内核为linux-2.4.80的版本。下面就讲述一下个人的实验经过。一、系统文件修改进入RedHatLinux9.0后,右击桌面,打开终端,在终端中输入cd命令到内核目录下:[root@localhostroot]#cd/usr/src/linux-2.4如下图所示:图1首先,进入/usr/src/linux-2.4/kernel目录,用ls查看该目录下的文件,找到其中的sys.c文件,如下所示:图2若在kernel目录下找不到sys.c文件,说明在安装的时候没有将内核编译工具以前装上,可以导入安装光盘,双击打开进行系统工具的添加。找到该文件后,使用命令:[root@localhostkernel]#geditsys.c打开文件,并将要增加的系统调用写入其中,如下所示:图3图中选中部分内容即为本次本人所增加的系统调用,因为这是一次实验,所以增加的内容显得比较简单,只是调用一个foo函数,输出一个整数,在添加的内容中,有几点要特别注意:1、在sys.c中,增加的系统调用的函数名必须以“sys_”开头2、输出语句应为printk()而不是printf(),这和之前所认识的输出语句有所不同3、函数前面要带上asmlinkage标记修改完sys.c文件之后,进入/usr/src/linux-2.4/include/asm-i386目录下,找到unistd.h文件,并在其中添加刚才在sys.c文件中添加的函数的系统调用号,如下所示:、图4图5完成这一步骤之后,接下来要修改第三个文件,也是最后一个文件,entry.S,该文件在/usr/src/linux-2.4/arch/i386/kernel目录下,如图所示:图6打开该文件,并在该文件中添加之前写入sys.c文件中的系统函数的清单号,如下图所示:图7保存退出后,自此则完成了对增加系统调用所涉及的的要修改的文件的修改,完成这步以后,就要开始对修改后的内核进行编译了。二、内核编译在编译之前我们要先做好一些前期准备。首先,在/usr/src/linx-2.4目录下找到Makefile文件,并进行修改,如下所示:图8图9将Makefile文件中第三行的“EXTRAVERSION=-8custom”中的“custom”去掉,这样就可以在完成编译以后直接重启系统即可,不需要另外增加内核,但使用这种方法会有一个弊端,那就是如果不能从成功这个系统就不能再使用了,若使用的是Vmware虚拟机,则可以在开始本实验之前,对系统进行备份,在“VM”菜单选项中有“clone”的选项,可以进行系统备份,如下所示:做完这一步之后就可以正式的开始内核编译了。主要步骤为:makemrproper//文件归位。清除上次编译内核的文件如果是第一次编译,则可以省略这一步makemenuconfig//选择内核编译的选项makedep//作用:配置内核代码前需要进行配置;根据用户的配置设置源代码的相关性必选的配置选项如下:SCSIdevicesupport---SCSIlow-leveldrivers---*BusLogicSCSIsupport//对于这一选项,进去以后会发现BusLogicSCSIsupport只有“M”和两种种选项,要想出现“*”的选项,只要在进入SCSIlow-leveldrivers以后将第一项设为“*”FusionMPTdevicesupport---MFusionMPT(base+ScsiHost)drivers和MFusionMPTmiscdevice(ioctl)driver(这个要用模块形式加载)Networkdevicessupport---Ethernet(10or100Mbit)---*AMDPCnet32PCIsupportblockdevices---RAMdisksupport和Initialdisk(initrd)supportFilesystems---ext3jourmallingsystemsupport//最后两条个人在做的时候没有去改动它,默认选择“M”makebzImage//内核编译,生成一个新内核映像文件bzImage,即编译好的可以被cpu直接执行的二进制机器码。makemodulesmakemodules_install//配置的内核有模块支持makeinsall//将内核安装在系统中编译过程会有点长,需要耐性等待,完成重新启动系统即可。四、检测为检测本次试验是否成功,本人写了一个简单的小程序,调用foo()函数,代码如下://test.c#includestdio.h#includelinux/unistd.h#includeerrno.h#define__NR_foo259_syscall1(long,foo,int,ret)Intmain(){Inti,j;i=2;j=100;i=foo(j);printf(“Thisistheresultofnewkernel\n”);return0;}在终端中编译test.c文件,运行,运行结果如下所示:在Xwindows下并没有将调用函数后的结果显示出来,要查看结果,需要在字符界面下运行才能看到,用ctrl+alt+shift+F1,从图形界面切换到字符界面,如下所示:另外还可以从日志文件中查看结果,在/var/log/messages文件下查看结果,显示如下:自此,本次试验就圆满结束了。
本文标题:关于Linux系统增加系统调用的方法
链接地址:https://www.777doc.com/doc-5959083 .html