最近想尝试把新的Linux内核移植到开发板上看看能不能顺利运行,我的基础版本是买板子时附带的2.6.30版本,编译器版本是4.3.3。
下载源代码和编译器
下载Linux源码,源码的官方网站是,官方git分支有多个,大家可以根据需要选择,我选择的版本是:
,推荐使用此版本,因为它具有更完整的分支。
你也可以下载 Linus 的分支:
。该分支的分支很少,但标签很多。
使用git,可以方便的进行版本切换,非常适合实验。
下载编译器:
随着内核版本的升级,编译器版本也需要升级。撰写本文时,最新的编译器版本是 13.3。不过,编译器版本越高越好。太新的编译器和旧的内核也可能存在兼容性问题。
新内核有一个脚本.//cc-.sh可以检查编译器是否正常。
它调用另一个脚本 .//min-tool-.sh,显示内核支持的最低编译器版本。
老内核我没有找到对应的工具,但是编译器会提示,比如版本太高的话,会出现找不到文件的错误。
我用13.3的编译器编译.4内核时出现上述错误,换成4.3.3编译器后就OK了。
配置环境变量
编译前需要配置环境变量,将编译器的bin路径加入PATH,可以修改~/.或者/etc/。此方法长期有效,开机状态下都可以使用。也可以直接在命令行窗口配置PATH=[编译器bin路径]:$PATH。此方法暂时针对本命令行窗口,关闭后即失效。关于环境变量更详细的信息请自行搜索学习,这里就不赘述了。
为了编译内核,还需要下载一些必要的工具:
sudo apt bc bison flex gcc git gzip -dev -dev -dev make perl-base rsync tar xz-utils
这只是举个例子,随着内核的发展,可能有些工具不需要了,或者版本不对,又或者需要一些其他的新工具。不用担心,如果编译过程中缺少工具,编译器会报错,我们通过错误信息就知道需要安装什么了。
修改代码
前期工作完成后,就可以进入Linux源码目录了。交叉编译需要明确给出两个环境变量ARCH和,否则会默认编译x86版本的内核。可以在make命令参数中给出它们:
也可以直接写入文件,我选择这种方法,比较方便;
以下修改都是针对我的板子的,你的板子可能不需要修改,需要根据你的板子自己判断,不能盲目照搬。
修改系统时钟。我的板子用的是12M晶振,内核默认是16.9344M。这里如果不改的话,log输出会乱码。修改的文件是arch/arm/mach-s3c/mach-.c,老版本是arch/arm/mach-/mach-.c或者arch/arm/mach-/mach-.c,所以需要灵活掌握。
这个功能不同版本也有区别,只要掌握好2440这个键就不会错。
还有一个地方需要修改,我的uboot把机器码改成了168,所以Linux那边也需要改,这个很关键,内核之所以知道跑哪个芯片,哪个平台,就是靠这个机器码来决定的。
要知道uboot传递的是哪个机器码,可以在uboot命令行中输入bd或者检查
内核修改文件arch/arm/tools/mach-types,找到并将362改为168
如果机器码不正确,内核会提示以下信息
列出的内容与您的配置相关。
上述修改是每个版本都必须进行的,因此以后我不会特别指出。
配置内核
接下来准备 . 文件,这个是内核编译依赖的配置文件,整个内核相关的宏都在这个文件里,我们的操作就是改这个文件,如果你不确定你想要的配置是生效还是关闭,可以在 中搜索查看。(注意前面有个英文句号,代表默认是隐藏文件)
Linux 内核提供了一些预定义文件,我们可以以其中一个作为基础开始,执行以下命令,将预定义文件复制到 .:
到此就可以编译了,我的目标是尽量少修改,让内核可以启动,也就是内核可以运行,可以输出日志。所以我先用默认配置编译,下载到板子上看效果,再根据情况做进一步的操作。下面我会根据版本分别描述不同版本遇到的问题及解决方法,供大家参考。
(实际移植的时候一定要尽量删掉不需要的东西,否则编译会比较费时间,而且编译后的文件会很大)
在开始之前,让我们先使用make命令看一下Linux内核配置界面。
最上面一行显示的是使用的配置文件、平台、内核版本,这里可以确认你的交叉编译环境是否配置正确,不同版本这个界面会有所不同,需要灵活应对。
2.6.30-2.6.34
这些版本在使用 4.3.3 编译时需要额外修改/.pl
编译成功之后就可以下载到板子上,直接开机运行就可以了,没什么特别需要注意的,很顺利。
2.6.35
这个版本有问题,跟上面的通用方法一样,这次操作就卡在这里了
之后就没有任何输出了,然后我从网上的一篇博客里找到了这段话
尝试之后发现确实管用。可见老版Linux内核的行为在新内核中未必能行。当然这里就不深究更深层的原因了,因为后来升级后的Linux版本又恢复到了不用拆掉其他板子就能运行的状态。
(以上文章为转载,未能找到原始出处,就不列转载出处了,有兴趣的请自行搜索。)
3.4.y
这个版本更离谱,以未定义的指令启动,直接重启。
按照之前的想法,把其他没用到的板子去掉,然后就变成这样了
遇到这种情况不要慌张,内核提供了调试信息,我们可以通过打开调试信息来得到线索。以前的版本可能也有这种可能,但我是在这个版本才发现这个配置的。如果你有以前的版本,可以试一试。
编译并下载
这里可以看到波特率为0,明显有问题,我在uboot中传过了,但是这里没有收到,就不给大家悬念了,这个版本的内核增加了设备树,uboot传递参数的方式变了,我的uboot比较老,所以需要配置内核按照老的方式传递参数。
之后再次编译下载,输出正常,说明uboot参数传递成功。
当然这里内核也提示这个方法已经过时了,所以赶紧升级uboot吧。
3.19
此版本采用默认预定义配置,不会出现未定义指令,直接输出乱码,似乎是参数传递的问题。
启用旧的传递参数方式。此版本将此选项置于启动下。
编译并下载,这次就可以启动OK了。
这里我们可以发现内核的兼容性又提升了,不需要过多的剪裁就可以正常运行。可见内核升级就是一个不断遇到问题并不断改进的过程。
4.19.y
在做这个版本的时候开始提示编译器太旧,需要升级。
切换到最新的编译器
继续编译就OK了。
无法启动默认下载
不过已经确认是参数传递有问题,先改成老办法,编译下载,就可以了。
5.19.y
这次我们就直接开始按照老的方式传递参数,按照老的方式编译、下载。
直接就可以启动了,注意此时内核大小是4M,而初始的2.6.35大小只有2M,翻了一倍,从日志中也可以看出内核结构发生了巨大的变化。
6.2.y
修改配置与5.19相同,编译启动也正常。
Linux 6.3 及以上版本不支持此芯片,当然老版本内核也够用,这个年代的芯片很多都是用老内核,没有特殊需求的话没必要升级到新内核,这可能是新版本不再支持的原因。
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。