U-Boot bootargs简析
Linux内核启动时需要一些配置信息,如根文件系统的类型、flash分区情况、串口终端的编号、内存的使用情况等等,而由于U-Boot和Linux Kernel的镜像是独立的两个文件,所以只能两者约定好在内存的什么地方存放启动参数,这样U-Boot在启动引导时就将启动参数放置在相应的地址处,而Linux Kernel则去相应的地址读取,然后加以处理。
对于Tiny210开发板,启动参数放置在DDR2 SDRAM起始地址后的0x100偏移处,U-Boot中board/samsung/goni/goni.c中有如下代码:
int board_init(void)
{
/* Set Initial global variables */
s5pc110_gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE; gd->bd->bi_arch_number = MACH_TYPE_GONI;
gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; return ;
}
PHYS_SDRAM_1在include/configs/s5p_goni.h中就被定义为DDR2 SDRAM的起始地址。
而在内核中,arch/arm/mach-s5pv210/mach-mini210.c中也有相关的定义,两者的地址是一样的。
那么参数应该如何在内存中组织呢?对于内核来说,它应该知道参数是从哪开始,从哪结束,这一点的解决方法是,第一个参数和最后一个参数都约定好形式,下面有说明。
先看几个用到的数据结构。
struct tag_header {
u32 size;
u32 tag;
}; struct tag {
struct tag_header hdr;
union {
struct tag_core core;
struct tag_mem32 mem;
struct tag_videotext videotext;
struct tag_ramdisk ramdisk;
struct tag_initrd initrd;
struct tag_serialnr serialnr;
struct tag_revision revision;
struct tag_videolfb videolfb;
struct tag_cmdline cmdline; /*
* Acorn specific
*/
struct tag_acorn acorn; /*
* DC21285 specific
*/
struct tag_memclk memclk;
} u;
}; struct tag *params;
在启动内核的函数中,全局变量被初始化为:
params = ( struct tag *)bd->bi_boot_params;
对U-Boot来说,只要牵住params这个变量,不断向后面写参数就行了,下面简单分析几个参数的填写过程。
第一个参数必须是TAG_CORE
设置ATAG_CORE的伪代码
params->hdr.tag = ATAG_CORE;
params->hdr.size = ( sizeof ( struct tag_header ) + sizeof( struct tag_core ) ) >> ;
params->u.core.flags = ;
params->u.core.pagesize = ;
params->u.core.rootdev = ;
params = params + params->hdr.size;
重要的参数CMDLING_TAG
设置ATAG_CMDLINE的伪代码
params->hdr.tag = ATAG_CMDLINE;
params->hdr.size = ( sizeof( struct tag_header ) + sizeof( struct tag_cmdline ) ) >> ;
p = getenv( "bootargs" );
check_bootargs_not_null( p ) && bootargs_valid( p );
strcpy( params->u.cmdline.cmdline, p );
params = params + params->hdr.size;
重要参数CONFIG_SETUP_MEMORY_TAGS
for( i = ; i < CONFIG_NR_DRAM_BANKS; i++ ) //tiny210中此宏为1
{
params->hdr.tag = ATAG.MEM;
params->hdr.size = ( sizeof( struct tag_header ) + sizeof( struct tag_mem32 ) ) >> ;
params->u.mem.start = bd->bi_dram.start;
params->u.mem.size = bd->bi_dram.size;
params = params + params->hdr.size; }
可选参数CONFIG_REVISION_TAG
params->hdr.tag = ATAG_REVISION;
params->hdr.size = ( sizeof( struct tag_header ) + sizeof( struct tag_revision ) ) >> ;
revision = board_get_revision();
params->u.revision.rev = revision;
params = params + params->hdr.size;
可选参数SERIAL_TAG
params->hdr.tag = ATAG_SERIAL;
params->hdr.size = ( sizeof( struct tag_header ) + sizeof( struct tag_serial ) ) >> ;
serialnr = board_get_serialnr();
params->u.serialnr.low = serialnr.low;
params->u.serialnr.high = serialnr.high
params = params + params->hdr.size;
INITRD_TAG,所谓initrd 就是init ramdisk
if( images->rd_start && images->rd_end )
{
setup_initrd_tag( gd->bd, images->rd_start, images->rd_end );
虽然s5p_goni.h中使用了宏定义,但是没有使用。
params->hdr.tag = ATAG_INITRD2; ATAG_INITRD是压缩的ramdisk image所在 的虚拟地址,ATAG_INITRD2是相应的物理地址。
params->hdr.size = ( sizeof( struct tag_header ) + sizeof( struct tag_initrd ) ) >> ;
params->u.initrd.start = initrd_start;
params->u.initrd.size = initrd_end - initrd_start;
params += params->hdr.size;
}
对应于开始的ATAG_CORE,最后一个也需要固定格式的tag:
params->hdr.tag = ATAG_NONE;
params->hdr.size = ;
U-Boot bootargs简析的更多相关文章
- [Spring] 学习Spring Boot之一:基本使用及简析
一.简介 使用 Spring Boot 目的主要是用来简化 Spring 应用的搭建及开发过程,因为使用 Spring 及 SpringMVC 框架时需要手动配置的地方非常多(各种包之间的依赖.各种配 ...
- Android 启动过程简析
首先我们先来看android构架图: android系统是构建在linux系统上面的. 所以android设备启动经历3个过程. Boot Loader,Linux Kernel & Andr ...
- Linux 目录结构学习与简析 Part2
linux目录结构学习与简析 by:授客 QQ:1033553122 ---------------接Part 1-------------- #1.查看CPU信息 #cat /proc/cpuinf ...
- Linux 磁盘分区方案简析
Linux 磁盘分区方案简析 by:授客 QQ:1033553122 磁盘分区 任何硬盘在使用前都要进行分区.硬盘的分区有两种类型:主分区和扩展分区.一个硬盘上最多只能有4个主分区,其中一个主分区 ...
- Linux目录结构简析
Linux目录结构简析 Linux继承了unix操作系统结构清晰的特点.在linux下的文件结构非常有条理.但是,上述的优点只有在对linux相当熟悉时,才能体会到.现在,虫虫就把linux下的目录结 ...
- Spring系列.@EnableRedisHttpSession原理简析
在集群系统中,经常会需要将Session进行共享.不然会出现这样一个问题:用户在系统A上登陆以后,假如后续的一些操作被负载均衡到系统B上面,系统B发现本机上没有这个用户的Session,会强制让用户重 ...
- 简析.NET Core 以及与 .NET Framework的关系
简析.NET Core 以及与 .NET Framework的关系 一 .NET 的 Framework 们 二 .NET Core的到来 1. Runtime 2. Unified BCL 3. W ...
- 简析 .NET Core 构成体系
简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...
- RecycleView + CardView 控件简析
今天使用了V7包加入的RecycleView 和 CardView,写篇简析. 先上效果图: 原理图: 这是RecycleView的工作原理: 1.LayoutManager用来处理RecycleVi ...
随机推荐
- Java框架spring Boot学习笔记(三):Controller的使用
Controller注解介绍 @Controller:处理http请求 @RestController: Spirng4之后新加的注解,其实是一个组合注解等同于@ResponseBody和@Contr ...
- 安装IDEA的历程
安装IDEA的历程 写这篇博客的主要目的就是记录自己安装IDEA的"复杂"过程,顺便给一些需要帮助的人提供一些帮助,以及让他们可以少走一些弯路.之所以说"复杂" ...
- 19-04【mysql】transaction,autocommit
本地使用mysql测试结果如下, 没有使用start transaction的情况下: 如果set autocommit=1,则每一条语句默认提交: 如果set autocommit=0,则这条语句默 ...
- 20165315 2018-2019-2 《网络对抗技术》Exp1 PC平台逆向破解
20165315 2018-2019-2 <网络对抗技术>Exp1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调 ...
- 内置函数-map
ret = map(abs,[-1,1,2,3]) print(ret) for i in ret: print(i) l = [1,-2,3,6,8,-7] l.sort(key=abs) prin ...
- Struct2 基础介绍
前面花一周时间学习了servlet+jsp+mysql, 并且简单实现了登录注册等操作.对Servlet应用有了基础了解! 关于Struct2这个经常听说,但是自己没有用过.今天在这学习总结下,目的是 ...
- C#使用CefSharp开源库开发Chrome 浏览器
一.介绍 这个东西我以前没有接触过,但是公司项目里面有用到这个东西,所以就顺便研究一下.今天只是做了 WinForm 的测试,有时间了在试试 WPF 是如何实现的.刚开始一塌糊涂,有点麻 ...
- 原生js简单轮播图 代码
在团队带人,突然被人问到轮播图如何实现,进入前端领域有一年多了,但很久没自己写过,一直是用大牛写的插件,今天就写个简单的适合入门者学习的小教程.当然,轮播图的实现原理与设计模式有很多种,我这里讲的是用 ...
- 超简单的全新win10安装
1.准备工作! 这里说一下需要装系统的东西: 至少8G的U盘或内存卡 一台Windows电脑 在要安装的电脑上至少有16G的空间,最好至少64G. 2.现成电脑下载文件(已经有重装系统U盘跳过这一步) ...
- 洛谷P1576||最小花费||dijkstra||双向建边!!
题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元. 数据范 ...