linux中添加系统调用.ppt

linux中添加系统调用.ppt

ID:55829024

大小:800.50 KB

页数:30页

时间:2020-06-09

linux中添加系统调用.ppt_第1页
linux中添加系统调用.ppt_第2页
linux中添加系统调用.ppt_第3页
linux中添加系统调用.ppt_第4页
linux中添加系统调用.ppt_第5页
资源描述:

《linux中添加系统调用.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、添加系统调用实验平台介绍本次实验在Redhat9.0,即linux2.4内核上进行实验,用系统中自带的源码进行系统调用的添加.(2.4和2.6内核添加系统调用的步骤稍有不同,稍后介绍)用uname-a命令查看当前内核版本如下:2实验原理介绍每个系统调用都是通过一个单一的入口点多路传入内核。eax寄存器用来标识应当调用的某个系统调用,这在C库中做了指定(来自用户空间应用程序的每个调用)。当加载了系统的C库调用索引和参数时,就会调用一个软件中断(0x80中断),它将执行system_call函数(通过中断处理程序),这个函

2、数会按照eax内容中的标识处理所有的系统调用。在经过几个简单测试之后,使用system_call_table和eax中包含的索引来执行真正的系统调用了。从系统调用中返回后,最终执行syscall_exit,并调用resume_userspace返回用户空间。然后继续在C库中执行,它将返回到用户应用程序中。3实验原理介绍图1.使用中断方法的系统调用的简化流程4实验原理介绍系统调用接口的核心是系统调用多路分解表。这个表如左图所示,使用eax中提供的索引来确定要调用该表中的哪个系统调用(sys_call_table)系统调用

3、多路分解有些系统调用会由内核进一步进行多路分解。例如,BSD(BerkeleySoftwareDistribution)socket调用(socket、bind、connect等)都与一个单独的系统调用索引(__NR_socketcall)关联在一起,不过在内核中会进行多路分解,通过另外一个参数进入适当的调用。请参看./linux/net/socket.c中的sys_socketcall函数。图2.系统调用表和各种链接5实验原理介绍-对用户空间进行读写Linux内核提供了几个函数,可以用来将系统调用参数移动到用户空间中

4、,或从中移出。方法包括一些基本类型的简单函数(例如get_user或put_user)。要移动一块儿数据(如结构或数组),您可以使用另外一组函数:copy_from_user和copy_to_user。可以使用专门的调用移动以null结尾的字符串:strncpy_from_user和strlen_from_user。通过调用access_ok来测试用户空间指针是否有效。这些函数都是在linux/include/asm/uaccess.h中定义的。6实验原理介绍-对用户空间进行读写要在内核和用户空间移动一些简单类型(例如

5、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函数,向一块用户内存写数据.7实验原理介绍-内核中进行输出(printk)当函数

6、在内核中运行时,只能使用内核空间的资源,不能使用用户态的资源,例如C库.所以在输入信息的时候使用printkprintk是printf的一个简化版本,不能输出像符点数之类的复杂数据类型.与printf不同的是,printk按照相关的记录级或优先级将消息严格分类。在第三个系统调用中采用了prink函数输出一些信息,到/var/log/messages中.8添加Linux系统调用添加新函数1运行测试程序5重新编译内核4针对这个新函数更新系统调用表3更新头文件29添加新函数在linux/kernel/sys.c中,添加三个系

7、统调用函数到内核,命名和功能如下:myca1根据输入(1,2,3)返回我们小组三个人的学号myca2返回当前的时钟滴答数jiffies,并将其写入一个用户指针myca3输出一些信息10添加新函数myca1函数定义11添加新函数myca2,myca3函数定义12添加Linux系统调用添加新函数1运行测试程序5重新编译内核4针对这个新函数更新系统调用表3更新头文件213更新头文件在linux/include/asm-i386/unistd.h中,添加三个系统调用函数号.如下图所示:14添加Linux系统调用添加新函数1运行

8、测试程序5重新编译内核4针对这个新函数更新系统调用表3更新头文件215更新系统调用表在linux/arch/i386/kernel/entry.S中的syscall_table中,添加三个系统调用表项.如下图所示:16添加Linux系统调用添加新函数1运行测试程序5重新编译内核4针对这个新函数更新系统调用表3更新头文件217编译内

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。