微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > linux内核启动过程——基于S3C2410

linux内核启动过程——基于S3C2410

时间:11-09 来源:互联网 点击:

-2.6.24-moko-linuxbj/init/main.c的507行,start_kernel函数。这里只粘贴部分代码

__mmap_switched: adr r3, __switch_data + 4 ldmia r3!, {r4, r5, r6, r7} cmp r4, r5 @ Copy data segment if needed 1: cmpne r5, r6 ldrne fp, [r4], #4 strne fp, [r5], #4 bne 1b

在main.c第507行,是硬件无关的C初始化代码

asmlinkage void __init start_kernel(void) { char * command_line; extern struct kernel_param __start___param[], __stop___param[]; smp_setup_processor_id();

s3c2410平台linux-2.6.24内核早期的汇编初始化到这里就结束了

调试技巧:

利用gdb调试内核Image启动流程是一种很好的分析手段,要使用好这种手段有一个问题需要解决——内核地址映射问题

  1. 代码执行的早期是处于mmu关闭的状态下,软件直接使用硬件相关的物理地址(s3c2410的ram从0x30000000开始);
  2. 后来启用mmu并建立映射之后,软件使用虚拟地址。在3G用户空间配置下(大多数32位嵌入式系统都是此配置),内核使用的PAGE_OFFSET为0xc0000000,与硬件无关,核心虚拟地址变为从0xc0000000开始;

调试器无法自动接受这样的地址转变,需要使用上文介绍的诀窍,手工“告诉”调试器该怎么做。

对内核编译产生的vmlinux文件使用objdump工具

$ /usr/local/linuxbj/eabi-glibc/arm/bin/arm-linuxbj-linux-gnueabi-objdump -t vmlinux|more vmlinux: file format elf32-littlearm SYMBOL TABLE: c0008000 l d .text.head 00000000 .text.head c0008240 l d .init 00000000 .init c0027000 l d .text 00000000 .text c03377ec l d .notes 00000000 .notes c0338000 l d __ksymtab 00000000 __ksymtab c033ca40 l d __ksymtab_gpl 00000000 __ksymtab_gpl c033e2d0 l d __ksymtab_gpl_future 00000000 __ksymtab_gpl_future c033e2e8 l d __ksymtab_strings 00000000 __ksymtab_strings c034c9ec l d __param 00000000 __param c034e000 l d .data 00000000 .data c0373e20 l d .bss 00000000 .bss

可以看到内核符号表的.text链接虚拟地址是0xc0027000,所以在mmu处于关闭的阶段中,应该将内核符号表在调试器里加载到0x30027000地址。使得head.S入口.text.head正好是0x30008000,与实际的内存一致。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top