s3c2440移植Linux内核之引导

news2024/11/12 0:14:40

最近想尝试把新的Linux内核移植到tq2440的开发板上,看看还能不能顺利的跑起来。我的基础版本是买板子的时候提供的2.6.30版本,编译器版本是4.3.3.。

下载源码和编译器

下载linux源码,源码的官方网站是The Linux Kernel Archives,官方有多个git分支,可以根据自己的需求选择,我选择stable版本:

kernel/git/stable/linux.git - Linux kernel stable tree,推荐这个版本,分支比较全。

也可以下载Linus Torvalds的分支:

kernel/git/torvalds/linux.git - Linux kernel source tree。这个分支不多,tag多。

用git可以非常方便的在各个版本之间切换,非常适合实验。

下载编译器

https://developer.arm.com/-/media/Files/downloads/gnu/13.3.rel1/binrel/arm-gnu-toolchain-13.3.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz

随着内核版本的升级,编译器的版本也需要升级,写稿时最新的编译器版本是13.3。但是编译器版本也不是越高越好,太新的编译器和老的内核也会出现兼容性问题。

新的内核有个脚本./scripts/cc-version.sh可以检查编译器是否OK,

它调用了另一个脚本./scripts/min-tool-version.sh显示内核支持的最低编译器版本。

旧内核我没找到对应的工具,不过编译器都会提示的,比如版本过高就会出现找不到文件的错误

上面的错误就是我用13.3的编译器编译linux3.4的内核出现的,换成4.3.3的编译器就OK了。

配置环境变量

编译前需要配置好环境变量,将编译器的bin路径添加到PATH中,可以修改~/.bashrc或者/etc/profile,这种方式是长期生效的,开机即用,也可以直接在命令行窗口export PATH=[编译器bin路径]:$PATH的方式配置,这种方式是针对此命令行窗口临时的,关掉后就失效了。关于环境变量更详细的内容请自行搜索学习,我这里就不再罗嗦了。

编译内核还需要下载一些必要的工具,

sudo apt install bc binutils bison dwarves flex gcc git gnupg2 gzip libelf-dev libncurses5-dev libssl-dev make openssl pahole perl-base rsync tar xz-utils

这里只是一个例子,随着内核的发展,或许有些工具不需要了,或许版本不对,或者需要其他一些新的工具,不要担心,编译的过程中如果缺乏工具编译器会报错的,通过错误信息我们就知道安装什么了。

修改代码

前期工作做好了之后就可以进入linux源码目录了,交叉编译需要明确给出两个环境变量ARCH和CROSS_COMPILE,否则会默认编译x86版本的内核。可以在make命令参数上给出:

也可以直接写入Makefile文件,我选择这种方式,比较方便;

第二幅图的编译器是最新的,随着版本的更新,编译器也跟着升级,宏的具体值根据你自己版本的情况填入即可。

下面的修改是针对我的板子的,你的可能不需要修改,需要你根据你的板子自行判断,不能盲目照搬。

修改系统时钟,我的板子用的12M晶振,内核默认是16.9344M的,这里不改会导致log输出乱码。修改的文件是arch/arm/mach-s3c/mach-smdk2440.c,老的版本是arch/arm/mach-s3c24xx/mach-smdk2440.c或arch/arm/mach-s3c2440/mach-smdk2440.c,需要灵活应对。

不同的版本这个函数也是有区别的,抓住关键2440和clocks就不会出错。

还有个地方需要修改,我的uboot将s3c2440的机器码改成了168,所以Linux这边也得改,这里非常关键,内核之所以知道跑哪个芯片的哪个平台就是通过这个机器码决定的。

想要知道uboot传入的是哪个机器码,可以在uboot的命令行输入bd或bdinfo查看

内核修改文件arch/arm/tools/mach-types,找到s3c2440,将362改成168

如果机器码不对,内核会提示下面的信息

列出的machine跟你的配置有关。

以上的修改对每个版本都要做,我以后就不特别指出了。

配置内核

接下来准备.config文件,这是内核编译依赖的配置文件,整个内核相关的宏都在这个文件中,我们menuconfig的操作就是在改变这个文件,如果你不确定你想要的配置是否生效或者关闭,就可以在.config中搜索查看。(注意config之前有个英文句号,默认是隐藏文件)

Linux内核提供了一些预定义文件,我们可以拿一个作为基础开始,执行下面的命令,复制预定义文件为.config:

此时已经可以编译了,我的目标是做最少的修改,内核能引导起来就行,也就是内核能运行起来,并且能够输出log。所以我先用默认配置编译,下载到板子看效果,然后再根据情况做进一步的操作。下面我会按照版本讲述不同版本遇到的问题和解决办法,以供大家参考。

(实际做移植肯定要尽可能裁剪掉不需要的东西,否则编译费时间,编译出来的文件还大)

在开始之前,我们先通过命令make menuconfig见一见linux内核的配置界面

最上面一行可以看到使用的配置文件、平台和内核版本,这里就可以确认你的交叉编译环境是否配置正确。这个界面不同的版本会有所不同,需要大家灵活应对。

2.6.30-2.6.34

这几个版本用4.3.3编译需要额外修改kernel/timeconst.pl

编译通过后下载到板子可以直接引导运行,没什么特别需要注意的,比较顺利。

2.6.35

到这个版本就出现问题了,跟上面通用的方法,这次运行卡在了booting the kernel这里

之后也没有任何输出,然后在网上找到了一个blog的这一段话

尝试后发现真的可以了。可见,linux旧内核可以的行为在新内核不一定可以。当然这里进一步的原因我没有深究,因为后边linux的升级版本又恢复到不需要去掉其他板子也可以运行的状态了。

(对于上面的文章是转载的,我没有找到原出处,我就不列出转载源了,感兴趣自己搜索吧)

3.4.y

这个版本更绝,上来就是未定义的指令,直接重启。

按照之前的思路去掉其他不用的板子,然后成这样了

遇到这种情况不要慌,内核提供了调试信息,我们打开调试信息或许能获得线索,之前的版本或许也可以,不过我到这个版本才发现这个配置,你如果是之前的版本可以试试。

编译下载

这里可以看到波特率是0,很明显有问题。我在uboot的bootargs传入了115200,但是这里没有收到。不卖关子了,这个版本内核加入了设备树,uboot传参的方式已经发生了变化,而我的uboot是旧的,所以需要配置内核用旧的方式传参。

之后再次编译下载就能正常输出了,说明uboot的传参成功了

当然内核在这里也提示这种方式过时了,赶紧升级uboot吧。

3.19

这个版本用默认预定义配置不会出现未定义指令,直接能输出乱码,那看来就是传参问题了。

开启旧方式传参,这个版本把这个选项放到了boot options下,

编译下载,这次启动就OK了。

到这里可以发现内核的兼容性又变好了,不需要过多的裁剪也可以正常运行,可见内核升级就是一个不断出现问题又改进问题的过程。

4.19.y

这个版本make时开始提示编译器太老了,需要升级。

换成最新的编译器

继续编译就OK了。

默认下载进去启动不了

但是之前已经确认传参有问题,先改成旧的方式,编译下载后可以了。

5.19.y

这次在s3c2410_defconfig的基础上直接开启用旧的方式传参,编译下载。

直接可以启动。注意看,此时内核的大小是4M,而最开始2.6.35的才2M,直接翻倍了。从log也可以看出来内核结构发生了巨大的变化。

6.2.y

修改和配置同5.19,编译引导也正常。

Linux内核6.3以后就不支持s3c2440这颗芯片了。当然旧版本的内核也够用了,这么老的芯片很多都用旧内核,没有特殊需求没有升级新内核的必要,这或许也是新版本不再支持的原因吧。

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ff0c7e18629b

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2074760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

沉积层的厚度为自振周期波长的1/4

要理解为什么是1/4,需要明白如下两点。 (1)自振周期(fundamental model, or first harmonic)取决于在某边界条件下可以出现驻波(standing wave)的最短距离。Standing wave, also known as a st…

AI助力水体保护区无人值守垂钓智能预警,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建水体保护区场景下无人值守垂钓智能检测预警系统

保护我们赖以生存的自然生态环境,无疑是一项意义深远且需要长期坚持的任务。自然界的生态系统,由水、气、森林、土壤等多要素组成,它们相互依存、相互影响,共同维系着地球的生态平衡。然而,在人类活动的影响下&#xf…

浅谈进程,线程,协程以及服务端高并发的处理

进程、线程、协程 进程:独立的程序实例,资源开销较大,适合隔离性要求高的任务。 独立性:进程具有独立的内存空间和资源,互不干扰。 资源开销大:由于每个进程都需要分配独立的内存和资源,创建和…

5个常用的物理仿真JavaScript插件

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,ech…

【Python学习手册(第四版)】学习笔记21-模块概览

个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 import操作和模块是Python之中程序架构的核心。本文主要介绍了模块、属性以及导入的基础知识,并探索了import语句的操作(搜索、可选编译、…

不同搜索引擎蜘蛛的功能、‌抓取策略与技术实现差异探究

搜索引擎作为互联网信息检索的重要工具,‌其核心功能依赖于背后的“蜘蛛”程序。‌这些蜘蛛程序负责访问互联网上的各种内容,‌并建立索引数据库,‌以便用户能够快速准确地找到所需信息。‌然而,‌不同搜索引擎的蜘蛛在功能、‌抓…

Python爬取静态网页技术解析

内容导读 实现HTTP请求解析网页存储数据静态网页爬取实例 一、实现HTTP请求 1、爬虫场景简介 (1)基本功能 爬虫的基本功能是读取URL和爬取网页内容,这就需要爬虫具备能够实现HTTP请求的功能。请求过程主要包括生成HTTP请求、请求头处理、…

《Programming from the Ground Up》阅读笔记:p95-p102

《Programming from the Ground Up》学习第6天,p95-p102总结,总计8页。 一、技术总结 1.directive(伪指令) 很多资料喜欢把directive和instruction都翻译成“指令”,这样在看到指令这个词时就不知道到底指的是什么?这里参考其它…

文件包含漏洞案例

一、PHP://INPUT Example 1&#xff1a;造成任意代码执行 源代码&#xff1a; <meta charset"utf8"> <?php error_reporting(0); $file $_GET["file"]; if(stristr($file,"php://filter") || stristr($file,"zip://") |…

在技术风暴中站稳脚跟:构建软件服务团队的应急韧性与高效响应力

在数字化浪潮汹涌的今天&#xff0c;软件服务已成为连接用户与企业的桥梁&#xff0c;其稳定性直接关系到用户体验、品牌信誉乃至企业的生存与发展。然而&#xff0c;即便是拥有庞大用户基础和先进技术的平台&#xff0c;如网易云音乐&#xff0c;也难以完全避免技术故障的突袭…

MySQL 系统学习系列 - SQL 语句 DQL 语句的使用(3)《MySQL系列篇-05》

SQL 语句 DQL 多表连接查询 连接与多表查询&#xff1a;连接是在多个表之间通过一定的连接条件&#xff0c;使表之间发生关联&#xff0c;进而能从多个表之间获取数据 基本简介与表之间的搭建&#xff08;用于使用多表查询语句-即准备工作&#xff09; 单词普及(名称)单词连…

HT-360A 360度全向强声广播、应急广播、全向声波驱鸟

1、产品简介 HT-360A多层叠装360向广播是北京恒星科通科技发展有限公司自主研发的一款应急广播专用设备&#xff0c;该设备内部采用4组换能器垂直阵列设置&#xff0c;水平采用指数函数碟形堆叠技术&#xff0c;在垂直方向上多层碟扬声器可实现360度环形垂直阵列&#xff0c;实…

MYSQL集群技术

---------------第一部分---------------------- 一.mysql源码部署 环境&#xff1a;rhel7.9 1.1.下载安装包 官网&#xff1a;http://www.mysql.com 1.2.在linux下部署mysql 1.创建登录用户和数据目录&#xff0c;并给数据目录赋权&#xff0c;因为配置文件读取需要权限&…

Delphi5实现秒钟程序

效果图 目的 这个项目非常简单&#xff0c;开发这个是为了方便看秒钟&#xff0c;进行秒杀活动。 虽然目前啥也抢不到&#xff0c;但是有志者事竟成。 完整代码 unit Unit1;interfaceusesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Dialogs, For…

了解prolog规则

要推理先要有规则&#xff1b; 假设有一条规则&#xff0c; 如果X和Y是朋友&#xff0c;那么Y和X也是朋友&#xff1b; 这条规则写成这样&#xff0c; friend(X,Y) :- friend(Y, X). X和Y都是大写&#xff0c;表示这是两个变量&#xff1b;符号 :- 表示推理关系&…

多语言无障碍沟通:2024年英语翻译工具新趋势

随着科技的快速发展&#xff0c;一系列以人工智能为核心驱动的英语翻译工具应运而生&#xff0c;它们如同桥梁简化了跨越语言障碍的交流过程。本文将引领你深入探索这些神奇的英语翻译工具&#xff0c;揭示它们如何助力我们轻松跨越语言鸿沟&#xff0c;实现无缝的跨文化沟通。…

谷歌、火狐及Edge等浏览器中实现allWebPlugin中间件自动安装及升级

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

wp-autopost-pro 3.7.8最新完美版

插件简介&#xff1a; 插件是wp-autopost-pro 3.7.8最新版本。 采集插件适用对象 1、刚建的wordpress站点内容比较少&#xff0c;希望尽快有比较丰富的内容&#xff1b; 2、热点内容自动采集并自动发布&#xff1b; 3、定时采集&#xff0c;手动采集发布或保存到草稿&#xff…

Python酷库之旅-第三方库Pandas(099)

目录 一、用法精讲 426、pandas.DataFrame.at属性 426-1、语法 426-2、参数 426-3、功能 426-4、返回值 426-5、说明 426-6、用法 426-6-1、数据准备 426-6-2、代码示例 426-6-3、结果输出 427、pandas.DataFrame.iat属性 427-1、语法 427-2、参数 427-3、功能 …

LeetCode //C - 331. Verify Preorder Serialization of a Binary Tree

331. Verify Preorder Serialization of a Binary Tree One way to serialize a binary tree is to use preorder traversal. When we encounter a non-null node, we record the node’s value. If it is a null node, we record using a sentinel value such as ‘#’. For…