ubuntu系统中添加新的系统调用2.6.33.1(linux)
- 格式:doc
- 大小:35.00 KB
- 文档页数:7
一、题目:新增Linux系统调用(1)需要重新编译Linux内核(2)增加一个Linux的系统调用(3)写一个用户程序进行调用测试。
系统调用实现的功能:计算一个数字的三次方,并打印出来。
二、版本:编译版本:Win10上虚拟机(Virtual Box) Ubuntu(64bit)15.04系统原内核版本:3.19.0编译的新内核源码版本:3.2.75不同内核版本,32位和64位文件位置以及文件名可能有所不同。
添加系统调用时要根据自己的版本的文件位置和文件名修改相应的三个文件。
三、步骤:1.前期准备:下载内核及解压1.1下载内核:1.2打开终端获得权限然后再输入su输入刚刚设置的密码。
1.3移动文件并解压下载目录2.添加系统调用2.1添加系统调用函数在文末添加调用函数。
然后保存,关闭。
2.2 添加调用函数声明在文末#endif前添加函数声明。
然后保存关闭。
2.3添加系统调用号因为前一个系统调用号是311 所以这里我们写312将原本的#defineNR_syscalls (__NR_syscall_max+1)修改为:#defineNR_syscalls (__NR_syscall_max + 2)然后保存,关闭。
3.编译内核3.1安装基本编译器套件3.2编译3.1make mrproper清除以前配置(如果是第一次编译,不用执行此操作)3.2 make menuconfig配置内核(此处选择了默认配置)3.3 make编译内核如果电脑是双核则也可以用make–j4代替make(双核编译会更快一些)接下来就是漫长的等待过程,不过要随时注意是否编译过程中因有错误而停止。
我的电脑用了两个小时。
(也有教程里用的是make bzlmage和makemodules,make bzlmage+make modules=make)4.安装内核4.1makemodules_install4.2makeinstall4.2 reboot重启(或不使用命令直接对电脑进行重启)ﻩ重启之后在开机时候开机时候,如果是虚拟机需要同时按esc和↑键出现开机启动项(如果是真机开机一般会自动出现开机启动项),选择新建的内核版本进入。
实验一添加一个新的系统调用一、实验目的理解操作系统内核与应用程序的接口关系;加深对内核空间和用户空间的理解;学会增加新的系统调用。
二、实验内容与要求首先增加一个系统调用函数,然后连接新的系统调用,重建新的Linux内核,用新的内核启动系统,使用新的系统调用(2.4内核和2.6内核任选一个)三、实验指导(2.6版本)⑴获得源代码(本次实验的内核版本是2.6.22.5,必须是root用户)1.从教育在线上下载内核源代码到本地磁盘;保存在/usr/src目录下2.进入终端,输入命令cd /usr/src 进入/usr/src目录(可以输入ls命令会发现目录下有一个名为LINUX_2_6_22_5.TAR.BZ2的压缩文件)3.当前目录下(/usr/src)输入命令tar –xjvf LINUX_2_6_22_5.TAR.BZ2 解压缩源代码,命令执行完毕后,会出现/usr/src/linux-2.6.22.5文件夹4.修改文件夹下的3个文件第一,编辑/usr/src/linux-版本号/kernel/sys.c文件,添加函数:asmlinkage long sys_mycall(long number){printk(“call number is %d\n”,number);return number;}第二,修改/usr/src/linux-版本/include/asm-i386/unistd.h添加一行#define __NR_mycall 324 到当前的最大系统调用号之后,比如原来最大的是323,在323的这一行之后加上一行#define __NR_mycall 324修改#define NR_systemcalls 的值,改成原来的值+1,比如原来是324 改成325第三,编辑/usr/src/linux-版本/arch/i386/kernel/syscall_table.S,在文件最后加上一行:.long sys_mycall5.重新编译内核在终端输入命令,进入源代码文件夹,cd /usr/src/linux-2.6.22.5 依次执行如下命令:make mrpropermake cleanmake xconfig (自己配置内核,出现图形对话框后,直接点保存,关闭)make(耗时最长,大约20分钟)make modules_install (安装模块)以上命令执行完毕后,会在当前目录下生成一个名为System.map的文件,会在/usr/src/linux-版本号/arch/i386/boot/下生成一个bzImage文件。
linux系统调用流程Linux系统调用流程主要包括以下几个步骤:1. 用户程序发起系统调用:用户程序通过调用C库函数(如read、write等)发起系统调用。
C库函数会将系统调用的参数打包到指定的寄存器中,并通过软中断(int 0x80或sysenter指令)触发一个中断。
2.内核保存现场:当用户程序触发中断后,CPU会从用户态切换到核心态,此时控制权转交给内核。
内核会保存用户程序执行的上下文(即寄存器状态、代码段选择器等),以便系统调用执行完后返回到用户程序继续执行。
3.系统调用处理:内核根据中断向量号找到系统调用处理函数的入口地址,并执行相应的处理代码。
系统调用处理函数根据调用的系统调用号(存储在EAX寄存器中)在系统调用表中查找对应的处理函数。
4.参数传递与验证:系统调用处理函数根据规定的参数个数和顺序,从寄存器或用户程序的堆栈中读取参数。
内核会对参数进行验证,确保用户程序没有越权访问操作系统资源。
5.执行系统调用:系统调用处理函数根据参数的具体内容执行相应的系统调用操作,如打开文件、读写文件、创建进程等。
内核代码会完成对应的系统调用功能,并更新相关的数据和状态。
6.返回结果:系统调用完成后,会将结果存储在指定的寄存器中,如EAX寄存器。
再将保存的用户程序上下文恢复,将控制权从内核返回到用户程序。
用户程序可以通过检查返回值来判断系统调用是否执行成功。
总结:Linux系统调用流程包括用户程序发起系统调用、内核保存现场、系统调用处理、参数传递与验证、执行系统调用和返回结果等步骤。
通过系统调用,用户程序能够获取操作系统提供的服务和资源,实现各种功能。
系统调用流程涉及用户态和核心态的切换,用户程序和内核通过寄存器和堆栈传递参数和返回结果,确保了用户程序与操作系统之间的安全和可靠交互。
两种⽅法添加系统调⽤通过修改内核源代码添加系统调⽤通过以上分析linux系统调⽤的过程,将⾃⼰的系统调⽤加到内核中就是⼀件容易的事情。
下⾯介绍⼀个实际的系统调⽤,并把它加到内核中去。
要增加的系统调⽤是:inttestsyscall(),其功能是在控制终端屏幕上显⽰hello world,执⾏成功后返回0。
1编写inttestsyscall()系统调⽤编写⼀个系统调⽤意味着要给内核增加1个函数,将新函数放⼊⽂件kernel/sys.c中。
新函数代码如下:asmlingkage sys_testsyscall(){ console_print("hello world ");return 0;}2连接新的系统调⽤编写了新的系统调⽤过程后,下⼀项任务是使内核的其余部分知道这⼀程序的存在,然后重建包含新的系统调⽤的内核。
为了把新的函数连接到已有的内核中去,需要编辑2个⽂件:1).inculde/asm/unistd.h在这个⽂件中加⼊#define_NR_testsyscall 1912).are/i386/kernel/entry.s这个⽂件⽤来对指针数组初始化,在这个⽂件中增加⼀⾏:.long SYMBOL_NAME(_sys_tsetsycall)将.rept NR_syscalls-190改为NR_SYSCALLS-191,然后重新奖励和运⾏新内核。
3).使⽤新的系统调⽤在保证的C语⾔库中没有新的系统调⽤的程序段,必须⾃⼰建⽴其代码如下#inculde_syscall0(int,testsyscall)main(){tsetsyscall();}在这⾥使⽤了_syscall0()宏指令,宏指令本⾝在程序中将扩展成名为syscall()的函数,它在main()函数内部加以调⽤。
在testsyscall()函数中,预处理程序产⽣所有必要的机器指令代码,包括⽤系统调⽤参数值加载相应的cpu寄存器,然后执⾏int 0x80中断指令。
添加系统调用(模块添加法fedora10:2.6.27.5内核)
一、为什么要使用内核模块的方式添加系统调用?
⏹编译内核的方式费时间,一般的PC机都要两三个小时。
⏹不方便调试,一旦出现问题前面的工作都前功尽弃。
二、用内核模块的方式实现系统调用有个前提,就是系统必须导出sys_call_table 内核符号,但是在2.6内核和2.4.18以上版本中,sys_call_table不再导出。
也就是说模块中不能再通过简单的extern void *sys_call_table[];来获得系统调用
表地址。
但是,即使内核不导出sys_call_table,也可以在内存中找到它的地址,下面是它的实现方法:
第1步:编写syscall_my.c程序:
pptprogram/syscall/module_syscall/syscall_my.c
第2步:编写Makefie文件
见pptprogram/syscall/module_syscall/Makefile
第3步.执行make命令编译模块
第4步:执行insmod命令插入模块,此时会把自己编写的系统调用插入到系统调用表中。
Ubuntu编译安装Linux内核过程编译安装Linux内核是Ubuntu系统用户进行内核优化、定制和个性化的重要方式之一、本文将介绍Ubuntu编译安装Linux内核的过程,帮助用户完成编译安装。
## 1. 获取Linux内核源代码##2.安装必要的工具和依赖项在编译安装Linux内核之前,需要安装一些必要的工具和依赖项,以确保编译过程的顺利进行。
你可以通过以下命令来安装它们:```sudo apt updatesudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev```##3.解压源代码```tar -xf linux-x.x.x.tar.xz```##4.进入源代码目录进入解压后的源代码目录:```cd linux-x.x.x```##5.配置内核在继续编译之前,需要对内核进行配置。
你可以使用以下命令打开配置窗口:```make menuconfig```这个命令会打开一个文本界面的配置窗口,你可以在其中选择和配置不同的内核选项。
根据你的需求进行自定义配置。
##6.编译内核完成内核配置后,可以执行以下命令来开始编译内核:```make -j4```这个命令中的“-j4”表示使用4个线程进行编译。
你可以根据你的系统硬件配置自定义线程数量。
编译内核的时间会根据你的系统配置和编译选项的不同而有所不同。
请耐心等待编译过程完成。
##7.安装内核完成编译后,可以执行以下命令来安装编译得到的内核:```sudo make modules_install install```这个命令将编译得到的内核模块和内核文件安装到系统中。
安装完成后,你需要更新系统的引导加载程序(grub)以使用新的内核。
##8.更新引导加载程序执行以下命令来更新引导加载程序(grub):```sudo update-grub```这个命令会自动检测并添加新安装的内核到引导菜单中。
linux文件系统的系统调用命令Linux文件系统的系统调用命令Linux是一个开源的操作系统,提供了许多强大且灵活的系统调用命令来管理文件系统。
本文将深入探讨Linux文件系统的系统调用命令,包括创建、删除、重命名、复制和移动文件,以及设置文件权限和属性等功能。
一、文件系统简介在Linux系统中,文件系统是指对存储设备的管理和组织。
它使用层次结构来管理文件和目录,允许用户在存储设备上创建、访问和操作文件。
文件系统的目的是提供一种有效和可靠的方式来组织和存储数据。
二、系统调用命令Linux系统提供了一系列的系统调用命令,可以通过调用这些命令来操作文件系统。
1.创建文件创建文件是文件系统中的常见操作。
在Linux中,可以使用open系统调用命令来创建文件。
open命令的语法如下:int open(const char *pathname, int flags, mode_t mode);pathname:指定文件的路径和名称。
flags:指定文件的打开模式,如O_RDONLY(只读)、O_WRONLY (只写)、O_RDWR(读写)等。
mode:指定文件的权限模式。
open命令返回一个文件描述符,以便在后续的操作中引用该文件。
2.删除文件删除文件是通过unlink系统调用命令实现的。
unlink命令的语法如下:int unlink(const char *pathname);pathname:指定要删除的文件的路径和名称。
3.重命名文件重命名文件是通过rename系统调用命令实现的。
rename命令的语法如下:int rename(const char *oldpath, const char *newpath);oldpath:指定要重命名的文件的路径和名称。
newpath:指定重命名后的文件的路径和名称。
4.复制文件复制文件是通过使用read和write系统调用命令实现的。
read命令用于从源文件中读取数据,write命令用于将数据写入目标文件。
Ubuntu随着微软的步步紧逼,包括早先的Windows黑屏计划、实施,逮捕番茄花园作者并判刑,种种迹象表明,中国用户免费使用盗版Windows的日子将不会太长久了,那么这个世界上有没有即免费又易用的操作系统呢?答案是有,那就是Ubuntu操作系统。
Ubuntu 被授予PC World 2006 World Class Award,证明了Ubuntu成为世界最好的100个产品之一。
Ubuntu是一个流行的Linux操作系统,基于Debian发行版和GNOME桌面环境,和其他Linux 发行版相比,Ubuntu非常易用,和Windows相容性很好,非常适合Windows用户的迁移,预装了大量常用软件,中文版的功能也较全,支持拼音输入法,预装了Firefox、Open Office、多媒体播放、图像处理等大多数常用软件,一般会自动安装网卡、音效卡等设备的驱动,对于不打游戏不用网银的用户来说,基本上能用的功能都有了,在Windows操作系统下不用分区即可安装使用,就如同安装一个应用软件那么容易,整个Ubuntu操作系统在Windows下就如同一个大文件一样,很容易卸载掉。
下面我就介绍一下Ubuntu操作系统安装使用的方法,供Ubuntu新手参考,希望能起到Linux扫盲的作用。
一、什么是Ubuntu?Ubuntu 是一个南非的民族观念,着眼于人们之间的忠诚和联系。
该词来自于祖鲁语和科萨语。
Ubuntu(发音"oo-BOON-too"——“乌班图”)被视为非洲人的传统理念,也是建立新南非共和国的基本原则之一,与非洲复兴的理想密切相关。
Ubuntu 精神的大意是“人道待人”(对他人仁慈)。
另一种翻译可以是:“天下共享的信念,连接起每个人”。
“具有ubuntu 精神的人心胸开阔,乐于助人,见贤思齐而不忌妒贤能,因为他/她拥有适度的自信,而这源自如下认识:自己乃是属于一个更大的整体,当他人受到伤害或死去时,当他人受到折磨或压迫时,这个整体就会消失。
Ubuntu是一个以桌面应用为主的Linux操作系统,其用法主要包括以下方面:1.文件管理:在Ubuntu中,你可以使用Nautilus文件管理器来浏览和操作文件。
通过Nautilus,你可以创建文件夹、复制或移动文件、重命名文件等。
你还可以使用终端命令行来管理文件,如使用ls命令列出目录内容,使用cd命令更改目录等。
2.应用程序安装:Ubuntu使用APT包管理系统来安装和管理应用程序。
你可以使用apt-get命令来安装新应用程序,例如:sudo apt-get install <package-name>。
你还可以使用apt-cache命令来搜索和管理已安装的包。
3.系统设置:你可以通过系统设置来配置Ubuntu的各种选项,例如:更改主题、设置桌面背景、调整屏幕分辨率等。
在系统设置中,你还可以进行账户管理、网络设置等操作。
4.软件源管理:Ubuntu使用软件源来获取软件包信息,并将其存储在本地数据库中。
你可以通过软件源来查找和安装新应用程序,例如:使用apt-get update命令更新本地软件源数据库,然后使用apt-get install命令安装新应用程序。
5.命令行操作:Ubuntu是一个基于Linux的操作系统,因此它支持使用命令行来进行各种操作。
你可以使用终端命令行来执行各种系统命令,例如:使用ls命令列出目录内容,使用cd命令更改目录等。
在Ubuntu中,你可以使用一些常用的快捷键来执行某些常用命令,例如:Ctrl+C复制,Ctrl+V粘贴,Ctrl+Z撤销等。
以上是Ubuntu的一些基本用法,希望能对你有所帮助。
如果你还有其他问题或需要更详细的说明,请随时提问。
首先在终端执行sudo apt-get install nautilus-open-terminalsudo apt-get install nautilus-gksu然后就可以右键在终端打开和右键以管理员打开文件了,如果习惯用终端打开文件的话也可以跳过这一步同时建议使用VMWare的童鞋安装VMWare tools以便在宿主机与虚拟机之间复制数据中途如果出现以下错误greb: /boot/config-XX.XX.XX : no such file or directory请无视,没什么影响进行下面的操作前可以先执行sudo su获取权限1、下载内核apt-get install linux-source我下载到的内核文件是linux-source-2.6.35.tar.bz2,在/usr/src下2、解压内核cd /usr/srctar -jxvf linux-source-2.6.35.tar.bz2将内核解压到/usr/src3、修改文件a)/usr/src/linux-source-2.6.35/kernel/sys.c可以用右键管理员打开或者gedit /usr/src/linux-source-2.6.35/kernel/sys.c然后简单起见按照第一篇文章的函数修改sys.c文件在文件最后添加asmlinkage int sys_mycall(int number){printk("这是我添加的第一个系统调用");return number;}asmlinkage int sys_addtotal(int number){int i=0,enddate=0;printk("这是我添加的第二个系统调用");while(i<=number)enddate+=i++;return enddate;}asmlinkage int sys_three(){printk("这是我添加的第三个系统调用");return 0;}b)/usr/src/linux-source-2.6.35/arch/x86/kernel/syscall_table_32.S可以用右键管理员打开或者gedit /usr/src/linux-source-2.6.35/arch/x86/kernel/syscall_table_32.S然后在一列.long sys_XXXX的下一行添加.long sys_mycall.long sys_addtotal.long sys_three并记住他们分别是第几个.long sys_XXXXc)/usr/src/linux-source-2.6.35/arch/x86/include/asm/unistd_32.h可以用右键管理员打开或者gedit /usr/src/linux-source-2.6.35/arch/x86/include/asm/unistd_32.h在一列#define __NR_XXXX NNN后添加几行#define __NR_mycall 338#define __NR_addtotal 339#define __NR_three 340注意后面那个数字是接着上面那几行下来的d)/usr/src/linux-source-2.6.35/ubuntu/omnibook/Makefile这个是教程里面没有的,不一定要改,如果在后面编译模块时出现ld: /ubuntu/omnibook/sections.lds: No such file: No such file or directory make[2]: *** [ubuntu/omnibook/omnibook.o] Error 1make[1]: *** [ubuntu/omnibook] Error 2make: *** [ubuntu] Error 2以上错误,则需要修改,不过我建议还是先改了再说可以用右键管理员打开或者gedit /usr/src/linux-source-2.6.35/ubuntu/omnibook/Makefile找到下面两行#EXTRA_LDFLAGS += $(src)/sections.ldsEXTRA_LDFLAGS += $(PWD)/ubuntu/omnibook/sections.lds调换一下‘#’的位置,如下EXTRA_LDFLAGS += $(src)/sections.lds#EXTRA_LDFLAGS += $(PWD)/ubuntu/omnibook/sections.lds4、编译内核这里也是按照教程,首先进入解压目录cd /usr/src/linux-source-2.6.35a)make mrproper //清除内核中不稳定的目标文件,附属文件及内核配置文件b)make clean //清除以前生成的目标文件和其他文件c)make oldconfig// 采用默认的内核配置,如果这里出现选项,选择默认的选项,就是方括号内的第一个字母,不过我这里没出现选项d)make bzImage //编译内核,大概需要半小时e)make modules //编译模块,大概需要两小时,如果出现错误,看看是不是因为上面的第3步的d)没做f)make modules_install// 安装模块,比较快5、复制内核首先查看一下编译好的内核版本,以便命名打开/lib/modules里面应该多了一个纯数字不带"generic"的文件夹,那就是新内核版本号,我的是2.6.35.11 然后复制内核cp /usr/src/linux-source-2.6.35/arch/i386/boot/bzImage /boot/vmlinuz-2.6.35.11-mykernel6、创建initrd文件在创建之前先安装必要的程序apt-get install bootcd-mkinitramfsmkinitramfs -o /boot/initrd.img-2.6.35.11耐心等待创建完成7、更新配置GRUB引导列表可以用右键管理员打开/boot/grub/grub.cfg或者gedit /boot/grub/grub.cfg找到下面这种结构menuentry 'Ubuntu, with Linux 2.6.35-27-generic' --class ubuntu --class gnu-linux --class gnu --class os {recordfailinsmod part_msdosinsmod ext2set root='(hd1,msdos1)'search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2linux /boot/vmlinuz-2.6.35-27-generic root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro quiet splashinitrd /boot/initrd.img-2.6.35-27-generic}menuentry 'Ubuntu, with Linux 2.6.35-27-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {recordfailinsmod part_msdosinsmod ext2set root='(hd1,msdos1)'search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2echo 'Loading Linux 2.6.35-27-generic ...'linux /boot/vmlinuz-2.6.35-27-generic root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro singleecho 'Loading initial ramdisk ...'initrd /boot/initrd.img-2.6.35-27-generic}复制一份在这些结构前粘贴,注意必须贴在### BEGIN /etc/grub.d/10_linux ###……### END /etc/grub.d/10_linux ###里面,并将粘贴出来的结构中的linux /boot/vmlinuz-2.6.35-27-genericinitrd /boot/initrd.img-2.6.35-27-generic改成你的内核文件地址和initrd文件地址linux /boot/vmlinuz-2.6.35.11-mykernelinitrd /boot/initrd.img-2.6.35.11最好把其他所有版本相关信息号改成2.6.35.11(新编译的版本号),以便在Grub菜单选择比如改成menuentry 'Ubuntu, with Linux 2.6.35.11' --class ubuntu --class gnu-linux --class gnu --class os { recordfailinsmod part_msdosinsmod ext2set root='(hd1,msdos1)'search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2linux /boot/vmlinuz-2.6.35.11-mykernel root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro quiet splashinitrd /boot/initrd.img-2.6.35.11}menuentry 'Ubuntu, with Linux 2.6.35.11 (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {recordfailinsmod part_msdosinsmod ext2set root='(hd1,msdos1)'search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2echo 'Loading Linux 2.6.35.11 ...'linux /boot/vmlinuz-2.6.35.11-mykernel root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro singleecho 'Loading initial ramdisk ...'initrd /boot/initrd.img-2.6.35.11}注意检查一下/boot/目录下是否存在上面这两个文件,如果没有,证明上面的几部还没成功还有就是这些menuentry的顺序,有些系统启动引导时会直接进入第一个menuentry,如果第一个menuentry不是你想进的内核,则需要在开机时按Shift进入GRUB引导菜单选择内核。
Linux系统增加系统调用之前的一段时间就做过Linux系统的系统调用的实验,但是一直无法最终实现,这几天又重新捣鼓了一下,最终终于成功实现了在Linux中增加系统调用,在此本人使用的Linux 系统为Red Hat Linux 9.0,系统内核为linux-2.4.80的版本。
下面就讲述一下个人的实验经过。
一、系统文件修改进入Red Hat Linux 9.0后,右击桌面,打开终端,在终端中输入cd命令到内核目录下:[root@localhost root]#cd /usr/src/linux-2.4如下图所示:图1首先,进入/usr/src/linux-2.4/kernel目录,用ls查看该目录下的文件,找到其中的sys.c 文件,如下所示:图2若在kernel目录下找不到sys.c文件,说明在安装的时候没有将内核编译工具以前装上,可以导入安装光盘,双击打开进行系统工具的添加。
找到该文件后,使用命令:[root@localhost kernel]#gedit sys.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保存退出后,自此则完成了对增加系统调用所涉及的的要修改的文件的修改,完成这步以后,就要开始对修改后的内核进行编译了。
ubuntu命令大全Ubuntu命令大全。
Ubuntu是一个基于Debian的Linux操作系统,是一个开源免费的操作系统。
它具有良好的稳定性、安全性和易用性,因此备受用户喜爱。
作为一个Ubuntu用户,熟练掌握一些基本的命令是非常重要的,可以帮助我们更好地管理系统、提高工作效率。
在本文中,我将为大家整理一份Ubuntu命令大全,希望能够帮助大家更好地使用Ubuntu系统。
1. cd命令。
cd命令是change directory的缩写,用于切换当前工作目录。
例如,要切换到根目录,可以使用以下命令:```shell。
cd /。
```。
要切换到home目录,可以使用以下命令:```shell。
cd ~。
```。
2. ls命令。
ls命令用于列出指定目录中的文件和子目录。
例如,要列出当前目录下的所有文件和子目录,可以使用以下命令:```shell。
```。
要列出指定目录下的文件和子目录,可以使用以下命令:```shell。
ls /path/to/directory。
```。
3. mkdir命令。
mkdir命令用于创建新的目录。
例如,要在当前目录下创建一个名为test的目录,可以使用以下命令:```shell。
mkdir test。
```。
4. rm命令。
rm命令用于删除文件或目录。
要删除文件,可以使用以下命令:```shell。
rm filename。
```。
要删除目录及其下所有文件和子目录,可以使用以下命令:```shell。
rm -r directory。
5. cp命令。
cp命令用于复制文件或目录。
例如,要将文件file1复制到目录directory中,可以使用以下命令:```shell。
cp file1 directory。
```。
要将目录directory1复制到目录directory2中,可以使用以下命令:```shell。
cp -r directory1 directory2。
```。
6. mv命令。
操作系统实验一:向Linux内核增加一个系统调用xx711103xx2012年3月18日一、实验目的通过实验,熟悉Linux操作系统的使用,掌握构建与启动Linux内核的方法;掌握用户程序如何利用系统调用与操作系统内核实现通信的方法,加深对系统调用机制的理解;进一步掌握如何向操作系统内核增加新的系统调用的方法,以扩展操作系统的功能。
二、实验内容1.Linux环境下的C或C++编译和调试工具的使用2.向Linux内核增加新的系统调用,系统调用名称和功能自行定义3.Linux新内核的编译、安装和配置4.编写应用程序以测试新的系统调用并输出测试结果三、实验步骤1、安装VirtualBox-4.0.8并在虚拟机上安装ubuntu11.10。
(电脑上本有ubuntu11.10 64位系统,但在编译内核完成后发现参考教程为32位系统,因64位系统与32位系统增加系统调用步骤差别较大,身为初学者的我选择安装虚拟机,并重新编译……)2、安装编译源环境sudo apt-get install build-essential、sudo apt-get install gcc、sudo apt-get install g++编写一个c++或c程序,并使用gcc–o xxx或g++-o xxx进行编译并运行。
3、用sudo apt-get update更新软件源,并用apt-get install linux-source命令下载适合自己的内核。
(当使用过老版本内核时,采用默认的内核配置make oldconfig时,将会造成错误,自己也因此重做一遍)。
4、增加系统调用:第一步:解压文件#cp linux-source-3.0.0.tar.bz2/usr/src拷贝至/usr/src目录#tar xvf linux-source-3.0.0.tar.bz2解压文件第二步:修改源程序,增加系统调用实现#gedit/usr/src/linux-source-3.0.0/kernel/sys.casmlinkage int sys_mycall(int number){printk("hello,my new kernel,xw~!");return number;}第三步:修改头文件,增加系统调用声名#gedit/usr/src/linux-source-3.0.0/arch/x86/kernel/syscall_table_32.S将223行.long sys_ni_syscall改为.long sys_mycall(不要放在其他地方,否侧可能出现错误)第四步:修改系统调用表,注册系统调用。
学会Linux添加自定义系统调用一、什么是系统调用在Linux的世界里,我们经常会遇到系统调用这一术语,所谓系统调用,就是内核提供的、功能十分强大的一系列的函数。
这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门(gate)陷入(trap)实现。
系统调用就是用户空间应用程序和内核提供的服务之间的一个接口。
由于服务是在内核中提供的,因此无法执行直接调用;相反,您必须使用一个进程来跨越用户空间与内核之间的界限。
在特定架构中实现此功能的方法会有所不同。
因此,本文将着眼于最通用的架构—— i386。
二、系统调用的作用系统调用在Linux系统中发挥着巨大的作用,如果没有系统调用,那么应用程序就失去了内核的支持。
我们在编程时用到的很多函数,如fork、open等这些函数最终都是在系统调用里实现的,这里我们说到了两个函数,即fork和exit,这两函数都是glibc中的函数,但是如果我们跟踪函数的执行过程,看看glibc对fork和exit函数的实现就可以发现在glibc 的实现代码里都是采用软中断的方式陷入到内核中再通过系统调用实现函数的功能的。
具体过程我们在系统调用的实现过程会详细的讲到。
由此可见,系统调用是用户接口在内核中的实现,如果没有系统调用,用户就不能利用内核。
三、系统调用的现实及调用过程详细讲述系统调用的之前也讲一下Linux系统的一些保护机制。
Linux系统在CPU的保护模式下提供了四个特权级别,目前内核都只用到了其中的两个特权级别,分别为“特权级0”和“特权级3”,级别0也就是我们通常所讲的内核模式,级别3也就是我们通常所讲的用户模式。
划分这两个级别主要是对系统提供保护。
内核模式可以执行一些特权指令和进入用户模式,而用户模式则不能。
这里特别提出的是,内核模式与用户模式分别使用自己的堆栈,当发生模式切换的时候同时要进行堆栈的切换。
每个进程都有自己的地址空间(也称为进程空间),进程的地址空。
如果用户在Linux中添加新的系统调用,应该遵循几个步骤才能添加成功,下面几个步骤详细说明了添加系统调用的相关内容。
(1) 添加源代码第一个任务是编写加到内核中的源程序,即将要加到一个内核文件中去的一个函数,该函数的名称应该是新的系统调用名称前面加上sys_标志。
假设新加的系统调用为mycall(int number),在/usr/src/linux/kernel/sys.c文件中添加源代码,如下所示:asmlinkage int sys_mycall(int number){return number;}作为一个最简单的例子,我们新加的系统调用仅仅返回一个整型值。
(2) 连接新的系统调用添加新的系统调用后,下一个任务是使Linux内核的其余部分知道该程序的存在。
为了从已有的内核程序中增加到新的函数的连接,需要编辑两个文件。
在我们所用的Linux内核版本(RedHat 6.0,内核为2.2.5-15)中,第一个要修改的文件是:/usr/src/linux/include/asm-i386/unistd.h该文件中包含了系统调用清单,用来给每个系统调用分配一个唯一的号码。
文件中每一行的格式如下:#define __NR_name NNN其中,name用系统调用名称代替,而NNN则是该系统调用对应的号码。
应该将新的系统调用名称加到清单的最后,并给它分配号码序列中下一个可用的系统调用号。
我们的系统调用如下:#define __NR_mycall 191系统调用号为191,之所以系统调用号是191,是因为Linux-2.2内核自身的系统调用号码已经用到190。
(在后来的版本中系统调用一般都是插入表中作为倒数第二个调用的。
我使用ubuntu9-10,内核为2.6.33.1实现的)第二个要修改的文件是:/usr/src/linux/arch/i386/kernel/entry.S该文件中有类似如下的清单:.long SYMBOL_NAME()该清单用来对sys_call_table[]数组进行初始化。
Linux终端中的系统更新命令Linux作为一种开源的操作系统,广泛应用于各个领域。
为了保持系统的稳定和安全,定期进行系统更新是非常必要的。
在Linux终端中,有一些常用的系统更新命令,本文将介绍这些命令及其使用方法,以帮助读者更好地管理和更新Linux系统。
1. apt-get命令apt-get命令是Debian和Ubuntu系列Linux操作系统中常用的包管理器。
通过使用apt-get命令,可以方便地进行软件包的安装、升级、删除和搜索等操作。
1.1 安装软件包要安装一个软件包,可以使用以下的命令:```sudo apt-get install package_name```其中,package_name是要安装的软件包的名称。
使用sudo命令以超级用户权限运行该命令。
1.2 升级软件包要升级已安装的软件包,可以使用以下的命令:```sudo apt-get upgrade```此命令将会升级系统中所有已安装软件包的最新版本。
1.3 删除软件包如果要删除一个已安装的软件包,可以使用以下的命令:```sudo apt-get remove package_name```其中,package_name是要删除的软件包的名称。
1.4 搜索软件包要搜索一个软件包,可以使用以下的命令:```apt-cache search keyword```其中,keyword是要搜索的关键字。
该命令将会列出所有与关键字匹配的软件包。
2. yum命令yum命令是CentOS和Fedora系列Linux操作系统中常用的包管理器。
通过使用yum命令,可以方便地管理和更新系统的软件包。
2.1 安装软件包要安装一个软件包,可以使用以下的命令:```sudo yum install package_name```其中,package_name是要安装的软件包的名称。
使用sudo命令以超级用户权限运行该命令。
2.2 升级软件包要升级已安装的软件包,可以使用以下的命令:```sudo yum update```此命令将会升级系统中所有已安装软件包的最新版本。
向Linux内核添加系统调用函数实验环境:虚拟机VMware 6.0操作系统Ubuntu9.10(内核版本2.6.31-14-generic)修改内核版本2.6.31.12实验步骤:1.下载Linux内核:在终端中输入命令sudo apt-get install linux-source,下载的文件在/usr/src 目录下。
(注:如果源没有更新的,在下载之前请先更新源。
)2.将内核代码解压缩:例如下载的内核文件为linux-source-2.6.31.tar.bz2,运行解压命令tar –jxvf linux-source-2.6.31.tar.bz2。
解压出的文件夹为/usr/src/linux-source-2.6.31。
3.修改/usr/src/linux-source-2.6.31/kernel/sys.c文件,例如在文件末尾增加一个系统响应函数。
asmlinkage int sys_mycall(int number){printk("这是***编写的的系统调用函数");//printk是内核中日志级别的输出函数return number;}4.在/usr/src/linux-source-2.6.31/arch/x86/kernel/syscall_table_32.S中添加:.long sys_mycall。
5.在/usr/src/linux-2.6.31/arch/x86/include/asm/unistd_32.h中添加:#define __NR_mycall 序号(例如337),添加系统调用的入口参数(注意:其中会顺序定义入口参数的序号,添加的序号是在原有最大值的基础上+1)6.编译内核:首先切换到解压的内核目录下。
第一步:make mrproper 清除内核中不稳定的目标文件,附属文件及内核配置文件第二步:make clean 清除以前生成的目标文件和其他文件第三步:make oldconfig 采用默认的内核配置第四步:make bzImage 编译内核第五步:make modules 编译模块第六步:make modules_install 安装模块总共需要的编译的时间大约为两个小时。
如果用户在Linux中添加新的系统调用,应该遵循几个步骤才能添加成功,下面几个步骤详细说明了添加系统调用的相关内容。
(1) 添加源代码
第一个任务是编写加到内核中的源程序,即将要加到一个内核文件中去的一个
函数,该函数的名称应该是新的系统调用名称前面加上sys_标志。
假设新加的系统调用为mycall(int number),在/usr/src/linux/kernel/sys.c文件中添加源代码,如下所示:
asmlinkage int sys_mycall(int number)
{
return number;
}
作为一个最简单的例子,我们新加的系统调用仅仅返回一个整型值。
(2) 连接新的系统调用
添加新的系统调用后,下一个任务是使Linux内核的其余部分知道该程序的存
在。
为了从已有的内核程序中增加到新的函数的连接,需要编辑两个文件。
在我们所用的Linux内核版本(RedHat 6.0,内核为2.2.5-15)中,第一个要
修改的文件是:
/usr/src/linux/include/asm-i386/unistd.h
该文件中包含了系统调用清单,用来给每个系统调用分配一个唯一的号码。
文
件中每一行的格式如下:
#define __NR_name NNN
其中,name用系统调用名称代替,而NNN则是该系统调用对应的号码。
应该将新的系统调用名称加到清单的最后,并给它分配号码序列中下一个可用的系统调用号。
我们的系统调用如下:
#define __NR_mycall 191
系统调用号为191,之所以系统调用号是191,是因为Linux-2.2内核自身的系统调用号码已经用到190。
(在后来的版本中系统调用一般都是插入表中作为倒数第二个调用的。
我使用ubuntu9-10,内核为2.6.33.1实现的)
第二个要修改的文件是:
/usr/src/linux/arch/i386/kernel/entry.S
该文件中有类似如下的清单:
.long SYMBOL_NAME()
该清单用来对sys_call_table[]数组进行初始化。
该数组包含指向内核中每个
系统调用的指针。
这样就在数组中增加了新的内核函数的指针。
我们在清单最后添加一行:
.long SYMBOL_NAME(sys_mysyscall)
(3) 重建新的Linux内核
为使新的系统调用生效,需要重建Linux的内核。
这需要以超级用户身份登
录。
#pwd
/usr/src/linux
#
超级用户在当前工作目录(/usr/src/linux)下,才可以重建内核。
#make menuconfig
#make dep
#make clearn
#make bzImage
编译完毕后,系统生成一可用于安装的、压缩的内核映象文件:
/usr/src/linux/arch/i386/boot/bzImage
对与(3)在内核为2.4之后的内核制作过程中只要执行以下命令
Make mrproper 清除之前编译留下的文件,如果你是第一次编译就不必要执行Make menuconfig 进行相关的配置,保存退出
Make 制作内核
Make modules_install 安装模块
Make install 安装内核
(4) 用新的内核启动系统
要使用新的系统调用,需要用重建的新内核重新引导系统。
为此,需要修改/etc/lilo.conf文件,在我们的系统中,该文件内容如下:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
image=/boot/vmlinuz-2.2.5-15
label=linux
root=/dev/hdb1
read-only
other=/dev/hda1
label=dos
table=/dev/had
首先编辑该文件,添加新的引导内核:image=/boot/bzImage-new
label=linux-new
root=/dev/hdb1
read-only
添加完毕,该文件内容如下所示:boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
image=/boot/bzImage-new
label=linux-new
root=/dev/hdb1
read-only
image=/boot/vmlinuz-2.2.5-15
label=linux
root=/dev/hdb1
read-only
other=/dev/hda1
label=dos
table=/dev/hda
这样,新的内核映象bzImage-new成为缺省的引导内核。
为了使用新的lilo.conf配置文件,还应执行下面的命令:
#cp /usr/src/linux/arch/i386/boot/zImage /boot/bzImage-new
其次配置lilo:
# /sbin/lilo
现在,当重新引导系统时,在boot:提示符后面有三种选择:linux-new 、linux、dos,新内核成为缺省的引导内核。
至此,新的Linux内核已经建立,新添加的系统调用已成为操作系统的一部分,重新启动Linux,用户就可以在应用程序中使用该系统调用了。
(5)使用新的系统调用
在应用程序中使用新添加的系统调用mycall。
同样为实验目的,我们写了一个
简单的例子xtdy.c。
#include
_syscall1(int,mycall,int,ret)
main()
{
printf("%d n",mycall(100));
}
编译该程序:
# cc -o xtdy xtdy.c
执行:
# xtdy
结果:
# 100
注意,由于使用了系统调用,编译和执行程序时,用户都应该是超级用户身份。