C语言代码的入口是start_kernel这个函数,本文要介绍其中的set_arch这个函数,该函数的作用是查找给定机器ID的数据结构信息、配置内存条信息、解析bootloader传递命令行参数,然后根据machine_desc结构体所记录的信息对机器进行一些必要的设置,最后开始正式建立完整的页表。 setup_arch这个重磅函数,该函数是一个架构相关函数。...
/* arch/arm/kernel/setup.c */ for_each_machine_desc(p) if (nr == p->nr) { printk("Machine: %s\n", p->name); mdesc = p; break; } 找到mdesc之后,执行mdesc->fixup(),该调用实际执行的函数是定义在cpu.c中的cpu_fixup函数,该函数的作用是设置内存条个数以及对应物理起始地址和大小。
分析setup_arch(setup.c): setup_processor 设置处理器的类型,并进行初始化 setup_machine 返回机器类型描述结构体信息 setup_arch()对内核参数的解析 setup_arch()函数是体系结构相关的内核初始化过程,这其中对内核参数有涉及的变量和操作如下 void __init setup_arch(char **cmdline_p) ...
①u-boot将配置参数地址通过寄存器传递给内核 ②内核(arch/arm/kernel/head-common.S中的__mmap_switched)将这个地址存入__atags_pointer(定义于arch/arm/kernel/setup.c) ③setup_arch()函数 [html]view plaincopyprint? void __init setup_arch(char **cmdline_p) { struct tag *tags= (struct tag *)&...
Linux内核源码分析之setup_arch (三) 基本上把setup_arch主要的函数都分析了,由于距离上一篇时间比较久了,所以这里重新贴一下大致的流程图,本文主要分析的是bootmem_init函数。 代码分析 bootmem_init函数的结构如下: find_limits通过存储在meminfo中的内存条信息得到低端内存和高端内存的页框编号,分别放入到min、max...
1. 在kernel/arch/mips/kernel/head.S中会做一些特定硬件相关的初始化,然后会调用内核启动函数:start_kernel; 2. start_kernel是通用的内核启动函数,但是在初始化内核过程中,必然有一些参数是特定于硬件体系结构的,这些特定于硬件体系结构的设置通过调用函数setup_arch函数; ...
setup_arch()函数 分页机制启用以后,与内存管理相关的操作就是调用init/main.c中的start_kernel()函数,start_kernel()函数要调用一个叫setup_arch()的函数,setup_arch()位于arch/i386/kernel/setup.c文件中,我们所关注的与物理内存探测相关的内容就在这个函数中。
分页机制启用以后,与内存管理相关的操作就是调用init/main.c中的start_kernel()函数,start_kernel()函数要调用一个叫setup_arch()的函数,setup_arch()位于arch/i386/kernel/setup.c文件中,我们所关注的与物理内存探测相关的内容就在这个函数中。 1.setup_arch()函数 ...
分析setup_arch(setup.c): setup_processor 设置处理器的类型,并进行初始化 setup_machine 返回机器类型描述结构体信息 setup_arch()对内核参数的解析 setup_arch()函数是体系结构相关的内核初始化过程,这其中对内核参数有涉及的变量和操作如下 void __init setup_arch(char **cmdline_p) ...
总结,setup_arch做了以下几件事情: 1.CPU配置初始化 - cpu_probe() __cpuinitvoidcpu_probe(void){struct cpuinfo_mips*c=¤t_cpu_data;unsignedintcpu=smp_processor_id();#1.读取CP0(协处理器0的PRId($15)寄存器获取版本号c->processor_id=PRID_IMP_UNKNOWN;c->fpu_id=FPIR_IMP_NONE;c->cputype=...