带来一篇linux下体系挪用道理与使用
有些人号称用过十几种甚至几十种linux,向人谈论起来头头是到,好像懂的很多。1.linux体系挪用的基础道理
linux的体系挪用情势与POSIX兼容,也是一套C言语函数名的汇合。但是,linux体系挪用的外部完成体例却与DOC的INT21H类似,它是经由INT0X80H软中止进进后,再依据体系挪用号分门别类地服务。
从体系剖析的角度,linux的体系挪用触及4个方面的成绩。
(1)与体系挪用有关的数据布局和函数
函数名以“sys_”开首,后跟该体系挪用的名字。比方,体系挪用fork()的呼应函数是sys_fork()(见Kernel/fork.c),exit()的呼应函数是sys_exit()(见kernel/fork.c)。
文件include/asm/unisted.h为每一个体系挪用划定了独一的编号。假定用name暗示体系挪用的称号,那末体系挪用号与体系挪用呼应函数的干系是:以体系挪用号_NR_name作为下标,可找出体系挪用表sys_call_table(见
arch/i386/kernel/entry.S)中对应表项的内容,它恰好是该体系挪用的呼应函数sys_name的出口地点。体系调
用表sys_call_table纪录了各sys_name函数在表中的位置,共190项。有了这张表,就很简单依据特定体系挪用
在表中的偏移量,找到对应的体系挪用呼应函数的出口地点。体系挪用表共256项,余下的项是可供用户本人增加的体系挪用空间。
(2)历程的体系挪用命令转换为INT0x80中止的历程
宏界说_syscallN()见include/asm/unisted.h)用于体系挪用的格局转换和参数的传送。N取0~5之间的整数。
参数个数为N的体系挪用由_syscallN()卖力格局转换和参数传送。体系挪用号放进EAX存放器,启动INT0x80
后,划定前往值送EAX存放器。
(3)体系挪用功效模块的初始化
对体系挪用的初始化也就是对INT
0x80的初始化。体系启动时,汇编子程序setup_idt(见arch/i386/kernel/head.S)筹办了1张256项的idt表,由
start_kernel()(见init/main.c),trap_init()(见
arch/i386/kernel/traps.c)挪用的C言语宏界说
set_system_gate(0x80,&system_call)(见include/asm/system.h)设置0x80号软中止的服务程序为system_call(见
arch/i386/kernel/entry.S),system.call就是一切体系挪用的总出口。
(4)内核怎样为各类体系挪用服务
当历程必要举行体系挪用时,必需以C言语函数的情势写一句体系挪用命令。该命令假如已在某个头文件
中由响应的_syscallN()睁开,则用户程序必需包括该文件。当历程实行到用户程序的体系挪用命令时,实践上执
行了由宏命令_syscallN()睁开的函数。体系挪用的参数由各通用存放器传送,然后实行INT0x80,之内核态进
进出口地点system_call。
(5)ret_from_sys_call
以ret_from_sys_call出口的汇编程序段在linux历程办理中起到了非常主要的感化。一切体系挪用停止前和年夜部分中止服务前往前,城市跳转至此处出口地点。该段程序不单单为体系挪用服务,它还处置中止嵌套、CPU调剂、旌旗灯号等事件。
2.经由过程修正内核源代码增加体系挪用
经由过程以上剖析linux体系挪用的历程,
将本人的体系挪用加到内核中就是一件简单的事变。上面先容一个实践的体系挪用,
并把它加到内核中往。要增添的体系挪用是:inttestsyscall(),其功效是在把持终端屏幕上显现helloworld,
实行乐成后前往0。
1编写inttestsyscall()体系挪用
编写一个体系挪用意味着要给内核增添1个函数,将新函数放进文件kernel/sys.c中。新函数代码以下:
asmlingkagesys_testsyscall()
{console_print("helloworld
");
return0;
}
2毗连新的体系挪用
编写了新的体系挪用历程后,下一项义务是使内核的其他部分晓得这一程序的存在,然后重修包括新的体系挪用的内核。为了把新的函数毗连到已有的内核中往,必要编纂2个文件:
1).inculde/asm/unistd.h在这个文件中到场
#define_NR_testsyscall191
2).are/i386/kernel/entry.s这个文件用来对指针数组初始化,在这个文件中增添一行:
.longSYMBOL_NAME(_sys_tsetsycall)
将.reptNR_syscalls-190改成NR_SYSCALLS-191,然后从头嘉奖和运转新内核。
3).利用新的体系挪用
在包管的C言语库中没有新的体系挪用的程序段,必需本人创建其代码以下
#inculde
_syscall0(int,testsyscall)
main()
{
tsetsyscall();
}
在这里利用了_syscall0()宏指令,宏指令自己在程序中将扩大成名为syscall()的函数,它在main()函数外部加以挪用。
在testsyscall()函数中,预处置程序发生一切需要的呆板指令代码,包含用体系挪用参数值加载响应的cpu存放器,然后实行int
0x80中止指令。
3.使用内核模块增加体系挪用
模块是内核的一部分,可是并没有被编译到内核内里往。它们被分离编译并毗连成一组方针文件,这些文件能被拔出到正在运转的内核,大概从正在运转的内核中移走。内核模块最少必需有2个函数:
in
12下一页
vim除非你打算真正的学好linux,或者说打算长久时间学习他,而且肯花大量时间vim,否则,最好别碰
带来一篇linux下体系挪用道理与使用
要明白学好linux不是一件一蹴而就的事,一定要能坚持使用它,特别是在使用初期。t_module和cleanup_module。第一个函数是在把模块拔出内核时挪用的;</P> 第二个函数则在删除该模块时挪用。因为内核模块是内核的一部分,以是能会见一切内核资本。依据对linux体系挪用机制的剖析,
假如要增添体系挪用,能够编写本人的函数来完成,然后在sys_call_table表中增添一项,使该项中的指针指向本人编写的函数,
就能够完成体系挪用。上面用该办法完成在把持终端上打印“helloworld”的体系挪用testsyscall()。
1)编写体系挪用内核模块
#inculde(linux/kernel.h)
#inculde(linux/module.h)
#inculde(linux/modversions.h)
#inculde(linux/sched.h)
#inculde(asm/uaccess.h)
#define_NR_testsyscall191
externviod*sys_call+table[];
asmlinkageinttestsyscall()
{printf("helloworld\n");
return0;
}
intinit_module()
{sys_call_table=testsyscall;
printf("systemcalltestsyscall()loadedsuccess\n");
return0;
}
voidcleanup_module()
{
}
2)利用新的体系挪用#define
#define_NR_testsyscall191
_syscall0(int,testsyscall)
main()
{
testsyscall();
}
3)编译内核模块并拔出内核
编译内核的命令为:gcc-Wall-02-DMODULE-D_KERNEL_-Csyscall.c
-Wall关照编译程序显现告诫信息;参数-02是关于代码优化的设置,内核模块必需优化;
参数-D_LERNEL关照头文件向内核模块供应准确的界说;参数-D_KERNEL_关照头文件,
这个程序代码将在内核形式下运转。编译乐成后将天生syscall.0文件。最初利用insmod
syscall.o命令将模块拔出内核后便可利用增添的体系挪用。
对照以上二种办法,笔者以为接纳内核模块的办法较好。由于这类办法可省往编译新内核并用新内核从头启动的贫苦,这一长处关于代码的调试长短常有代价的,能够节俭大批工夫
</p>上一页12
在这里你会学到更多的知识,学习linux,更要学习一种geek的精神,python之禅中也说过:以总结分享为荣,以跪求其解为耻; 一定要养成在命令行下工作的习惯,要知道X-window只是运行在命令行模式下的一个应用程序。在命令行下学习虽然一开始进度较慢。 随着Linux技术的更加成熟、完善,其应用领域和市场份额继续快速增大。目前,其主要应用领域是服务器系统和嵌入式系统。然而,它的足迹已遍布各个行业,几乎无处不在。 查阅经典工具书和Howto,特别是Howto是全球数以万计的Linux、Unix的经验总结非常有参考价值通常40%的问题同样可以解决。 学习Linux半年了~个人认为不会的多在网上找资料网上有很多资料可以搜索到,LS那位说放手去搞。 熟读写基础知识,学得会不如学得牢。 在学习linux的工程中,linux学习方法有很多种,这里是小编的学习心得,给大家拿出来分享一下。 linux鸟哥的私房菜,第三版,基础篇,网上有pdf下的,看它的目录和每章的介绍就行了,这个绝对原创! 为了更好的学习这门课程,我不仅课上认真听讲,课下也努力学习,为此还在自己的电脑上安装了Ubuntu系统。
页:
[1]