内核启动流程—走马观花

汇编阶段:

ensure svc mode
and irqs disabled
@76确保cpu运行与svc模式,中断关闭

get processor id
@78获取cpu id

r5=procinfo r9=cpuid
invalid processor (r5=0)?
@79 和__proc_info lists 里比较,不能找到id就 r5 = 0

bl __vet_atags
@97 验证内核标记列表,r2指向内核标记列表是否4字节对齐,是否以ATAG_CORE开始

bl __create_page_tables
创建临时页表

ldr r13, =__mmap_switched
把__mmap_switched地址放到r13,在mmu开启后调用他搬运数据

1: b __enable_mmu –> __turn_mmu_on
开启mmu

mov r3, r3
mov r3, r13
mov pc, r3

执行数据搬运,清除BSS段调用start_kernel

c语言阶段:
init/man.c

smp_setup_processor_id();
用于处理对称多处理器

lockdep_init();
debug_objects_early_init();
初始化锁的状态跟踪模块

boot_init_stack_canary();
cgroup_init_early();
控制组早期初始化,控制组会分配不同进程的资源

local_irq_disable();
early_boot_irqs_disabled = true;
关闭中断

tick_init();
初始化时钟事件管理

boot_cpu_init();
激活第一个处理器,设置当前的cpu为可用状态

page_address_init();
初始化高端内存的映射表

printk(KERN_NOTICE “%s”, linux_banner);
打印版本信息,编译主机

setup_arch(&command_line);
对体系构架进行初始化,获取uboot传入的参数

setup_command_line(command_line);
保存传入的参数

setup_nr_cpu_ids();
给nr_cpu_ids赋值,表示可能的cpu数量

smp_prepare_boot_cpu
smp引导(多cpu)

build_all_zonelists(NULL);
page_alloc_init();
初始化所有内存管理节点,设置内存页分配通知器

printk(KERN_NOTICE “Kernel command line: %s\n”, boot_command_line); //499
parse_early_param();
parse_args
打印传入的参数并解析

sort_main_extable();
排序异常表

trap_init();
对异常进行初始化

mm_init();
开启内存配置器

sched_init();
设置调度程序

idr_init_cache();
创建 IDR机制的高速缓存对象

rcu_init();
读-复制-跟新机制初始化

early_irq_init();
init_IRQ();

init_timers();
初始化引导cpuu的定时器相关的数据结构注册定时器,设置软中断

hrtimers_init();
初始化高精度定时器

softirq_init();
软中断初始化

timekeeping_init();
初始化系统时钟计时器 资源和共同的变量

profile_init();
分配 内核性能统计保存变量的内存

console_init();
串口初始化

lockdep_info();
打印锁的依赖信息(默认关闭)

locking_selftest();@570
当irq 被开启时,要测试 锁 是否正常

setup_per_cpu_pageset();
分配并设置每个CPU页面集

pidmap_init();

cred_init();
初始化凭证

fork_init(totalram_pages);
“fork()” 是用來產生 child process 的 system call,當 parent process 想要執行外部程式時,會先 fork child process,接著 child process 再利用 exec system call 自己的空間取代為外部程式。

vfs_caches_init(totalram_pages);
初始化虚拟文件系统的缓存

signals_init();

page_writeback_init();
文件系统可能会需要page-writeback

cpuset_init();
初始化CPU集合的内存分配变量,限制进程允许分配的内存大小

cpuset_init(); @614
初始化top_cpuset和CPUSET内部文件系统

taskstats_init_early();
初始化任务状态相关的缓存、队列和信号量

delayacct_init();
初始化任务延迟机制

acpi_early_init();
初始化ACPI电源管理

ftrace_init();
内核跟踪模块

rest_init();
创建并运行内核初始化线程init

后续我会更新reset_init();里的流程,和板级初始化函数的调用流程

转于http://lornyin.top/?p=104

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

空气中超声衰减

空气中超声衰减是非常厉害的,这导致在空气耦合声换能器的制作或是声传感器的设计是极具挑战的,因此对超声衰减做一个细致的分析是很有必要的。 具体计算根据经验公式如下进行计算 结果如下: Figure 1 超声衰减系数与频率关系图 Figure 2 超声…

嵌入式linux系统和嵌入式android系统的区别和联系

目录区别与联系嵌入式系统在物联网行业中的应用物联网嵌入式系统的特征区别与联系 这个问题很多人问,尤其是初入嵌入式的菜鸟。其实大家都认为android是java,已经不是linux,殊不知android就是靠着linux 才发展起来的,现在来说说有…

java生产者消费者问题代码分析

作者要的是一个生产者生成,接着必须有一个消费者消费,那这不是需要单线程吗?或者使用1个大小的阻塞队列。所以只谈论问题本身,不谈论好不好。 具体代码: Java代码 import java.util.concurrent.locks.Condition; i…

vb冒泡排序法流程图_VB算法-冒泡排序教案

1冒泡排序教学设计班级:高一一班授课教师:袁海军一、教案背景模块:算法与程序设计班级:高一(1)班课时数:1课时所用教材:华师大版《算法与程序设计》教师:袁海军二、教学设计1.教学目标知识与技能…

linux板级初始化

最近拿到了明远智睿 的EK314开发板,以前主要用2440,眼界过于狭隘,借此机会练习下。 http://lornyin.top/?p106 原文地址 首先看看它的板级文件 /arch/arm/mach-mx6/board-myimx6ek314.c 在他的末尾指定了map_io、init_irq、init_machine…

可以ping通 但ssh: connect to host 192.168.0.2 port 22: Connection refused

目录问题描述原因解决问题描述 自己在树莓派端通过SCP指令给电脑上ubuntu传输文件发现提示:ssh: connect to host 192.168.0.2 port 22: Connection refused,并且发现树莓派端是可以ping通ubuntu的。 原因 通过网上查新找到原因: SSH分客…

动态规划初步--数字三角形

数字三角形是一个由非负数组成的三角形,第n行有n个数,形如: 1 2 3 4 5 6 除最下行之外,每一行的左下和右下各有一个数,从第一行开始,向下,左或者右走一格,直到走到最后一行&#…

光影精灵5完全拆解全程图解_惠普光影精灵5值得买吗?惠普光影精灵5绿刃版游戏本深度拆解评测...

三星8GB DDR4 2666MHz内存还有一个小配件,虽然小,但绝对是最常用的,这就是无线模块。这款笔记本搭载的是Intel 9560NGW无线网卡,支持2.4GHz / 5GHz双频,最大传输速度可达1.73Gbps,并且集成蓝牙5.0版本&…

linux嵌入式贪吃蛇

目标:用游戏手柄控制贪吃蛇 硬件平台:imax6q 版本信息: arm-none-linux-gnueabi-gcc-4.8.3、 qt5.7.1、linux3.0.1 一、交叉编译tslib1.4 由于 imax6q是 armv7-a 构架,所以以后的编译我们都应编译出 armv7 平台的文件 编译参…

2.联邦模式配置---扩容,负载均衡

原理图 两个集群---目的:扩容 HA联邦模式解决了单纯HA模式的性能瓶颈(主要指Namenode、ResourceManager),将整个HA集群划分为两个以上的集群,不同的集群之间通过Federation进行连接,使得HA集群拥有了横向扩…

树莓派交叉编译(PS交叉编译链下载安装、配置永久环境变量、带WiringPi库交叉编译、软链接)

目录一、本章概述二、交叉编译工具链的下载安装下载安装交叉编译链临时有效交叉编译链永久有效三、交叉编译的使用对比gcc与armgccPC端交叉编译发送到树莓派运行四、带WiringPi库的交叉编译如何处理复制树莓派上的WiringPi库到主机软硬链接交叉编译一、本章概述 下面将详细介绍…

海量数据处理分析(部分)

2019独角兽企业重金招聘Python工程师标准>>> 1. 海量数据处理分析 原文地址: http://blog.csdn.net/DaiZiLiang/archive/2006/12/06/1432193.aspx 笔者在实际工作中,有幸接触到海量的数据处理问题,对其进行处理是一项艰巨而复…

android p wifi一直在扫描_在Android上的每次WiFi扫描之间我应该使用什么时间间隔?...

我需要定期执行Wifi扫描.当时间间隔设置为1-2秒时,我遇到了问题.好像我没有得到任何ScanResult.是否有最短的时间设置,以便WifiManager能够执行成功的WiFi扫描?这是代码.我正在使用服务进行Wifi扫描:public class WifiScanning extends Service{private …

uboot2015–启动流程分析 imx6q

最近项目原因,要在uboot中增加内核验校和内核损坏修复功能,所以需要回头看看uboot。这次选择了uboot2015来进行分析 uboot是明远睿智提供的。 下载地址 链接:https://pan.baidu.com/s/13SuRii3WTqvFTNIsSS9GAg 密码:65zz 环境&…

树莓派内核开发准备(内核源码获取、启动过程、源码目录树)

目录1.交叉编译工具的安装2.内核源码获取3.嵌入式设备带操作系统的启动过程扫盲4.Linux内核源码树扫盲1.内核源码简介2.Linux内核源代码目录树结构tree指令查看内核源码目录树1.交叉编译工具的安装 参照我之前的笔记 2.内核源码获取 下载哪个版本取决于树莓派的版本&#xf…

linux修改文件句柄数生效_修改Linux的open files参数是,立即生效,无需重启

通过命令ulimit -a查看的open files参数的修改:core file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (…

柯乐义猜数字游戏

游戏规则:柯乐义请您玩猜数字游戏。后台已经随机生成了一个100到999之间的数字。如果您能在10次之内猜出这个数字,则游戏成功,否则失败。请开始吧。 SilverLight 猜数字游戏:http://keleyi.com/keleyi/phtml/silverlight/ 一次猜数…

fsdisk 分区

芯片主控:imx6q http://lornyin.top/?p545 昨天在做一个linux嵌入式项目时要修改板子的分区,查看了ucl2.xml (mfgtool)文件后,找到了他的分区脚本 #!/bin/sh# partition size in MB BOOT_ROM_SIZE10# call sfdisk …

树莓派Linux内核源码配置、编译、挂载(boot/kernal/根文件)、开启新内核

目录一、树莓派Linux源码配置(适合树莓派)总体概述配置的三种方式1.照搬厂家的配置(使用这种方式)2.参考厂家的配置(感受一下)3.完全自主配置(需要一定工作经验)二、树莓派Linux内核编译三、树莓派挂载新内…

xshell连接linux出现乱码

今天用Xshell连接linux,查看一个脚本,里面有中文写的注解,出现了乱码,所以记录一下,以便下次用到,也可以帮助遇到同样问题的小伙伴。 以下是乱码的截图: 我们可以照着下面的方式更改编码&#x…