系统调用
一、 实验内容
1)设计并实现一个新的系统调用pedagogictime( ) ,该函数通过使用一个引用参数的调用返回当前的系统时间。 2)编写一个用户空间程序来测试pedagogictime( ) 二、 实验目的
学习如何产生一个系统调用,以及怎样通过往内核中增加一个新函数,从而在内核空间
中实现对用户空间的读/写。学习重建内核,通过以上学习更进一步了解Linux的工作。 三、
实验过程
本次实验过程主要可分为以下几个部分:修改系统文件、编译内核、修改Grub启动管理器等。
1)修改系统文件
1.在系统调用表中添加相应表项
# cd /usr/src/linux-2.4/arch/i386/kernel # vi entry.S
添加.long SYMBOL_NAME(sys_pedagogictime) 2. 添加系统调用号
# cd /usr/src/linux-2.4/include/asm
# vi unistd.h
添加# define __NR_pedagogictime 259 3. 在文件最后添加一个系统服务例程 # cd /usr/src/linux-2.4/kernel # vi sys.c
添加sys_pedagogictime 如图一
图一 添加系统服务例程 2)编译内核(此步时间比较长) # cd /usr/src/linux-2.4 # make mrproper
# make xconfig
Block devices ? Loopback device support 选Y
SCSI support ? SCSI low-level drivers ? BusLogic SCSI support 选Y File systems ? Ext3 journallingfile system support 选Y
NTFS file system support 选 Y Save and exit
# make dep # make clean # make bzImage # make modules
# make modules_install
从/etc/modules.conf中删除BusLogic的加载项#alias scsi_hostadapter BusLogic
# cd /usr/src/linux-2.4 # make install
3)将新内核和System.map拷贝到/boot目录下
# cp /usr/src/linux-2.4/arch/i386/boot/bzImage /boot/vmlinuz-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 4)修改Grub启动管理器 # cd /boot/grub
# vi menu.lst
修改menu.lst文件,将Red Hat Linux (2.4.20-8custom)部分中的 root=LABEL=/改为root=/dev/sda2 如图二
图二 修改后的Grub启动管理器 5)重新启动系统
# reboot
重启后显示如图三所示界面,此时选择第一个菜单。 6)编辑用户空间的测试程序:
编译运行即可。 四、
实验总结
通过这次的实验,我觉得自身有很大的收获,同时也得到了不少的提高,许多在课
堂上遗漏了的东西在做这个试验的过程中都得到了具体的落实,很多只是将其来很抽象在经过时间之后才能真正的明白其间的奥妙,学会了很多时间上的小技巧。
在Windows操作系统的时代,操作系统很多底层的东西都被掩盖了,幸亏我们有Linux,它可以让我们更深入地了解操作系统的工作原理等等各方面。本次实验就是一次让我们了解操作系统的系统调用的很好的机会。
在本次实验过程中,遇到的问题还是比较多的,比如在添加系统调用服务例程时,不小心的输入错误导致后面的实验无法正常进行,偶尔输入一个错误的指令产生错误让人费解,这也从另一方面说明了Linux系统的严密性,因为涉及到内核的东西将直接影响到系统的运行。