实验06 增加系统调用功能
linux实验_添加系统调用-完整版
实验一添加一个新的系统调用一、实验目的理解操作系统内核与应用程序的接口关系;加深对内核空间和用户空间的理解;学会增加新的系统调用。
二、实验内容与要求首先增加一个系统调用函数,然后连接新的系统调用,重建新的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文件。
添加系统调用实验报告
一、构建基本的实验环境1.1基本实验环境与前提条件Windows7 、Word 2010、Vmware WorkStation 8.5、AdobeReaderReadHatLinux 9.0,gcc,viLinux内核[V2.4.18]1.2虚拟机的安装及使用1.3将Linux 内核源代码及配置文件传送给虚拟机上的Red Hat Linux V9.0 系统配置网络时遇到这个问题,Determining IP information for eth0... failed; no link present. Check cable?通过查找资料发现是系统的Bug,解决方法如下:到/etc/sysconfig/network-scripts/ifcfg-eth0在文件最后一行中加入check_link_down () {return 1;}另外如果存在/etc/sysconfig/networking/profiles/default/ifcfg-eth0 文件,则同样在其中加入这一段东西即可,然后重启系统。
设置网络为DHCP,重新启动就可以,啦,直接上图最后将内核代码下载到/root目录下二、Linux 内核编译、配置与调试2.1 内核配置与编译2.1.1、解压内核源代码文件tar -zxf linux-2.4.18.tar.gz2.1.2、解压后如下2.1.3、拷贝linux,命名为linux-2.4.18cp -r linux linux-2.4.182.1.4、移动config-2.4.18forMP.txt到linux-2.4.18根目录,替换掉.config2.1.5、进入linux-2.4.18目录,配置和编译内核模块make oldconfigmake depmake cleanmake bzImagemake modules2.2 内核安装与测试2.2.1安装内核映像文件cp arch/i386/boot/bzImage /boot/vmlinux-2.4.182.2.2拷贝和安装Linux系统映射文件System.map,并创建其与系统映射文件System.map之间的符号链接2.2.3执行命令make modules_install 以安装可动态加载的内核模块2.2.4添加启动项的配置利用vi编辑器,vi grub.conf查看/ 所在的位置,为/dev/sda32.2.5reboot重新启动系统,从自己创建的内核启动系统启动后查看内核分别用uname –r,和dmesg查看三、Linux 系统调用添加与实现3.1 在内核增加系统调用3.1.1结构体struct srz_rusage可声明如下:.struct srz_rusage {struct timeval ru_utime; /* user time used */struct timeval ru_stime; /* system time used */long ru_majflt; /* major page faults */long ru_minflt; /* minor page faults */long ru_nswap; /* swaps */};3.1.2添加到linux-2.4.18/include/linux下的resource.h中3.1.3添加的系统调用名称为:int get_process_usage(pid_t, struct srz_rusage*);参考的getrusage和sys_getrusage的代码在linux-2.4.18/linux/kernel/sys.c下面3.1.4分析getrusage()和sys_getrusage()的源代码1)数据结构rusage 在头文件resource.h中定义。
操作系统实验一向LINUX内核增加一个系统调用
操作系统实验一向LINUX内核增加一个系统调用一、背景介绍操作系统是计算机硬件与应用程序之间的接口,负责管理和调度计算机系统的各种资源,并提供用户与计算机系统的交互界面。
内核是操作系统的核心部分,负责管理和分配计算机系统的资源,执行各种任务。
系统调用是操作系统提供给应用程序的一种接口,可以让应用程序访问内核提供的功能,例如文件操作、进程管理、网络通信等。
在一些情况下,我们可能需要在LINUX内核中增加新的系统调用,以满足特定的需求。
本文将介绍如何向LINUX内核增加一个系统调用的具体步骤。
二、增加系统调用的步骤1.编写系统调用的具体实现代码首先,我们需要编写一个具体的系统调用的实现代码。
在LINUX内核中,系统调用的实现代码通常位于内核的/syscalls目录下。
我们可以在该目录下新建一个.c文件,编写我们自己的系统调用代码。
2.修改内核源代码3.更新系统调用表每个系统调用都在内核中有一个唯一的标识符,存储在一个叫做系统调用表的地方。
我们需要更新系统调用表,将新增的系统调用添加到表中。
这样,用户程序才能够通过系统调用号来调用新增的系统调用。
4.重新编译内核在修改完内核源代码后,我们需要重新编译内核。
这通常涉及到一些繁琐的步骤,例如配置内核选项、编译内核、安装内核等。
在重新编译内核之后,我们需要重新启动计算机,使新的内核生效。
5.修改用户程序最后,我们需要修改用户程序,以便能够调用新增的系统调用。
用户程序通常是通过C语言编写的,我们可以在用户程序的代码中添加对新增系统调用的调用代码。
三、实验结果在完成上述步骤后,我们就成功地向LINUX内核增加了一个系统调用。
用户程序可以通过系统调用调用自己新增的系统调用,从而实现特定的功能。
总结:本文介绍了向LINUX内核增加一个系统调用的具体步骤,包括编写系统调用的具体实现代码、修改内核源代码、更新系统调用表、重新编译内核和修改用户程序。
在实施这些步骤之前,我们需要对操作系统和内核的相关概念有一定的了解,并具备一定的编程能力。
增加系统调用实验报告(3篇)
第1篇一、实验目的1. 了解系统调用的基本概念和作用。
2. 掌握在Linux内核中增加系统调用的方法。
3. 熟悉系统调用在用户空间和内核空间之间的交互过程。
4. 提高编程能力和系统理解能力。
二、实验环境1. 操作系统:Linux2. 编译器:gcc3. 开发工具:内核源代码、makefile三、实验原理系统调用是操作系统提供的一种服务,允许用户空间程序请求内核空间的服务。
在Linux内核中,系统调用通过系统调用表来实现。
增加系统调用需要修改内核源代码,并重新编译内核。
四、实验步骤1. 创建系统调用函数首先,我们需要创建一个系统调用函数,该函数将实现一个简单的功能,例如打印一条消息。
以下是一个简单的系统调用函数示例:```cinclude <linux/module.h>include <linux/kernel.h>include <linux/init.h>static int __init hello_init(void) {printk(KERN_INFO "Hello, World!\n");return 0;}static void __exit hello_exit(void) {printk(KERN_INFO "Goodbye, World!\n");}module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("Your Name");MODULE_DESCRIPTION("A simple system call module");MODULE_VERSION("0.1");```2. 修改系统调用表接下来,我们需要修改内核源代码中的系统调用表,以注册我们创建的系统调用。
操作系统实验 为linux添加一个系统调用
进程控制的基础
Linux进程创建及分析
第一个进程事实上就是Linux kernel本身,像所有其 他的进程一样,Linux kernel本身也有代码段,数据段, 堆栈。只不过Linux kernel这个进程自己来维护这些段, 这一点是与其他进程不同的地方。第一个进程是唯一一个 静态创建的进程,在Linux kernel编写并且编译的时候创 建。 在Linux内核中,这个进程被称作init task/thread(pid 0)。 系统中其他的进程都通过复制父进程来产生,Linux 提供两个系统调用fork和clone来实现这个功能,广义上, 我们都叫它们fork( ),这也是Unix系统的传统叫法,表示 一个进程分叉又产生两个进程。对fork( )具体使用方法我 们稍后阐述。
关键点五
一般来说,在fork之后时父进程先执行还是子进程先执行 是不确定的。这取决于内核所使用的调度算法。如果要求父子 进程之间相互同步,则要求某种形式的进程之间通信。
进程的创建和销毁——exec理解
关键点一
fork( )创建了一个程序,但是如果这个子程序只能 局限在自身的代码段范围之中(不能去执行别的程序), 那么fork( )也就没有太多的实际意义。在Linux中,exec 调用用于从一个进程的地址空间中执行另外一个进程, 覆盖自己的地址空间。有了这个系统调用,shell就可以 使用fork+exec 的方式执行别的用户程序了。一个进程 使用exec执行别的应用程序之后,它的代码段,数据段, bss段和堆栈段都被新程序覆盖,唯一保留的是进程号。
进程的创建和销毁——fork分析
1. 为新进程分配一些基本的数据结构。具体到Linux,最重要的 比如一个新的进程好pid,一个task_struct和一个8K大小的联合 体(存放thread_info和内核栈)等。 2. 共享或者拷贝父进程的资源,包括环境变量,当前目录,打 开的文件,信号量以及处理函数等。 3. 为子进程创建虚拟地址空间。子进程可能跟父进程共享代码 段,数据段也可能采用COM(写时拷贝)的策略使fork( )的速 度和灵活性得到提高。 4. 为子进程设置好调度相关的信息,使得子进程在适当的时候 独立于父进程,能被独立调度。 5. fork( )的返回。对于父进程来说,for( )函数直接返回子进程的 pid;而对于子进程来说,是在子进程被第一次调度执行的时候, 返回0。
操作系统实验系统调用
操作系统实验系统调用 Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】实验六系统调用学时:2学时1.实验内容:系统调用实验2.实验目的:通过调用PV操作解决生产者、消费者问题,了解系统中并发进程是怎样同步执行的。
3.实验题目:编写一段程序模拟PV操作实现进程同步,且用PV操作解决生产者、消费者问题。
4.实验提示:⑴PV操作由P操作原语和V操作原语组成。
P操作原语P(s)将信号量s减1,若s<0则执行原语的进程被置成等待状态。
V操作原语V(s)将信号量s加1,若s<=0则释放一个等待的进程。
⑵生产者、消费者问题主要解决的是进程并发执行时访问公共变量的问题。
假定有一个生产者和一个消费者。
生产者每次生产一个产品,并把产品存入共享缓冲区供消费者取走。
消费者每次从共享缓冲区取出一个产品去消费。
禁止生产者将产品放入已满的缓冲区,禁止消费者从空缓冲区内取产品。
⑶模拟程序中对应关系如下:实例代码:开始!当前的产品数[ 0] 加快生产速度呀,没有产品了。
当前的产品数[ 1] 生产了一个产品。
当前的产品数[ 2] 生产了一个产品。
当前的产品数[ 1] 消费了一个产品。
当前的产品数[ 2] 生产了一个产品。
当前的产品数[ 1] 消费了一个产品。
当前的产品数[ 2] 生产了一个产品。
当前的产品数[ 3] 生产了一个产品。
当前的产品数[ 2] 消费了一个产品。
当前的产品数[ 3] 生产了一个产品。
当前的产品数[ 2] 消费了一个产品。
当前的产品数[ 3] 生产了一个产品。
当前的产品数[ 4] 生产了一个产品。
当前的产品数[ 3] 消费了一个产品。
当前的产品数[ 4] 生产了一个产品。
实验报告增加新的系统调用参考模板
操作系统《实验2》实验报告实验项目2:增加新的系统调用学号1209050123 姓名宋玉美课程号实验地点指导教师万少华时间2013.11评语:成绩教师签字万少华线性表链式存储(双向链表)插入、删除运算1、预备知识:Linux内核结构、Linux内核源码、Linux系统调用2、实验目的:增加新的系统调用3、实验内容及要求:(1)增加新的系统调用新增的系统调用名为get_proc_run_time,其功能是根据指定的进程pid,从该进程的进程描述符task_struct结构中提取出它的系统时间stime与用户时间utime (2)编译内核用编译内核的方法,将其增加到内核源码并编译内核(3)程序测试在用户空间编写测试程序测试该系统调用。
程序中调用此系统调用能准确的度量一个程序的时间效率,考虑是否还有别的方法比这更准确的学生信息,参数x, i,j从键盘输入(4)给出程序运行截图。
4、该文档的文件名不要修改,存入<学号><姓名> 命名的文件夹中5、该表中的数据只需填空,已有内容不要修改1.添加系统调用函数,修改文件/usr/src/linux—3.5/kernel/sys.c2. 添加系统调用号,修改文件/arch/x86/systemcalls/syscall_32.tbl3. 添加声明到头文件,修改文件,/include/linux/syscalls.h4. 重新编译内核(前几步只顾着运行忘记截图了,不好意思哈老师~)1)安装ncurses2)make menuconfig3)make dep 确定依赖性4)make clean 清理编译中间文件5)make bzImage 生成新内核6)make modules 生成modules 7)安装modules9)安装内核make install 10)配置grub引导程序13)重启。
重启系统,从grub菜单中选中新内核引导linux。
操作系统原理-实验-linux增加系统调用
中国地质大学(武汉)《操作系统原理》课程实验报告数据科学与大数据技术专业班级195182学生姓名钟欢任课教师康晓军完成时间2020年3月31日实验一——实现一个linux的系统调用一、实验目的1.加深对系统调用的理解,掌握增加与调用系统调用的方法。
2.掌握内核编译方法。
二、实验思路1.增加新的系统调用:新增的系统调用名为Hello,其功能是打印输出“This is ZhongHuan ’ s system call ! wo zhong yu cheng gong le !”2.编译内核:用编译内核的方法,将其增加进内核源码并编译内核。
3.测试:在用户控件编写测试程序测试该系统调用。
三、实验步骤1.系统调用的添加在Linux中添加新的系统调用,需执行多个步骤才能添加成功:(1)第一步完成系统调用函数在内核源码目录kernel/sys.c文件中编写待添加的系统调用函数。
该函数的名称应该是新的系统调用名称前面加上sys_标志。
新加的系统调用为hello(void),在kernel/sys.c文件中添加源代码:asmlinkage long sys_hello(void){printk("This is ZhongHuan's system call! wo zhong yu cheng gong le!");return 1;}(2)第二步在系统函数表中表项添加新的系统调用后,需要让Linux内核的其余部分知晓该程序的存在。
在内核源码目录arch/x86/entry/syscalls下修改文件syscall_64.tbl。
该文件用来对sys_call_table[]数组实行原始化,数组包含指向内核中每个系统调用的指针。
在该文件中的最后一行添加自己的系统调用表项:335 64 hello sys_hello(),这样就在数组中添加了新的内核函数指针。
(3)第三步添加系统调用号在内核源码目录arch/x86/include/asm下修改头文件unistd_32.h。
操作系统课程实验
系统调用的细节
• Linux系统调用是通过中断实现的。
• 中断发生时,系统将转到核心态的中断 处理程序。 • 中断处理结束,系统将返回用户态。 • 有很多个系统调用,中断处理程序如何 知道调用的是哪一个?
操作系统课程实验 添加系统调用
2003.12
演示 基于意识识别的 Windows安全登陆
• 大家想一想,为什么告诉你密码,你都 没法进去??
回顾:用新的内核启动
• 如果启动成功,别忘了告诉好友,你打造 的内核可以运行! • 如果启动失败,请按reset重新启动,然 后在LILO或GRUB界面选择老版本内核。
write()
open()
表中标有sys_ni_syscall 系统调用的细节 的,是指这一项没有被使 • 系统调用表在哪里? 用。
在/usr/src/linux-2.4.22/arch/i386/kernel/entry.S中 打开这个文件,翻到末尾 ENTRY(sys_call_table) .long SYMBOL_NAME(sys_ni_syscall) /* 0 - old "setup()" system call*/ .long SYMBOL_NAME(sys_exit) .long SYMBOL_NAME(sys_fork) .long SYMBOL_NAME(sys_read) .long SYMBOL_NAME(sys_write) .long SYMBOL_NAME(sys_open) /* 5 */ 按照Linux的习惯,给系统调 ……
asmlinkage int sys_my_syscall() /*函数名为sys_my_syscall*/ { /*这个函数的唯一作用是向屏幕上输出一句话*/ printk(“Hello, now we are in the kernel\n”); return 0; }
linux增加系统调用实验
实验二增加系统调用实验报告一修改系统文件1.在系统调用表中添加相应表项# cd /usr/src/linux-2.4/arch/i386/kernel# vi entry.S添加.long SYMBOL_NAME(sys_pedagogictime)见图1:2. 添加系统调用号# cd /usr/src/linux-2.4/include/asm# vi unistd.h添加# define __NR_pedagogictime 259见图2:3. 在文件最后添加一个系统服务例程# cd /usr/src/linux-2.4/kernel# vi sys.c添加sys_pedagogictime见图三二.编译内核# cd /usr/src/linux-2.4# make mrproper# make xconfigBlock devices → Loopback device support 选YSCSI support → SCSI low-level drivers → BusLogic SCSI support 选YFile systems → Ext3 journallingfile system support 选YNTFS file system support 选YSave and exit# make dep# make clean# make bzImage# make modules# make modules_install从/etc/modules.conf中删除BusLogic的加载项#alias scsi_hostadapter BusLogic /* 否则make install时总报错:No module BusLogic found for kernel 2.4.22 */ # cd /usr/src/linux-2.4# make install三将新内核和System.map拷贝到/boot目录下# cp /usr/src/linux-2.4/arch/i386/boot/bzImage /boot/vmlinux-2.4.20# cp /usr/src/linux-2.4/ System.map /boot/System.map-2.4.20# cd /boot# rm –f System.map# ln –s System.map-2.4.20 System.map四修改Grub启动管理器# cd /boot/grub# vi menu.lst修改menu.lst文件,将Red Hat Linux (2.4.20-8custom)部分中的root=LABEL=/改为root=/dev/sda2修改前见图四修改后见图五五重启系统:# reboot重启后显示如图六:选择Red Hat Linux (2.4.20-8custom),回车六编辑用户空间的测试程序:.运行结果:。
关于Linux系统增加系统调用的方法
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保存退出后,自此则完成了对增加系统调用所涉及的的要修改的文件的修改,完成这步以后,就要开始对修改后的内核进行编译了。
实验一新增系统调用
操作系统实验一:向Linux 内核增加一个系统调用一、实验目的通过实验,熟悉Linux 操作系统的使用,掌握构建与启动Linux 内核的方法;掌握用户程序如何利用系统调用与操作系统内核实现通信的方法,加深对系统调用机制的理解;进一步掌握如何向操作系统内核增加新的系统调用的方法,以扩展操作系统的功能。
二、实验类型设计型实验三、预习要求已完成操作系统相关课程,了解操作系统结构。
四、实验设备与环境PII以上电脑一台,已安装Linux操作系统,GCC或其他C语言编译环境。
五、实验原理内核:内核是整个操作系统的最底层,它负责了整个硬件的驱动以及提供了各种系统所需的内核功能,包括防火墙机制,是否支持LVM或Quota 文件系统,以及进程和内存管理和通信功能。
其实内核就是系统上面的一个文件而已,它包含了驱动主机各项硬件的检测程序与驱动模块。
内核文件通常被放置在/boot/vmlinuz中。
(uname –r 命令:显示内核版本信息) 内核模块:由于现在硬件更新速度太快,如果我的内核比较旧,我换了新的硬件,内核肯定无法支持,怎么办?重新拿一个新的内核来处理吗?内核编译的过程是很麻烦的。
为了这个缘故,Linux很早之前就已经开始使用所谓的模块化设置了。
即将一些不常用的类似驱动程序的内容独立出内核,编译成为模块,然后,内核可以在正常运行的过程当中加载这个模块到内核。
这样,在不需要改动内核的前提之下,只要编译出适当的内核模块并加载它,Linux就可以使用新的硬件。
模块被放置在/lib/modules/$(uname -r)/kernel中。
内核编译:内核其实是一个文件,由源代码编译而成的,开机读完BIOS 并加载MBR内的引导程序后,就开始加载内核到内存当中,所以要将它编译成系统可以认识的数据才行。
六、实验1. Linux 环境下的C 或C++编译和调试工具的使用2. 向Linux 内核增加新的系统调用,系统调用名称和功能自行定义3. Linux 新内核的编译、安装和配置4. 编写应用程序以测试新的系统调用并输出测试结果七、实验步骤1、开启电脑,从实验室共享了文件的机器上拷贝内核源码文件linux-2.6.30.tar.gz,以及ncurses-devel-5.5-24.20060715.i386.rpm文件。
操作系统实验报告Linux下的系统调用
操作系统实验报告----- Linux下的系统调用计算机10-4 赵俊楠10081407实验目的:实现多个系统调用实验实验内容:添加简单系统调用、添加随机抽牌系统调、用模块添加系统调用实验步骤:(我是将三个系统调用添加完毕后一起编译的)1.在usr/src/linux-2.4/include/asm i386/unistd.h中添加#define __NR_print_info 259和#define __NR_rank 2602.在usr/src/linux-2.4/arch/i386/kernel/entry.S中添加.long SYMBOL_NAME(sys_print_info)和.long SYMBOL_NAME(sys_rank);3.在usr/src/linux-2.4/kernel中添加asmlinkage int sys_rank(int value,int suit){if (value==1) return (int)(4*13+suit);else return (int)(4*(value-1)+suit);};和asmlinkage int sys_print_info(int testflag){printk(KERN_EMERG " It's my syscall function!\n");return 0;}4.在usr/src/linux-2.4/kernel/ksyms中添加#ifndef __mips__EXPORT_SYMBOL(sys_call_table);#endif至此,三个实验的系统调用添加完毕下面开始编译内核。
5.make cleanmake mrpropermake oldconfigmake depmake bzImagemake modulesmake modules_installmake install在添加系统调用时候一定要专心、仔细,否则在编译的时候会出现错误,改起来很麻烦!!6.重启Linux后,显示界面如下(没有改内核版本号)7.进入新内核后不要忘了将#define __NR_print_info 259和#define __NR_rank260添加到中8.然后编写三个测试程序分别测试新的系统调用结果如下图:关于test_print_info关于card关于call和test_call实验总结:本次实验的内容涉及到Linux的系统调用。
向Linux内核增加一个系统调用
操作系统实验一实验报告一、基本信息:实验题目:向Linux内核增加一个系统调用完成人姓名:金威报告日期:2016年4月24日二、实验目的通过实验,熟悉Linux操作系统的使用,掌握构建与启动Linux内核的方法;掌握用户程序如何利用系统调用与操作系统内核实现通信的方法,加深对系统调用机制的理解;进一步掌握如何向操作系统内核增加新的系统调用的方法,以扩展操作系统的功能。
三、实验内容1. Linux环境下的C或C++编译和调试工具的使用。
2. 向Linux内核增加新的系统调用,系统调用名称和功能自行定义,但必须实现如下输出功能:“My Student No. is ×××,and My Name is ×××”。
3. Linux新内核的编译、安装和配置。
4. 编写应用程序以测试新的系统调用并输出测试结果。
四、实验步骤1.第一次尝试了使用Virtual Box ,但是出了一些问题,虚拟机网连不上就换了VMware workstations ,曾试过用和比较老版本的内核,但是过程略繁琐,且很容易出错,就更换了Ubuntu 64 来创建虚拟机。
2.我先在windows中下载了的内核,然后直接拖入了虚拟机中(拖入的过程有时可能会无法进行,可以对虚拟机的Vmware Tools重新安装,或者用共享文件夹的形式拖入),拖入了桌面后,我直接进行了解压,较新版本无需cp 入/usr/src中。
3.接着进入终端,sudo apt-get install build-essential kernel-package libncurses5-dev fakeroot 获得编译内核必需,但是这个所需下载的东西太多,有1个G 左右,中间可能如果网络出现故障,出现故障中断下载后我是按它的提示输入了 apt-get update更新软件环境。
4. 修改 systemtable。
实验6 DOS系统功能调用
实验六DOS系统功能调用(2学时)
实验目的
1.掌握CALL指令的使用方法。
2.掌握子程序的定义
3.掌握主程序与子程序之间的调用关系及其调用方法
4.掌握主程序与子程序间参数的传递方法(寄存器、存储器、堆栈)
实验内容
1.从键盘输入两个不相等的十进制无符号数存入内存中符号地址NUM1
及NUM2处,比较两数的大小,如果NUM1>NUM2,屏幕显示
NUM1>NUM2!,否则屏幕显示NUM1<NUM2!。
要求:
子程序将从键盘输入的十进制数转换为二进制形式,保存到寄存器中。
给出子程序的说明文件
实验准备
1.预习子程序定义的方法
2.根据实验内容,选择合适的主程序与子程序参数传递的方法
3.给出完整的子程序的描述(入口参数、出口参数、功能),子程序的流
程图及代码
4.给出完整的源代码
实验步骤
1.输入,汇编并将此程序连接成EXE文件。
2.通过设置断点和单步执行命令调试此程序,给出调试的过程并观察和
记录CALL 、RET指令执行结果
实验报告要求
1.写出子程序的描述,(入口参数、出口参数、功能)
2.给出实验内容中主程序与子程序的分析、流程图
3.说明实验内容中主程序与子程序参数传递的方法
4.写出实现内容中完整的源程序
5.写出每次过程调用、返回及进出栈指令前后的SP和堆栈内容。
6.写出详细的调试过程,包含调试中遇到的问题,并说明解决的方法。
系统调用实验报告
系统调用实验报告系统调用实验报告一、引言计算机操作系统是现代计算机系统的核心组成部分,它负责管理和协调计算机硬件和软件资源,为用户提供良好的使用环境。
在操作系统中,系统调用是用户程序与操作系统之间进行交互的关键接口。
二、实验目的本实验旨在深入理解系统调用的概念和原理,通过编写和调用系统调用接口,掌握系统调用的使用方法和注意事项。
三、实验环境本实验使用Linux操作系统,并借助C语言编写相关程序。
四、实验过程1. 系统调用的概念系统调用是操作系统提供给用户程序的一组函数接口,通过这些接口,用户程序可以向操作系统请求服务和资源。
系统调用可以分为进程控制、文件操作、设备管理、通信等多个类别,每个系统调用都有一个唯一的标识符和一组参数。
2. 系统调用的使用方法为了使用系统调用,我们需要包含相应的头文件,并通过系统调用号来调用对应的函数。
例如,要打开一个文件,可以使用open()系统调用,其原型为:```cint open(const char *pathname, int flags, mode_t mode);```其中,pathname是文件路径,flags是打开方式,mode是权限设置。
通过调用open()函数,我们可以获取一个文件描述符,用于后续的文件操作。
3. 系统调用的注意事项在使用系统调用时,需要注意以下几点:- 参数传递:系统调用的参数传递通常使用寄存器或栈来完成,具体传递方式与操作系统和硬件平台相关。
- 错误处理:系统调用可能会返回错误码,表示调用失败。
因此,在调用系统调用后,需要检查返回值并进行相应的错误处理。
- 安全性:系统调用是操作系统提供的特权接口,用户程序需要通过操作系统的访问控制机制来确保系统调用的安全性。
五、实验结果通过编写和调用系统调用接口,我们可以实现各种功能,如文件读写、进程创建和管理、网络通信等。
这些功能可以大大扩展用户程序的能力,提高系统的灵活性和可扩展性。
六、实验总结系统调用是操作系统与用户程序之间的重要接口,它为用户程序提供了访问操作系统服务和资源的途径。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7、在汇编程序中使用系统调用 、
编写汇编程序, 编写汇编程序,见下图 编译
as –o asm.o asm.s ld –o asm asm.o
运行பைடு நூலகம்/asm 运行
8、在汇编程序中使用自己创建的系统调用 、
替换eax中的系统调用号 中的系统调用号 替换
9、在C程序中使用系统调用 、 程序中使用系统调用
参照lib/目录下库函数实现方法在 目录下库函数实现方法在libc库中增加 参照 目录下库函数实现方法在 库中增加 新系统调用库函数sethostname() 新系统调用库函数 示例: 示例:
#define _LIBRARY #include <unistd.h> _syscall2(int, sethostname, char *, name, int, len);
4、修改系统调用汇编程序 、
修改sys_call.s程序第 行,将内核系统调用 程序第61行 修改 程序第 总数nr_system_calls增1 总数 增
5、重新编译内核 、
参考实验: 系统中编译0.12内核 参考实验:在Linux0.12系统中编译 系统中编译 内核
6、增加新系统调用库函数 、
实验内容
增加系统调用功能
1、编制系统调用处理函数 、
例如:函数名sys_sethostname2 例如:函数名 放在kernel/sys.c程序中 放在 程序中 函数代码参加P295 函数代码参加 示例: 示例:
int sys_sethostname2(char *name, int len) { …… return 0; }
编写c程序 编写 程序 编译 运行
实验小结
3、添加外部函数声明 、
在include/linux/sys.h文件中添加 文件中添加 注意: 注意:一定要严格按照功能号顺序排列函数名 示例: 示例:
extern int sys_sethostname(); //函数指针数组表 函数指针数组表 fn_ptr sys_call_table[]={sys_setup, sys_exit, sys_fork, sys_read,…, sys_setreuid, sys_setregid, sys_sethostname};
2、添加系统调用功能号和原型定义 、
在include/unistd.h文件中添加 文件中添加 //新系统调用功能号 新系统调用功能号 #define _NR_sethostname 72 //新系统调用函数原型 新系统调用函数原型 int sethostname(char *name, int len);