内核汇编.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
内核汇编

linux源代码中汇编语言部分总是有.previous.section、.long,这是一个ELF段堆栈操作命令。其他的段堆栈操作命令还有.section.subsection、.pushsection、.popsection,本命令交换当前段(及其子段)和最近访问过的段(及其子段)。多个连续的.previous命令将使当前位置两个段(及其子段)之间反复切换。 用段堆栈的术语来说,本命令使当前段和堆顶段交换位置。我的理解:section是elf文件中的一个节ELF文件中代码、连接信息和注释是以节(section)为单位存放的,并由一个节头表(section header)来控制组织。节头表可以看作是一个ELF32_Shdr结构的数组其中每一项都对应文件中的一个节程序运行读入内存时,是以程序段(program segment)为单位读入的。程序段的内容由若干节(section)组成,节的内容组合在一起连成一片构成程序段的内容。所以.section是给gcc或者ld等工具用来生产可执行文件或者共享库或者重定向文件用的previous表示恢复到当前.section定义之前的那个段作为当前段。也就是说这个previous与它前面的那个section一般成对出现. .long?在哪里一个elf文件(例如动态库)一般来说在文本段有以下几个section:.hash ? ?.dynsym ? ?.dynstr ? ?.gnu.version ? ?.gnu.version_d ? ?.gnu.version_r ? ?.rel.data ? ?.rel.got ? ?.rel.plt ? ?.init ? ?.plt ? ?.text ? ?.fini ? ?.rodata 数据段包括: .data ??.eh_frame ??.ctors ??.dtors ??.got ??.dynamic ??.bss: 其他的还有: .comment ? ?.note ? ?.shstrtab ? ?.symtab ? ?.strtab 等等[/Color] 1. __copy_user 宏__copy_user在include/asm-i386/uaccess.h中定义,是作为从用户空间和内核空间进行内存复制的关键。这个宏扩展为汇编后如下: 000 #define __copy_user(to,from,size) 001 do { 002 int __d0, __d1; 003 __asm__ __volatile__( 004 0: rep; movsl\n 005 movl %3,%0\n 006 1: rep; movsb\n 007 2:\n 008 .section .fixup,\ax\\n 009 3: lea 0(%3,%0,4),%0\n 010 jmp 2b\n 011 .previous\n 012 .section __ex_table,\a\\n 013 .align 4\n 014 .long 0b,3b\n 015 .long 1b,2b\n 016 .previous 017 : =c(size), =D (__d0), =S (__d1) 018 : r(size 3), 0(size / 4), 1(to), 2(from) 019 : memory); 020 } while (0) 这段代码的主要操作就是004-007行,它的主要功能是将from处长度为size的数据复制到to处。 看这段代码之前,先看看它的约束条件: 017 : =c(size), =D (__d0), =S (__d1) 018 : r(size 3), 0(size / 4), 1(to), 2(from) 019 : memory); 017是输出部,根据描述可知size保存在ecx中,__d0保存在DI中,__d1保存在SI中。 018是输入部,根据描述可知size/4(即size除以4后的整数部分)保存在ecx中,size3(即size除以4的余数部分)随便保存在某一个寄存器中,to保存在DI中,from保存在SI中。 然后再反过头来看004-007行,就明白了: 004行:将size/4个4字节从from复制到to。为了提高速度,这里使用的是movsl,所以对size也要处理一下。 005行:将size3,即size/4后余下的余数,复制到ecx中。 006行:根据ecx中的数量,从from复制数据到to,这里使用的是movsb。 007行:代码结束。 到这里,复制就结束了。 但是实际上没有这么简单,因为还可能发生复制不成功的现象,所以008-016行的代码都是进行此类处理的。 内核提供了一个意外表,它的每一项

文档评论(0)

me54545 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档