linux内核编译以及烧写

先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题,二维码如下:

linux内核编译以及烧写_第1张图片
**

一 环境

**
本文以s3c2440位硬件平台,分别以linux-2.6.22.6和linux-3.4.2介绍编译过程,
针对linux-2.6.22.6版本,需要的环境是:

  1. linux内核包linux-2.6.22.6.tar.bz2
  2. 针对soc2440的patch:linux-2.6.22.6_jz2440.patch
  3. 交叉编译工具链,arm-linux-gcc v3.4.5
    针对linux-3.4.2,需要的环境是:
  4. linux内核包linux-3.4.2.tar.bz2
  5. 针对soc2440的patch:linux-3.4.2_100ask.patch
  6. 交叉编译工具链,arm-linux-gcc v4.3.2
    针对不同的内核包,需要不同的交叉工具链,因为不同的内核包里面的makefile语法规则略有变化,老版本工具链不一定支持新版本语法规则,所以需要不同的交叉工具链
    **

二 编译过程

**
1、解压缩 tar xjf linux-2.6.22.6.tar.bz2
在这里插入图片描述
2、切换到刚刚解压下来的路劲下,
打补丁patch -p1 <…/linux-2.6.22.6_jz2440.patch
在这里插入图片描述
在这里插入图片描述
3、配置
三种方式:
A. make menu config(需要修改的太多)
B. 使用默认配置,在上面修改,在./arch/arm/configs路劲下有一个s3c2410_defconfig,先执行命令make s3c2410_defconfig,然后执行make menuconfig
这样编译的本质是先按照一个默认配置来编译,然后执行make menuconfig时根据默认配置项,可以选择配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
执行命令make s3c2410_defconfig,会提示如下错误:
在这里插入图片描述
解决办法,参照:http://www.cnblogs.com/lovechen/p/5717322.html,这是因为我的系统下面的make工具太新,make的旧版本规则已经无法兼容新版本,所以我们需要修改Makefile中的命令规则,这个Makefile是指./linux-2.6.22.6路径下面
linux内核编译以及烧写_第2张图片
vi命令下面如何删除字符:
在这里插入图片描述
执行make menuconfig命令,提示错误:
linux内核编译以及烧写_第3张图片
解决办法:https://blog.csdn.net/czg13548930186/article/details/79851149
缺少了一个库,我们需要安装一个库
sudo apt-get install libncurses5-dev libncursesw5-dev
安装过程中,请确保虚拟机可以联网,否则安装不成功
当虚拟机可以和主机ping通时,有时候虚拟机会无法上网,这个时候的解决办法就是:虚拟机设置网络适配器自定义模式选择NAT模式,对于我本地电脑就是VMnet8,然后点击确定,虚拟机就可以上网了。
有时安装这两个包时,会提示错误Could not get lock /var/lib/dpkg/lock,解决办法:https://blog.csdn.net/u011596455/article/details/60322568
C. 使用厂家提供的配置文件:直接把厂家的复制,cp config_厂家 .config;然后make menuconfig
对于s3c2410,韦老师提供的配置文件是config_ok
在当前目录下执行:cp config_ok .config
然后执行 make menuconfig(在编译的时候,会提示Your display is too small to run Menuconfig,这个时候需要把终端最大化即可)
需要注意的是,我们根据方法B编译出来的uImage加载到s3c2410的板子上时,一直提示Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block,原因还未找到,应该配置选项不全,我们在弹出的对话框未选择合适的配置项,暂时还不清楚是哪个配置项没有选择带来的问题。因此,我们采用方法C,根据韦老师提供的config_ok来配置,然后编译
4、编译生成uImage
在这个编译过程中,还是提示出错
在编译uboot的时候生成过一个mkimage,把它拷贝到内核的/usr下,
mkimage的路径:./uboot/u-boot-1.1.6/tools/mkimage
usr的路径:./ linux_kernel_test/linux-2.6.22.6/usr
以上是编译linux-2.6.22.6内核的过程,如果此时我们的环境是编译linux-2.6.22.6内核的环境,我们想要直接编译编译linux-3.4.2内核,编译是会失败的,因为我们的交叉工具链不匹配,在编译编译linux-3.4.2内核之前,需要先修改交叉工具链,步骤如下:
1、先查看当前版本:arm-linux-gcc --v
2、查看当前环境变量: echo $PATH
3、查看当前环境变量路径 cat /etc/environment

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/work/tools/gcc-3.4.5-glibc-2.3.6/bin"

4、修改环境变量gedit /etc/environment,如下

#PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/work/tools/gcc-3.4.5-glibc-2.3.6/bin"
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/work/tools/usr/local/arm/4.3.2/bin"

此时,在按照上面编译linux-2.6.22.6内核的步骤,编译linux-3.4.2内核,在最后一步编译uImage的时候,可能会出现如下错误:

Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.

解决办法为修改这个文件的内容,将文件kernel/timeconst.pl 文件中 373行做如下修改,重新编译uImage即可

if (!defined(@val)) {
改为if (!@val) {

三 烧写

你可能感兴趣的:(linux系统)