Chinaunix首页 | 论坛 | 博客
  • 博客访问: 458819
  • 博文数量: 48
  • 博客积分: 345
  • 博客等级: 民兵
  • 技术积分: 499
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-21 12:02
个人简介

文章分类

全部博文(48)

文章存档

2021年(7)

2020年(10)

2019年(2)

2016年(20)

2015年(5)

2014年(1)

2011年(3)

我的朋友

分类: LINUX

2021-09-17 16:41:46

特殊段定义在linux linker 脚本中(区别于默认的链接脚本),这些脚本存储在arch目录树下的kernel/vmlinux.lds.S,如arm64的链接脚本:linux/arch/arm64/kernel/vmlinux.lds.S

该文件使用了linux/include/asm-generic/vmlinux.lds.h头文件中的宏定义。

本文介绍一个特殊段, __ex_table pairs of instruction pointer 它存储了一对指令的指针。
定义如下:

#define _ASM_EXTABLE(from, to)                        \

    "    .pushsection    __ex_table, \"a\"\n"            \

    "    .align        3\n"                    \

    "    .long        (" #from " - .), (" #to " - .)\n"    \

    "    .popsection\n"


允许页面错误异常处理程序( page fault exception handler) 来确定异常是否是由地址“from”的内核指令引起的,如果是,跳转到地址“to” 该地址是fixup修复代码起始地址,否则发生内核错误。

看一下内核代码中对 exception table structure的解释呃

/*

* The exception table consists of pairs of relative offsets: the first

* is the relative offset to an instruction that is allowed to fault,

* and the second is the relative offset at which the program should

* continue. No registers are modified, so it is entirely up to the

* continuation code to figure out what to do.

*

* All the routines below use bits of fixup code that are out of line

* with the main instruction path.  This means when everything is well,

* we don't even have to jump over them.  Further, they do not intrude

* on our cache or tlb entries.

*/

存储了一对相对偏移地址;

insn:     可能发生“fault”的指令的相对偏移

fixup  发生“fault”后,程序继续执行的指令的相对偏移

这期间没有寄存器发生改变;

 

struct exception_table_entry

{

    int insn, fixup;

}; 


怎么理解这里的相对偏移呐?是偏移到哪里呐?

涉及到两个section.fixup      __ex_table;它们的定义可以从链接脚本中找到。

 linux/arch/arm64/kernel/vmlinux.lds.S中,看到了 


.fixup
定义在 .text (很熟悉),就是代码段;