- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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行的代码都是进行此类处理的。
内核提供了一个意外表,它的每一项
您可能关注的文档
最近下载
- 内控系列之审计各循环访谈提纲.docx VIP
- 材料价格调差申请表(含计算公式).docx VIP
- 驾考科目一知识点.doc VIP
- 北师版九年级数学下册培优精品讲义(最新版;可直接打印).doc VIP
- 第9课发展全过程人民民主(课件+视频)(高教版2023·基础模块).pptx VIP
- 一般建厂流程图..doc
- 2025最新职业卫生健康考试题库(附含答案).pdf VIP
- 建筑装饰设计收费标准(2014年版)(完整).pdf VIP
- 2025-2030中国军事模拟行业市场发展趋势与前景展望战略研究报告.docx VIP
- 领取!吴蓬《104集芥子园谱视频教程》 《芥子园画谱》高清彩色电子版!.pdf VIP
原创力文档


文档评论(0)