使用vmlinux objcopy img工具转换Linux内核文件 (vmlinux objcopy img)

Linux内核是一个非常重要的软件,它是运行在计算机硬件上的操作系统内核。对于Linux内核的编译、组装、链接和调试等工作,我们需要使用一系列的开发工具,其中包括vmlinux objcopy img工具。本文将介绍这一工具的使用,以及它在Linux内核开发中的重要性。

一、vmlinux objcopy img工具的作用

vmlinux objcopy img工具是一款用于转换Linux内核文件格式的工具。具体来说,它可以将vmlinux文件转换为obj文件和img文件。

在Linux开发中,vmlinux是一个非常重要的文件,它是编译、链接和调试过程中生成的。vmlinux包含了内核代码和符号表等信息,但是它不能被直接运行和加载到硬件上。这时候,我们需要将vmlinux转换为其他格式的文件,例如obj文件和img文件。

obj文件是一种目标文件格式,它包含了链接器需要的所有信息。通过将vmlinux转换为obj文件,我们可以将不同源文件生成的目标文件链接在一起,生成最终的可执行文件。而img文件则是一种可以被加载到存储设备中的文件格式。

二、vmlinux objcopy img工具的用法

1. 将vmlinux转换为obj文件

我们可以使用以下命令将vmlinux转换为obj文件:

objcopy -O elf64-x86-64 -g vmlinux vmlinux.o

其中,-O用于指定输出的文件格式,elf64-x86-64表示生成的文件是64位的二进制目标文件,-g表示将符号表信息也包含在生成的文件中,vmlinux为输入文件名,vmlinux.o为输出文件名。

2. 将vmlinux转换为img文件

我们可以使用以下命令将vmlinux转换为img文件:

objcopy -O binary vmlinux vmlinux.img

其中,-O用于指定输出的文件格式,binary表示生成的文件是二进制文件,vmlinux为输入文件名,vmlinux.img为输出文件名。

需要注意的是,生成的img文件并不能直接运行在计算机上,它需要被加载到存储设备中才能被启动。

三、vmlinux objcopy img工具的重要性

在Linux内核开发中,使用vmlinux objcopy img工具转换内核文件格式是非常重要的。由于vmlinux文件不能被直接加载到硬件上,我们需要将它转换为其他格式的文件,才能将Linux内核运行在实际的硬件中。

而obj文件和img文件则是实际运行Linux内核所必需的。obj文件包含了链接器需要的所有信息,它是生成最终可执行文件的必要文件。而img文件则是一种可以被加载到存储设备中的文件格式,它是将Linux内核加载到硬件上的必要文件。

因此,在Linux内核开发中,熟练掌握vmlinux objcopy img工具的使用,对于生成最终可执行文件和将Linux内核加载到硬件上都是非常重要的。

四、

Linux内核是一个非常重要的软件,它是运行在计算机硬件上的操作系统内核。在Linux内核开发中,vmlinux objcopy img工具是非常重要的工具之一,它可以将vmlinux文件转换为其他格式的文件。使用vmlinux objcopy img工具转换内核文件格式,对于生成最终可执行文件和将Linux内核加载到硬件上都是非常重要的。因此,在Linux内核开发中,熟练掌握vmlinux objcopy img工具的使用是非常必要的。

相关问题拓展阅读:

linux系统如何传递信息给uboot

#make at91rm9200dk_config

#make oldcnofig //使用dk板默认配置

如果想定制,可以继续执行

#make menuconfig

#make Image

#/usr/local/arm/2.95.3/bin/arm-linux-objcopy -O binary -S vmlinux linux.bin

#gzip -v9 linux.bin

#mkimage -A arm -O linux -C gzip -a 0xe 0xd linux.bin.gz uImage

这样我们得到了Linux启动压缩内核uImage,默认运行地址为0x,

还有一个RAM启动盘-名字为ramdisk-rmk7,在普通的PC机上叫initrd-2.4.20-8.img,在

/boot/grub/menu.lst文件中,我们可以看到它的使用方法穗闭:

***********************

root (hd0,6)

kernel /boot/vmlinuz-2.4.20-8 ro root=LABEL=/ ##########内核文件

initrd /boot/initrd-2.4.20-8.img##########RAM启动盘文件

***********************

ramdisk-rmk7的默认运行地址为0x,

只要有上边的两个文件,Linux内核就能够正常的工作了。

uBoot中进行如下设置

Uboot > tftpuImage##########装载内核到内存处

Uboot > tftpramdisk-rmk ##########装载RAM启动盘到处

Uboot > setenv bootargs root=/dev/ram rw initrd=0x,ramdisk_size=15360 console=ttyS0,mem=32M

Uboot > bootm

如上是通过tftp直接将内核文件uImage和RAM启动盘加载到内存中,然后运行,下面讲讲如何

将这两个文件固化到Flash中,然后通过Flash进行加载启动:

1)将RAM启动盘固化到c为起始地址的Flash中

U-Boot > tftpPATH/ramdisk-rmk7

U-Boot > cp.bcramdisk_size

2)将uImage内核镜像固陆衫化到紧跟RAM盘存储空间之后

U-Boot > tftpPATH/uImage

U-Boot > cp.bc+ramdisk_size image_size

3)存储之后,就要配置uBoot启动加载参数了

U-Boot > setenv ramdisk cp.b c00 ramdisk_size

U-Boot > setenv image cp.b c+ramdisk_sizeimage_size setenv boot bootm

U-Boot > setenv bootcmd run ramdisk\早族腔; run image\; run boot

U-Boot > saveenv

U-Boot > run bootcmd

*************************************************

arch/arm/Makefile

//内核运行虚拟地址TEXTADDR = 0xC

*************************************************

arch/arm/boot/Makefile

//内核加载地址ZRELADDR = 0x

*************************************************

arch/arm/boot/compressed/Makefile

//自解压程序地址ZTEXTADDR = 0x

(linux-2.4.19-rmk7内核的自解压函数gunzip位于

/lib/inflate.c中,为gzip-1.0.3版本,现在在PC上使用gzip

函数压缩出来的文件不能被gzip-1.0.3版本的gunzip识别,所以linux-2.4.19-rmk7

内核自解压的功能等于不能使用,默认值ZTEXTADDR= 0x

表示不使用。(只能通过uBoot的gunzip解压加载)

***********************************************

//uImage存放地址= 0x

***********************************************

mkimage -A arm -O linux -C gzip -a 0xe 0xd linux.bin.gz uImage

-A:CPU类型

-O:操作系统

-C:采用的压缩方式

-a:内核加载地址

-e:内核入口地址

***********************************************

uBoot的do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char *argv);

函数将检验存放到0x地址处的经过mkimage格式化的uImage数据的头部

typedef struct image_header {

uint32_t ih_magic; /* Image Header Magic Number */

uint32_t ih_hcrc; /* Image Header CRC Checksum */

uint32_t ih_time; /* Image Creation Timestamp */

uint32_t ih_size; /* Image Data Size */

uint32_t ih_load; /* Data Load Address */

uint32_t ih_ep; /* Entry Point Address */

uint32_t ih_dcrc; /* Image Data CRC Checksum */

uint8_t ih_os; /* Operating System */

uint8_t ih_arch; /* CPU architecture */

uint8_t ih_type; /* Image Type */

uint8_t ih_comp; /* Compression Type */

uint8_t ih_name; /* Image Name */

}image_header_t;

(ih_ep值为0x,ih_load值为0x)

如果头部各个域值和crc合法,那么do_bootm将调用如下gunzip解压函数对

0x+sizeof(image_header_t)地址处的压缩内核进行解压:

gunzip((void*)ntohl(hdr->ih_load),0x400000,data,(int*)&len);

1.hdr->ih_load 为输出数据地址0x

2.0x为gunzip解压输出数据上限值-4M

3.data为输入数据地址data=0x+sizeof(image_header_t);

4.Len为输入数据长度len = ntohl(hdr->ih_size );

解压完成后将会存储解压后数据的实际大小

压缩的Linux内核文件uImage,经由gunzip解压函数后,通过

do_bootm_linux (cmdtp, flag, argc, argv,addr, len_ptr, verify);

函数向Linux内核传递内核运行所需的5个参数

kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))hdr->ih_ep ;

1.hdr->ih_ep 为0x

/*

* Linux Kernel Parameters:

* r3: ptr to board info data

* r4: initrd_start or 0 if no initrd

* r5: initrd_end – unused if r4 is 0

* r6: Start of command line string

* r7: End of command line string

*/

(*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);

这样完成了Linux系统启动所需要5个参数的传递,至此uBoot的工作已经结束

Linux启动后U-Boot就基本没有用了。U-Boot将一些信息传给Linux,纤薯然后引导Linux。

不知道你的U-Boot能不能进入命毁扰者令行界面?你可以修改Linux的MTD分区,将新的Linux和文件系统烧写在其他的MTD分李哪区,然后在U-Boot中引导新的linux和文件系统。

关于vmlinux objcopy img的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 使用vmlinux objcopy img工具转换Linux内核文件 (vmlinux objcopy img)