![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Kernel Start
文章平均质量分 91
主要总结Linux启动过程的相关知识
HZero.chen
随风潜入夜,润物细无声
展开
-
memblocks_present
PAGE_SECTION_MASK对于sparse内存模型,有三级概念:root, section, page,它通过物理地址来进行组织,本例中物理地址为48bit,其中section大小为1G,占用30bit,而PAGE_SHIFT为12,因此page index也就是PFN_SECTION_SHIFT为30-12=18bit//每个section所占用物理地址的位数#define SECTION_SIZE_BITS 30//30 - 12 = 18#define PFN_SECTI原创 2022-02-14 14:46:18 · 444 阅读 · 0 评论 -
for_each_mem_pfn_range宏
kenrel: 5.10arch: aarch64前言启动阶段经过arm64_memblock_init之后,通过gdb可以查看到memblock布局如下:(gdb) p/x memblock$5 = { bottom_up = 0x0, current_limit = 0xffffffffffffffff, memory = { cnt = 0x1, max = 0x80, total_size = 0x40000000, regions = 0xff原创 2022-02-14 09:53:32 · 557 阅读 · 0 评论 -
如何获取initrd起始地址
我们知道用户在制作rootfs的时候,最终rootfs会三种方式挂接到系统:用户制作的根文件系统通过initramfs的方式与内核镜像打包在一起,这种情况下的rootfs内核会进行cpio压缩;此时主要会通过rest_init->kernel_init->populate_rootfs将用户根文件系统释放到内核的rootfs中。用户制作的根文件系统通过cpio的方式单独处理,不与内核镜像打包在一起;仍然会通过rest_init->kernel_init->popula原创 2021-11-19 10:06:56 · 1512 阅读 · 0 评论 -
kernel启动流程-start_kernel的执行_8.cpio initrd解包
目录1. 前言2.populate_rootfs3.GotName的处理参考文档1. 前言本专题文章承接之前《kernel启动流程_head.S的执行》专题文章,我们知道在head.S执行过程中保存了bootloader传递的启动参数、启动模式以及FDT地址等,创建了内核空间的页表,最后为init进程初始化好了堆栈,并跳转到start_kernel执行。在《kernel启动流程-start_kernel的执行_7.arch_call_rest_init》中提到kernel_init->do_ba原创 2021-02-25 15:28:28 · 1678 阅读 · 0 评论 -
kernel启动流程-start_kernel的执行_7.arch_call_rest_init
目录1. 前言2.arch_call_rest_init|- - rcu_scheduler_starting|- -kernel_thread(kernel_init, NULL, CLONE_FS)|- -tsk = find_task_by_pid_ns(pid, &init_pid_ns);|- -set_cpus_allowed_ptr(tsk, smp_processor_id())|- -numa_default_policy|- -kernel_thread(kthreadd, ..原创 2021-02-25 11:39:09 · 1142 阅读 · 0 评论 -
kernel启动流程-start_kernel的执行_6.vfs_caches_init
目录1. 前言2.vfs_caches_init|- -kmem_cache_create_usercopy("names_cache"...)|- -dcache_init|- -inode_init|- -files_init|- -files_maxfiles_init|- -mnt_init|- -bdev_cache_init|- -chrdev_init3. 总结1. 前言本专题文章承接之前《kernel启动流程_head.S的执行》专题文章,我们知道在head.S执行过程中保存了bootl原创 2021-02-23 17:34:16 · 643 阅读 · 0 评论 -
kernel启动流程-start_kernel的执行_5.sched_init
目录1. 前言2. 调度类与调度策略3. 关于组调度4. sched_init|- -wait_bit_init|- -初始化root_task_group|- -init_defrootdomain|- -初始化每个cpu的rq|- -mmgrab(&init_mm)|- -enter_lazy_tlb(&init_mm, current)|- -set_load_weight(&init_task, false)|- -init_idle(current, smp_process原创 2021-02-22 17:06:22 · 820 阅读 · 0 评论 -
kernel启动流程-start_kernel的执行_4.mm_init
目录1. 前言2. mm_initpage_ext_init_flatmeminit_debug_pageallocreport_meminitmem_init1. 前言本专题文章承接之前《kernel启动流程_head.S的执行》专题文章,我们知道在head.S执行过程中保存了bootloader传递的启动参数、启动模式以及FDT地址等,创建了内核空间的页表,最后为init进程初始化好了堆栈,并跳转到start_kernel执行。本文重点介绍start_kernel的mm_init的主要流程.ke原创 2021-02-20 17:30:01 · 1123 阅读 · 0 评论 -
kernel启动流程-start_kernel的执行_3.build_all_zonelists
1. 前言本专题文章承接之前《kernel启动流程_head.S的执行》专题文章,我们知道在head.S执行过程中保存了bootloader传递的启动参数、启动模式以及FDT地址等,创建了内核空间的页表,最后为init进程初始化好了堆栈,并跳转到start_kernel执行。本文重点介绍start_kernel的build_all_zonelists的主要流程.kernel版本:5.10平台:arm642. pg_data_t先来重点看下pg_data_t结构体,有一段注释On NUMA m原创 2021-02-20 16:04:38 · 523 阅读 · 0 评论 -
kernel启动流程-start_kernel的执行_1.概述
1.前言本专题文章承接之前《kernel启动流程_head.S的执行》专题文章,我们知道在head.S执行过程中保存了bootloader传递的启动参数、启动模式以及FDT地址等,创建了内核空间的页表,最后为init进程初始化好了堆栈,并跳转到start_kernel执行。本专题文章就是简要介绍start_kernel的启动流程,并对进程、内存、IO等的初始化部分做重点分析,本文是start_kernel的概述部分,总体介绍start_kernel包含的主要流程。kernel版本:5.10平台:ar原创 2021-02-04 09:15:21 · 5582 阅读 · 0 评论 -
kernel启动流程-start_kernel的执行_2.setup_arch
1.前言本专题文章承接之前《kernel启动流程_head.S的执行》专题文章,我们知道在head.S执行过程中保存了bootloader传递的启动参数、启动模式以及FDT地址等,创建了内核空间的页表,最后为init进程初始化好了堆栈,并跳转到start_kernel执行。本文重点介绍start_kernel的setup_arch的主要流程.kernel版本:5.10平台:arm642.setup_arch(&command_line)init_mminit_mm.start_code原创 2021-02-04 09:15:49 · 2754 阅读 · 3 评论 -
kernel启动流程-head.S的执行_9.__primary_switched
1. 前言kernel版本:5.10平台:arm64本专题主要基于《arm64_linux head.S的执行流程》系列文章,前者是基于3.18,本专题针对的是内核5.10。主要分析head.S的执行过程。前面分析了___primary_switch的执行过程,在___primary_switch的最后将会跳转到__primary_switched执行,它最终将跳转到start_kernel。2. __primary_switched设置init进程信息 adrp x4, i原创 2020-12-25 09:47:46 · 1376 阅读 · 0 评论 -
kernel启动流程-head.S的执行_2.总体流程
1.前言kernel版本:5.10平台:arm64本专题主要基于《arm64_linux head.S的执行流程》系列文章,前者是基于3.18,本专题针对的是内核5.10。主要分析head.S的执行过程。本文主要记录head.S的总体执行过程。2. head.S执行前bootloader在跳转到kernel前,需要确保如下设置:MMU = off, D-cache = off, I-cache = on or offx0 = physical address to the FDT blobk原创 2020-12-23 16:19:49 · 1806 阅读 · 0 评论 -
kernel启动流程-head.S的执行__8._primary_switch
1. 前言kernel版本:5.10平台:arm64本专题主要基于《arm64_linux head.S的执行流程》系列文章,前者是基于3.18,本专题针对的是内核5.10。主要分析head.S的执行过程。本文主要记录head.S的__primary_switch执行过程。2. __primary_switch保存设定值SCTLR_EL1_SET#ifdef CONFIG_RANDOMIZE_BASE原创 2020-12-23 16:03:20 · 1286 阅读 · 0 评论 -
kernel启动流程-head.S的执行__7.__cpu_setup
1. 前言kernel版本:5.10平台:arm64本专题主要基于《arm64_linux head.S的执行流程》系列文章,前者是基于3.18,本专题针对的是内核5.10。主要分析head.S的执行过程。本文主要记录head.S的__cpu_setup执行过程。2. __cpu_setup// A code blockvar foo = 'bar';// An highlighted blockvar foo = 'bar';...原创 2020-12-22 15:29:17 · 928 阅读 · 0 评论 -
kernel启动流程-head.S的执行___6.create_page_tables
1.前言kernel版本:5.10平台:arm64本专题主要基于《arm64_linux head.S的执行流程》系列文章,前者是基于3.18,本专题针对的是内核5.10。主要分析head.S的执行过程。本文主要记录head.S的create_page_tables执行过程。2. create_page_tables/* * Setup the initial page tables. We only setup the barest amount which is * required to原创 2020-12-22 10:04:37 · 1367 阅读 · 3 评论 -
kernel启动流程-head.S的执行__5.set_cpu_boot_mode_flag
1.前言kernel版本:5.10平台:arm64本专题主要基于《arm64_linux head.S的执行流程》系列文章,前者是基于3.18,本专题针对的是内核5.10。主要分析head.S的执行过程。本文主要记录head.S的set_cpu_boot_mode_flag执行过程。2.set_cpu_boot_mode_flag/* * Sets the __boot_cpu_mode flag depending on the CPU boot mode passed * in w0. S原创 2020-12-20 20:00:43 · 567 阅读 · 0 评论 -
kernel启动流程-head.S的执行_4.el2_setup
1.前言kernel版本:5.10平台:arm64本专题主要基于《arm64_linux head.S的执行流程》系列文章,前者是基于3.18,本专题针对的是内核5.10。主要分析head.S的执行过程。本文主要记录head.S的el2_setup执行过程。2. el2_setup/* * If we're fortunate enough to boot at EL2, ensure that the world is * sane before dropping to EL1. * *原创 2020-12-20 18:09:39 · 1010 阅读 · 1 评论 -
kernel启动流程-head.S的执行_3.preserve_boot_args
1.前言kernel版本:5.10平台:arm64本专题主要基于《arm64_linux head.S的执行流程》系列文章,前者是基于3.18,本专题针对的是内核5.10。主要分析head.S的执行过程。本文主要记录head.S的preserve_boot_args执行过程。2.preserve_boot_args/*原创 2020-12-18 16:46:05 · 996 阅读 · 0 评论 -
kernel启动流程-head.S的执行_1.概述
1.前言kernel版本:5.10平台:arm64本专题主要基于《arm64_linux head.S的执行流程》系列文章,前者是基于3.18,本专题针对的是内核5.10。主要分析head.S的执行过程。本文主要记录head.S的总体执行过程。2.如何执行到head.S的第一条指令?vmlinux.lds中定义了入口点为_text.......ENTRY(_text).......SECTIONS{ /* * XXX: The linker does原创 2020-12-15 16:02:42 · 1909 阅读 · 0 评论