linux系统调用Word格式.docx
- 文档编号:15059830
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:13
- 大小:462.58KB
linux系统调用Word格式.docx
《linux系统调用Word格式.docx》由会员分享,可在线阅读,更多相关《linux系统调用Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门陷入(gatetrap)实现。
系统调用就是用户空间应用程序和内核提供的服务之间的一个接口。
由于服务是在内核中提供的,因此无法执行直接调用;
相反,您必须使用一个进程来跨越用户空间与内核之间的界限。
在特定架构中实现此功能的方法会有所不同。
实现系统调用的方法有多种,最常用的是一个特殊的中断,即陷入(int指令),其中断向量号是$0x80。
因此,系统调用的处理过程也就是int$0x80的处理过程。
当执行到指令int$0x80时,处理器会将堆栈切换到当前进程的系统堆栈,并在栈顶自动压入SS、ESP、EFLAGS、CS、EIP,而后跳转到system_call。
程序system_call的处理流程如下:
(1)将EAX中的系统调用号压入栈顶。
(2)将其余的寄存器压入栈顶,形成一个pt_regs结构。
值得注意的是服务函数都通过堆栈接收参数,而处于栈顶位置的寄存器(EBX、ECX、EDX、ESI、EDI、EBP)恰好是传递给服务函数的参数。
(3)检查EAX中的系统调用号是否越界。
(4)根据EAX中的系统调用号查系统调用表sys_call_table,获得该调用号对应的服务函数,调用该函数完成系统调用的服务处理工作。
系统调用服务函数通过堆栈接收参数,参数的个数是预先约定好的。
(5)当服务函数返回时,用EAX中的返回值替换栈顶的ax。
(6)关闭中断(CLI)。
(7)善后处理:
1)根据当前进程的设置完成必要的审计工作;
2)如果当前进程需要调度,则调度它;
3)如果当前进程有待处理的信号,则处理它;
4)弹出栈顶,恢复各段寄存器、各通用寄存器及EIP、CS、EFLAGS、ESP、SS等寄存器的值,返回用户态,继续执行int$0x80之后的指令。
此时,EAX中值是栈顶的ax,及系统调用的返回值。
二.实验环境
VMware平台安装:
ubuntu-13.10-desktop-i386
要编译的内核版本:
linux-3.19.3
三.实验内容
(1)添加linux系统调用
(2)编译linux内核
四.实验步骤
次实验主要是在现有内核基础上增加一个系统调用并重新编译内核,以更好的理解linux下的内核机制。
要增加一个自定义的系统调用,首先要修改源码。
而修改源码需要修改三个文件,也即执行三个操作:
1:
添加声明到头文件
路径:
/usr/src/linux-3.19.3/include/linux/syscalls.h不同机器可能路径会不同
在最后添加:
#ifdefsys_call
asmlinkageintsys_callmycall(intnum);
#endif
2:
添加系统调用号
/usr/src/linux-3.19.3/arch/x86/syscalls/syscall_64.tbl
在合适的位置添加一个系统未用到的调用号:
223i386call_lpfsys_call_mycall
注:
a.此处需要查看一下自己的电脑室64位还是32位,如果是32位需要相应的修改syscall_32.tbl,而不是syscall_64.tbl。
linux下查看可以用以下命令:
终端下:
file/sbin/init,如下图所示
b.以上四个参数的解释:
223系统调用号
i386兼容Intel
call_lpf调用名
sys_call_mycall入口地址(即函数名)
3:
添加系统调用函数
/usr/src/linux-3.19.3/kernel/sys.c
路径是指自己要编译的内核的存放的路径,后面所有的操作都要在这个路径下面进行
asmlinkageintsys_call_mycall(intnum)
{
printk("
===2012221104210026,lipengfei==="
);
return1;
}
至此,内核源码修改完毕。
4:
开始重新编译内核
编译内核时与上次步骤基本一样
主要步骤如下:
cd/usr/src/linux-3.19.3/
makemrproper(净化)
makeoldconfig为了方便我们直接将内核配置默认为原来内核的配置
makebzImage(制作镜像)
makemodules(制作模块)
a)这里命令为makemodules–j4参数–j4表示使用4个线程编译,这是为了加快编译速度。
也可以用–j8使用8个线程编译
b)make的等价写法:
上面两步可以写为make–j8
或者
makebzImage–j8
makemodules–j8
makemodules_install(安装模块)
makeinstall(安装内核)
#cp/usr/src/linux-3.19.3/arch/i386/boot/bzImage/boot/vmlinuz-3.19.3
#cpSystem.map/boot/System.map-3.19.3
#ln-s/boot/System.map-3.19.3/boot/System.map
update-grub(更新启动文件)
5:
内核编译完成后,可以用uname–a查看一下新内核
如下所示:
6:
编写一个简单的程序调用一下
call.c
#include<
unistd.h>
#include<
stdio.h>
intmain()
{syscall(223,1);
return1;
7:
gcc上述程序,执行之后,用dmesg可以查看当前系统日志
gcccall.c-osyscall-lpthread
./syscall
dmesg-c
./syscall
编译call.c时使用了线程,所以,运行一次syscall没出结果时,多运行几次,稍微等一下,可能是因为线程阻塞
如下图所示:
五.FAQ
Q1:
编译内核时安装依赖库输入apt-getinstallbuild-essentialkernel-packagelibncurses5-devfakeroot总是无法更新包
问题描述:
该问题是因为系统资源更新下载源失效
解决方案:
更新sources.list文件,敲入以下代码查看sources.list
#备份原来的文件
sudocp/etc/apt/sources.list/etc/apt/sources.list.old
#编辑sources.list
sudogedit/etc/apt/sources.list
#把最新的源列表粘贴进去
#更新可用资源
sudoapt-getupdate
附上我的用的源(是从14.04的版本里拷贝过来的):
#debcdrom:
[Ubuntu14.04.2LTS_TrustyTahr_-Releaseamd64(20150218.1)]/trustymainrestricted
#Seeforhowtoupgradeto
#newerversionsofthedistribution.
debtrustymainrestricted
deb-srctrustymainrestricted
##Majorbugfixupdatesproducedafterthefinalreleaseofthe
##distribution.
debtrusty-updatesmainrestricted
deb-srctrusty-updatesmainrestricted
##N.B.softwarefromthisrepositoryisENTIRELYUNSUPPORTEDbytheUbuntu
##team.Also,pleasenotethatsoftwareinuniverseWILLNOTreceiveany
##revieworupdatesfromtheUbuntusecurityteam.
debtrustyuniverse
deb-srctrustyuniverse
debtrusty-updatesuniverse
deb-srctrusty-updatesuniverse
##N.B.softwarefromthisrepositoryisENTIRELYUNSUPPORTEDbytheUbuntu
##team,andmaynotbeunderafreelicence.Pleasesatisfyyourselfasto
##yourrightstousethesoftware.Also,pleasenotethatsoftwarein
##multiverseWILLNOTreceiveanyrevieworupdatesfromtheUbuntu
##securityteam.
debtrustymultiverse
deb-srctrustymultiverse
debtrusty-updatesmultiverse
deb-srctrusty-updatesmultiverse
##N.B.softwarefromthisrepositorymaynothavebeentestedas
##extensivelyasthatcontainedinthemainrelease,althoughitincludes
##newerve
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 系统 调用