|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
由于在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)体系挪用功效模块的初始化
对体系挪用的初始化也就是对INT0x80的初始化。体系启动时,汇编子程序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<linux/unistd.h>
_syscall0(int,testsyscall)
main()
{
tsetsyscall();
}
在这里利用了_syscall0()宏指令,宏指令自己在程序中将扩大成名为syscall()的函数,它在main()函数外部加以挪用。在testsyscall()函数中,预处置程序发生一切需要的呆板指令代码,包含用体系挪用参数值加载响应的cpu存放器,然后实行int0x80中止指令。
3.使用内核模块增加体系挪用
模块是内核的一部分,可是并没有被编译到内核内里往。它们被分离编译并毗连成一组方针文件,这些文件能被拔出到正在运转的内核,大概从正在运转的内核中移走。内核模块最少必需有2个函数:
int_module和cleanup_module。第一个函数是在把模块拔出内核时挪用的;第二个函数则在删除该模块时挪用。因为内核模块是内核的一部分,以是能会见一切内核资本。依据对linux体系挪用机制的剖析,假如要增添体系挪用,能够编写本人的函数来完成,然后在
12下一页
如果你只是想应付一下操作系统的课程,劝你最好别学,或者说不要指望能用的怎么样。 |
|