uboot环境变量与内核MTD分区关系

发布者:BlissfulSunrise最新更新时间:2024-08-30 来源: cnblogs关键字:uboot  环境变量 手机看文章 扫描二维码
随时随地手机看文章

分区只是内核的概念,就是说A~B地址放内核,C~D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等。


1:在内核MTD中可以定义分区A~B,C~D。。。。。。并予以绝对的地址赋值给每个分区。我们可以来看看在内核中是怎样来对MTD进行分区的:archarmplat-s3c24xxcommon-smdk.c


static struct mtd_partition smdk_default_nand_part[] = {

 [0] = {

  .name = 'Boot',

  .size = SZ_16K,

  .offset = 0,

 },

 [1] = {

  .name = 'S3C2410 flash partition 1',

  .offset = 0,

  .size = SZ_2M,

 },

 [2] = {

  .name = 'S3C2410 flash partition 2',

  .offset = SZ_4M,

  .size = SZ_4M,

 },

 [3] = {

  .name = 'S3C2410 flash partition 3',

  .offset = SZ_8M,

  .size = SZ_2M,

 },

 [4] = {

  .name = 'S3C2410 flash partition 4',

  .offset = SZ_1M * 10,

  .size = SZ_4M,

 },


......

 };


一般我们只需要分3-4个区,第一个为boot区,一个为boot参数区(传递给内核的参数),一个为内核区,一个为文件系统区。


而对于bootloader中只要能将内核下载到A~B区的A地址开始处就可以,C~D区的C起始地址下载文件系统。。。这些起始地址在MTD的分区信息中能找到。所以bootloader对分区的概念不重要,只要它能把内核烧到A位置,把文件系统烧到C位置。

所以,在bootloader对Flash进行操作时,哪块区域放什么是以内核为主。


而为了方便操作,bootloader类似也引入分区的概念,如,可以使用“nand write 0x3000000 kernel 200000”命令将uImage烧到kernel分区,而不必写那么长:nand write 3000000 A 200000,也就是用分区名来代替具体的地址。


这要对bootloader对内核重新分区:这需要重新设置一下bootloader环境参数,就可以同步更新内核分区信息


如:


setenv bootargs 'noinitrd console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2


                           mtdparts=nand_flash:128k(u-boot)ro,64k(u-boot envs),3m(kernel),30m(root.jffs2),30m(root.yaffs)'


内核配置时选上Device Drivers  ---> Memory Technology Device (MTD) support  ---> Command line partition table parsing


在设置了mtdparts变量之后,就可以在nand read/write/erase命令中直接使用分区的名字而不必指定分区的偏移位置.而这需要内核MTD最好没有规划分区。


如果你是通过uboot的内核命令行给MTD层传递MTD分区信息,这种情况下,内核读取到的分区信息始终和u-boot中的保持一致(推荐的做法)


如果你是把分区信息写在内核源代码MTD里定义好的方法,那最好保证它和u-boot中的保持一致,即同步修改uboot及内核的相关部分。


 


 


2:


 


内核通过bootargs找到文件系统,bootargs中的mtdblockx即代表分区,block1,2,3代表哪个分区。


 


事实上,bootargs中的'root=/dev/mtdblockx'只是告诉内核,root fs从第x个(x=0,1,2...)MTD分区挂载,mtdblock0对应第一个分区,mtdblock1对应第二个分区,以此类推.


 


3:分区方法


 


1) MTD层的分区


 


2) 通过U-boot传递给内核的命令行中的mtdparts=...


 


3) 其他可以让内核知道分区信息的任何办法,(内核默认的命令参数)


 


下面说到mtdparts,及它的用法:


 


mtdparts


 


mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),38272k(user),256k(env),384k(uboot)


 


要想这个参数起作用,内核中的mtd驱动必须要支持,即内核配置时需要选上Device Drivers  ---> Memory Technology Device (MTD) support  ---> Command line partition table parsing


 


 


 


mtdparts的格式如下:


 


mtdparts=[;

 


  := :[,]


 


  := [@offset][][ro]


 


   := unique id used in mapping driver/device


 


    := standard linux memsize OR '-' to denote all remaining space


 


    := (NAME)


 


因此你在使用的时候需要按照下面的格式来设置:


 


mtdparts=mtd-id:@(),@()


 


这里面有几个必须要注意的:


 


a.  mtd-id 必须要跟你当前平台的flash的mtd-id一致,不然整个mtdparts会失效 怎样获取到当前平台的flash的mtd-id?


 


在bootargs参数列表中可以指定当前flash的mtd-id,如指定 mtdids:nand0=gen_nand.1,前面的nand0则表示第一个flash


 


b.  size在设置的时候可以为实际的size(xxM,xxk,xx),也可以为'-'这表示剩余的所有空间。


 


相关信息可以查看drivers/mtd/cmdlinepart.c中的注释找到相关描述。


 


U-boot的环境变量值得注意的有两个: bootcmd 和bootargs。


 


引用:


 


u       bootcmd


 


    前面有说过bootcmd是自动启动时默认执行的一些命令,因此你可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置bootcmd为你经常使用的那种参数。


 


u       bootargs


 


    bootargs是环境变量中的重中之重,甚至可以说整个环境变量都是围绕着bootargs来设置的。bootargs的种类非常非常的多,我们平常只是使用了几种而已,感兴趣的可以看看这篇文章说的很全:http://www.linuxidc.com/Linux/2011-03/33599p4.htm。bootargs非常的灵活,内核和文件系统的不同搭配就会有不同的设置方法,甚至你也可以不设置bootargs,而直接将其写到内核中去(在配置内核的选项中可以进行这样的设置),正是这些原因导致了bootargs使用上的困难。


 


    下面介绍一下bootargs常用参数,bootargs的种类非常的多,而且随着kernel的发展会出现一些新的参数,使得设置会更加灵活多样。


 


 


 


A. root


 


用来指定rootfs的位置, 常见的情况有:


 


    root=/dev/ram rw  


 


    root=/dev/ram0 rw


 


  请注意上面的这两种设置情况是通用的,我做过测试甚至root=/dev/ram1 rw和root=/dev/ram2 rw也是可以的,网上有人说在某些情况下是不通用的,即必须设置成ram或者ram0,但是目前还没有遇到,还需要进一步确认,遇到不行的时候可以逐一尝试。


 


 


 


    root=/dev/mtdx rw


 


    root=/dev/mtdblockx rw


 


    root=/dev/mtdblock/x rw


 


    root=31:0x


 


 


 


上面的这几个在一定情况下是通用的,当然这要看你当前的系统是否支持,不过mtd是字符设备,而mtdblock是块设备,有时候你的挨个的试到底当前的系统支持上面那种情况下,不过root=/dev/mtdblockx rw比较通用。此外,如果直接指定设备名可以的话,那么使用此设备的设备号也是可以的。


 


 


 


    root=/dev/nfs


 


在文件系统为基于nfs的文件系统的时候使用。当然指定root=/dev/nfs之后,还需要指定nfsroot=serverip:nfs_dir,即指明文件系统存在那个主机的那个目录下面。


 


 


B. rootfstype


 


    这个选项需要跟root一起配合使用,一般如果根文件系统是ext2的话,有没有这个选项是无所谓的,但是如果是jffs2,squashfs等文件系统的话,就需要rootfstype指明文件系统的类型,不然会无法挂载根分区.


 


 


 


C. console


 


 


 


console=tty  使用虚拟串口终端设备 .


 


console=ttyS[,options]使用特定的串口,options可以是这样的形式bbbbpnx,这里bbbb是指串口的波特率,p是奇偶校验位,n是指的bits。


 


console=ttySAC[,options]同上面。 


 


看你当前的环境,有时用ttyS,有时用ttySAC,网上有人说,这是跟内核的版本有关,2.4用ttyS,2.6用ttySAC,但实际情况是官方文档中也是使用ttyS,所以应该是跟内核版本没有关联的。可以查看Documentation/serial-console.txt找到相关描述。


 


D. mem


 


mem=xxM 指定内存的大小,不是必须的


 


 


 


E. ramdisk_size


 


ramdisk=xxxxx           不推荐  


 


ramdisk_size=xxxxx   推荐


 


上面这两个都可以告诉ramdisk 驱动,创建的ramdisk的size,默认情况下是4m(s390默认8M),你可以查看Documentation/ramdisk.txt找到相关的描述,不过ramdisk=xxxxx在新版的内核都已经没有提了,不推荐使用。


 


 


 


F. initrd, noinitrd


 


当你没有使用ramdisk启动系统的时候,你需要使用noinitrd这个参数,但是如果使用了的话,就需要指定initrd=r_addr,size, r_addr表示initrd在内存中的位置,size表示initrd的大小。


 


 


 


G. init


 


init指定的是内核启起来后,进入系统中运行的第一个脚本,一般init=/linuxrc, 或者init=/etc/preinit,preinit的内容一般是创建console,null设备节点,运行init程序,挂载一些文件系统等等操作。请注意,很多初学者以为init=/linuxrc是固定写法,其实不然,/linuxrc指的是/目录下面的linuxrc脚本,一般是一个连接罢了。


 


 


 


H. ip


 


指定系统启动之后网卡的ip地址,如果你使用基于nfs的文件系统,那么必须要有这个参数,其他的情况下就看你自己的喜好了。设置ip有两种方法:


 


 ip = ip addr


 


 ip=ip addr:server ip addr:gateway:netmask::which netcard:off


 


这两种方法可以用,不过很明显第二种要详细很多,请注意第二种中which netcard 是指开发板上的网卡,而不是主机上的网卡。


 


 


 


说完常见的几种bootargs,那么我们来讨论平常我经常使用的几种组合:


 


1). 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下:


 


setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’


 


 


 


2). 假设文件系统是ramdisk,且在flash中,bootargs的设置应该如下:


 


setenv bootargs ‘mem=32M console=ttyS0,115200 root=/dev/ram rw init=/linuxrc’


 


注意这种情况下你应该要在bootm命令中指定ramdisk在flash中的地址,如bootm kernel_addr ramdisk_addr (fdt_addr)


 


 


 


3). 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下


 


setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’


 


 


 


4). 假设文件系统是基于nfs的,bootargs的设置应该如下


 


setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5:192.168.0.3:192.168.0.3:255.255.255.0::eth0:off’


 


或者


setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5


 


 


 


linux kernel boot arguments


The following is a consolidated list of the kernel parameters as implemented (mostly) by the __setup() macro and sorted into English Dictionary order (defined as ignoring all punctuation and sorting digits before letters in a case insensitive manner), and with descriptions where known.


Module parameters for loadable modules are specified only as the parameter name with optional '=' and value as appropriate, such as:


modprobe usbcore blinkenlights=1


Module parameters for modules that are built into the kernel image are specified on the kernel command line with the module name plus '.' plus parameter name, with '=' and value if appropriate, such as:


usbcore.blinkenlights=1


The text in square brackets at the beginning of the description states the restrictions on the kernel for the said kernel parameter to be valid. The restrictions referred to are that the relevant option is valid if:


        ACPI    ACPI support is enabled.

        ALSA    ALSA sound support is enabled.

        APIC    APIC support is enabled.

        APM     Advanced Power Management support is enabled.

        AX25    Appropriate AX.25 support is enabled.

        CD      Appropriate CD support is enabled.

        DEVFS   devfs support is enabled.

        DRM     Direct Rendering Management support is enabled.

        EDD     BIOS Enhanced Disk Drive Services (EDD) is enabled

        EFI     EFI Partitioning (GPT) is enabled

        EIDE    EIDE/ATAPI support is enabled.

        FB      The frame buffer device is enabled.

        HW      Appropriate hardware is enabled.

        IA-32   IA-32 aka i386 architecture is enabled.

        IA-64   IA-64 architecture is enabled.

        IOSCHED More than one I/O scheduler is enabled.

        IP_PNP  IP DHCP, BOOTP, or RARP is enabled.

        ISAPNP  ISA PnP code is enabled.

        ISDN    Appropriate ISDN support is enabled.

        JOY     Appropriate joystick support is enabled.

        LP      Printer support is enabled.

        LOOP    Loopback device support is enabled.

        M68k    M68k architecture is enabled.

                        These options have more detailed description inside of

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ..[13]
关键字:uboot  环境变量 引用地址:uboot环境变量与内核MTD分区关系

上一篇:s3c2440对nandflash的操作1
下一篇:GCC 内联汇编(GCC内嵌ARM汇编规则)

推荐阅读最新更新时间:2026-03-25 11:19

迅为-i.MX6开发板手册更新-非设备树uboot-修改默认环境变量
本文档主要介绍如何非设备树 uboot 修改默认启动参数。iTOP-iMX6 开发板烧写好之后,默认是android 系统 9.7 寸屏幕的系统参数和屏幕参数,如下图所示。输入以下命令查看默认启动参数printenv 74.1 重要的环境变量 比较重要的环境变量或者说经常使用的环境变量,已经在上图中的红色方框中。 主要是:bootsystem、lcdtype 和 bootargs。这些参数都可以在 uboot 源码中进行设置。具体文件为:“iTOP-iMX6_android4.4.2/bootable/bootloader/uboot-imx/lib_arm/board.c”文件。 74.2 默认启动系统设置 默认启动系统参数是
[单片机]
迅为-i.MX6开发板手册更新-非设备树<font color='red'>uboot</font>-修改默认<font color='red'>环境变量</font>
移植uboot-设置默认环境变量,裁剪,并分区
在上一章使uboot支持网卡传输文件后,但是每次启机时,环境变量都要变为默认值,需要重新设置ip,MAC地址才行,由于没有配置mtdparts命令,启动内核也不成功 所以本章主要学习: 1)修改环境变量默认值 2)裁剪uboot 3)分区,设置mtdparts命令 1.修改之前,先来理解下uboot的环境参数 首先,uboot会去校验(CRC)存放环境变量的一段空间 ,若CRC有效则使用该空间里的环境变量,无效则用默认的环境变量. 而我们移植的uboot,由于一直没有使用save,所以没有读不出CRC校验,使用的默认环境变量,如下图所示: 2.来修改uboot的默认环境变量 (PS:uboot此时的内存分
[单片机]
移植<font color='red'>uboot</font>-设置默认<font color='red'>环境变量</font>,裁剪,并分区
内核移植(3)修改MTD分区
修改MTD分区,在arch/arm/plat-s3c24xx/common-smdk.c修改: static struct mtd_partition smdk_default_nand_part = { = { .name = Boot Agent , .size = SZ_16K, .offset = 0, }, = { .name = S3C2410 flash partition 1 , .offset = 0, .size = SZ_2M, }, = { .
[单片机]
U-boot-2014.04移植到MINI2440(10) 移植nand flash保存环境变量、添加分区
一.保存环境变量到nand flash 第一步:修改mini2440.h 由于我们执行saveenv这个命令,然后保存环境变量,u-boot的命令都是在common下实现的,切进去执行gerp “saveenv” –nr ./*.c,查找出如下结果: 这里出现了很多,打开Makefile: # environment obj-y += env_attr.o obj-y += env_callback.o obj-y += env_flags.o obj-$(CONFIG_ENV_IS_IN_DATAFLASH) +=env_dataflash.o obj-$(CONFIG_ENV_IS_IN_E
[单片机]
U-boot-2014.04移植到MINI2440(10) 移植nand flash保存<font color='red'>环境变量</font>、添加分区
嵌入式学习丨4412开发板-uboot源码-汇编-源码分析(一)嵌入式学习丨4412开发板-uboot源码-汇
在第一章中,介绍了迅为4412 的 iROM、启动方式、源码组成等;在第二章中,介绍uboot 编译等。通过前面对编译的详细分析,了解到 uboot 源码中有以下几个文件是非常重要的: “cpu/arm_cortexa9/start.S” “board/samsung/smdkc210/lowlevel_init_SCP.S 或者 lowlevel_init_POP.S” “include/configs/itop_4412_android.h 或者 itop_4412_ubuntu.h” 其中“cpu/arm_cortexa9/start.S”是 uboot 代码入口文件,分析 uboot 一般是从 “start.S”文件开始,
[单片机]
嵌入式学习丨4412开发板-<font color='red'>uboot</font>源码-汇编-源码分析(一)嵌入式学习丨4412开发板-<font color='red'>uboot</font>源码-汇
uboot(基于IMX6ull)
一、U-Boot初次编译 1、首先在 Ubuntu 中安装 ncurses 库,否则编译会报错,安装命令如下:sudo apt-get install libncurses5-dev 2、解压官方Uboot:tar -vxjf uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2 3、编写编译脚本文件:xxx.sh #!/bin/bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- (加空格) mx6ull_14x14_ddr51
[单片机]
<font color='red'>uboot</font>(基于IMX6ull)
uboot总结:uboot配置和启动过程2(mkconfig分析)
说明:文件位置:在uboot的目录下,文件名为:mkconfig。本身是一个脚本文件。 它的主要作用的是: (1)创建一个重要的符号链接 (2)创建一个config.mk文件(在include目录下) (3)创建一个config.h文件(在include目录下) 下面会截距一部分重要的代码来分析 1、首先要明白一个参数($1、$2、$3、$4、$5),这是传参 (1)@(MKCONFIG)(��������)(@:_config=) arm s5pc11x x210 samsung s5pc110 这个是在主Makefile中的配置部分的代码。这里的5个参数将来会传给mkconfig脚本。 $1:arm $2:s5pc11
[单片机]
[uboot] (第五章)uboot流程——uboot启动流程
一、uboot说明 1、uboot要做的事情 CPU初始刚上电的状态。需要小心的设置好很多状态,包括cpu状态、中断状态、MMU状态等等。其次,就是要根据硬件资源进行板级的初始化,代码重定向等等。最后,就是进入命令行状态,等待处理命令。 在armv7架构的uboot,主要需要做如下事情 arch级的初始化 关闭中断,设置svc模式 禁用MMU、TLB 关键寄存器的设置,包括时钟、看门狗的寄存器 板级的初始化 堆栈环境的设置 代码重定向之前的板级初始化,包括串口、定时器、环境变量、I2CSPI等等的初始化 进行代码重定向 代码重定向之后的板级初始化,包括板级代码中定义的初始化操作、emmc、nand flash、网络、
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved