uboot引导kernel - 3 -uboot给内核传参详解
uboot中执行theKernel函数后,kernel正式启动。如下函数,我们发现有3个参数。
1. 参数 0;
2. 参数machid;
如下code 中获取machid, gd是个全局变量.
2.1 bi_arch_number是board_info中的一个元素,含义是:开发板的机器码。所谓机器码就是uboot给这个开发板定义的一个唯一编号。
2.2 机器码的主要作用就是在uboot和linux内核之间进行比对和适配. uboot中配置的这个机器码,会作为uboot给linux内核的传参的一部分传给linux内核,内核启动过程中会比对这个接收到的机器码,和自己本身的机器码相对比,如果相等就启动,如果不相等就不启动.
2.3 linux做了个设置:给每个开发板做个唯一编号(机器码),然后在uboot、linux内核中都有一个软件维护的机器码编号。然后开发板、uboot、linux三者去比对机器码,如果机器码对上了就启动,否则就不启动(因为软件认为我和这个硬件不适配)。
3. 参数 bd->bi_boot_params;
3.1 即gd->bd->bi_boot_params
bd_info中另一个主要元素,bi_boot_params表示uboot给linux kernel启动时的传参的参数所在DDR内存地址。
根据以上code可以知道在下x210中gd->bd->bi_boot_params等于 0x3000 0100, 这个内存地址就被分配用来做内核传参了.
uboot给linux内核传参的时候是这么传的:uboot事先将准备好的传参(字符串,就是bootargs)放在内存的一个地址处(就是bi_boot_params),然后uboot就启动了内核(uboot在启动内核时真正是通过寄存器r0 r1 r2来直接传递参数的,其中有一个寄存器中就是bi_boot_params)。内核启动后从寄存器r2中读取bi_boot_params就知道了uboot给我传递的参数到底在内存的哪里。然后自己去内存的那个地方去找bootargs。
3.2 传递参数详解:a list of tagged entries
tag list方式传参,
- struct tag,tag是一个数据结构,在uboot和linux kernel中都有定义tag数据机构,而且定义是一样的。
- tag_header中有这个tag的size和类型编码,kernel拿到一个tag后先分析tag_header得到tag的类型和大小,然后将tag中剩余部分当作一个tag_xxx来处理。
- tag_start与tag_end。kernel接收到的传参是若干个tag构成的,这些tag由tag_start起始,到tag_end结束.
bootargs举例:
bootargs=console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3
console=ttySAC2,115200 控制台使用串口2,波特率115200.
root=/dev/mmcblk0p2 rw 根文件系统在SD卡端口0设备(iNand)第2分区,根文件系统是可读可写的
init=/linuxrc linux的进程1(init进程)的路径
rootfstype=ext3 根文件系统的类型是ext3
内存配置举例:
如何在uboot运行中得知uboot的DDR配置信息?uboot中有一个命令叫bdinfo,这个命令可以打印出gd->bd中记录的所有硬件相关的全局变量的值,因此可以得知DDR的配置信息。
DRAM bank = 0x00000000
-> start = 0x30000000
-> size = 0x10000000
DRAM bank = 0x00000001
-> start = 0x40000000
-> size = 0x10000000
4. 根文件系统(root=)和进程1(init=)
4.1 根文件系统的作用:
根文件系统提供根目录。
进程1存放在根文件系统中
内核启动最后会去装载根文件系统。
总结:根文件系统为操作系统启动提供了很多必备的资源:根目录、进程1. 根文件系统在bootargs 中用root= 来指定根文件系统在哪里的。一般格式是:root=/dev/xxx
(如果是nandflash,则root=/dev/mtdblock2,
如果是inand/sd, 则root=/dev/mmcblk0p2,表示mmc0的第2个分区)
**遗留问题: 存储介质中的分区表uboot怎么告诉kernel呢 **?
如果是nfs的rootfs,则root=/dev/nfs (网络文件系统)
一套linux体系,只有内核本身是不能工作的,必须要rootfs(上的etc目录下的配置文件、/bin /sbin等目录下的shell命令,还有/lib目录下的库文件等•••)相配合才能工作. 几乎可以认为:发行版=内核+rootfs
4.2 进程1-liunxrc
/linuxrc是一个可执行的应用程序
/linuxrc执行时引出用户界面, 进程1(init进程,也就是/linuxrc)是其他所有应用程序进程的祖宗进程
/linuxrc负责系统启动后的配置(/etc)
/linuxrc在嵌入式linux中一般就是busybox
busybox这个程序开发出来就是为了在嵌入式环境下构建rootfs使用的,也就是说他就是专门开发的init进程应用程序. busybox为当前系统提供了一整套的shell命令程序集。譬如vi、cd、mkdir、ls等.
相关文章:

hdu 1166 敌兵布阵(树状数组)
题意:区间和 思路:树状数组 #include<iostream> #include<stdio.h> #include<string.h> using namespace std;int n,c[50005];int lowbit(int i){return i&-i; }void update(int i,int val){//更新函数while(i<n){//注意这个n的…

java jdbc 表存在_使用JDBC查询是否存在某表或视图,按月动态生成表
查询数据库是否有某表的存在,主要用的就是Connection对象对元数据的操作,代码很简单,贴出来大家参考。/*** 查询数据库是否有某表* param cnn* param tableName* return* throws Exception*/SuppressWarnings("unchecked")public b…

linux串口驱动分析
linux串口驱动分析硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作。UART 使用系统时钟能够支持最高 115.2Kbps 的波特…
计算TD-LTE DL 峰值速率的工具和相关参数
前一段时间测试DT 基站,需要配置TDD LTE cell 的UDC、TM模式来验证不同组合下的下行峰值速率,趁此机会我用excel写了一个计算下行峰值速率的工具。工具上传至我的github: https://github.com/greenricky/tdlte_dl_rate 计算峰值速率的常用办法是参考36.2…

java配置中心开源项目_配置中心搭建(spring-cloud-config-server)
1.github创建配置库2.配置服务端①创建项目②导入jarorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testorg.springframework.cloudspring-cloud-starter-netflix-eureka-clientorg.springframework.cloudspring-cloud-config-…

detection in video and image
video中的detection,背景更加复杂,目标更加不聚焦,同时由于图片分辨率低于图像,因此更加难做。 image中的Detection,背景相对简单些,目标更加聚焦,同时图片分辨率高,因此更加容易些。 转载于:ht…

烂泥:U盘安装Centos6.5
本文首发于烂泥行天下。使用U盘安装Centos6.5,需要以下几个步骤:1、 制作U盘linux系统2、 设置服务器BIOS3、 安装Centos,注意引导分区的安装首先要把U盘做成linux启动盘。网上有关这方面的软件比较多,在此我使用的是WinSetupFrom…

http status 汇总
http status 汇总 常见HTTP状态码 200 OK301 Moved Permanently302 Found304 Not Modified307 Temporary Redirect400 Bad Request401 Unauthorized403 Forbidden404 Not Found410 Gone500 Internal Server Error501 Not Implemented100 Continue 初始的请求已经接受…

hdu 4278 2012天津赛区网络赛 数学 *
8进制转为10进制 1 #include<cstdio>2 #include<iostream>3 #include<algorithm>4 #include<cstring>5 #include<cmath>6 #include<queue>7 #include<map>8 using namespace std;9 #define MOD 1000000007 10 const int INF0x3f3f3f…
slub object 内存布局
我在 https://blog.csdn.net/wowricky/article/details/83218126 介绍了一种内存池,它的实现类似于linux 中打开slub_debug (1. make menuconfig: Kenel hacking -> Memory Debugging, 2. comand line中传入slub_debugPZU) 时slub 对象池。 首先我们先看一下slub…

java wait abc_java----wait/notify
解释wait/notify必须配合synchronized使用democlass NotifyStop2 {private final Object lock new Object();public void add(String s) throws InterruptedException {Thread.sleep(1000);synchronized (lock) {System.out.println("add notify qian");//唤醒其他线…

hdu-1166敌兵布阵
这个题目就是考察线段树的基本用法,我自己打了代码,其实就是照模板来的,大概思想已经弄懂了。用c不能过,说我超时,就改成c的读入读出,这坑爹的过了。我最爱的c,你肿么了。。。 这是ac的代码&…

Android数据存储(三)——SQLite
如果需要一个更加健壮的数据存储机制,则需要使用一个关系型数据库,在Android上,则为SQLlite。 SQLite的特点:轻量级、嵌入式的、关系型数据库。可移植性好,易使用,小,高效且可靠,与使…
3GPP组织和协议概述
3GPP组织概述 1. TSG/WG 3GPP是以工作组开展工作的,目前有3个大的技术规范组:RAN, SA, CT, 这一级别的工作组英语写为 TSG (Technical Specification Group)。每个TSG下面又分了很多工作组(WG: work group). 详见下表: https://www.3gpp.or…

mysql被拖垮_说几个拖垮系统的小细节!
本文首发于个人微信公众号《andyqian》,期待你的关注!前言有好几天没有更新了,期间确实比较忙些,以至于周末也没休息。在这期间,感触还是蛮深的。现在碎片化的想法等整理好后,再以文章的形式分享出来。今天要说的是另外…

为 区域添加 Tag
tagsinput selectTag 转载于:https://www.cnblogs.com/yunqianduan/p/4740902.html

android中文字中间有超链接的实现方法
1.XML里写: <resources> <string name"ACCOUNT_REGISTER_PROMPT_AGREEMENT">点击注册,表示同意<a href"http://www.ouragreement.com">服务协议</a></string> </resources> <TextView …

4.4 类型转换
from http://www.learncpp.com/cpp-tutorial/44-type-conversion-and-casting/ 类型隐式转换 类型隐式转换的步骤如下所示: Long double (highest)DoubleFloatUnsigned long intLong intUnsigned intInt (lowest) 最底层是int而不是short或是char,是因为…

LFSR 和 m序列
翻译自:sharetechnote: LFSR LFSR Linear Feedback Shift Register - 线性反馈移位寄存器 LFSR 是一种移位寄存器电路,其中两个或多个中间步骤的输出线性组合并反馈到输入值,这就是为什么它被称为线性反馈移位寄存器的原因。 该电路具有以…

python合并k个有序链表_Leetcode合并K个升序链表(Python版本),LeetCode,python
一、描述给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下&…

Qt界面风格设置
每个widget都可以设置风格setStyle(QStyle style)对QApplication设置QStyle即对所有QApplication::setStyle(QStyleFactory::create("Fusion"));其他widget如过没有被设置QStyle,默认使用QApplication的QStyle主要可重写接口绘制复杂控件virtual void …

树莓派练习程序(蜂鸣器)
蜂鸣器模块如下图: 树莓派的引脚如下图: 我们将Vcc引脚连接物理接口1(注意这里需要用3.3v),I/O引脚连接物理接口40,GND引脚连接物理接口39。 实物连接如下图: 编程使用WiringPi库,使…

Gold Code,Gold Sequence
Gold Code Gold Code是以Robert Gold的名字命名的。它是一组特殊的二进制随机(伪随机)序列,其中成员序列之间的相关性很小。由于这种特性(较小的相关性),它被广泛地用作各种无线通信系统的扰码。 我们可以非常简单地利用 m序列 来生成Gold Code: 选择两…

【PHP高效搜索专题(1)】sphinxCoreseek的介绍与安装
我们已经知道mysql中带有"%keyword%"条件的sql是不走索引的,而不走索引的sql在大数据量大并发量的时候,不仅效率极慢还很有可能让数据库崩溃.那我们如何通过某些关键字来搜索我们想要的文章呢? 虽然mysql的MYISAM提供全文索引,但是只支持中文,并且性能却不敢让人恭维…

java 开源sns_JEESNS V1.0发布,JAVA 开源 SNS 社交系统
JEESNS V1.0 发布了,本次更新内容:增加后台管理员授权与取消功能增加私信模块解决在微博页面,左侧微博点赞过后,左侧展示列表小手会变黑,但是右侧热门出小手依然是白色修复后台添加栏目、文章成功后,提示页…

Balanced Binary Tree leetcode java
题目:Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. 题解:采用递归…

leaflet地图框架
leaflet 中文API LeafLet js 官网: http://leafletjs.com/index.html LeafLet js 官网demo: http://leafletjs.com/examples.html LeafLet js 官网API: http://leafletjs.com/reference-1.3.0.html L.Map API各种类中的核心部分,用…

NR:UE初始搜网流程
UE的初始搜网流程,PSS->SSS->PBCH->RMSI.我画了一个简单的流程图如下,里面标注了每个环节的重点。 UE的初始搜网流程: 分为SSB同步(包括MIB读取)和RMSI的读取。 1. SSB SSB包括: PSS,SSS,PBCH. UE 在GSCN频点上,搜索…

纯CSS3制作的圆角效果按钮菜单
<!DOCTYPE html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>纯CSS3制作的圆角效果按钮菜单丨曲阳雕塑</title> <style type"text/css"> nav{display: block; wid…

java 左右键_js 区分鼠标左右键点击
oncontextmenu 是右键事件但是滚轮事件并没有获取到, 使用vue可以用middle获取Title.box {width: 200px;height: 200px;background: deepskyblue;}let div document.getElementById(app)div.oncontextmenu function (e) {e.preventDefault();console.log(右键, e.button)};d…