仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 586|回复: 8
打印 上一主题 下一主题

[其他Linux] 带来一篇Linux中使用内核模块增加体系挪用

[复制链接]
透明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 12:19:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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下一页


如果你只是想应付一下操作系统的课程,劝你最好别学,或者说不要指望能用的怎么样。
透明 该用户已被删除
沙发
 楼主| 发表于 2015-1-16 12:35:41 | 只看该作者

带来一篇Linux中使用内核模块增加体系挪用

要多动手,不要怕什么搞坏了怎么办,你不搞坏,不去动手,就永远不会有收获,既然你在linux中是自由的,那就发挥自己的权利;
sys_call_table表中增添一项,使该项中的指针指向本人编写的函数,就能够完成体系挪用。上面用该办法完成在把持终端上打印“helloworld”的体系挪用testsyscall()。</P>  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[_NR_tsetsyscall]=testsyscall;
  printf("systemcalltestsyscall()loadedsuccess\n");
  return0;
  }
  voidcleanup_module()
  {
  }
  2)利用新的体系挪用#define<linux/unistd.h>
  #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文件。最初利用insmodsyscall.o命令将模块拔出内核后便可利用增添的体系挪用。
  对照以上二种办法,笔者以为接纳内核模块的办法较好。由于这类办法可省往编译新内核并用新内核从头启动的贫苦,这一长处关于代码的调试长短常有代价的,能够节俭大批工夫
</p>
上一页12


Linux的常用命令find,察看man文档,初学者一定会觉得太复杂而不原意用,但是你一旦学会就爱不释手。
愤怒的大鸟 该用户已被删除
板凳
发表于 2015-1-18 15:45:29 | 只看该作者
我们这一代90后,从小接触的是windows98,家里条件好的自己有电脑装的是2000,后来又有了XP,上大学时又有了win7。
再见西城 该用户已被删除
地板
发表于 2015-1-27 09:52:28 | 只看该作者
首先Linux是开源的,这也是最主要的原因,想学windows,Unix,对不起我们没源代码。也正是因为这样,Linux才能够像滚雪球一样越滚越大,发展到现在这种规模。
精灵巫婆 该用户已被删除
5#
发表于 2015-2-5 11:15:47 | 只看该作者
眼看这个学期的Linux课程已经告一段落了,我觉得有必要写一遍心得体会来总结一下这学期对着门课程的学习。
第二个灵魂 该用户已被删除
6#
发表于 2015-2-11 17:01:33 | 只看该作者
Linux只是个内核!这点很重要,你必须理解这一点。只有一个内核是不能构成一个操作系统的。
蒙在股里 该用户已被删除
7#
发表于 2015-3-2 17:55:28 | 只看该作者
现在的linux操作系统如redhat,难点,红旗等,都是用这么一个内核,加上其它的用程序(包括X)构成的。
柔情似水 该用户已被删除
8#
发表于 2015-3-11 06:05:55 | 只看该作者
就这样,我们一边上OS理论课,一边上这个实验,这样挺互补的,老师讲课,一步一步地布置任务
乐观 该用户已被删除
9#
发表于 2015-3-25 06:10:52 | 只看该作者
学习Linux,应该怎样学,主要学些什么,一位Linux热心学习者,一段学习Linux的风云经验,历时十二个小时的思考总结,近十位网络Linux学习者权威肯定,为您学习Linux指明方向。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-30 08:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表