系统初始化

  • 一、Makefile分析
  • 二、head.S
    • 1、fake_start
    • 2、real_start
    • 3、__prepare_jump_to_master
  • 三、main.c
    • 1、start_master
    • 2、init_in_process
    • 3、init_in_process

一、Makefile分析

从 src/ 目录下的Makefile可以看出,工程的结构基本与Linux系统保持一致:

#mermaid-svg-gFSsIC3Ub2cxvktd .label {font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family);fill: #333;color: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd .label text {fill: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd .node rect, #mermaid-svg-gFSsIC3Ub2cxvktd .node circle, #mermaid-svg-gFSsIC3Ub2cxvktd .node ellipse, #mermaid-svg-gFSsIC3Ub2cxvktd .node polygon, #mermaid-svg-gFSsIC3Ub2cxvktd .node path {fill: #ECECFF;stroke: #9370DB;stroke-width: 1px; }#mermaid-svg-gFSsIC3Ub2cxvktd .node .label {text-align: center;fill: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd .node.clickable {cursor: pointer; }#mermaid-svg-gFSsIC3Ub2cxvktd .arrowheadPath {fill: #333333; }#mermaid-svg-gFSsIC3Ub2cxvktd .edgePath .path {stroke: #333333;stroke-width: 1.5px; }#mermaid-svg-gFSsIC3Ub2cxvktd .flowchart-link {stroke: #333333;fill: none; }#mermaid-svg-gFSsIC3Ub2cxvktd .edgeLabel {background-color: #e8e8e8;text-align: center; } #mermaid-svg-gFSsIC3Ub2cxvktd .edgeLabel rect {opacity: 0.9; } #mermaid-svg-gFSsIC3Ub2cxvktd .edgeLabel span {color: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd .cluster rect {fill: #ffffde;stroke: #aaaa33;stroke-width: 1px; }#mermaid-svg-gFSsIC3Ub2cxvktd .cluster text {fill: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd div.mermaidTooltip {position: absolute;text-align: center;max-width: 200px;padding: 2px;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family);font-size: 12px;background: #ffffde;border: 1px solid #aaaa33;border-radius: 2px;pointer-events: none;z-index: 100; }#mermaid-svg-gFSsIC3Ub2cxvktd .actor {stroke: #CCCCFF;fill: #ECECFF; }#mermaid-svg-gFSsIC3Ub2cxvktd text.actor > tspan {fill: black;stroke: none; }#mermaid-svg-gFSsIC3Ub2cxvktd .actor-line {stroke: grey; }#mermaid-svg-gFSsIC3Ub2cxvktd .messageLine0 {stroke-width: 1.5;stroke-dasharray: none;stroke: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd .messageLine1 {stroke-width: 1.5;stroke-dasharray: 2, 2;stroke: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd #arrowhead path {fill: #333;stroke: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd .sequenceNumber {fill: white; }#mermaid-svg-gFSsIC3Ub2cxvktd #sequencenumber {fill: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd #crosshead path {fill: #333;stroke: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd .messageText {fill: #333;stroke: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd .labelBox {stroke: #CCCCFF;fill: #ECECFF; }#mermaid-svg-gFSsIC3Ub2cxvktd .labelText,#mermaid-svg-gFSsIC3Ub2cxvktd .labelText > tspan {fill: black;stroke: none; }#mermaid-svg-gFSsIC3Ub2cxvktd .loopText,#mermaid-svg-gFSsIC3Ub2cxvktd .loopText > tspan {fill: black;stroke: none; }#mermaid-svg-gFSsIC3Ub2cxvktd .loopLine {stroke-width: 2px;stroke-dasharray: 2, 2;stroke: #CCCCFF;fill: #CCCCFF; }#mermaid-svg-gFSsIC3Ub2cxvktd .note {stroke: #aaaa33;fill: #fff5ad; }#mermaid-svg-gFSsIC3Ub2cxvktd .noteText,#mermaid-svg-gFSsIC3Ub2cxvktd .noteText > tspan {fill: black;stroke: none; }#mermaid-svg-gFSsIC3Ub2cxvktd .activation0 {fill: #f4f4f4;stroke: #666; }#mermaid-svg-gFSsIC3Ub2cxvktd .activation1 {fill: #f4f4f4;stroke: #666; }#mermaid-svg-gFSsIC3Ub2cxvktd .activation2 {fill: #f4f4f4;stroke: #666; }#mermaid-svg-gFSsIC3Ub2cxvktd .mermaid-main-font {font-family: "trebuchet ms", verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-gFSsIC3Ub2cxvktd .section {stroke: none;opacity: 0.2; }#mermaid-svg-gFSsIC3Ub2cxvktd .section0 {fill: rgba(102, 102, 255, 0.49); }#mermaid-svg-gFSsIC3Ub2cxvktd .section2 {fill: #fff400; }#mermaid-svg-gFSsIC3Ub2cxvktd .section1, #mermaid-svg-gFSsIC3Ub2cxvktd .section3 {fill: white;opacity: 0.2; }#mermaid-svg-gFSsIC3Ub2cxvktd .sectionTitle0 {fill: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd .sectionTitle1 {fill: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd .sectionTitle2 {fill: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd .sectionTitle3 {fill: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd .sectionTitle {text-anchor: start;font-size: 11px;text-height: 14px;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-gFSsIC3Ub2cxvktd .grid .tick {stroke: lightgrey;opacity: 0.8;shape-rendering: crispEdges; } #mermaid-svg-gFSsIC3Ub2cxvktd .grid .tick text {font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-gFSsIC3Ub2cxvktd .grid path {stroke-width: 0; }#mermaid-svg-gFSsIC3Ub2cxvktd .today {fill: none;stroke: red;stroke-width: 2px; }#mermaid-svg-gFSsIC3Ub2cxvktd .task {stroke-width: 2; }#mermaid-svg-gFSsIC3Ub2cxvktd .taskText {text-anchor: middle;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-gFSsIC3Ub2cxvktd .taskText:not([font-size]) {font-size: 11px; }#mermaid-svg-gFSsIC3Ub2cxvktd .taskTextOutsideRight {fill: black;text-anchor: start;font-size: 11px;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-gFSsIC3Ub2cxvktd .taskTextOutsideLeft {fill: black;text-anchor: end;font-size: 11px; }#mermaid-svg-gFSsIC3Ub2cxvktd .task.clickable {cursor: pointer; }#mermaid-svg-gFSsIC3Ub2cxvktd .taskText.clickable {cursor: pointer;fill: #003163 !important;font-weight: bold; }#mermaid-svg-gFSsIC3Ub2cxvktd .taskTextOutsideLeft.clickable {cursor: pointer;fill: #003163 !important;font-weight: bold; }#mermaid-svg-gFSsIC3Ub2cxvktd .taskTextOutsideRight.clickable {cursor: pointer;fill: #003163 !important;font-weight: bold; }#mermaid-svg-gFSsIC3Ub2cxvktd .taskText0, #mermaid-svg-gFSsIC3Ub2cxvktd .taskText1, #mermaid-svg-gFSsIC3Ub2cxvktd .taskText2, #mermaid-svg-gFSsIC3Ub2cxvktd .taskText3 {fill: white; }#mermaid-svg-gFSsIC3Ub2cxvktd .task0, #mermaid-svg-gFSsIC3Ub2cxvktd .task1, #mermaid-svg-gFSsIC3Ub2cxvktd .task2, #mermaid-svg-gFSsIC3Ub2cxvktd .task3 {fill: #8a90dd;stroke: #534fbc; }#mermaid-svg-gFSsIC3Ub2cxvktd .taskTextOutside0, #mermaid-svg-gFSsIC3Ub2cxvktd .taskTextOutside2 {fill: black; }#mermaid-svg-gFSsIC3Ub2cxvktd .taskTextOutside1, #mermaid-svg-gFSsIC3Ub2cxvktd .taskTextOutside3 {fill: black; }#mermaid-svg-gFSsIC3Ub2cxvktd .active0, #mermaid-svg-gFSsIC3Ub2cxvktd .active1, #mermaid-svg-gFSsIC3Ub2cxvktd .active2, #mermaid-svg-gFSsIC3Ub2cxvktd .active3 {fill: #bfc7ff;stroke: #534fbc; }#mermaid-svg-gFSsIC3Ub2cxvktd .activeText0, #mermaid-svg-gFSsIC3Ub2cxvktd .activeText1, #mermaid-svg-gFSsIC3Ub2cxvktd .activeText2, #mermaid-svg-gFSsIC3Ub2cxvktd .activeText3 {fill: black !important; }#mermaid-svg-gFSsIC3Ub2cxvktd .done0, #mermaid-svg-gFSsIC3Ub2cxvktd .done1, #mermaid-svg-gFSsIC3Ub2cxvktd .done2, #mermaid-svg-gFSsIC3Ub2cxvktd .done3 {stroke: grey;fill: lightgrey;stroke-width: 2; }#mermaid-svg-gFSsIC3Ub2cxvktd .doneText0, #mermaid-svg-gFSsIC3Ub2cxvktd .doneText1, #mermaid-svg-gFSsIC3Ub2cxvktd .doneText2, #mermaid-svg-gFSsIC3Ub2cxvktd .doneText3 {fill: black !important; }#mermaid-svg-gFSsIC3Ub2cxvktd .crit0, #mermaid-svg-gFSsIC3Ub2cxvktd .crit1, #mermaid-svg-gFSsIC3Ub2cxvktd .crit2, #mermaid-svg-gFSsIC3Ub2cxvktd .crit3 {stroke: #ff8888;fill: red;stroke-width: 2; }#mermaid-svg-gFSsIC3Ub2cxvktd .activeCrit0, #mermaid-svg-gFSsIC3Ub2cxvktd .activeCrit1, #mermaid-svg-gFSsIC3Ub2cxvktd .activeCrit2, #mermaid-svg-gFSsIC3Ub2cxvktd .activeCrit3 {stroke: #ff8888;fill: #bfc7ff;stroke-width: 2; }#mermaid-svg-gFSsIC3Ub2cxvktd .doneCrit0, #mermaid-svg-gFSsIC3Ub2cxvktd .doneCrit1, #mermaid-svg-gFSsIC3Ub2cxvktd .doneCrit2, #mermaid-svg-gFSsIC3Ub2cxvktd .doneCrit3 {stroke: #ff8888;fill: lightgrey;stroke-width: 2;cursor: pointer;shape-rendering: crispEdges; }#mermaid-svg-gFSsIC3Ub2cxvktd .milestone {transform: rotate(45deg) scale(0.8, 0.8); }#mermaid-svg-gFSsIC3Ub2cxvktd .milestoneText {font-style: italic; }#mermaid-svg-gFSsIC3Ub2cxvktd .doneCritText0, #mermaid-svg-gFSsIC3Ub2cxvktd .doneCritText1, #mermaid-svg-gFSsIC3Ub2cxvktd .doneCritText2, #mermaid-svg-gFSsIC3Ub2cxvktd .doneCritText3 {fill: black !important; }#mermaid-svg-gFSsIC3Ub2cxvktd .activeCritText0, #mermaid-svg-gFSsIC3Ub2cxvktd .activeCritText1, #mermaid-svg-gFSsIC3Ub2cxvktd .activeCritText2, #mermaid-svg-gFSsIC3Ub2cxvktd .activeCritText3 {fill: black !important; }#mermaid-svg-gFSsIC3Ub2cxvktd .titleText {text-anchor: middle;font-size: 18px;fill: black;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-gFSsIC3Ub2cxvktd g.classGroup text {fill: #9370DB;stroke: none;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family);font-size: 10px; } #mermaid-svg-gFSsIC3Ub2cxvktd g.classGroup text .title {font-weight: bolder; }#mermaid-svg-gFSsIC3Ub2cxvktd g.clickable {cursor: pointer; }#mermaid-svg-gFSsIC3Ub2cxvktd g.classGroup rect {fill: #ECECFF;stroke: #9370DB; }#mermaid-svg-gFSsIC3Ub2cxvktd g.classGroup line {stroke: #9370DB;stroke-width: 1; }#mermaid-svg-gFSsIC3Ub2cxvktd .classLabel .box {stroke: none;stroke-width: 0;fill: #ECECFF;opacity: 0.5; }#mermaid-svg-gFSsIC3Ub2cxvktd .classLabel .label {fill: #9370DB;font-size: 10px; }#mermaid-svg-gFSsIC3Ub2cxvktd .relation {stroke: #9370DB;stroke-width: 1;fill: none; }#mermaid-svg-gFSsIC3Ub2cxvktd .dashed-line {stroke-dasharray: 3; }#mermaid-svg-gFSsIC3Ub2cxvktd #compositionStart {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-gFSsIC3Ub2cxvktd #compositionEnd {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-gFSsIC3Ub2cxvktd #aggregationStart {fill: #ECECFF;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-gFSsIC3Ub2cxvktd #aggregationEnd {fill: #ECECFF;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-gFSsIC3Ub2cxvktd #dependencyStart {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-gFSsIC3Ub2cxvktd #dependencyEnd {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-gFSsIC3Ub2cxvktd #extensionStart {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-gFSsIC3Ub2cxvktd #extensionEnd {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-gFSsIC3Ub2cxvktd .commit-id, #mermaid-svg-gFSsIC3Ub2cxvktd .commit-msg, #mermaid-svg-gFSsIC3Ub2cxvktd .branch-label {fill: lightgrey;color: lightgrey;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-gFSsIC3Ub2cxvktd .pieTitleText {text-anchor: middle;font-size: 25px;fill: black;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-gFSsIC3Ub2cxvktd .slice {font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-gFSsIC3Ub2cxvktd g.stateGroup text {fill: #9370DB;stroke: none;font-size: 10px;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-gFSsIC3Ub2cxvktd g.stateGroup text {fill: #9370DB;fill: #333;stroke: none;font-size: 10px; }#mermaid-svg-gFSsIC3Ub2cxvktd g.statediagram-cluster .cluster-label text {fill: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd g.stateGroup .state-title {font-weight: bolder;fill: black; }#mermaid-svg-gFSsIC3Ub2cxvktd g.stateGroup rect {fill: #ECECFF;stroke: #9370DB; }#mermaid-svg-gFSsIC3Ub2cxvktd g.stateGroup line {stroke: #9370DB;stroke-width: 1; }#mermaid-svg-gFSsIC3Ub2cxvktd .transition {stroke: #9370DB;stroke-width: 1;fill: none; }#mermaid-svg-gFSsIC3Ub2cxvktd .stateGroup .composit {fill: white;border-bottom: 1px; }#mermaid-svg-gFSsIC3Ub2cxvktd .stateGroup .alt-composit {fill: #e0e0e0;border-bottom: 1px; }#mermaid-svg-gFSsIC3Ub2cxvktd .state-note {stroke: #aaaa33;fill: #fff5ad; } #mermaid-svg-gFSsIC3Ub2cxvktd .state-note text {fill: black;stroke: none;font-size: 10px; }#mermaid-svg-gFSsIC3Ub2cxvktd .stateLabel .box {stroke: none;stroke-width: 0;fill: #ECECFF;opacity: 0.7; }#mermaid-svg-gFSsIC3Ub2cxvktd .edgeLabel text {fill: #333; }#mermaid-svg-gFSsIC3Ub2cxvktd .stateLabel text {fill: black;font-size: 10px;font-weight: bold;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-gFSsIC3Ub2cxvktd .node circle.state-start {fill: black;stroke: black; }#mermaid-svg-gFSsIC3Ub2cxvktd .node circle.state-end {fill: black;stroke: white;stroke-width: 1.5; }#mermaid-svg-gFSsIC3Ub2cxvktd #statediagram-barbEnd {fill: #9370DB; }#mermaid-svg-gFSsIC3Ub2cxvktd .statediagram-cluster rect {fill: #ECECFF;stroke: #9370DB;stroke-width: 1px; }#mermaid-svg-gFSsIC3Ub2cxvktd .statediagram-cluster rect.outer {rx: 5px;ry: 5px; }#mermaid-svg-gFSsIC3Ub2cxvktd .statediagram-state .divider {stroke: #9370DB; }#mermaid-svg-gFSsIC3Ub2cxvktd .statediagram-state .title-state {rx: 5px;ry: 5px; }#mermaid-svg-gFSsIC3Ub2cxvktd .statediagram-cluster.statediagram-cluster .inner {fill: white; }#mermaid-svg-gFSsIC3Ub2cxvktd .statediagram-cluster.statediagram-cluster-alt .inner {fill: #e0e0e0; }#mermaid-svg-gFSsIC3Ub2cxvktd .statediagram-cluster .inner {rx: 0;ry: 0; }#mermaid-svg-gFSsIC3Ub2cxvktd .statediagram-state rect.basic {rx: 5px;ry: 5px; }#mermaid-svg-gFSsIC3Ub2cxvktd .statediagram-state rect.divider {stroke-dasharray: 10,10;fill: #efefef; }#mermaid-svg-gFSsIC3Ub2cxvktd .note-edge {stroke-dasharray: 5; }#mermaid-svg-gFSsIC3Ub2cxvktd .statediagram-note rect {fill: #fff5ad;stroke: #aaaa33;stroke-width: 1px;rx: 0;ry: 0; }:root {--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive; }#mermaid-svg-gFSsIC3Ub2cxvktd .error-icon {fill: #552222; }#mermaid-svg-gFSsIC3Ub2cxvktd .error-text {fill: #552222;stroke: #552222; }#mermaid-svg-gFSsIC3Ub2cxvktd .edge-thickness-normal {stroke-width: 2px; }#mermaid-svg-gFSsIC3Ub2cxvktd .edge-thickness-thick {stroke-width: 3.5px; }#mermaid-svg-gFSsIC3Ub2cxvktd .edge-pattern-solid {stroke-dasharray: 0; }#mermaid-svg-gFSsIC3Ub2cxvktd .edge-pattern-dashed {stroke-dasharray: 3; }#mermaid-svg-gFSsIC3Ub2cxvktd .edge-pattern-dotted {stroke-dasharray: 2; }#mermaid-svg-gFSsIC3Ub2cxvktd .marker {fill: #333333; }#mermaid-svg-gFSsIC3Ub2cxvktd .marker.cross {stroke: #333333; }:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-gFSsIC3Ub2cxvktd {color: rgba(0, 0, 0, 0.75);font: ;}

_all
all
vmlinux
vmlinux-lds
vmlinux-init
head-y
init-y:= init/
vmlinux-main
vmlinux.o
kallsyms.o

在 init/ 目录中的Makefile主要内容如下:

obj-y := main.o version.o init_task.o test.o

在 arch/arm64/kernel/Makefile中可以找到:

head-y := head.o

从Makefile的分析可以看出,系统的初始化是在head.S和main.c这两个文件完成的,接下来我们来看看这两个文件。

二、head.S

head.S是一个汇编文件,内部的执行流程如下:

#mermaid-svg-Ez2PvmBUU50nYkHe .label {font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family);fill: #333;color: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe .label text {fill: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe .node rect, #mermaid-svg-Ez2PvmBUU50nYkHe .node circle, #mermaid-svg-Ez2PvmBUU50nYkHe .node ellipse, #mermaid-svg-Ez2PvmBUU50nYkHe .node polygon, #mermaid-svg-Ez2PvmBUU50nYkHe .node path {fill: #ECECFF;stroke: #9370DB;stroke-width: 1px; }#mermaid-svg-Ez2PvmBUU50nYkHe .node .label {text-align: center;fill: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe .node.clickable {cursor: pointer; }#mermaid-svg-Ez2PvmBUU50nYkHe .arrowheadPath {fill: #333333; }#mermaid-svg-Ez2PvmBUU50nYkHe .edgePath .path {stroke: #333333;stroke-width: 1.5px; }#mermaid-svg-Ez2PvmBUU50nYkHe .flowchart-link {stroke: #333333;fill: none; }#mermaid-svg-Ez2PvmBUU50nYkHe .edgeLabel {background-color: #e8e8e8;text-align: center; } #mermaid-svg-Ez2PvmBUU50nYkHe .edgeLabel rect {opacity: 0.9; } #mermaid-svg-Ez2PvmBUU50nYkHe .edgeLabel span {color: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe .cluster rect {fill: #ffffde;stroke: #aaaa33;stroke-width: 1px; }#mermaid-svg-Ez2PvmBUU50nYkHe .cluster text {fill: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe div.mermaidTooltip {position: absolute;text-align: center;max-width: 200px;padding: 2px;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family);font-size: 12px;background: #ffffde;border: 1px solid #aaaa33;border-radius: 2px;pointer-events: none;z-index: 100; }#mermaid-svg-Ez2PvmBUU50nYkHe .actor {stroke: #CCCCFF;fill: #ECECFF; }#mermaid-svg-Ez2PvmBUU50nYkHe text.actor > tspan {fill: black;stroke: none; }#mermaid-svg-Ez2PvmBUU50nYkHe .actor-line {stroke: grey; }#mermaid-svg-Ez2PvmBUU50nYkHe .messageLine0 {stroke-width: 1.5;stroke-dasharray: none;stroke: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe .messageLine1 {stroke-width: 1.5;stroke-dasharray: 2, 2;stroke: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe #arrowhead path {fill: #333;stroke: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe .sequenceNumber {fill: white; }#mermaid-svg-Ez2PvmBUU50nYkHe #sequencenumber {fill: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe #crosshead path {fill: #333;stroke: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe .messageText {fill: #333;stroke: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe .labelBox {stroke: #CCCCFF;fill: #ECECFF; }#mermaid-svg-Ez2PvmBUU50nYkHe .labelText,#mermaid-svg-Ez2PvmBUU50nYkHe .labelText > tspan {fill: black;stroke: none; }#mermaid-svg-Ez2PvmBUU50nYkHe .loopText,#mermaid-svg-Ez2PvmBUU50nYkHe .loopText > tspan {fill: black;stroke: none; }#mermaid-svg-Ez2PvmBUU50nYkHe .loopLine {stroke-width: 2px;stroke-dasharray: 2, 2;stroke: #CCCCFF;fill: #CCCCFF; }#mermaid-svg-Ez2PvmBUU50nYkHe .note {stroke: #aaaa33;fill: #fff5ad; }#mermaid-svg-Ez2PvmBUU50nYkHe .noteText,#mermaid-svg-Ez2PvmBUU50nYkHe .noteText > tspan {fill: black;stroke: none; }#mermaid-svg-Ez2PvmBUU50nYkHe .activation0 {fill: #f4f4f4;stroke: #666; }#mermaid-svg-Ez2PvmBUU50nYkHe .activation1 {fill: #f4f4f4;stroke: #666; }#mermaid-svg-Ez2PvmBUU50nYkHe .activation2 {fill: #f4f4f4;stroke: #666; }#mermaid-svg-Ez2PvmBUU50nYkHe .mermaid-main-font {font-family: "trebuchet ms", verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-Ez2PvmBUU50nYkHe .section {stroke: none;opacity: 0.2; }#mermaid-svg-Ez2PvmBUU50nYkHe .section0 {fill: rgba(102, 102, 255, 0.49); }#mermaid-svg-Ez2PvmBUU50nYkHe .section2 {fill: #fff400; }#mermaid-svg-Ez2PvmBUU50nYkHe .section1, #mermaid-svg-Ez2PvmBUU50nYkHe .section3 {fill: white;opacity: 0.2; }#mermaid-svg-Ez2PvmBUU50nYkHe .sectionTitle0 {fill: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe .sectionTitle1 {fill: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe .sectionTitle2 {fill: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe .sectionTitle3 {fill: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe .sectionTitle {text-anchor: start;font-size: 11px;text-height: 14px;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-Ez2PvmBUU50nYkHe .grid .tick {stroke: lightgrey;opacity: 0.8;shape-rendering: crispEdges; } #mermaid-svg-Ez2PvmBUU50nYkHe .grid .tick text {font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-Ez2PvmBUU50nYkHe .grid path {stroke-width: 0; }#mermaid-svg-Ez2PvmBUU50nYkHe .today {fill: none;stroke: red;stroke-width: 2px; }#mermaid-svg-Ez2PvmBUU50nYkHe .task {stroke-width: 2; }#mermaid-svg-Ez2PvmBUU50nYkHe .taskText {text-anchor: middle;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-Ez2PvmBUU50nYkHe .taskText:not([font-size]) {font-size: 11px; }#mermaid-svg-Ez2PvmBUU50nYkHe .taskTextOutsideRight {fill: black;text-anchor: start;font-size: 11px;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-Ez2PvmBUU50nYkHe .taskTextOutsideLeft {fill: black;text-anchor: end;font-size: 11px; }#mermaid-svg-Ez2PvmBUU50nYkHe .task.clickable {cursor: pointer; }#mermaid-svg-Ez2PvmBUU50nYkHe .taskText.clickable {cursor: pointer;fill: #003163 !important;font-weight: bold; }#mermaid-svg-Ez2PvmBUU50nYkHe .taskTextOutsideLeft.clickable {cursor: pointer;fill: #003163 !important;font-weight: bold; }#mermaid-svg-Ez2PvmBUU50nYkHe .taskTextOutsideRight.clickable {cursor: pointer;fill: #003163 !important;font-weight: bold; }#mermaid-svg-Ez2PvmBUU50nYkHe .taskText0, #mermaid-svg-Ez2PvmBUU50nYkHe .taskText1, #mermaid-svg-Ez2PvmBUU50nYkHe .taskText2, #mermaid-svg-Ez2PvmBUU50nYkHe .taskText3 {fill: white; }#mermaid-svg-Ez2PvmBUU50nYkHe .task0, #mermaid-svg-Ez2PvmBUU50nYkHe .task1, #mermaid-svg-Ez2PvmBUU50nYkHe .task2, #mermaid-svg-Ez2PvmBUU50nYkHe .task3 {fill: #8a90dd;stroke: #534fbc; }#mermaid-svg-Ez2PvmBUU50nYkHe .taskTextOutside0, #mermaid-svg-Ez2PvmBUU50nYkHe .taskTextOutside2 {fill: black; }#mermaid-svg-Ez2PvmBUU50nYkHe .taskTextOutside1, #mermaid-svg-Ez2PvmBUU50nYkHe .taskTextOutside3 {fill: black; }#mermaid-svg-Ez2PvmBUU50nYkHe .active0, #mermaid-svg-Ez2PvmBUU50nYkHe .active1, #mermaid-svg-Ez2PvmBUU50nYkHe .active2, #mermaid-svg-Ez2PvmBUU50nYkHe .active3 {fill: #bfc7ff;stroke: #534fbc; }#mermaid-svg-Ez2PvmBUU50nYkHe .activeText0, #mermaid-svg-Ez2PvmBUU50nYkHe .activeText1, #mermaid-svg-Ez2PvmBUU50nYkHe .activeText2, #mermaid-svg-Ez2PvmBUU50nYkHe .activeText3 {fill: black !important; }#mermaid-svg-Ez2PvmBUU50nYkHe .done0, #mermaid-svg-Ez2PvmBUU50nYkHe .done1, #mermaid-svg-Ez2PvmBUU50nYkHe .done2, #mermaid-svg-Ez2PvmBUU50nYkHe .done3 {stroke: grey;fill: lightgrey;stroke-width: 2; }#mermaid-svg-Ez2PvmBUU50nYkHe .doneText0, #mermaid-svg-Ez2PvmBUU50nYkHe .doneText1, #mermaid-svg-Ez2PvmBUU50nYkHe .doneText2, #mermaid-svg-Ez2PvmBUU50nYkHe .doneText3 {fill: black !important; }#mermaid-svg-Ez2PvmBUU50nYkHe .crit0, #mermaid-svg-Ez2PvmBUU50nYkHe .crit1, #mermaid-svg-Ez2PvmBUU50nYkHe .crit2, #mermaid-svg-Ez2PvmBUU50nYkHe .crit3 {stroke: #ff8888;fill: red;stroke-width: 2; }#mermaid-svg-Ez2PvmBUU50nYkHe .activeCrit0, #mermaid-svg-Ez2PvmBUU50nYkHe .activeCrit1, #mermaid-svg-Ez2PvmBUU50nYkHe .activeCrit2, #mermaid-svg-Ez2PvmBUU50nYkHe .activeCrit3 {stroke: #ff8888;fill: #bfc7ff;stroke-width: 2; }#mermaid-svg-Ez2PvmBUU50nYkHe .doneCrit0, #mermaid-svg-Ez2PvmBUU50nYkHe .doneCrit1, #mermaid-svg-Ez2PvmBUU50nYkHe .doneCrit2, #mermaid-svg-Ez2PvmBUU50nYkHe .doneCrit3 {stroke: #ff8888;fill: lightgrey;stroke-width: 2;cursor: pointer;shape-rendering: crispEdges; }#mermaid-svg-Ez2PvmBUU50nYkHe .milestone {transform: rotate(45deg) scale(0.8, 0.8); }#mermaid-svg-Ez2PvmBUU50nYkHe .milestoneText {font-style: italic; }#mermaid-svg-Ez2PvmBUU50nYkHe .doneCritText0, #mermaid-svg-Ez2PvmBUU50nYkHe .doneCritText1, #mermaid-svg-Ez2PvmBUU50nYkHe .doneCritText2, #mermaid-svg-Ez2PvmBUU50nYkHe .doneCritText3 {fill: black !important; }#mermaid-svg-Ez2PvmBUU50nYkHe .activeCritText0, #mermaid-svg-Ez2PvmBUU50nYkHe .activeCritText1, #mermaid-svg-Ez2PvmBUU50nYkHe .activeCritText2, #mermaid-svg-Ez2PvmBUU50nYkHe .activeCritText3 {fill: black !important; }#mermaid-svg-Ez2PvmBUU50nYkHe .titleText {text-anchor: middle;font-size: 18px;fill: black;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-Ez2PvmBUU50nYkHe g.classGroup text {fill: #9370DB;stroke: none;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family);font-size: 10px; } #mermaid-svg-Ez2PvmBUU50nYkHe g.classGroup text .title {font-weight: bolder; }#mermaid-svg-Ez2PvmBUU50nYkHe g.clickable {cursor: pointer; }#mermaid-svg-Ez2PvmBUU50nYkHe g.classGroup rect {fill: #ECECFF;stroke: #9370DB; }#mermaid-svg-Ez2PvmBUU50nYkHe g.classGroup line {stroke: #9370DB;stroke-width: 1; }#mermaid-svg-Ez2PvmBUU50nYkHe .classLabel .box {stroke: none;stroke-width: 0;fill: #ECECFF;opacity: 0.5; }#mermaid-svg-Ez2PvmBUU50nYkHe .classLabel .label {fill: #9370DB;font-size: 10px; }#mermaid-svg-Ez2PvmBUU50nYkHe .relation {stroke: #9370DB;stroke-width: 1;fill: none; }#mermaid-svg-Ez2PvmBUU50nYkHe .dashed-line {stroke-dasharray: 3; }#mermaid-svg-Ez2PvmBUU50nYkHe #compositionStart {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-Ez2PvmBUU50nYkHe #compositionEnd {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-Ez2PvmBUU50nYkHe #aggregationStart {fill: #ECECFF;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-Ez2PvmBUU50nYkHe #aggregationEnd {fill: #ECECFF;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-Ez2PvmBUU50nYkHe #dependencyStart {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-Ez2PvmBUU50nYkHe #dependencyEnd {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-Ez2PvmBUU50nYkHe #extensionStart {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-Ez2PvmBUU50nYkHe #extensionEnd {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-Ez2PvmBUU50nYkHe .commit-id, #mermaid-svg-Ez2PvmBUU50nYkHe .commit-msg, #mermaid-svg-Ez2PvmBUU50nYkHe .branch-label {fill: lightgrey;color: lightgrey;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-Ez2PvmBUU50nYkHe .pieTitleText {text-anchor: middle;font-size: 25px;fill: black;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-Ez2PvmBUU50nYkHe .slice {font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-Ez2PvmBUU50nYkHe g.stateGroup text {fill: #9370DB;stroke: none;font-size: 10px;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-Ez2PvmBUU50nYkHe g.stateGroup text {fill: #9370DB;fill: #333;stroke: none;font-size: 10px; }#mermaid-svg-Ez2PvmBUU50nYkHe g.statediagram-cluster .cluster-label text {fill: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe g.stateGroup .state-title {font-weight: bolder;fill: black; }#mermaid-svg-Ez2PvmBUU50nYkHe g.stateGroup rect {fill: #ECECFF;stroke: #9370DB; }#mermaid-svg-Ez2PvmBUU50nYkHe g.stateGroup line {stroke: #9370DB;stroke-width: 1; }#mermaid-svg-Ez2PvmBUU50nYkHe .transition {stroke: #9370DB;stroke-width: 1;fill: none; }#mermaid-svg-Ez2PvmBUU50nYkHe .stateGroup .composit {fill: white;border-bottom: 1px; }#mermaid-svg-Ez2PvmBUU50nYkHe .stateGroup .alt-composit {fill: #e0e0e0;border-bottom: 1px; }#mermaid-svg-Ez2PvmBUU50nYkHe .state-note {stroke: #aaaa33;fill: #fff5ad; } #mermaid-svg-Ez2PvmBUU50nYkHe .state-note text {fill: black;stroke: none;font-size: 10px; }#mermaid-svg-Ez2PvmBUU50nYkHe .stateLabel .box {stroke: none;stroke-width: 0;fill: #ECECFF;opacity: 0.7; }#mermaid-svg-Ez2PvmBUU50nYkHe .edgeLabel text {fill: #333; }#mermaid-svg-Ez2PvmBUU50nYkHe .stateLabel text {fill: black;font-size: 10px;font-weight: bold;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-Ez2PvmBUU50nYkHe .node circle.state-start {fill: black;stroke: black; }#mermaid-svg-Ez2PvmBUU50nYkHe .node circle.state-end {fill: black;stroke: white;stroke-width: 1.5; }#mermaid-svg-Ez2PvmBUU50nYkHe #statediagram-barbEnd {fill: #9370DB; }#mermaid-svg-Ez2PvmBUU50nYkHe .statediagram-cluster rect {fill: #ECECFF;stroke: #9370DB;stroke-width: 1px; }#mermaid-svg-Ez2PvmBUU50nYkHe .statediagram-cluster rect.outer {rx: 5px;ry: 5px; }#mermaid-svg-Ez2PvmBUU50nYkHe .statediagram-state .divider {stroke: #9370DB; }#mermaid-svg-Ez2PvmBUU50nYkHe .statediagram-state .title-state {rx: 5px;ry: 5px; }#mermaid-svg-Ez2PvmBUU50nYkHe .statediagram-cluster.statediagram-cluster .inner {fill: white; }#mermaid-svg-Ez2PvmBUU50nYkHe .statediagram-cluster.statediagram-cluster-alt .inner {fill: #e0e0e0; }#mermaid-svg-Ez2PvmBUU50nYkHe .statediagram-cluster .inner {rx: 0;ry: 0; }#mermaid-svg-Ez2PvmBUU50nYkHe .statediagram-state rect.basic {rx: 5px;ry: 5px; }#mermaid-svg-Ez2PvmBUU50nYkHe .statediagram-state rect.divider {stroke-dasharray: 10,10;fill: #efefef; }#mermaid-svg-Ez2PvmBUU50nYkHe .note-edge {stroke-dasharray: 5; }#mermaid-svg-Ez2PvmBUU50nYkHe .statediagram-note rect {fill: #fff5ad;stroke: #aaaa33;stroke-width: 1px;rx: 0;ry: 0; }:root {--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive; }#mermaid-svg-Ez2PvmBUU50nYkHe .error-icon {fill: #552222; }#mermaid-svg-Ez2PvmBUU50nYkHe .error-text {fill: #552222;stroke: #552222; }#mermaid-svg-Ez2PvmBUU50nYkHe .edge-thickness-normal {stroke-width: 2px; }#mermaid-svg-Ez2PvmBUU50nYkHe .edge-thickness-thick {stroke-width: 3.5px; }#mermaid-svg-Ez2PvmBUU50nYkHe .edge-pattern-solid {stroke-dasharray: 0; }#mermaid-svg-Ez2PvmBUU50nYkHe .edge-pattern-dashed {stroke-dasharray: 3; }#mermaid-svg-Ez2PvmBUU50nYkHe .edge-pattern-dotted {stroke-dasharray: 2; }#mermaid-svg-Ez2PvmBUU50nYkHe .marker {fill: #333333; }#mermaid-svg-Ez2PvmBUU50nYkHe .marker.cross {stroke: #333333; }:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-Ez2PvmBUU50nYkHe {color: rgba(0, 0, 0, 0.75);font: ;}

fake_start
real_start
__prepare_jump_to_master
start_master

知道了具体步骤之后,我们再来看看每一步做了什么。

1、fake_start

这一步直接跳转到了real_start,具体意义不明。

ENTRY(fake_start)b real_start
ENDPROC(fake_start)

2、real_start

在real_start中,首先将bootloader传递给内核的启动参数保存到了boot_params数组(该数组定义在main.c里)中;然后启动了MMU单元,最后跳转到了__prepare_jump_to_master。

ENTRY(real_start)/*** 将x0~x3保存到boot_params中* 这三个参数是boot传递给内核的值*/adr_l    x9, boot_paramsstp  x0, x1, [x9]stp x2, x3, [x9, #16]/*** 对boot_params中32个字节(x0~x3)执行inval操作*/adr_l x0, boot_paramsadd  x1, x0, #0x20           // 4 x 8 bytes/*** 在MMU未打开时,需要先调用此句* 才能执行inval操作*/dmb    sybl    __inval_cache_rangeadrp x11, VA_OFFSETbl    __create_temporary_page_tables      /* x12=TTBR0, x13=TTBR1 *//*** 前面已经准备好页表。* 准备调用CPU设置代码,打开MMU.*/bl  __prepare_cpu_mmu/*** 打开MMU以后,直接跳转到这里*/ldr   x14, =__prepare_jump_to_masterb    __turn_on_cpu_mmu
ENDPROC(real_start)

3、__prepare_jump_to_master

这一步主要是为运行C语言程序准备环境,初始化堆栈之后直接跳转到了main.c中的start_master函数运行。

__prepare_jump_to_master:adr_l   x6, __bss_startadr_l    x7, __bss_stop/*** 清空BSS段的内容*/
1:  cmp x6, x7b.hs  2fstr   xzr, [x6], #8b  1b
/*** 准备启动线程的堆栈* 并跳转到C函数入口处*/
2:adr_l sp, initial_sp, x4str_l x9, device_tree_phys, x5str_l   x11, phys_addr_origin, x6mov    x29, #0/*** 是不是有点小激动??*/b   start_master
ENDPROC(__prepare_jump_to_master)

三、main.c

程序运行到main.c文件,就是由大家熟悉的C语言进行编写了,我们先来看看程序流程:

#mermaid-svg-XmCAAbRsQuWadFZN .label {font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family);fill: #333;color: #333; }#mermaid-svg-XmCAAbRsQuWadFZN .label text {fill: #333; }#mermaid-svg-XmCAAbRsQuWadFZN .node rect, #mermaid-svg-XmCAAbRsQuWadFZN .node circle, #mermaid-svg-XmCAAbRsQuWadFZN .node ellipse, #mermaid-svg-XmCAAbRsQuWadFZN .node polygon, #mermaid-svg-XmCAAbRsQuWadFZN .node path {fill: #ECECFF;stroke: #9370DB;stroke-width: 1px; }#mermaid-svg-XmCAAbRsQuWadFZN .node .label {text-align: center;fill: #333; }#mermaid-svg-XmCAAbRsQuWadFZN .node.clickable {cursor: pointer; }#mermaid-svg-XmCAAbRsQuWadFZN .arrowheadPath {fill: #333333; }#mermaid-svg-XmCAAbRsQuWadFZN .edgePath .path {stroke: #333333;stroke-width: 1.5px; }#mermaid-svg-XmCAAbRsQuWadFZN .flowchart-link {stroke: #333333;fill: none; }#mermaid-svg-XmCAAbRsQuWadFZN .edgeLabel {background-color: #e8e8e8;text-align: center; } #mermaid-svg-XmCAAbRsQuWadFZN .edgeLabel rect {opacity: 0.9; } #mermaid-svg-XmCAAbRsQuWadFZN .edgeLabel span {color: #333; }#mermaid-svg-XmCAAbRsQuWadFZN .cluster rect {fill: #ffffde;stroke: #aaaa33;stroke-width: 1px; }#mermaid-svg-XmCAAbRsQuWadFZN .cluster text {fill: #333; }#mermaid-svg-XmCAAbRsQuWadFZN div.mermaidTooltip {position: absolute;text-align: center;max-width: 200px;padding: 2px;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family);font-size: 12px;background: #ffffde;border: 1px solid #aaaa33;border-radius: 2px;pointer-events: none;z-index: 100; }#mermaid-svg-XmCAAbRsQuWadFZN .actor {stroke: #CCCCFF;fill: #ECECFF; }#mermaid-svg-XmCAAbRsQuWadFZN text.actor > tspan {fill: black;stroke: none; }#mermaid-svg-XmCAAbRsQuWadFZN .actor-line {stroke: grey; }#mermaid-svg-XmCAAbRsQuWadFZN .messageLine0 {stroke-width: 1.5;stroke-dasharray: none;stroke: #333; }#mermaid-svg-XmCAAbRsQuWadFZN .messageLine1 {stroke-width: 1.5;stroke-dasharray: 2, 2;stroke: #333; }#mermaid-svg-XmCAAbRsQuWadFZN #arrowhead path {fill: #333;stroke: #333; }#mermaid-svg-XmCAAbRsQuWadFZN .sequenceNumber {fill: white; }#mermaid-svg-XmCAAbRsQuWadFZN #sequencenumber {fill: #333; }#mermaid-svg-XmCAAbRsQuWadFZN #crosshead path {fill: #333;stroke: #333; }#mermaid-svg-XmCAAbRsQuWadFZN .messageText {fill: #333;stroke: #333; }#mermaid-svg-XmCAAbRsQuWadFZN .labelBox {stroke: #CCCCFF;fill: #ECECFF; }#mermaid-svg-XmCAAbRsQuWadFZN .labelText,#mermaid-svg-XmCAAbRsQuWadFZN .labelText > tspan {fill: black;stroke: none; }#mermaid-svg-XmCAAbRsQuWadFZN .loopText,#mermaid-svg-XmCAAbRsQuWadFZN .loopText > tspan {fill: black;stroke: none; }#mermaid-svg-XmCAAbRsQuWadFZN .loopLine {stroke-width: 2px;stroke-dasharray: 2, 2;stroke: #CCCCFF;fill: #CCCCFF; }#mermaid-svg-XmCAAbRsQuWadFZN .note {stroke: #aaaa33;fill: #fff5ad; }#mermaid-svg-XmCAAbRsQuWadFZN .noteText,#mermaid-svg-XmCAAbRsQuWadFZN .noteText > tspan {fill: black;stroke: none; }#mermaid-svg-XmCAAbRsQuWadFZN .activation0 {fill: #f4f4f4;stroke: #666; }#mermaid-svg-XmCAAbRsQuWadFZN .activation1 {fill: #f4f4f4;stroke: #666; }#mermaid-svg-XmCAAbRsQuWadFZN .activation2 {fill: #f4f4f4;stroke: #666; }#mermaid-svg-XmCAAbRsQuWadFZN .mermaid-main-font {font-family: "trebuchet ms", verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-XmCAAbRsQuWadFZN .section {stroke: none;opacity: 0.2; }#mermaid-svg-XmCAAbRsQuWadFZN .section0 {fill: rgba(102, 102, 255, 0.49); }#mermaid-svg-XmCAAbRsQuWadFZN .section2 {fill: #fff400; }#mermaid-svg-XmCAAbRsQuWadFZN .section1, #mermaid-svg-XmCAAbRsQuWadFZN .section3 {fill: white;opacity: 0.2; }#mermaid-svg-XmCAAbRsQuWadFZN .sectionTitle0 {fill: #333; }#mermaid-svg-XmCAAbRsQuWadFZN .sectionTitle1 {fill: #333; }#mermaid-svg-XmCAAbRsQuWadFZN .sectionTitle2 {fill: #333; }#mermaid-svg-XmCAAbRsQuWadFZN .sectionTitle3 {fill: #333; }#mermaid-svg-XmCAAbRsQuWadFZN .sectionTitle {text-anchor: start;font-size: 11px;text-height: 14px;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-XmCAAbRsQuWadFZN .grid .tick {stroke: lightgrey;opacity: 0.8;shape-rendering: crispEdges; } #mermaid-svg-XmCAAbRsQuWadFZN .grid .tick text {font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-XmCAAbRsQuWadFZN .grid path {stroke-width: 0; }#mermaid-svg-XmCAAbRsQuWadFZN .today {fill: none;stroke: red;stroke-width: 2px; }#mermaid-svg-XmCAAbRsQuWadFZN .task {stroke-width: 2; }#mermaid-svg-XmCAAbRsQuWadFZN .taskText {text-anchor: middle;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-XmCAAbRsQuWadFZN .taskText:not([font-size]) {font-size: 11px; }#mermaid-svg-XmCAAbRsQuWadFZN .taskTextOutsideRight {fill: black;text-anchor: start;font-size: 11px;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-XmCAAbRsQuWadFZN .taskTextOutsideLeft {fill: black;text-anchor: end;font-size: 11px; }#mermaid-svg-XmCAAbRsQuWadFZN .task.clickable {cursor: pointer; }#mermaid-svg-XmCAAbRsQuWadFZN .taskText.clickable {cursor: pointer;fill: #003163 !important;font-weight: bold; }#mermaid-svg-XmCAAbRsQuWadFZN .taskTextOutsideLeft.clickable {cursor: pointer;fill: #003163 !important;font-weight: bold; }#mermaid-svg-XmCAAbRsQuWadFZN .taskTextOutsideRight.clickable {cursor: pointer;fill: #003163 !important;font-weight: bold; }#mermaid-svg-XmCAAbRsQuWadFZN .taskText0, #mermaid-svg-XmCAAbRsQuWadFZN .taskText1, #mermaid-svg-XmCAAbRsQuWadFZN .taskText2, #mermaid-svg-XmCAAbRsQuWadFZN .taskText3 {fill: white; }#mermaid-svg-XmCAAbRsQuWadFZN .task0, #mermaid-svg-XmCAAbRsQuWadFZN .task1, #mermaid-svg-XmCAAbRsQuWadFZN .task2, #mermaid-svg-XmCAAbRsQuWadFZN .task3 {fill: #8a90dd;stroke: #534fbc; }#mermaid-svg-XmCAAbRsQuWadFZN .taskTextOutside0, #mermaid-svg-XmCAAbRsQuWadFZN .taskTextOutside2 {fill: black; }#mermaid-svg-XmCAAbRsQuWadFZN .taskTextOutside1, #mermaid-svg-XmCAAbRsQuWadFZN .taskTextOutside3 {fill: black; }#mermaid-svg-XmCAAbRsQuWadFZN .active0, #mermaid-svg-XmCAAbRsQuWadFZN .active1, #mermaid-svg-XmCAAbRsQuWadFZN .active2, #mermaid-svg-XmCAAbRsQuWadFZN .active3 {fill: #bfc7ff;stroke: #534fbc; }#mermaid-svg-XmCAAbRsQuWadFZN .activeText0, #mermaid-svg-XmCAAbRsQuWadFZN .activeText1, #mermaid-svg-XmCAAbRsQuWadFZN .activeText2, #mermaid-svg-XmCAAbRsQuWadFZN .activeText3 {fill: black !important; }#mermaid-svg-XmCAAbRsQuWadFZN .done0, #mermaid-svg-XmCAAbRsQuWadFZN .done1, #mermaid-svg-XmCAAbRsQuWadFZN .done2, #mermaid-svg-XmCAAbRsQuWadFZN .done3 {stroke: grey;fill: lightgrey;stroke-width: 2; }#mermaid-svg-XmCAAbRsQuWadFZN .doneText0, #mermaid-svg-XmCAAbRsQuWadFZN .doneText1, #mermaid-svg-XmCAAbRsQuWadFZN .doneText2, #mermaid-svg-XmCAAbRsQuWadFZN .doneText3 {fill: black !important; }#mermaid-svg-XmCAAbRsQuWadFZN .crit0, #mermaid-svg-XmCAAbRsQuWadFZN .crit1, #mermaid-svg-XmCAAbRsQuWadFZN .crit2, #mermaid-svg-XmCAAbRsQuWadFZN .crit3 {stroke: #ff8888;fill: red;stroke-width: 2; }#mermaid-svg-XmCAAbRsQuWadFZN .activeCrit0, #mermaid-svg-XmCAAbRsQuWadFZN .activeCrit1, #mermaid-svg-XmCAAbRsQuWadFZN .activeCrit2, #mermaid-svg-XmCAAbRsQuWadFZN .activeCrit3 {stroke: #ff8888;fill: #bfc7ff;stroke-width: 2; }#mermaid-svg-XmCAAbRsQuWadFZN .doneCrit0, #mermaid-svg-XmCAAbRsQuWadFZN .doneCrit1, #mermaid-svg-XmCAAbRsQuWadFZN .doneCrit2, #mermaid-svg-XmCAAbRsQuWadFZN .doneCrit3 {stroke: #ff8888;fill: lightgrey;stroke-width: 2;cursor: pointer;shape-rendering: crispEdges; }#mermaid-svg-XmCAAbRsQuWadFZN .milestone {transform: rotate(45deg) scale(0.8, 0.8); }#mermaid-svg-XmCAAbRsQuWadFZN .milestoneText {font-style: italic; }#mermaid-svg-XmCAAbRsQuWadFZN .doneCritText0, #mermaid-svg-XmCAAbRsQuWadFZN .doneCritText1, #mermaid-svg-XmCAAbRsQuWadFZN .doneCritText2, #mermaid-svg-XmCAAbRsQuWadFZN .doneCritText3 {fill: black !important; }#mermaid-svg-XmCAAbRsQuWadFZN .activeCritText0, #mermaid-svg-XmCAAbRsQuWadFZN .activeCritText1, #mermaid-svg-XmCAAbRsQuWadFZN .activeCritText2, #mermaid-svg-XmCAAbRsQuWadFZN .activeCritText3 {fill: black !important; }#mermaid-svg-XmCAAbRsQuWadFZN .titleText {text-anchor: middle;font-size: 18px;fill: black;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-XmCAAbRsQuWadFZN g.classGroup text {fill: #9370DB;stroke: none;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family);font-size: 10px; } #mermaid-svg-XmCAAbRsQuWadFZN g.classGroup text .title {font-weight: bolder; }#mermaid-svg-XmCAAbRsQuWadFZN g.clickable {cursor: pointer; }#mermaid-svg-XmCAAbRsQuWadFZN g.classGroup rect {fill: #ECECFF;stroke: #9370DB; }#mermaid-svg-XmCAAbRsQuWadFZN g.classGroup line {stroke: #9370DB;stroke-width: 1; }#mermaid-svg-XmCAAbRsQuWadFZN .classLabel .box {stroke: none;stroke-width: 0;fill: #ECECFF;opacity: 0.5; }#mermaid-svg-XmCAAbRsQuWadFZN .classLabel .label {fill: #9370DB;font-size: 10px; }#mermaid-svg-XmCAAbRsQuWadFZN .relation {stroke: #9370DB;stroke-width: 1;fill: none; }#mermaid-svg-XmCAAbRsQuWadFZN .dashed-line {stroke-dasharray: 3; }#mermaid-svg-XmCAAbRsQuWadFZN #compositionStart {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-XmCAAbRsQuWadFZN #compositionEnd {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-XmCAAbRsQuWadFZN #aggregationStart {fill: #ECECFF;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-XmCAAbRsQuWadFZN #aggregationEnd {fill: #ECECFF;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-XmCAAbRsQuWadFZN #dependencyStart {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-XmCAAbRsQuWadFZN #dependencyEnd {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-XmCAAbRsQuWadFZN #extensionStart {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-XmCAAbRsQuWadFZN #extensionEnd {fill: #9370DB;stroke: #9370DB;stroke-width: 1; }#mermaid-svg-XmCAAbRsQuWadFZN .commit-id, #mermaid-svg-XmCAAbRsQuWadFZN .commit-msg, #mermaid-svg-XmCAAbRsQuWadFZN .branch-label {fill: lightgrey;color: lightgrey;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-XmCAAbRsQuWadFZN .pieTitleText {text-anchor: middle;font-size: 25px;fill: black;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-XmCAAbRsQuWadFZN .slice {font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-XmCAAbRsQuWadFZN g.stateGroup text {fill: #9370DB;stroke: none;font-size: 10px;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-XmCAAbRsQuWadFZN g.stateGroup text {fill: #9370DB;fill: #333;stroke: none;font-size: 10px; }#mermaid-svg-XmCAAbRsQuWadFZN g.statediagram-cluster .cluster-label text {fill: #333; }#mermaid-svg-XmCAAbRsQuWadFZN g.stateGroup .state-title {font-weight: bolder;fill: black; }#mermaid-svg-XmCAAbRsQuWadFZN g.stateGroup rect {fill: #ECECFF;stroke: #9370DB; }#mermaid-svg-XmCAAbRsQuWadFZN g.stateGroup line {stroke: #9370DB;stroke-width: 1; }#mermaid-svg-XmCAAbRsQuWadFZN .transition {stroke: #9370DB;stroke-width: 1;fill: none; }#mermaid-svg-XmCAAbRsQuWadFZN .stateGroup .composit {fill: white;border-bottom: 1px; }#mermaid-svg-XmCAAbRsQuWadFZN .stateGroup .alt-composit {fill: #e0e0e0;border-bottom: 1px; }#mermaid-svg-XmCAAbRsQuWadFZN .state-note {stroke: #aaaa33;fill: #fff5ad; } #mermaid-svg-XmCAAbRsQuWadFZN .state-note text {fill: black;stroke: none;font-size: 10px; }#mermaid-svg-XmCAAbRsQuWadFZN .stateLabel .box {stroke: none;stroke-width: 0;fill: #ECECFF;opacity: 0.7; }#mermaid-svg-XmCAAbRsQuWadFZN .edgeLabel text {fill: #333; }#mermaid-svg-XmCAAbRsQuWadFZN .stateLabel text {fill: black;font-size: 10px;font-weight: bold;font-family: 'trebuchet ms', verdana, arial;font-family: var(--mermaid-font-family); }#mermaid-svg-XmCAAbRsQuWadFZN .node circle.state-start {fill: black;stroke: black; }#mermaid-svg-XmCAAbRsQuWadFZN .node circle.state-end {fill: black;stroke: white;stroke-width: 1.5; }#mermaid-svg-XmCAAbRsQuWadFZN #statediagram-barbEnd {fill: #9370DB; }#mermaid-svg-XmCAAbRsQuWadFZN .statediagram-cluster rect {fill: #ECECFF;stroke: #9370DB;stroke-width: 1px; }#mermaid-svg-XmCAAbRsQuWadFZN .statediagram-cluster rect.outer {rx: 5px;ry: 5px; }#mermaid-svg-XmCAAbRsQuWadFZN .statediagram-state .divider {stroke: #9370DB; }#mermaid-svg-XmCAAbRsQuWadFZN .statediagram-state .title-state {rx: 5px;ry: 5px; }#mermaid-svg-XmCAAbRsQuWadFZN .statediagram-cluster.statediagram-cluster .inner {fill: white; }#mermaid-svg-XmCAAbRsQuWadFZN .statediagram-cluster.statediagram-cluster-alt .inner {fill: #e0e0e0; }#mermaid-svg-XmCAAbRsQuWadFZN .statediagram-cluster .inner {rx: 0;ry: 0; }#mermaid-svg-XmCAAbRsQuWadFZN .statediagram-state rect.basic {rx: 5px;ry: 5px; }#mermaid-svg-XmCAAbRsQuWadFZN .statediagram-state rect.divider {stroke-dasharray: 10,10;fill: #efefef; }#mermaid-svg-XmCAAbRsQuWadFZN .note-edge {stroke-dasharray: 5; }#mermaid-svg-XmCAAbRsQuWadFZN .statediagram-note rect {fill: #fff5ad;stroke: #aaaa33;stroke-width: 1px;rx: 0;ry: 0; }:root {--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive; }#mermaid-svg-XmCAAbRsQuWadFZN .error-icon {fill: #552222; }#mermaid-svg-XmCAAbRsQuWadFZN .error-text {fill: #552222;stroke: #552222; }#mermaid-svg-XmCAAbRsQuWadFZN .edge-thickness-normal {stroke-width: 2px; }#mermaid-svg-XmCAAbRsQuWadFZN .edge-thickness-thick {stroke-width: 3.5px; }#mermaid-svg-XmCAAbRsQuWadFZN .edge-pattern-solid {stroke-dasharray: 0; }#mermaid-svg-XmCAAbRsQuWadFZN .edge-pattern-dashed {stroke-dasharray: 3; }#mermaid-svg-XmCAAbRsQuWadFZN .edge-pattern-dotted {stroke-dasharray: 2; }#mermaid-svg-XmCAAbRsQuWadFZN .marker {fill: #333333; }#mermaid-svg-XmCAAbRsQuWadFZN .marker.cross {stroke: #333333; }:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-XmCAAbRsQuWadFZN {color: rgba(0, 0, 0, 0.75);font: ;}

进程
start_master
init_in_process
init_in_process

从流程图来看main.c文件的内容好像非常少,但其实这个文件完成了主要的系统初始化工作。

1、start_master

在函数前端看到了熟悉的标记 __init,猜测这个标记的作用可能与Linux系统中的作用类似。

在函数中我们可以看到各种系统初始化的函数(init_xxx),这里就不展开讨论了,在后面具体模块的代码分析中我们再来讨论。我们可以看到 boot_state 全局变量表示当前系统的初始化状态,在状态变化为 KERN_PREPARE_RUN 之后,就进入到了 kick_rest 函数中。cpu_idle 函数作用类似于一个死循环,防止系统直接运行结束。

/*** 主核初始化*/
asmlinkage void __init start_master(void)
{boot_state = BOOTING;disable_irq();/* 为主核设置其活动掩码 */smp_mark_master();/* 体系结构特定的初始化过程 */start_arch();init_memory_early();init_vfs_early();init_sched_early();init_linear_mapping();/*** 初始化内存子系统* 自此以后,可以调用内存分配API了^_^*/init_memory();boot_state = KERN_MALLOC_READY;init_pagecache();init_virt_space();init_radix_tree();init_IRQ();init_time();init_timer();init_sched();init_console();enable_irq();boot_state = KERN_PREPARE_RUN;kick_rest();cpu_idle();//不可能运行到这里来BUG();
}

2、init_in_process

这个函数顾名思义,创建了一个新的进程继续系统初始化的操作。

static void kick_rest(void)
{create_process(init_in_process,NULL,"init_in_process",5);
}

3、init_in_process

从调用的函数名可以看出这一步主要是为运行用户的应用程序做准备,同时打开了命令行终端设备,最后将系统的控制权交给用户。

/*** 在进程上下文进行初始化工作。* 在开中断的情况下运行,此时可以睡眠。*/
static __maybe_unused int init_in_process(void *unused)
{/*** 初始化工作队列* 可睡眠的延迟任务*/init_sleep_works();init_vfs();init_file_systems();init_bus();probe_devices();init_tty();mount_file_systems();/*** 初始化lwip协议栈*/init_lwip();/*** 启动所有从核*/launch_slave();/*** 打开console设备* 将其作为默认的输出设备*/if (sys_open("/dev/console", O_RDWR, 0) < 0)printk("Warning: unable to open an initial console.\n");/*** 用于printf*/(void) sys_dup(0);(void) sys_dup(0);boot_state = KERN_RUNNING;__init_klibc();dim_sum_test();/*** 将控制权交给用户线程*/usrAppInit();return 0;
}

DIM-SUM系统的学习就从这里开始了,后续我会持续更新各个子系统的分析文章。

(目前DIM-SUM系统版本为HOTPOT,本文内容为鄙人愚见,有不足之处请大家指正,如果有意转载请标明来源:https://blog.csdn.net/wdy8841693/article/details/107937706。在这里感谢谢宝友前辈的付出,另外向大家推荐《自研操作系统:DIM-SUM设计与实现》这本书)

(三)DIM-SUM系统之系统初始化相关推荐

  1. 磁盘加密软件TrueCrypt知识大全(三)之加密非系统分区/设备

    磁盘加密软件TrueCrypt知识大全(三)之加密非系统分区/设备 1.点击创建加密卷. 2.↑选择第2个,加密非系统分区/设备.第一个是通过创建文件的方式创建加密卷,由于文件容易误删除.丢失.破坏. ...

  2. 此时无法停用连接。这个连接可能在用一个或多个不支持即插即用的协议,或者它是由其他用户或系统帐户初始化的。...

    在电脑桌面右下角结束本地连接时无法结束,并且报错"此时无法停用连接.这个连接可能在用一个或多个不支持即插即用的协议,或者它是由其他用户或系统帐户初始化的."的最新终极解决方法.如下 ...

  3. 三个用户在同一系统中同时对他们的c语言,杭州电子科技大学学生考试卷2013年操作系统试卷(2份,有答案)...

    内容简介: 杭州电子科技大学学生考试卷2013年操作系统试卷(2份,有答案) 杭州电子科技大学学生考试卷(A )卷 一.判断题(共10分,每小题1分,正确的打√,错误的打×) 1.分布式操作系统和网络 ...

  4. win7计算机组策略打不开,三个步骤解决win7系统本地组策略打不开的问题

    win7系统本地组策略编辑器窗口可以实现很多功能的操作,本地组策略是管理员为用户和计算机定义并控制程序.网络资源及操作系统行为的主要工具,但是win7系统用户发现本地组策略编辑器窗口,那么我们要如何还 ...

  5. 怎么关闭win10虚拟机服务器,如何关闭Win10自带虚拟机?三种关闭Win10专业版系统hyper-v虚拟机的方法...

    在win10专业版系统中,通常是自带有虚拟机Hyper-V,可以帮助大家实现其他系统的操作,但是很多用户并不知道要怎么开启虚拟机Hyper-V,hyper-v可以提高虚拟实现的可用性,但是如果我们使用 ...

  6. 《信号与系统》(吴京)部分课后习题答案与解析——第三章(离散LTI系统的时域分析)

    第三章(离散LTI系统的时域分析) 题 3.11 已知二阶微分方程为 d 2 y ( t ) d t 2 + 3 d y ( t )

  7. 【项目实战开发】第三章——在线生鲜商城系统

    系列文章目录 第一章--AI人机对战版五子棋游戏 第二章--在线商城系统 第三章--在线生鲜商城系统 文章目录 系列文章目录 前言 1.系统背景介绍 2. 功能需求分析 3.准备工作 3.1 用到的库 ...

  8. 《信号与系统》(吴京)部分课后习题答案与解析——第三章(连续LTI系统的时域分析)

    第三章(连续LTI系统的时域分析) 题 2.20 已知描述系统的微分方程如下: y′′′(t)+3y′′(t)+2y′(t)=0y^{'''}(t)+3 y^{''}(t)+2 y^{'}(t) = ...

  9. 三方线上美食城|基于Springboot的三方线上美食商城系统

    作者主页:编程指南针 作者简介:Java领域优质创作者.CSDN博客专家 .掘金特邀作者.多年架构师设计经验.腾讯课堂常驻讲师 主要内容:Java项目.毕业设计.简历模板.学习资料.面试题库.技术互助 ...

  10. 基于Springboot的三方线上美食商城系统

    作者主页:编程千纸鹤 作者简介:Java.前端.Pythone开发多年,做过高程,项目经理,架构师 主要内容:Java项目开发.毕业设计开发.面试技术整理.最新技术分享 收藏点赞不迷路  关注作者有好 ...

最新文章

  1. 关于CLR、CIL、CTS、CLS、CLI、BCL和FCL
  2. SSH免密码登录设置
  3. xss防御方法base64_XSS 防御方法总结
  4. wxWidgets:线程间和进程间通信
  5. RDBMS数据定时采集到HDFS
  6. 关于细分到字段的权限系统_操作系统中的细分
  7. 3.2 SE11创建数据元素
  8. 双系统安装和ros安装踩坑
  9. Python中selenium的玩法,小朋友看了都说学会了
  10. 数据结构与算法C语言版—— 数据结构的详细介绍
  11. STM32 CubeMX 串口通信
  12. 软考系统分析师考试大纲
  13. 计算机表格增加,怎样在表格中新增一行和上排一样格式的表格。
  14. HDU 6441 Find Integer 费马大定理
  15. 解决ios微信端video全屏
  16. bcc语料库下载_BCC语料库使用指南
  17. Linux正则表达式和文本处理工具(gred、awk、sed)
  18. 服装设计师和时尚达人必看的实用网站信息大全
  19. 优化华为云服务器采用Key登陆
  20. 湖仓一体技术调研(Apache Hudi、Iceberg和Delta lake对比)

热门文章

  1. 【循环数组】js循环数组的方法合集
  2. [原创]听说蔻臣士要找刘德华打广告了
  3. 计算机一级死都过不了怎么办,电脑突然卡死不动重启都没用怎么办
  4. linux设置程序自动启动
  5. 应用遍地开花的时代,区块链盈利难题该如何解决?
  6. smartforms rotate text 文字方向旋转
  7. 最新版50个 Kubernetes(k8s) 生态工具
  8. python画易烊千玺代码_因为易烊千玺的一张图片,我找来了 6 款神奇的生成器
  9. linux卸载python
  10. 使用vite创建vue项目步骤