历史上的今天
返回首页

历史上的今天

今天是:2025年03月31日(星期一)

正在发生

2020年03月31日 | ARMv7:Linux Kernel引导

2020-03-31 来源:eefocus

1.如果内核镜像是压缩的,需要解压缩,引导的第一步是从解压缩开始:archarmbootcompressedhead.S


2.解压缩之后,内核镜像已经存在于ARM中了,下面开始运行,内核开始运行是从/arch/arm/kernel/head.S开始的,入口代码为:

1

2

3

4

5

6

7

8

    .arm

    __HEAD

ENTRY(stext)

                        

 THUMB( adr r9, BSYM(1f)    )   @ Kernel is always entered in ARM.

 THUMB( bx  r9      )   @ If this is a Thumb-2 kernel,

 THUMB( .thumb          )   @ switch to Thumb now.

 THUMB(1:           )

这是由/arch/arm/kernel/vmlinux.lds.S决定的。告诉我们入口点为stext.

1

2

OUTPUT_ARCH(arm)

ENTRY(stext)

3.顺序执行head.S的代码。

1

2

3

4

5

6

7

8

 ldr r13, =__switch_data          @ address to jump to after

                                  @ mmu has been enabled

 adr lr, BSYM(1f)               @ return (PIC) address

 mov r8, r4                    @ set TTBR1 to swapper_pg_dir

 ARM(   add pc, r10, #PROCINFO_INITFUNC )

 THUMB( add r12, r10, #PROCINFO_INITFUNC    )

 THUMB( mov pc, r12             )

1:  b   __enable_mmu

代码line1将__switch_data的地址赋给r13,在__enable_mmu(代码line8)执行成功后跳转到__switch_data执行。


因为是.arm环境,所以执行代码ARM(   add pc, r10, #PROCINFO_INITFUNC ),即跳转到__cpu_flush执行。

1

2

3

4

/arch/arm/kernel/head.S 

mrc p15, 0, r9, c0, c0      @ get processor id

bl  __lookup_processor_type     @ r5=procinfo r9=cpuid

movs    r10, r5             @ invalid processor (r5=0)?

r10中保存的是proc_info结构体的start address.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

archarmincludeasmProcinfo.h

struct proc_info_list {

    unsigned int        cpu_val;

    unsigned int        cpu_mask;

    unsigned long       __cpu_mm_mmu_flags; /* used by head.S */

    unsigned long       __cpu_io_mmu_flags; /* used by head.S */

    unsigned long       __cpu_flush;        /* used by head.S */

    const char      *arch_name;

    const char      *elf_name;

    unsigned int        elf_hwcap;

    const char      *cpu_name;

    struct processor    *proc;

    struct cpu_tlb_fns  *tlb;

    struct cpu_user_fns *user;

    struct cpu_cache_fns    *cache;

};

1

2

include/generated/asm-offsets.h

#define PROCINFO_INITFUNC 16

4.__cpu_flush

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

arch/arm/mm/proc-v7.S

             

__v7_ca9mp_proc_info:

    .long   0x410fc090

    .long   0xff0ffff0

    __v7_proc __v7_ca9mp_setup

                 

                 

    .macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0

    ALT_SMP(.long   PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | 

            PMD_SECT_AF | PMD_FLAGS_SMP | mm_mmuflags)

    ALT_UP(.long    PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | 

            PMD_SECT_AF | PMD_FLAGS_UP | mm_mmuflags)

    .long   PMD_TYPE_SECT | PMD_SECT_AP_WRITE | 

        PMD_SECT_AP_READ | PMD_SECT_AF | io_mmuflags

    W(b)    initfunc

             

         

__v7_ca5mp_setup:

__v7_ca9mp_setup:

    mov r10, #(1 << 0)            @ TLB ops broadcasting

    b   1f

__v7_ca7mp_setup:

__v7_ca15mp_setup:

    mov r10, #0

不同架构的CPU,针对的文件不同,对于ARMV7架构的cpu而言,对应的为proc-v7.S。从code中可以看出,其对应俄proc_info为__v7_ca9mp_proc_info,所以偏移16后,就是执行跳转代码    b   1f。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

    __CPUINIT

        

/*

 *  __v7_setup

 *

 *  Initialise TLB, Caches, and MMU state ready to switch the MMU

 *  on.  Return in r0 the new CP15 C1 control register setting.

 *

 *  This should be able to cover all ARMv7 cores.

 *

 *  It is assumed that:

 *  - cache type register is implemented

 */

__v7_ca5mp_setup:

__v7_ca9mp_setup:

    mov r10, #(1 << 0)            @ TLB ops broadcasting

    b   1f

__v7_ca7mp_setup:

__v7_ca15mp_setup:

    mov r10, #0

1:

#ifdef CONFIG_SMP

    ALT_SMP(mrc p15, 0, r0, c1, c0, 1)

    ALT_UP(mov  r0, #(1 << 6))        @ fake it for UP

    tst r0, #(1 << 6)         @ SMP/nAMP mode enabled?

    orreq   r0, r0, #(1 << 6)     @ Enable SMP/nAMP mode

    orreq   r0, r0, r10         @ Enable CPU-specific SMP bits

    mcreq   p15, 0, r0, c1, c0, 1

#endif

__v7_setup:

5.__v7_setup->__enable_mmu->__turn_mmu_on

1

2

3

4

5

6

7

8

__turn_mmu_on:

    mov r0, r0

    mcr p15, 0, r0, c1, c0, 0       @ write control reg

    mrc p15, 0, r3, c0, c0, 0       @ read id reg

    mov r3, r3

    mov r3, r3

    mov pc, r13

ENDPROC(__turn_mmu_on)

r13保存的是__switch_data的地址,mov pc,r13跳转到__switch_data.


6.__mmap_switched

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

    .type   __switch_data, %object

__switch_data:

    .long   __mmap_switched

    .long   __data_loc          @ r4

    .long   _data               @ r5

    .long   __bss_start         @ r6

    .long   _end                @ r7

    .long   processor_id            @ r4

    .long   __machine_arch_type     @ r5

    .long   __atags_pointer         @ r6

推荐阅读

史海拾趣

CLANDELL公司的发展小趣事

随着国内市场的饱和,CLANDELL公司开始寻求国际化发展。公司通过市场调研和合作伙伴的建立,逐步拓展海外市场。在国际化的过程中,CLANDELL公司不仅提升了自身的品牌影响力,也学习到了国际先进的管理经验和市场策略,为公司的长远发展奠定了坚实基础。

Cristek Interconnects Inc公司的发展小趣事

面对日益复杂的供应链环境,Cristek Interconnects Inc公司进行了深入的供应链优化。公司与多家优质供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和质量可靠。同时,公司还引入先进的供应链管理系统,提高了供应链的透明度和效率,为公司的快速发展提供了有力保障。

Federal Custom Cable公司的发展小趣事

Federal Custom Cable公司成立于XXXX年,由几位具有丰富电缆制造经验的工程师创立。公司创立之初,就专注于为客户提供定制化的电缆解决方案。他们深入了解不同行业对电缆的特殊需求,通过技术创新和工艺改进,生产出符合客户要求的电缆产品。这种对定制化需求的精准把握,使Federal Custom Cable在竞争激烈的电缆市场中脱颖而出。

G-Two Inc公司的发展小趣事

背景:在光伏胶膜领域取得成功后,福斯特开始寻求多元化发展。

发展:公司依托在光伏材料领域的技术积累和市场优势,逐步向电子电路、锂电等新材料领域拓展。同时,公司还成立了新材料研究院,专注于新材料的研发和创新。

成果:目前,福斯特在电子电路、锂电等领域也取得了显著成绩,为公司带来了新的增长点。

长工微电子公司的发展小趣事

长工微电子的发展得到了行业内外的高度认可。自成立以来,公司荣获了多项荣誉,包括广东省科技型中小企业、松山湖集成电路设计企业、国家高新技术企业、最具潜力中国模拟IC设计公司、中国集成电路创新创业大赛总决赛第二名等。这些荣誉不仅彰显了公司的实力,也为公司的发展注入了强大的动力。

ELDECO公司的发展小趣事

面对全球电子记录仪市场的快速增长,ELDECO公司制定了国际化发展战略。公司首先在欧洲市场设立了研发中心和生产基地,通过与当地合作伙伴的紧密合作,成功将产品打入欧洲市场。随后,公司又在美国、亚洲等地设立了分支机构,进一步拓展全球市场。通过国际化战略布局,ELDECO公司不仅提高了品牌影响力,还获得了更多的市场机会和客户资源。

问答坊 | AI 解惑

用PowerPC860实现FPGA配置

摘要:介绍如何用PowerPC860(MPC860)进行FPGA(Xilinx的Virtex-II系列)的配置;给出进行FPGA配置所需的详细时序图和原理图。本配置基本原理对其它FPGA的配置也适用。 关键词:PowerPC860 FPGA Xilinx 1 概述 MPC860是基于PowerPC结构的通信控 ...…

查看全部问答>

关于USB MassStorage Client Function的几个问题?

在WinCE上实现优盘的功能已经实现了,现在我有几个小问题想请教一下? 1、usbmsfn.dll是MassStorage Client Function对应的驱动文件,这个文件的源代码在哪里,如何编译? 我通过查阅以前的帖子,发现可以通过sysgen_capture usbmsfn 得到对应的s ...…

查看全部问答>

关于内部数据寄存器的问题

在keilC51里,用了可以位寻址的存储器,可是工程芯片设成89C51时编译可以通过,就是不能实现功能(在电脑上通过串口仿真)。只有把芯片改成89C52才可以实现。 在平凡单片机书上也写了用到内部数据存储器时工程里需要把芯片设成52系列的。 不知道 ...…

查看全部问答>

为什么取不到串口输入缓冲区的值?

用MSCOMM32.OCX,串口初始化和输出都正常,但不能取输入缓冲区的值,为什么? 步骤如下 1)用SUDT SerialNull 软件虚拟了两个串口com15,com16 2)程序对com15,com16初始化,com15用做模拟接收,com16用做模拟发送 Ole_MSC.object.CommPort=15  &nb ...…

查看全部问答>

蓝牙控制器价格?

做一个蓝牙常用控制器价格如何?…

查看全部问答>

CCS4.2中debug的问题

小弟刚刚开始学DSP,在CCS4.2环境连接仿真器和开发板时,每次一点击Launch TI Debgger的时候就会出现这个问题,之前都是好的,不知道这个是怎么回事啊?希望各位前辈不吝赐教!…

查看全部问答>

急!!求高手解答

想问下inverse z transform变换 分母如果没有常数能变换么…

查看全部问答>

不同的FPGA芯片之间有那些差别啊?

最近我开始学习FPGA,但看了一些教程后,自己很困惑,好像没有在教程中看见不同的芯片之间有什么不同,我以前一直都是学习单片机的,习惯上了处理器外设的这种配置,我知道FPGA的一切都需要自己设计,但不同的FPGA之间都有那些区别啊?我就知道他们 ...…

查看全部问答>

新手怎样入门msp430

本人是大二学生,想学习做一个控制电路。。。要用到AD转换 pwm输出等。。 想问问如何入门学习 现在已经学完微机原理 数电 电路 要看什么书,用什么开发板,要不要仿真器? 希望各位多多指教…

查看全部问答>

NRF24L01无线模块

这个模块可以用来无线传输视频数据(摄像头即时传输)吗?…

查看全部问答>