没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
blog.chinaunix.net/uid-20543672-id-3184456.html
Preface 引言
我在这里用一些篇幅来描述一下 arm 体系结构下 Linux 中怎样来初始化中断向量表的,
因为这个方法很具有通用性,我把它叫做代码大挪移。您说搬代码谁不会阿,不就是拷贝吗,
的确如此,但是拷贝也有技巧。拷贝很简单啦,其实就是 memcpy,这不用提,我在这里想说
的是,你怎么把你的代码设计成能随便拷贝的,换句专业的术语,叫与位置无关的代码,
拷到哪都能用。我以前也用过类似的方法作启动,今天拿来说说。
Scenario 1 第一场景 copy
我们先看实际复制动作。代码的位置在 arch/arm/traps.c 中,kernel version: 2.6.27。 这
个是初始化部分的代码,setup_arch()->early_trap_init(). 熟悉初始化部分的朋友们可能见到
过这段代码。
void __init early_trap_init(void)
{
unsigned long vectors = CONFIG_VECTORS_BASE;
extern char __stubs_start[], __stubs_end[];
extern char __vectors_start[], __vectors_end[];
extern char __kuser_helper_start[], __kuser_helper_end[];
int kuser_sz = __kuser_helper_end - __kuser_helper_start;
/*
* Copy the vectors, stubs and kuser helpers (in entry-armv.S)
* into the vector page, mapped at 0xffff0000, and ensure these
* are visible to the instruction stream.
*/
memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);
memcpy((void *)vectors + 0x200, __stubs_start, __stubs_end - __stubs_start);
memcpy((void *)vectors + 0x1000 - kuser_sz, __kuser_helper_start, kuser_sz);
…
}
实际 copy 动作一目了然,就是两个 memcpy(第三个实际上是拷贝一些别的东西,原
理是一样的,这里不提了). Copy 的源是 vectors,这个值是 CONFIG_VECTORS_BASE,一般来
Commented [w1]: 这四个变量个汇编代码中的实现,
.globl __stubs_start
Globl __vectors_start
资源评论
普通网友
- 粉丝: 16
- 资源: 319
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功