仓酷云

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

[其他Linux] 带来一篇linux下体系挪用道理与使用

[复制链接]
金色的骷髅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 11:40:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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)体系挪用功效模块的初始化
  对体系挪用的初始化也就是对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,否则,最好别碰
金色的骷髅 该用户已被删除
沙发
 楼主| 发表于 2015-1-16 13:00:41 | 只看该作者

带来一篇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[_NR_tsetsyscall]=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之禅中也说过:以总结分享为荣,以跪求其解为耻;
冷月葬花魂 该用户已被删除
板凳
发表于 2015-1-18 15:55:28 来自手机 | 只看该作者
一定要养成在命令行下工作的习惯,要知道X-window只是运行在命令行模式下的一个应用程序。在命令行下学习虽然一开始进度较慢。
admin 该用户已被删除
地板
发表于 2015-1-27 10:22:22 | 只看该作者
随着Linux技术的更加成熟、完善,其应用领域和市场份额继续快速增大。目前,其主要应用领域是服务器系统和嵌入式系统。然而,它的足迹已遍布各个行业,几乎无处不在。
5#
发表于 2015-2-5 11:13:07 | 只看该作者
查阅经典工具书和Howto,特别是Howto是全球数以万计的Linux、Unix的经验总结非常有参考价值通常40%的问题同样可以解决。
柔情似水 该用户已被删除
6#
发表于 2015-2-11 16:52:03 | 只看该作者
学习Linux半年了~个人认为不会的多在网上找资料网上有很多资料可以搜索到,LS那位说放手去搞。
海妖 该用户已被删除
7#
发表于 2015-3-2 17:55:21 | 只看该作者
熟读写基础知识,学得会不如学得牢。
老尸 该用户已被删除
8#
发表于 2015-3-11 05:58:28 | 只看该作者
在学习linux的工程中,linux学习方法有很多种,这里是小编的学习心得,给大家拿出来分享一下。
爱飞 该用户已被删除
9#
发表于 2015-3-17 22:10:41 | 只看该作者
linux鸟哥的私房菜,第三版,基础篇,网上有pdf下的,看它的目录和每章的介绍就行了,这个绝对原创!
小女巫 该用户已被删除
10#
发表于 2015-3-25 05:15:17 | 只看该作者
为了更好的学习这门课程,我不仅课上认真听讲,课下也努力学习,为此还在自己的电脑上安装了Ubuntu系统。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-18 08:50

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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