本节讲解setup_arch函数中的machine查找的部分,初步分析了内核对机器码的定义和存储方式、比对方式、获取方式。
2.16.6.1、setup_arch函数简介
setup_arch(&command_line);
(1)从名字看,这个函数是CPU架构相关的一些创建过程。
(2)实际上这个函数是用来确定我们当前内核的机器(arch、machine)的。我们的linux内核会支持一种CPU的运行,CPU+开发板就确定了一个硬件平台,然后我们当前配置的内核就在这个平台上可以运行。之前说过的机器码就是给这个硬件平台一个固定的编码,以表征这个平台。
每个体系都有自己的set_arch函数,是体系结构相关的,具体编译哪个体系的setup_arch函数,又顶层的makefile中的arch变量决定。
它首先通过检测出来的处理器类型进行处理器内核的初始化,然后通过bootmem_init函数根据系统定义的meminfo结构体进行内存结构的初始化,最后调用pageing_init开启MMU,创建良好页表,映射所有的物理内存和IO空间。
start_kernel ()
--> setup_arch ()
--> paging_init ()
--> bootmem_init ()
--> alloc_bootmem_low_pages ()
(3)当前内核支持的机器码以及硬件平台相关的一些定义都在这个函数中处理。
2.16.6.2、Machine查找
(1)setup_processor函数用来查找CPU信息,可以结合串口打印的信息来分析。
setup_processor();
* 这个函数首先从arm寄存器里面取得CPU ID,然后调用lookup_processor_type来取得proc_info_list这个结构体。取得proc_info_list之后,将里面的内容一个个赋值相应的全局变量,然后将CPU的信息打印出来。然后它会从ARM寄存器里面获得cache的信息,并将cache的信息打印出来。最后它会调用cpu_proc_init的函数,这个函数实际上定义在proc_v6.S里面,没有做任何事情。
(2)mdesc = setup_machine(machine_arch_type);
* setup_machine函数的传参是机器码编号,machine_arch_type符号在include/generated/mach-types.h的32039-32050行定义了。经过分析后确定这个传参值就是2456.
* 函数的作用是通过传入的机器码编号,找到对应这个机器码的machine_desc描述符,并且返回这个描述符的指针。
* 其实真正干活的函数是lookup_machine_type,找这个函数发现在head-common.S中,真正干活的函数是__lookup_machine_type
* __lookup_machine_type函数的工作原理:内核在建立的时候就把各种CPU架构的信息组织成一个一个的machine_desc结构体实例,然后都给一个段属性.arch.info.init,链接的时候会保证这些描述符会被连接在一起。__lookup_machine_type就去那个那些描述符所在处依次挨个遍历各个描述符,比对看机器码哪个相同。
原文地址:https://www.cnblogs.com/Ocean-Star/p/9236005.html