ARM Linux 的启动过程
时间:11-09
来源:互联网
点击:
- loc,_bss_start-_data);
- */
- cmpr4,r5@Copydatasegmentifneeded
- 1:cmpner5,r6
- ldrnefp,[r4],#4
- strnefp,[r5],#4
- bne1b
- /*将BSS段,也即从_bss_start到_end的内存清零。*/
- movfp,#0@ClearBSS(andzerofp)
- 1:cmpr6,r7
- strccfp,[r6],#4
- bcc1b
- /*r4=processor_id,
- *r5=__machine_arch_type
- *r6=__atags_pointer
- *r7=cr_alignment
- *sp=init_thread_union+THREAD_START_SP
- *为什么将栈顶指针设置为init_thread_union+THREAD_START_SP
- *init_head_union变量是一个大小为THREAD_SIZE的union,它在编译时,放到数据段的前面。
- *初步估计这块空间是内核堆栈。故在跳入C语言代码时,它SP的值设置为init_thread_union+THREAD_START_SP。
- *注意THREAD_START_SP定义为THREAD_SIZE–8,中间为什么留出8个字节呢?是与ARM的堆栈操作有关吗?还有用专向start_kernel函数传递参数?
- */
- ldmiar3,{r4,r5,r6,r7,sp}
- strr9,[r4]@SaveprocessorID
- strr1,[r5]@Savemachinetype
- strr2,[r6]@Saveatagspointer
- bicr4,r0,#CR_A@ClearAbit
- /*cr_alignment变量的后面接着放置cr_no_alignment,
- *r0为打开alignment检测时,控制寄存器的值,而r4为关闭时的值,
- *这里分将将打开和关闭alignment检查的控制寄存器的值写到
- *cr_alignment和cr_no_alignement变量中。
- */
- stmiar7,{r0,r4}@Savecontrolregistervalues
- /*跳到start_kernel函数,此函数代码用纯C来实现,它会调用各个平台的相关初始化函数,
- *来实现不同平台的初始化工作。至此,armlinux的启动工作完成。
- */
- bstart_kernel
- ENDPROC(__mmap_switched)
[cpp]view plaincopy
- .type__switch_data,%object
- __switch_data:
- .long__mmap_switched
- .long__data_loc@r4
- .long_data@r5
- .long__bss_start@r6
- .long_end@r7
- .longprocessor_id@r4
- .long__machine_arch_type@r5
- .long__atags_pointer@r6
- .longcr_alignment@r7
- .longinit_thread_union+THREAD_START_SP@sp
- /*
- *ThefollowingfragmentofcodeisexecutedwiththeMMUoninMMUmode,
- *andusesabsoluteaddresses;thisisnotpositionindependent.
- *
- *r0=cp#15controlregister
- *r1=machineID
- *r2=atagspointer
- *r9=processorID
- */
- __mmap_switched:
- adrr3,__switch_data+4
- /*r4=__data_loc,r5=_data,r6=_bss_start,r7=_end*/
- ldmiar3!,{r4,r5,r6,r7}
- /*下面这段代码类似于这段C代码,即将整个数据段从__data_loc拷贝到_data段。
- *if(__data_loc==_data||_data!=_bass_start)
- *memcpy(_data,__data_loc,_bss_start-_data);
- */
- cmpr4,r5@Copydatasegmentifneeded
- 1:cmpner5,r6
- ldrnefp,[r4],#4
- strnefp,[r5],#4
- bne1b
- /*将BSS段,也即从_bss_start到_end的内存清零。*/
- movfp,#0@ClearBSS(andzerofp)
- 1:cmpr6,r7
- strccfp,[r6],#4
- bcc1b
- /*r4=processor_id,
- *r5=__machine_arch_type
- *r6=__atags_pointer
- *r7=cr_alignment
- *sp=init_thread_union+THREAD_START_SP
- *为什么将栈顶指针设置为init_thread_union+THREAD_START_SP
- *init_head_union变量是一个大小为THREAD_SIZE的union,它在编译时,放到数据段的前面。
- *初步估计这块空间是内核堆栈。故在跳入C语言代码时,它SP的值设置为init_thread_union+THREAD_START_SP。
- *注意THREAD_START_SP定义为THREAD_SIZE–8,中间为什么留出8个字节呢?是与ARM的堆栈操作有关吗?还有用专向start_kernel函数传递参数?
- */
- ldmiar3,{r4,r5,r6,r7,sp}
- strr9,[r4]@SaveprocessorID
- strr1,[r5]@Savemachinetype
- strr2,[r6]@Saveatagspointer
- bicr4,r0,#CR_A@ClearAbit
- /*cr_alignment变量的后面接着放置cr_no_alignment,
- *r0为打开alignment检测时,控制寄存器的值,而r4为关闭时的值,
- *这里分将将打开和关闭alignment检查的控制寄存器的值写到
- *cr_alignment和cr_no_alignement变量中。
- */
- stmiar7,{r0,r4}@Savecontrolregistervalues
- /*跳到start_kernel函数,此函数代码用纯C来实现,它会调用各个平台的相关初始化函数,
- *来实现不同平台的初始化工作。至此,armlinux的启动工作完成。
- */
- bstart_kernel
- ENDPROC(__mmap_switched)
ARMLinux启动过 相关文章:
- arm linux 启动过程(11-09)
- ARM Linux启动过程学习(11-09)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)