Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1028840
  • 博文数量: 166
  • 博客积分: 10217
  • 博客等级: 上将
  • 技术积分: 2133
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-09 19:45
文章分类

全部博文(166)

文章存档

2012年(3)

2011年(7)

2010年(18)

2009年(59)

2008年(79)

我的朋友

分类: LINUX

2009-12-18 17:17:17

网上看的一问一答:
我的意思是说:当kernel跑起来后,如果发生外部中断,从硬件上理解应该是跳去执行0x18处的指令,此处的指令是由bootloader决定的,vivi的此处代码如下:
ENTRY(_start)
ENTRY(ResetEntryPoint)
@
@ Exception vector ...
@
@ 0x00: Reset
b Reset
@ 0x04 Undefine instruction exception
UndefEntryPoint:
b HandleUndef
◎0x08: Software interrupt exception
SWIEntryPoint:
b HandleSWI
....

但,此时我在kernel中运行啊!!
答:当kernel bootup 的时候要建立MM page table,那么虚拟地址0被映射到RAM,中断发生时虚拟地址0处的中断向量与bootloader完全无关了。对于那些不带MMU 的CPU如S3C4510, AT91系列,bootloader必须使用memory remap的方法把RAM remap 到地址0。
 
asmlinkage void __init start_kernel(void)
|
|--- trap_init();

void __init trap_init(void)
{
extern void __trap_init(void *);

__trap_init((void *)vectors_base());
if (vectors_base() != 0)
printk(KERN_DEBUG "Relocating machine vectors to 0x%08x\n",
vectors_base());
#ifdef CONFIG_CPU_32
modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
#endif
}


#ifdef __ARM_ARCH_4__
#define vectors_base() ((cr_alignment & CR_V) ? 0xffff0000 : 0)
#else
#define vectors_base() (0)
#endif

#define CR_V (1 << 13) /* Vectors relocated to 0xffff0000 */
#define CR_RR (1 << 14) /* Round Robin cache replacement */

extern unsigned long cr_no_alignment; /* defined in entry-armv.S */
extern unsigned long cr_alignment; /* defined in entry-armv.S */


.LCvectors: swi SYS_ERROR0
b __real_stubs_start + (vector_undefinstr - __stubs_start)
ldr pc, __real_stubs_start + (.LCvswi - __stubs_start)
b __real_stubs_start + (vector_prefetch - __stubs_start)
b __real_stubs_start + (vector_data - __stubs_start)
b __real_stubs_start + (vector_addrexcptn - __stubs_start)
b __real_stubs_start + (vector_IRQ - __stubs_start)
b __real_stubs_start + (vector_FIQ - __stubs_start)

ENTRY(__trap_init)
stmfd sp!, {r4 - r6, lr}

adr r1, .LCvectors @ set up the vectors
ldmia r1, {r1, r2, r3, r4, r5, r6, ip, lr}
stmia r0, {r1, r2, r3, r4, r5, r6, ip, lr}

Here, all interrupt vectors are installed at address 0, those interrupt vectors are point to those code that belongs to the kernel, not the bootloader.
 
阅读(1467) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~