注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

linux-3.4.2中断机制分析——中断入口代码的重定位  

2012-09-09 20:55:19|  分类: 韦东山视频第二轮 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
内核入口函数在head.S中:
ENTRY(stext)
     ldr r13, =__mmap_switched
          start_kernel
                setup_arch(&command_line);
                      paging_init(mdesc);
                            //在顶层.config文件里面搜索到:CONFIG_VECTORS_BASE=0xffff0000
                            early_trap_init((void *)CONFIG_VECTORS_BASE);
                                   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);

在写单片机程序的时候我们就有了异常向量表的概念了,异常向量表就是一个个地址,当发生异常时程序会跳转到相对应于该异常的某个地址去执行。linux内核用到的异常向量的首地址是:0xffff0000,所以在0xffff0000地址处我们要放上一些代码,以便处理相应的异常!一下三行代码就完成了拷贝的工作:
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);
我们可以稍微分析一下:
vectors=CONFIG_VECTORS_BASE=0xffff0000:这是目的。
这里就是将:
__vectors_start与__vectors_end
__stubs_start与__stubs_end
__kuser_helper_start与
__kuser_helper_start+kuser_sz
之间的代码拷贝到:
0xffff0000地址处!

这样完成了代码的重定位之后,一旦发生了异常就会跳转到
0xffff0000地址处,而这地址处存放的就是
__vectors_start与__vectors_end之间的代码!下一节我们继续分析!
  评论这张
 
阅读(782)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017