linux内核跳转到文件系统,Uboot到Kernel到文件系统(Cortex_A9)移植详细文档
处理器:Exynos4412 Cortex_A9 四核
一: 4412 uboot 目录:
uboot基本配置编译
make xxx_config
编译结果如上图。
Uboot启动第一阶段分析:
1. cpu/arm_cortexa9/start.S
http://blog.chinaunix.net/uid-29589379-id-5568665.html
2.cpu/arm_cortexa9/u-boot.lds
http://blog.chinaunix.net/uid-29589379-id-5569651.html
cpu/arm_cortexa9/s5pc210/cpu_init.S
http://blog.chinaunix.net/uid-29589379-id-5571447.html
board/samsung/smdkc210/lowlevel_init.S
http://blog.chinaunix.net/uid-29589379-id-5571454.html
3.内存布局
http://blog.chinaunix.net/uid-29589379-id-5571499.html
4.u-boot 中的命令实现
http://blog.chinaunix.net/uid-29589379-id-5570660.html
Uboot启动第二阶段分析:
第二阶段入口地址为: start_armboot 在lib_arm/board.c 中定义。
1.lib_arm/board.c
http://blog.chinaunix.net/uid-29589379-id-5571531.html
2.u-boot 编译过程
http://blog.chinaunix.net/uid-29589379-id-5572684.html
3.NAND 闪存中启动U-BOOT
http://blog.chinaunix.net/uid-29589379-id-5573356.html
4.U-boot 给kernel 传参数和kernel 读取参数
1.u-boot 给kernel 传RAM 参数
http://blog.chinaunix.net/uid-29589379-id-5573412.html
2.kernel 读取参数
http://blog.chinaunix.net/uid-29589379-id-5573393.html
3.U-boot 中的bd 和gd
http://blog.chinaunix.net/uid-29589379-id-5573420.html
U-BOOT 源码分析及移植
1.u-boot 工程的总体结构
http://blog.chinaunix.net/uid-29589379-id-5573487.html
2.u-boot 的流程、主要的数据结构、内存分配
1.u-boot 的启动流程:
http://blog.chinaunix.net/uid-29589379-id-5573503.html
2.u-boot 主要的数据结构
http://blog.chinaunix.net/uid-29589379-id-5573522.html
3.u-boot重定位后的内存分布
http://blog.chinaunix.net/uid-29589379-id-5573529.html
uboot 引导 kernel 关键地方
上面Uboot启动第二阶段分析第4节: U-boot 给kernel 传参数和kernel 读取参数
.u-boot 给kernel 传RAM 参数
./common/cmd_bootm.c 文件中, bootm 命令对应的 do_bootm 函数,当分析 uImage 中信息发现 OS 是 Linux 时 ,
调用 ./lib_arm/bootm.c 文件中的 do_bootm_linux 函数来启动 Linux kernel 。
Kernel 读取U-boot 传递的相关参数
对于 Linux Kernel , ARM 平台启动时,先执行
arch/arm/kernel/head.S
,此文件
会调用 arch/arm/kernel/head-common.S 中的函数,并最后调用 start_kernel :
......
b start_kernel
......
init/main.c 中的 start_kernel 函数中会调用 setup_arch 函数来处理各种平台相关的动作,包括了 u-boot 传递过来参数的分析和保存:
start_kernel()
{
......
setup_arch(&command_line);
......
}
setup_arch 函数在
arch/arm/kernel/setup.c
文件中实现
二:
Kernel
启动过程详细分析
Kernel 目录如下图:
先用make menuconfig 配置内核 , 编译内核 make zImage
编译生成由uboot引导的内核镜像 make uImage
编译模块 make modules
内核启动流程1---汇编部分:
内核启动流程代码入口:
linux 内核编译连接后生成的ELF映像文件是vmlinux,从内核源代码顶层目录下的Makefile 中可以找到vmlinux的生成规则。
vmlinux : $ (vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE
顶层Makefile
http://blog.chinaunix.net/uid-29589379-id-5574552.html
其中 $(vmlinux-lds) 是连接器脚本,对于ARM平台而言,就是 arch/arm/kernel/vmlinux-lds 文件。从该脚本的可以看出,第一个被链接的段是 “.text.head“
SECTIONS
* {
* . = START;
* __init_begin = .;
*
HEAD_TEXT_SECTION
* INIT_TEXT_SECTION(PAGE_SIZE)
* INIT_DATA_SECTION(...)
* PERCPU_SECTION(CACHELINE_SIZE)
* __init_end = .;
......
}
1. $(vmlinux-lds) 是连接器脚本:
http://blog.chinaunix.net/uid-29589379-id-5574566.html
2 .text.head 段定义于 arch/arm/kernel/head.S 中,入口标号是 stext,因此可以判定,非压缩 ARM Linux 内核的入口点是 arch/arm/kernel/head.S 中的 stext。
arch/arm/kernelhead.S
http://blog.chinaunix.net/uid-29589379-id-5574569.html
3.THUMB( add r12, r10, #PROCINFO_INITFUNC ) //切换数据,最终跳转到C语言函数start_kernel()(在__switch_data结束时,调用b start_kernel)
arch/arm/kernel/head-common.S 中103行 b start_kernel.
http://blog.chinaunix.net/uid-29589379-id-5574581.html
内核启动流程2---C语言部分:
C语言部分由 start_kernel 函数开始,到第一个用户进程 init 结束,过程中调用了一系列的初始化函数对内核组件进行初始化。
其中,start_kernel , rest_init , kernel_init , init_post 等四个函数构成了整个初始化过程的主线
1.start_kernel() 定义于 init/main.c 。
http://blog.chinaunix.net/uid-29589379-id-5575333.html
start_kernel()对基本硬件,系统的结构进行初始化。最后调用rest_init()函数,该函数用于创建并启动内核线程init。
内核启动流程3.1----Busybox 的 init 进程 (纯Linux,没有Android)
Busybox 的 init 进程在 init/init.c 文件中
init/init.c
http://blog.chinaunix.net/uid-29589379-id-5575380.html
http://blog.csdn.net/conowen/article/details/7251057
init 启动详细流程
http://blog.chinaunix.net/uid-29589379-id-4592751.html
//来自
的博客
更多的驱动暂时没有。
Linux 系统完。
Android 系统启动过程分析 内核启动流程3.2----Android 文件系统 (Linux上的中间件Android)
1.Android 文件系统 ramdisk.img
http://blog.chinaunix.net/uid-29589379-id-5576460.html
2.
Android 的启动流程分析
Android从Linux系统启动有4个步骤;
(1) init进程启动
(2) Native服务启动
(3) System Server,Android服务启动
(4) Home启动
Android 移植详细分析
http://blog.chinaunix.net/uid-29589379-id-5494749.html
http://blog.csdn.net/luoshengyang/article/details/8923485 //老罗的Android 博客
init进程启动
system/core/init/init.c
kernel会启动第一个用户级别的进程:init
.
init始终是第一个进程。
PS:可以通过:ps | grep init命令来查看其Pid为1。
import_kernel_cmdline(0, import_kernel_nv);
//获取内核关于文件系统的参数,通过这个参数来启动Android。 linux和Android 的接口
http://blog.chinaunix.net/uid-29589379-id-5577496.html
Linux驱动开发学习的一些必要步骤
http://blog.csdn.net/luobin1984/article/details/7945620
linux内核跳转到文件系统,Uboot到Kernel到文件系统(Cortex_A9)移植详细文档相关推荐
- 在Linux 安装Python3.5.6详细文档!!!!
在Linux 安装Python3.5.6详细文档!!!! 1.安装相关依赖库(工具包) yum install gcc patch libffi-devel python-devel zlib-de ...
- Linux内核设计与实现笔记(一) 虚拟文件系统、块I/O层
虚拟文件系统 系统内所有文件系统不但依赖VFS共存,而且也依靠VFS系统协同工作. VFS使得用户可以直接使用open/read/write等系统调用,而无需考虑具体文件系统和实际物理介质. VFS中 ...
- uboot启动Linux内核(一):uboot启动流程
1. uboot介绍: uboot是bootloader的一种,是Linux内核的引导启动程序.会初始化嵌入式平台上的一些外设(比如:ddr等),把Linux内核镜像从flash中加载到内存,在 ...
- 【Linux 内核】Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )
文章目录 一.进程调度 二.内存管理 三.中断管理 四.设备管理 五.文件系统 一.进程调度 进程调度 : 进程 是 系统中 进行 资源分配 的 基本单位 ; 每个进程 在 运行时 , 都 感觉自己占 ...
- uboot加载linux内核加载那些内容,uBoot和Linux内核中涉及到的几个地址参数的理解...
uBoot和Linux内核中涉及到的几个地址参数的理解 ************************************************* arch/arm/Makefile //内核 ...
- linux内核态加速文件读取,学习在kernel态下使用NEON对算法进行加速的方法
本文跟着小编一起来学习在linux kernel态下如何使用NEON对算法进行加速的技巧,内容通过图文实例给大家做了详细分析,一起来看下. ARM处理器从cortex系列开始集成NEON处理单元,该单 ...
- 在Linux内核层面集成图形界面,技德操作系统(Jide OS)详细介绍
技德操作系统(Jide OS)是一款采用Linux内核的国产操作系统,兼容性好且功能强大,为用户提供个人电脑和移动设备良好体验的国产研发操作系统.它实现了跨平台的CPU指令集兼容.跨平台应用兼容.跨平 ...
- linux 轻量化图形界面,YOXIOS 入门教程--基于Linux的 轻量化GUI图形系统和硬件平台(41页)-原创力文档...
YOXIOS --基于 Linux 的轻量化 GUI图形系统和硬件平台 YOXIOS 入门教程 基于 Linux 的 轻量化 GUI图形系统和硬件平台 (V1.0 2020-05) 提示:阅读此文档需 ...
- 麒麟Linux关闭telnet,银河麒麟系统管理员使用手册(30页)-原创力文档
银河麒麟系统管理员使用手册 目 录 一. 管理员使用 3 1. MATE 终端 3 1.1 打开MATE 终端 3 1.2 终端切换root 管理员 3 2. 网络设置 4 3. 软件安装 5 4. ...
最新文章
- “元宇宙”概念引发AR/VR新一轮投资潮,去年Q4融资总额达120亿,超过此前2年总和...
- 路由过滤之 Route-map Distribute-list
- 分布式锁双重防死锁演进
- JAVAFX-1 开发应用
- 怎样与用户有效地沟通以获取用户的真实需求?
- 消费者原理分析-RocketMQ知识体系4
- Using the Hardware Scaler for Performance and Efficiency
- Class类的使用和背后实现的原理
- 条形码控件TBarCode SDK系列教程一(TBarCode OCX篇)
- 提供linux下的新世纪五笔的码表和字根口诀,用于ibus。
- BUUCTF 每日打卡 2021-5-6
- Chrome源码剖析——多线程模型、进程通信、进程模型
- Excel的图表:组成元素、图表类型与用途、图表可视化大全
- Python--数据库
- 在线教育企业如何精细化获客?
- java魔塔_基于java的魔塔游戏的设计与实现论文.docx
- matlab拉普拉斯变换锐化,图像的拉普拉斯锐化方法及讨论
- 【宝塔Linux面板】在阿里云服务器安装
- java验证电子邮件_用Java验证电子邮件
- 【信奥赛一本通】 1376:信使(msner)(详细代码)
热门文章
- frontpage编辑html,怎样用FrontPage软件编辑HTML帖子 | 音画代码学堂 - 中国音画家园 - Po...****...
- c语言访问数据库 不用odbc,急问ODBC访问数据库问题
- java嵌入groovy脚本_Java封装groovy脚本引擎并支持脚本包含(include)功能
- iframe 覆盖父页面_一次iframe子页面与父页面的通信
- 和csm_CSM媒介研究首发短视频用户价值研究报告
- python 判断div 之间的内容是否为空_python实现单向链表数据结构及其基本方法
- pfile文件怎么恢复格式_回收站清空的文件怎么恢复?值得收藏的恢复方法
- c++怎么保存汉字_“的汉字 ”写作练习
- 电脑连接电视方法详解_电脑如何连网?——校园宽带的连接方法(详解版)
- 事物 @Transactional