【linux】linux启动流程
欢迎转载,转载时请保留作者信息,谢谢。
博客园地址:http://www.cnblogs.com/embedded-tzp
Csdn博客地址:http://blog.csdn.net/xiayulewa
墨迹这么久,总算开始内核源代码分析了。
阶段1
阶段1大部分为汇编, 以程序启动到执行到start_kernel函数为第一阶段。 大概流程如下:
变量与文件的对应关系。
THUMB: src\arch\arm\include\asm\unified.h
head.S的很多定义在src\arch\arm\kernel\head-common.S
struct proc_info_list :src\arch\arm\include\asm\procinfo.h
PROC_INFO_SZ : build\include\generated\asm-offsets.h:
proc.info.init : src\arch\arm\mm\proc-arm920.S
PAGE_OFFSET:src\arch\arm\include\asm\memory.h = CONFIG_PAGE_OFFSET = 0xC0000000
寻找入口
首先从从程序入口处开始分析,linux内核下文件多不胜数,那么从哪里开始找到程序入口地址呢?
mov r0, #1 @ 假设在地址20
__lookup_processor_type_data: .long @ 假设在地址24
如上,adr是将当前PC值加一个偏移,得到目标地址,假如程序运行到上述第一条语句时:PC = 16, 因为 __lookup_processor_type_data与其相差8个字节的偏移,所以得到r3 = PC + 8 = 24; 而因为此时程序是运行的,PC代表的就是物理地址,所以adr获取的也就是物理地址了(严格来说这是不对的,因为PC是预取的,但是为了说明问题,不考虑预取功能,不然越说越复杂了)
linux mmu未开启时是如何将虚拟地址转换为物理地址的
此处对linux的adr计算真实物理地址讨论下,挺有意思的。Arm本来有三种地址,而此时未开启mmu,有MVA = VA(虚拟地址) = PA(物理地址).
要讨论这,就不得不提下内存模型。内存有两个基本属性,地址 + 内容。
围绕地址+内容,衍生了很多东西。包括c中的函数名,经汇编后对应的是汇编语言中的标号,即函数名是地址,这就是为什么存在函数指针一说, 如下表:
编译链接后各变量有其固定的地址,即虚拟地址,运行时变量也有自己的地址,两变量不一定一致。见下图,图中的地址是假定的,实际不一定如此:
上图两个内存里的内容必然是一致的,唯一的差别就在于地址。当运行到
mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4
mcr p15, 0, r0, c7, c10, 4 @ drain write buffer on v4
#ifdef CONFIG_MMU
mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4
#endif
adr r5, arm920_crval
ldmia r5, {r5, r6}
mrc p15, 0, r0, c1, c0 @ get control register v4
bic r0, r0, r5
orr r0, r0, r6
mov pc, lr
.size __arm920_setup, . - __arm920_setup
综上: ARM(add pc, r10,#PROCINFO_INITFUNC):是 执行函数 __arm920_setup, 该函数是对mmu作一些初始化。
__create_page_tables:虚拟地址映射页表是如何创建的
此处省略,在文章【linux】mm内存管理 http://blog.csdn.net/xiayulewa/article/details/45193741 有关于mmu比较详细的分析。
进入阶段2:
阶段2
src\init\main.c: asmlinkage void __init start_kernel(void)
start_kernel: 第二阶段启动入口,开始熟悉的c语言之旅。
src\include\linux\init.h: __init
第二阶段内容太多,不在这里具体写,后面结合具体例子再说,比如说明sysfs文件系统时,会有
/sys目录建立: start_kernel→rest_init→kernel_init→kernel_init_freeable→do_basic_setup→ driver_init的流程说明。
从start_kernel到 shell的流程:start_kernel→rest_init→kernel_init→run_init_process
【linux】linux启动流程的更多相关文章
- linux --> Linux 的启动流程
Linux 的启动流程 操作系统接管硬件以后发生的事情,也就是操作系统的启动流程. 因为在BIOS阶段,计算机的行为基本上被写死了,程序员可以做的事情并不多:但一旦进入操作系统,程序员几乎可以定制所有 ...
- Linux内核启动流程与模块机制
本文旨在简单的介绍一下Linux的启动流程与模块机制: Linux启动的C入口位于/Linux.2.6.22.6/init/main.c::start_kernel() 下图简要的描述了一下内核初始化 ...
- linux 内核启动流程
Linux内核启动流程详细分析: http://www.linuxidc.com/Linux/2014-10/108034.htm ARM Linux内核启动过程: http://blog.csdn. ...
- 【内核】linux内核启动流程详细分析
Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...
- I.MX6 Linux Qt 启动流程跟踪
/************************************************************************** * I.MX6 Linux Qt 启动流程跟踪 ...
- 【内核】linux内核启动流程详细分析【转】
转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...
- shell脚本编程学习笔记(二)linux服务器启动流程
一.linux服务器启动流程 1.bios找到磁盘上的mbr主引导扇区 2.进入grub洁面选择相应的启动内核 3.读取kernel内核文件-/boot/vmlinuz-* 4.读取init的镜像文件 ...
- Linux 的启动流程(转)
原文链接:http://blog.jobbole.com/46078/ 半年前,我写了<计算机是如何启动的?>,探讨BIOS和主引导记录的作用. 那篇文章不涉及操作系统,只与主板的板载程序 ...
- linux内核启动流程[转]
启动流程一览 既然启动是很严肃的一件事,那我们就来了解一下整个启动的过程吧! 好让大家比较容易发现启动过程里面可能会发生问题的地方,以及出现问题后的解决之道! 不过,由於启动的过程中,那个启动管理程序 ...
- 【转】Linux 的启动流程
半年前,我写了<计算机是如何启动的?>,探讨BIOS和主引导记录的作用. 那篇文章不涉及操作系统,只与主板的板载程序有关.今天,我想接着往下写,探讨操作系统接管硬件以后发生的事情,也就是操 ...
随机推荐
- easui tree载入时自动展开无子节点的节点
利用loadFilter对后台返回的原始数据进行过滤处理,将数据中的state字段修改相应的值,若无子节点,则改成open,若有子节点,则改成closed. 由于一个node属性只有下面几项内容,因此 ...
- js获取控件位置
//获取坐标位置 function getpos(e) { var t=e.offsetTop; var l=e.offsetLeft; var height=e.offsetHeight; whil ...
- android动画效果演示
第一种:TranslateAnimation 动画效果演示: public void move(View view) { // 传统动画效果 TranslateAnimation animation ...
- 【Eclipse】修改项目访问名称
Properties --> Web Project Settings --> Context root --> 输入想要用的名称(默认是项目名)
- Cocoapods安装步骤
Cocoapods安装步骤 1.升级Ruby环境 终端输⼊入:$ gem update --system 此时会出现 ERROR: While executing gem ... (Gem::File ...
- [HDU 2553]--N皇后问题(回溯)/N皇后问题的分析
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553 N皇后问题 Time Limit: 2000/1000 MS (Java/Others) ...
- NHibernate变的简单
前言 这篇文章出自于我尝试学习使用Nhiberbnate的挫败感.我发现好像Nhibernate全部的介绍材料不是很模糊就是太详细.我所需要的就是一个简单直接的教程,能让我尽快对NHibernate熟 ...
- USACO Barn Repair 【贪心算法】
这到题目的题意不太好理解= = 看来还是英语太弱了 实际上题目给了你M, S, C 分别代表最多不超过M 块木板, S代表牛棚总数,C代表接下来有C个牛所在牛棚的标号 然后求的是如何安排方案,可以使得 ...
- 【集训笔记】【大数模板】特殊的数 【Catalan数】【HDOJ1133【HDOJ1134【HDOJ1130
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3324 http://blog.csdn.net/xymscau/artic ...
- (Problem 2)Even Fibonacci numbers
Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting w ...