本文主要是介绍bootm命令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
制作Linux映像
============
使用uboot时,内核通常生成的文件"zImage"或"bzImage"是没用的。较新一些的内核原码会
生成"uImage", 这个可以为uboot使用。
"uImage"全用了一个工具"tools/mkimage"来封装压缩后的映像文件,在其头部添加一
些信息以及crc32校验等。
我们需要做如下几件事情:
* 制作一个标准的内核映像文件"vmlinux"(这个是ELF格式的)
* 将其转换为二进制映像
arm-linux-objcopy -O binarty \
-R .note -R .comment \
-S vmlinux linux.bin
* 压缩这个二进制映像
gzip -9 linux.bin
* 封装这个已压缩的映像
mkimage -A arm -O linux -T kernel -C gzip \
-a 0 -e 0 -n "Linux Kernel Image" \
-d linux.bin.gz uImage
mkimage 也可以用来制作ramdisk映像。
mkimage 在映像的头部添加了64字节的信息,用来指明映像文件用于的体系结构,操作系统, 映像类型, 压缩方式,入口地址,时间戳,crc32校验等。
mkimage 一般用于两种情况: 为映像添加头信息 和 列出文件的头信息
tools/mkimage -l image
-l ==> 列出映像的头信息
添加头信息时
tools/mkimage -A arch -O os -T type -C comp -a addr -e ep \
-n name -d data_file image
-A ==> set architecture to 'arch' 体系结构
-O ==> set operating system to 'os' 操作系统
-T ==> set image type to 'type' 映像类型
-C ==> set compression type 'comp' 压缩方式
-a ==> set load address to 'addr' (hex) 加载地址
-e ==> set entry point to 'ep' (hex) 入口地址
-n ==> set image name to 'name' 映像文件名
-d ==> use image data from 'datafile' 制作映像的时间
----------------------------------------------
bootm
=====
这个命令用于启动一个操作系统映像。它会从映像文件的头部取得一些信息,这些信息包括:
映像文件的基于的cpu架构、其操作系统类型、映像的类型、压缩方式、映像文件在内存中的加载地址、
映像文件运行的入口地址、映像文件名等。
紧接着bootm将映像加载到指定的地址,如果需要的话,还会解压映像并传递必要有参数给内核,最后
跳到入口地址进入内核。
bootm的第一个参数是映像存储的地址。
例如Linux,可以附带一个参数。此参数会被认为是一个initrd的起始地址,此时bootm命令有三个
步骤:首先解压Linux内核映像并将其复制到ram中,然后将ramdisk映像加载到ram中,最后将控制
权交给内核,并向内核传递ramdisk的位置和大小等信息.
单单用来启动Linux内核,而没有initrd时,可用如下命令:
=> bootm ${kernel_addr}
如果还有initrd,则可使用下面的命令:
=> bootm ${kernel_addr} ${ramdisk_addr}
使用时确保地址参数正确。
当待启动的映像文件已经被加载于RAM时(例如用tftp下载到sdram上),需要对内存部局更加小心。
需要确保映像文件(可能是已被压缩的映像文件)加载的地址不会与解压后的内核位置重叠。例如,如果
将一个ramdisk映像加载于内存的低地址,则在Linux内核加载时可能会覆盖它。这将导致未知的系统
崩溃。
这篇关于bootm命令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!