linux中添加系统调用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

添加系统调用BEAConfidential.|2实验平台介绍本次实验在Redhat9.0,即linux2.4内核上进行实验,用系统中自带的源码进行系统调用的添加.(2.4和2.6内核添加系统调用的步骤稍有不同,稍后介绍)用uname-a命令查看当前内核版本如下:BEAConfidential.|3实验原理介绍每个系统调用都是通过一个单一的入口点多路传入内核。eax寄存器用来标识应当调用的某个系统调用,这在C库中做了指定(来自用户空间应用程序的每个调用)。当加载了系统的C库调用索引和参数时,就会调用一个软件中断(0x80中断),它将执行system_call函数(通过中断处理程序),这个函数会按照eax内容中的标识处理所有的系统调用。在经过几个简单测试之后,使用system_call_table和eax中包含的索引来执行真正的系统调用了。从系统调用中返回后,最终执行syscall_exit,并调用resume_userspace返回用户空间。然后继续在C库中执行,它将返回到用户应用程序中。BEAConfidential.|4实验原理介绍图1.使用中断方法的系统调用的简化流程BEAConfidential.|5实验原理介绍系统调用接口的核心是系统调用多路分解表。这个表如左图所示,使用eax中提供的索引来确定要调用该表中的哪个系统调用(sys_call_table)系统调用多路分解有些系统调用会由内核进一步进行多路分解。例如,BSD(BerkeleySoftwareDistribution)socket调用(socket、bind、connect等)都与一个单独的系统调用索引(__NR_socketcall)关联在一起,不过在内核中会进行多路分解,通过另外一个参数进入适当的调用。请参看./linux/net/socket.c中的sys_socketcall函数。图2.系统调用表和各种链接BEAConfidential.|6实验原理介绍-对用户空间进行读写Linux内核提供了几个函数,可以用来将系统调用参数移动到用户空间中,或从中移出。方法包括一些基本类型的简单函数(例如get_user或put_user)。要移动一块儿数据(如结构或数组),您可以使用另外一组函数:copy_from_user和copy_to_user。可以使用专门的调用移动以null结尾的字符串:strncpy_from_user和strlen_from_user。通过调用access_ok来测试用户空间指针是否有效。这些函数都是在linux/include/asm/uaccess.h中定义的。BEAConfidential.|7实验原理介绍-对用户空间进行读写要在内核和用户空间移动一些简单类型(例如int或long类型),可以使用get_user和put_user轻松地实现。这两个宏都包含一个值以及一个指向变量的指针。get_user函数将用户空间地址(ptr)指定的值移动到所指定的内核变量(var)中。put_user函数则将内核变量(var)指定的值移动到用户空间地址(ptr)。如果成功,这两个函数都返回0:intget_user(var,ptr);intput_user(var,ptr);在第二个系统调用中采用了put_user函数,向一块用户内存写数据.BEAConfidential.|8实验原理介绍-内核中进行输出(printk)当函数在内核中运行时,只能使用内核空间的资源,不能使用用户态的资源,例如C库.所以在输入信息的时候使用printkprintk是printf的一个简化版本,不能输出像符点数之类的复杂数据类型.与printf不同的是,printk按照相关的记录级或优先级将消息严格分类。在第三个系统调用中采用了prink函数输出一些信息,到/var/log/messages中.BEAConfidential.|9添加Linux系统调用添加新函数1运行测试程序5重新编译内核4针对这个新函数更新系统调用表3更新头文件2BEAConfidential.|10添加新函数在linux/kernel/sys.c中,添加三个系统调用函数到内核,命名和功能如下:myca1根据输入(1,2,3)返回我们小组三个人的学号myca2返回当前的时钟滴答数jiffies,并将其写入一个用户指针myca3输出一些信息BEAConfidential.|11添加新函数myca1函数定义BEAConfidential.|12添加新函数myca2,myca3函数定义BEAConfidential.|13添加Linux系统调用添加新函数1运行测试程序5重新编译内核4针对这个新函数更新系统调用表3更新头文件2BEAConfidential.|14更新头文件在linux/include/asm-i386/unistd.h中,添加三个系统调用函数号.如下图所示:BEAConfidential.|15添加Linux系统调用添加新函数1运行测试程序5重新编译内核4针对这个新函数更新系统调用表3更新头文件2BEAConfidential.|16更新系统调用表在linux/arch/i386/kernel/entry.S中的syscall_table中,添加三个系统调用表项.如下图所示:BEAConfidential.|17添加Linux系统调用添加新函数1运行测试程序5重新编译内核4针对这个新函数更新系统调用表3更新头文件2BEAConfidential.|18编译内核编译内核前,如果用的是VMWare,务必记住进行一下快照,以免将来内核编译失败,可以返回修改代码后的状态.将/etc/modules.conf的scsi_hostAdapterBusLogic一行注释掉,避免将来的编译错误.cd/usr/src/linux;将Makefile中版本号里的custom去掉,防止内核版本冲突BEAConfidential.|19编译内核makemrproper;/*清除上次编译内核的文件*/makexconfig;必选的配置选项如下:SCSIdevicesupport---SCSIlow-leveldrivers---*BusLogicSCSIsupportFusionMPTdevicesupport---MFusionMPT(base+ScsiHost)drivers和MFusionMPTmiscdevice(ioctl)driver(这个要用模块形式加载)Networkdevicessupport---Ethernet(10or100Mbit)---*AMDPCnet32PCIsupportblockdevices---RAMdisksupport和Initialdisk(initrd)supportFilesystems---ext3jourmallingsystemsupportBEAConfidential.|20编译内核makedep;makebzImage;makemodules;makemodules_install;makeinsall;这之后新内核已经'安装'在了系统中,我们只需重启一下系统.BEAConfidential.|21添加Linux系统调用添加新函数1重新编译内核4运行测试程序5针对这个新函数更新系统调用表3更新头文件2BEAConfidential.|22运行测试程序(1)编辑源代码如下:BEAConfidential.|23运行测试程序(1)运行结果如下:BEAConfidential.|24运行测试程序(2)编辑源代码如下:BEAConfidential.|25运行测试程序(2)运行结果如下:BEAConfidential.|26运行测试程序(3)编辑源代码如下:BEAConfidential.|27运行测试程序(3)运行结果如下:BEAConfidential.|28Linux2.6内核添加系统调用内核空间:1./usr/src/kernel/linux-2.6.18/include/linux/syscalls.h末尾添加两行,声明系统调用asmlinkagelongsys_cqtest1(void);asmlinkagelongsys_cqtest2(void);2./usr/src/kernel/linux-2.6.18/kernel/sys.c添加相应的系统调用函数3./usr/src/kernel/linux-2.6.18/include/asmx86_64/unistd.h中添加系统调用号#define__NR_cqtest1280__SYSCALL(__NR_cqtest1,sys_cqtest1)#define__NR_cqtest2281__SYSCALL(__NR_cqtest2,sys_cqtest2)BEAConfidential.|29Linux2.6内核添加系统调用用户空间:1,/usr/include/asm/unistd末尾加上#define__NR_cqtest1280__SYSCALL(__NR_cqtest1,sys_cqtest1)#define__NR_cqtest2281__SYSCALL(__NR_cqtest2,sys_cqtest2)2,/usr/include/bits/syscall.h末尾加上#defineSYS_cqtest1__NR_cqtest1#defineSYS_cqtest2__NR_cqtest2ThankYou

1 / 30
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功