博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
嵌入式linux编译程序,构造嵌入式Linux(一):Kernel编译
阅读量:6513 次
发布时间:2019-06-24

本文共 4534 字,大约阅读时间需要 15 分钟。

使用交叉编译环境

建立好自己的交叉编译环境,就可以进行kernel的编译。这部分也是对O'Reilly的《Building Embeded Linux System》的第五章的一个实践。我们仍使用moblin作为例子。他已经为kernel提供了config文件的例子。对于menlow,需要将config-generic和config-menlow进行合并。可以在generic的基础上,通过手工根据menlow的配置来改动,也可以使用moblin提供的merge.pl,merg.pl config-generic config-menlow > wei-config,然后cp wei-config .config,即可 。在alpha3的版本似乎merge的结果有些问题,还是需要进行手动来改,但是在beta的版本中,没有问题。

$ make ARCH=x86 CROSS_COMPILE=i586-linux- bzImage   『由于kernel比较大,如果使用zImage,会报错,要求使用bzImage』

$ make ARCH=x86 CROSS_COMPILE=i586-linux- modules

对于交叉编译环境,为了不会出现误操作,覆盖我们host系统文件,不要使用root的身份进行。在完成编译之后,我们整理生成的关键系统文件,并将其保存好:

$ cp System.map $PRJROOT/images/myproject/System.map-2.6.29-menlow

$ cp vmlinux $PRJROOT/images/myproject/vmlinux-2.6.29-menlow

$ cp .config $PRJROOT/images/myproject/2.6.29-menlow.config

$ cp arch/x86/boot/bzImage $PRJROOT/images/myproject/bzImage2.6.29-menlow

$ mkdir modules-2.6.29-menlow //用于存放我们modules

安装模块,存放在指定的位置:$ make ARCH=x86 CROSS_COMPILE=i586-linux- INSTALL_MOD_PATH=$PRJROOT/images/myproject/modules-2.6.29-menlow modules_install

我们需要通过busybox来建立模块之间的依赖关系。

$ wget http://busybox.net/downloads/busybox-1.13.4.tar.bz2

$ cd busybox-1.1.1

$ make defconfig   //使用默认配置,可以通过 make menuconfig来进行配置,好多选项

$ make

BusyBox 最初是由 Bruce Perens 在 1996 年为 Debian GNU/Linux 安装盘编写的。其目标是在一张软盘上创建一个可引导的 GNU/Linux 系统,这可以用作安装盘和急救盘。一张软盘可以保存大约 1.4-1.7MB 的内容,因此这里没有多少空间留给 Linux 内核以及相关的用户应用程序使用。BusyBox 揭露了这样一个事实:很多标准 Linux 工具都可以共享很多共同的元素。例如,很多基于文件的工具(比如grep和find)都需要在目录中搜索文件的代码。当这些工具被合并到一个可执行程序中时,它们就可以共享这些相同的元素,这样可以产生更小的可执行程序。实际上, BusyBox 可以将大约 3.5MB 的工具包装成大约 200KB 大小。这就为可引导的磁盘和使用 Linux 的嵌入式设备提供了更多功能。我们可以对 2.4 和 2.6 版本的 Linux 内核使用 BusyBox。

在exampls/depmod.pl放置在工具位置中。

$ depmod.pl –k ./vmlinux-2.6.29-menlow [或者使用-F System.map-2.6.29-menlow] –b $PRJROOT/images/myproject/modules-2.6.29-menlow/lib/modules/2.6.29.1-menlow  $PRJROOT/images/myproject/modules-2.6.29-menlow/lib/modules/2.6.29.1-menlow/modules.dep

重新生成modules.dep,我也将其copy到$PRJROOT/images/myproject/modules.dep-2.6.29-menlow。

使用MIC2的开发环境

在MIC2中有moblin-chroot工具,可以生成我们的开发环境,并提供模拟的target。我们在生成image的kickstart文件中直接将kernel-netbook改为kernel-menlow ,发安装的时候出现花屏现象,如果我们将netbook的img在MID上安装,可以装上,但是速度很慢,可能和CPU的适配有关系,不可以容忍。在加上各类的driver之前,我们需要在netbook版本的基础上,将kernel适配menlow芯片。

[wei@wei project]$ sudo moblin-chroot -s wei-kernel-chroot --unpack-only moblin-netbook-core-developer-alpha3-200905081154.usbimg //进入模拟环境

[wei@wei project]$ sudo moblin-chroot wei-kernel-chroot/

bash-3.2# alias ls="ls --color" //不习惯没有颜色的情况,修正一下

bash-3.2# rpm -ivh kernel-2.6.29.1-18.1.moblin2.src.rpm //解开rpm的包

bash-3.2# cd ~

bash-3.2# echo %_default_patch_fuzz 2 > .rpmmacros 在 alpha3中alpha3版本中带补丁,使用fuzz 0,出现错误:

Patch #8 (linux-2.6.29-drm-revert.patch):

+ /bin/cat /home/wei/rpmbuild/SOURCES/linux-2.6.29-drm-revert.patch

+ /usr/bin/patch -s -p1 --fuzz=0

-- saving rejects to file drivers/gpu/drm/i915/i915_dma.c.rej

1 out of 1 hunk FAILED -- saving rejects to file drivers/gpu/drm/i915/i915_drv.h.rej

error: Bad exit status from /var/tmp/rpm-tmp.JUmRvI (%prep)需要至为fuzz 2,但是在beta版本中,没有这个问题,无需此步骤 。fuzz:如果找不到这些位置,且如果 patch 命令正在应用上下文差异列表,patch 命令能进行非精确搜索。fuzz factor 指定了非精确匹配的行数目。如果模糊因子设置成 1 或者更大,patch 命令执行第二次扫描,这一次忽略上下文的第一行和最后一行。如果没有匹配结果,且最大模糊因子设置成 2 或者更大, patch 命令执行第三次扫描,这一次会忽略上下文的前两行和最后两行。(缺省模糊因子最大值为 2)。如果找不到匹配的位置,patch 命令在拒绝文件中放置块(hunk)。创建拒绝文件时,其名称和输出文件一样,只是在文件名有后缀 .rej。使用 -r 标志可以覆盖此命名约定。

bash-3.2# cd rpmbuild/

bash-3.2# ls

SOURCES  SPECS

bash-3.2# cd SPECS/

bash-3.2# rpmbuild -bp kernel.spec //打补丁

生成.config的方式同交叉编译环境

bash-3.2# make ARCH=x86 bzImage

bash-3.2# make ARCH=x86 modules

bash-3.2# make ARCH=x86 modules_install

可以通过yum来导入busybox,但是我找遍到depmod.pl,有提供depmod,但是运行的时候有报错,我还是下载了busybox的包,运行#~/bin/depmod.pl -k ./vmlinux-2.6.29-menlow -b /lib/modules/2.6.29.3-menlow/  /lib/modules/2.6.29.3-menlow/modules.dep

我试过直接使用make install来安装, make install似乎将bzImage的文件copy到/boot下面作为vmlinuz。但是想通过MIC2将其制作为img的时候,出现以下报错:

This filesystem will be automatically checked every 32 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

tune2fs 1.41.3 (12-Oct-2008)

Setting maximal mount count to -1

Setting interval between checks to 0 seconds

Copying filesystem...

Error creating Live CD : Unable to copy valid kernels or initrds, please check the repo

Your new image can be found here:

Finished.

这个问题,需要进一步解决。在moblin中没有/etc/grub.conf文件,而/boot/grub和普通的linux长得不一样。 原因是在/boot里面没有发现initrd-文件。这个文件似乎在make modules_install的步骤中被删除。

修改时区 :

1,在/usr/share/zoneinfo/目录下查询想要更换的时区名称 2,将原有的localtime文件移走;        # mv /etc/localtime  /etc/localtime-old 3,做新的localtime文件,将对应的时区文件链接过来        # ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

转载地址:http://saifo.baihongyu.com/

你可能感兴趣的文章
数据库设计 Step by Step (6) —— 提取业务规则
查看>>
Redis客户端redisson实战
查看>>
连接到 JasperReports Server
查看>>
java处理高并发高负载类网站问题
查看>>
使用C#生成随机密码(纯数字或字母)和随机卡号(数字与字母组合)
查看>>
CAS服务器端集群
查看>>
设计模式 之 访问者模式
查看>>
JAVA Collections框架
查看>>
更改Windwos server 2003 域用户密码策略默认配置
查看>>
进制转换
查看>>
html与html5的一些区别
查看>>
ASCII码
查看>>
java常用四种排序源代码
查看>>
win7 下硬盘安装Redhat7
查看>>
Redis 分布式锁的正确实现方式
查看>>
mysqldump 备份命令使用中的一些经验总结
查看>>
Linux下MySql安装配置方法总结
查看>>
本IT博客用于域名投资、互联网、资源下载等相关干货收藏和学习
查看>>
ArrayList底层实现
查看>>
【转载】Java程序设计入门 (二)
查看>>