Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7)【转】
- void __init setup_arch(char **cmdline_p)
- {
- struct machine_desc *mdesc;
点击(此处)折叠或打开
- 此为设备描述结构体,对于任何板子都定义了这样的一个结构体,我以前的文章有介绍:
- 《Uncompressing Linux... done, booting the kernel》 1、machine type 不匹配
- unwind_init();
点击(此处)折叠或打开
- 初始化基於ARM EABI的Backtrace Unwind機制(栈回退),此函数主要用于地址转换(arch/arm/kernel/unwind.c)
- setup_processor();
点击(此处)折叠或打开
- 再次检测处理器类型,并初始化处理器相关的底层变量。内核启动时的处理器信息(包括cache)就是通过这个函数打印的,例如:
- CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c53c7f
- CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache
- 再次检测处理器类型,并初始化处理器相关的底层变量。内核启动时的处理器信息(包括cache)就是通过这个函数打印的,例如:
- mdesc = setup_machine_fdt(__atags_pointer);
- if (!mdesc)
- mdesc = setup_machine_tags(machine_arch_type);
点击(此处)折叠或打开
- 在此处通过bootloader传递过来的设备ID来匹配一个 struct machine_desc 结构体
- (这个结构体就是在arch/arm/mach-*/mach-*.c中定义的结构体:MACHINE_START~MACHINE_END )
- 如果没有匹配上就死循环。
- 如果匹配上了就打印机器名 ,并处理bootloader传递过来的tagged_list,将所有的tag信息保存到相应的全局变量或结构体中。
- 内核启动时的机器信息就是这里打印的,例如:
点击(此处)折叠或打开
- Machine: ti8168evm
- 最后返回结构体指针。
- machine_desc = mdesc;
- machine_name = mdesc->name;
点击(此处)折叠或打开
- 通过匹配的struct machine_desc 结构体数据,初始化一些全局变量
- if (mdesc->soft_reboot)
- reboot_setup("s");
点击(此处)折叠或打开
- 通过struct machine_desc 中的soft_reboot数据来设置重启类型:
- 如果存在就为“s”:softreset;如果不存在就为“h”:hardreset
- init_mm.start_code = (unsigned long) _text;
- init_mm.end_code = (unsigned long) _etext;
- init_mm.end_data = (unsigned long) _edata;
- init_mm.brk = (unsigned long) _end;
点击(此处)折叠或打开
- 这里通过连接脚本中得到的Linux代码位置数据来初始化一个mm_struct结构体init_mm中的部分数据
- ps:每一个任务都有一个mm_struct结构以管理内存空间,init_mm是内核自身的mm_struct
- /* 同时填充cmd_line以备后用, 保护boot_command_line数据 */
- strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE);
- *cmdline_p = cmd_line;
点击(此处)折叠或打开
- 将boot_command_line复制到cmd_line中。这里关键是要知道系统启动的时候的cmdline是如何传递的。
- parse_early_param();
点击(此处)折叠或打开
- 处理在 struct obs_kernel_param 中定义为early的启动参数(主要是内存配置部分的参数)
- 其中就分析了mem=size@start参数初始化了struct meminfo meminfo;
- 同时如果有vmalloc=size参数也会初始化 vmalloc_min
- 参考:《Linux内核高-低端内存设置代码跟踪(ARM构架)》
- 这里需要注意的是内核的cmdline中的参数按照其被需要的先后,分为early和非early的。
- include/linux/init.h:
点击(此处)折叠或打开
- struct obs_kernel_param {
- const char *str; //在cmdline中相应参数名。
- int (*setup_func)(char *); //对于此参数的专用处理函数
- int early; //是否为早期需要处理的参数
- };
- 两种不同的参数在内核中用了不同的宏来定义:
- early: #define early_param(str, fn) \
- __setup_param(str, fn, fn, )
- 非early: #define __setup(str, fn) \
- __setup_param(str, fn, fn, )
- 使用这两个宏定义的参数和构架相关,一些构架或者板子可以定义自己特定的参数和处理函数。对于比较重要的“men”参数就是early参数。
- sanity_check_meminfo();
点击(此处)折叠或打开
- 在此处设置struct meminfo meminfo中每个bank中的highmem变量,
- 通过vmalloc_min确定每个bank中的内存是否属于高端内存
- arm_memblock_init(&meminfo, mdesc);
点击(此处)折叠或打开
- 在此处按地址数据从小到大排序meminfo中的数据,并初始化全局的memblock数据。
- paging_init(mdesc);
点击(此处)折叠或打开
- 设置内核的参考页表。
- 此页表不仅用于物理内存映射,还用于管理vmalloc区。
- 此函数中非常重要的一点就是初始化了bootmem分配器!
- request_standard_resources(mdesc);
点击(此处)折叠或打开
- 通过获取设备描述结构体(struct machine_desc)中的数据和编译时产生的地址数据,初始化内存相关的全局结构体变量。
- unflatten_device_tree();
点击(此处)折叠或打开
- 通过启动参数中的“非平坦设备树”信息(如果有),获取内存相关信息
- #ifdef CONFIG_SMP
- if (is_smp())
- smp_init_cpus();
- #endif
点击(此处)折叠或打开
- 针对SMP处理器,初始化可能存在的CPU映射 - 这描述了可能存在的CPU
- reserve_crashkernel();
点击(此处)折叠或打开
- 用于内核崩溃时的保留内核
- 此功能通过内核command line参数中的"crashkernel="保留下内存用于主内核崩溃时获取内核信息的导出。
- cpu_init();
点击(此处)折叠或打开
- 初始化一个CPU,并设置一个per-CPU栈
- tcm_init();
点击(此处)折叠或打开
- 初始化ARM内部的TCM(紧耦合内存)。
- 参考资料:《对ARM紧致内存TCM的理解》
- ARM官网也有介绍文档
- #ifdef CONFIG_MULTI_IRQ_HANDLER
- handle_arch_irq = mdesc->handle_irq;
- #endif
点击(此处)折叠或打开
- 调用设备描述结构体中的mdesc->handle_irq函数,目的未知。
- #ifdef CONFIG_VT
- #if defined(CONFIG_VGA_CONSOLE)
- conswitchp = &vga_con;
- #elif defined(CONFIG_DUMMY_CONSOLE)
- conswitchp = &dummy_con;
- #endif
- #endif
- early_trap_init();
点击(此处)折叠或打开
- 对中断向量表进行早期初始化
- if (mdesc->init_early)
- mdesc->init_early();
点击(此处)折叠或打开
- 如果设备描述结构体定义了init_early函数(应该是早期初始化之意),则在这里调用。
- }
- static void __init setup_processor(void)
- {
- struct proc_info_list *list;
- /*
- * 在支持处理器列表中定位处理器
- * 连接器为我们创建这个列表,从 * arch/arm/mm/proc-*.S中的入口
- */
- list = lookup_processor_type(read_cpuid_id());
- if (!list) {
- printk("CPU configuration botched (ID %08x), unable "
- "to continue.\n", read_cpuid_id());
- while (1);
- }
点击(此处)折叠或打开
- 这里再次核对处理器类型,虽然这个已经在汇编代码中执行过一遍了
- cpu_name = list->cpu_name;
- #ifdef MULTI_CPU
- processor = *list->proc;
- #endif
- #ifdef MULTI_TLB
- cpu_tlb = *list->tlb;
- #endif
- #ifdef MULTI_USER
- cpu_user = *list->user;
- #endif
- #ifdef MULTI_CACHE
- cpu_cache = *list->cache;
- #endif
点击(此处)折叠或打开
- 通过从struct proc_info_list获取的数据初始化CPU相关的全局变量
- printk("CPU: %s [%08x] revision %d (ARMv%s), cr=%08lx\n",
- cpu_name, read_cpuid_id(), read_cpuid_id() & 15,
- proc_arch[cpu_architecture()], cr_alignment);
点击(此处)折叠或打开
- 打印内核启动时的处理器信息
- sprintf(init_utsname()->machine, "%s%c", list->arch_name, ENDIANNESS);
- sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS);
- elf_hwcap = list->elf_hwcap;
- #ifndef CONFIG_ARM_THUMB
- elf_hwcap &= ~HWCAP_THUMB;
- #endif
- feat_v6_fixup();
点击(此处)折叠或打开
- 针对特定的ARM核软件屏蔽一些功能
- cacheid_init();
点击(此处)折叠或打开
- 初始化ARM核中的缓存
- cpu_proc_init();
点击(此处)折叠或打开
- 宏:
- #define cpu_proc_init __glue(CPU_NAME,_proc_init)
- 意在调用处理器特定的初始化函数。
- }
Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7)【转】的更多相关文章
- 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源 | 百篇博客分析OpenHarmonyOS | v2.07
百篇博客系列篇.本篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核 ...
- Linux内核源码分析 day01——内存寻址
前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...
- 鸿蒙内核源码分析(根文件系统) | 先挂到`/`上的文件系统 | 百篇博客分析OpenHarmony源码 | v66.01
百篇博客系列篇.本篇为: v66.xx 鸿蒙内核源码分析(根文件系统) | 先挂到/上的文件系统 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...
- 鸿蒙内核源码分析(文件概念篇) | 为什么说一切皆是文件 | 百篇博客分析OpenHarmony源码 | v62.01
百篇博客系列篇.本篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一切皆是文件 | 51.c.h.o 本篇开始说文件系统,它是内核五大模块之一,甚至有Linux的设计哲学是" ...
- 鸿蒙内核源码分析(GN应用篇) | GN语法及在鸿蒙的使用 | 百篇博客分析OpenHarmony源码 | v60.01
百篇博客系列篇.本篇为: v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...
- 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 百篇博客分析OpenHarmony源码 | v51.04
百篇博客系列篇.本篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | ...
- 鸿蒙内核源码分析(信号生产篇) | 信号安装和发送过程是怎样的? | 百篇博客分析OpenHarmony源码 | v48.03
百篇博客系列篇.本篇为: v48.xx 鸿蒙内核源码分析(信号生产篇) | 年过半百,依然活力十足 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管 ...
- 鸿蒙内核源码分析(特殊进程篇) | 龙生龙,凤生凤,老鼠生儿会打洞 | 百篇博客分析OpenHarmony源码 | v46.02
百篇博客系列篇.本篇为: v46.xx 鸿蒙内核源码分析(特殊进程篇) | 龙生龙凤生凤老鼠生儿会打洞 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ...
- 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 百篇博客分析OpenHarmony源码 | v13.02
百篇博客系列篇.本篇为: v13.xx 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 51.c.h .o 几点说明 kernel_liteos_a_note | 中文注解鸿蒙内核 ...
- 鸿蒙内核源码分析(管道文件篇) | 如何降低数据流动成本 | 百篇博客分析OpenHarmony源码 | v70.01
百篇博客系列篇.本篇为: v70.xx 鸿蒙内核源码分析(管道文件篇) | 如何降低数据流动成本 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...
随机推荐
- JAVA面对对象(二)——继承、方法的覆写
1.继承就是基于已存在的类构造一个新类,继承已存在的类就能复用类的方法和属性,并且能够添加新的方法和属性.也就是子类和父类 2.一个父类可以拥有多个子类,一个子类只允许有一个父类 3.用extends ...
- d3 数学方法(伪随机数生成器 )
一.正态(高斯)分布(normal (Gaussian) distribution)的随机数 /* var nomarlRandmo = d3.random.normal(); console.log ...
- suse11/12关闭防火墙
suse11关闭操作为:service SuSEfirewall2_setup stopservice SuSEfirewall2_init stop 取消开机启动防火墙:chkconfig SuS ...
- 【BZOJ5281】Talent Show(分数规划)
[BZOJ5281]Talent Show(分数规划) 题面 BZOJ 洛谷 题解 二分答案直接就是裸的分数规划,直接跑背包判断是否可行即可. #include<iostream> #in ...
- Problem C: 多线程 解题报告
Problem C: 多线程 Description 多线程是一种常见的加速手段,利用多个线程同时处理不同的任务可以一定程度上减少总耗时,达到提高效率的目的.然而,多个线程间的执行顺序是完全不可控的, ...
- luogu1941 [NOIp2014]飞扬的小鸟 (dp)
设f[i][j]为到达(i,j)这个位置的最小操作数 就有$f[i][j]=min\{f[i-1][j+Y[i-1]],f[i-1][j-X[i-1]*k]+k\}$ 然后考虑优化一下转移: 对于一系 ...
- 洛谷P3721 单旋
什么毒瘤...... 题意:模拟一棵单旋splay,求每次插入,splay最值,删除最值的操作次数. 解:乍一看感觉很神,又因为是LCT题单上的,然后就折磨了我好久,最后跑去看题解... 居然是手玩找 ...
- Java: 扩大字节缓存区的大小,提升AIO的处理性能(并发性能)
前些日了,对AIO与NIO的并发性能进行了比较,在低并发的情况下,NIO性能表现比AIO好一些,主要原因是,NIO中可以使用FileChannel.transferTo(long position, ...
- C++并发编程之std::async(), std::future, std::promise, std::packaged_task
c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的: void f(int n); std::thread t(f, n + 1); t.join(); 但是线程毕竟是属于比 ...
- activiti 用户手册中 10分钟 小例子 简单代码搭建 及 其中的 各种坑
看mossle的 5.16 用户手册中的 快速起步:10分钟教程 想自己跑一下,虽然官方文档已经写的非常详细了,但是实际操作中还是遇到各种坑,这里记录下来. 首先官网下载最新的 5版本 full G ...