构建嵌入式系统交叉内核源码树

Linux驱动之Ubuntu下下载内核源码——学习笔记(7) PC操作系统:Ubuntu 16.04 LTS 内核版本:4.4.0-21-generic 编译器:gcc 5.4.0 主要是方便验证一些驱动的小问题。 一、下载内核源码 1、查看Ubuntu当前所使用的内核版本 执行命令 uname -r 可以查询。 2、查看一下可以下载的内核源码版本 执行命令 apt-cache search linux-source 可以查询。 可以看到有4.4.0版... 阅读详情

在学习过程中,发现几乎所有的驱动书籍都忽略了一个问题,那就是内核源码树的构建编译。而网上大部分的资料也都忽略或者没写清楚了一个问题,当开发板的内核版本和PC机的内核版本不一致时,当开发板和pc机CPU架构不一致时内核源码树的构建。以及当内核版本不一致时Makefile的编写细节。


例如,我的系统是Ubuntu12.04,内核版本是3.8.0-36,CPU架构是x86;而我的开发板版本是2.6.30.4,CPU架构是arm。该如何构建?

而这些问题,对于像我这种交叉编译基础不是很好的家伙来说,会产生迷茫。

---------------------------------------------------------------------------------

PC机:Ubuntu 12.04 LTS 64位

arm-linux-版本:4.4.3

开发板:TQ2440

开发板版本:2-6-30.4

参考资料:韦东山视频第一期,LDD3,网上其他资料。

---------------------------------------------------------------------------------

一,下载内核源码。https://www.kernel.org/pub/。下载和开发板版本一致的源码。

通常,这些源码开发板配套光盘会有,但是不知什么原因,配套的源码编译不上。于是我去下载了完整的源码。


二,将源码解压到你自己喜欢的工作目录。

sudo tar -vxf linux-2.6.30.4.tar.bz2 -C /opt

三,从配套光盘源码下复制一份配套设置。 因为我们是为开发板编译内核源码树,采用默认的pc机配置比较容易出问题,耗时也比较久。更重要的是,这时候我们(至少我)对内核裁剪还不熟悉,拿来主义最好了。

我开发板上厂家给我烧写的镜像配置文件是config_EmbedSky_W43。

复制下配置文件。

sudo cp config_EmbedSky_W43 .config

打开内核配置单

sudo make menuconfig

直接拉到倒数第二项,load an Alternate这项,将.config配置载入进去。

退出,退出,警告是否保持配置退出,选择YES保存配置。

可能的问题:menuconfig找不到命令之类的,缺少相关库文件,把错误代码百度一下就可以解决。


四,修改交叉编译器参数

不知道是何原因,大概是编译器比较新,编译出的内核是基于arm v5架构的,但是我的TQ2440是基于arm v4架构的。如果直接make,会出现内核模块版本不一致的问题。

因此修改交叉编译器路径下的参数,以我的交叉编译器为例,我的交叉编译器路径是/opt/FriendlyARM/toolschain/4.4.3/bin

删除bin目录下的三个链接脚步文件。

sudo rm -f arm-linux-gcc arm-linux-gcc-4.4.3 arm-linux-g++

重新新建并编辑这三个文件

sudo vim arm-linux-gcc

在打开的文件中输入

#!/bin/sh
arm-none-linux-gnueabi-gcc -march=armv4t $*

给该文件赋予执行权限

sudo chmod a+x arm-linux-gcc
其他两个文件同样的操作,其中不同是arm-linux-***的***处改成刚才删掉相对应的两个文件的后缀。

可能的问题:需要对linux和vim操作有点了解。


五,给内核打补丁

编译过程中发现问题,估计是gcc版本和内核版本的冲突导致。

问题描述:undefinedreference to `__gnu_mcount_nc'

解决,百度下载文件__gnu-mcount-nc-patch.patch

直接放入源码跟目录:gunzip __gnu-mcount-nc-patch.patch | patch p1

参考:http://blog.sina.com.cn/s/blog_7d3976fc01012itz.html

六,编译

sudo make

可能的问题:找不到arm-linux-gcc命令,这是因为sudo命令会重置默认路径,需要修改visudo文件。

http://www.cnblogs.com/A-Song/archive/2013/03/09/2951951.html这篇文章会给你答案。

七,安装内核

sudo make modules
sudo make modules_install
至此基于TQ2440的内核源码树编译完成

八,驱动程序Makefile编写

 KERN_DIR = /opt/linux-2.6.30.4
     obj-m +=first_drv.o
 modules:
      make -C $(KERN_DIR) M=/home/zero/weidongshan/led_dev modules
 
  clean:
      make -C $(KERN_DIR) M=/home/zero/weidongshan/led_dev modules clean
       rm -rf modules.order

 可能的问题:这个Makefile并不规范,因此不能当作范本。

 这是根据韦东山视频来着,但obj-m是放在最后,我测试无法通过。此外,他的M后面的路径是M='pwd',无法通过编译,就算把路径改成M=$(PWD)照样无法通过编译,只有改成这样才能通过,原因暂时不明。

最后,这个不要直接复制,会出问题。

九,安装内核。

将生产的ko文件载入到开发板上,我就是犯了没弄清究竟是谁需要ko文件的问题。

在开发板的串口界面,载入。

insmod first_drv.ko

如果成功,用cat /proc/devices查看模块就可以看到了。

至于以后加载驱动,测试驱动,那是另外的文章了。

最初我走了弯路的原因是交叉编译的基本概念不是很清楚。pc机用开发板的内核编译,载入到开发板上加载内核和程序测试。

Petalinux2018.3实战:从零构建Linux驱动(交叉编译详解) 本文详细介绍了使用Petalinux 2018.3从零开始构建Linux驱动的完整流程,重点解析了交叉编译环境的搭建与配置。通过“Hello World”模块和GPIO驱动实战案例,手把手指导开发者定位内核源码、编写驱动Makefile,并最终在Zynq/MPSoC硬件平台上完成测试,帮助开发者深入理解驱动开发与交叉编译的核心原理。 阅读详情

相关推荐

Linux 内核源码树 | 九七的Linux

Linux 内核源码树 一、定义介绍 Linux内核源码树其实就是Linux内核源码,只不过源码的组织形式是从根目录开始,包含各种文件夹,开发人员把这些文件夹以及文件夹之间的联系画成一副类似树一样的图,因此Linux内核源码就被形象地称之为树。 编译Linux内核源码树:编译Linux内核源码树的意思其实就是编译Linux内核源码。 二、功能作用 本质上就是和建立一个目录一样,为了方便直观 三、源码树的分支内容 arch:architecture,体系结构。此目录包括了所有和体系结构相关的核心代码。它下面的

九七的博客 1421

如何在Debian或Ubuntu上安装完整的内核源码

原文地址:http://ask.xmodulo.com/install-full-kernel-source-debian-ubuntu.html 原创:LCTT https://linux.cn/article-5015-1.html                          本文地址:https://linux.cn/article-5015-1.html

Oliverlyn的专栏 1895

Linux嵌入式系统的安装和配置

交叉编译工具链包括交叉编译器和相关工具,用于将源代码编译成在目标嵌入式平台上运行的可执行文件。配置引导加载程序以引导内核和文件系统,并将引导加载程序的二进制文件复制到目标嵌入式系统的启动介质上。在安装Linux嵌入式系统之前,首先需要选择一个适合嵌入式环境的Linux发行版。嵌入式系统是一种专门设计用于嵌入式设备的操作系统,它通常用于嵌入式计算机、物联网设备和其他资源受限的系统。编译完成后,将生成的内核映像文件(例如zImage或uImage)复制到目标嵌入式系统的启动介质上。选择合适的Linux发行版。

PixeGO的博客 490

在ubuntu虚拟机上安装不同版本的交叉编译工具链

在之前的章节中,学习了如何安装了4.8.3的交叉编译工具链;但是,在之后学习内核编译时,由于我的树莓派内核版本较高,为6.1,所以在使用4.8.3版本的交叉编译工具链来进行内核配置的时候会提示版本过低,所以只好安装更高版本的交叉编译工具链

mjmmm的博客 1368

实时嵌入式系统

实时嵌入式系统 该存储库包含2019-2020Spring在塞萨洛尼基亚里士多德大学电气和计算机工程系教授的``实时嵌入式系统''学术课程的作业。 该项目的目的是通过开发生产者-消费者变体来熟悉C的pthreads库。 这项工作分为两个可交付成果,分别负责优化使用者线程的数量以最大程度地减少每个项目的排队时间,并创建一个计时器以特定频率执行项目。 最后,源代码将安装在Raspberry-Pi上,并且实验将在园区内实时进行。 1.1。 队列中的平均时间〜使用者线程数 本报告分析了FIFO循环队列的实现,该循环包含使用pthreads作为生产者-消费者问题的变体的指向函数和参数的指针,以及测量各项保留在队列中的时间的结果。 已经创建了指向函数的指针和指向参数的指针的列表,作为要访问的每个线程的全局变量,这些变量可以进行简单的打印输出或计算数学函数。 main函数生成生产者的P线程和消费者的

linux源代码目录树结构图解

linux 源代码目录树结构图解,希望能帮助大家更直观的,更好的了解Linux内核的结构。

一篇让你弄懂交叉编译器的制作教程

1.准备交叉编译器的源码包 1.1上传源码包到opt目录下,下载链接地址郭工 ftp://iot-yun.zicp.net/linux_tools/ 1.2修改/opt目录权限 leiyuxing@centos6 桌面]$ cd [leiyuxing@centos6 ~]$ sudo chmod 777 /opt/ [leiyuxing@centos6

1、测试博主技术知识分享 2、pos行业知识技术分享 3、java后端技术知识分享 4、嵌入式技术知识分享 5、运维部署相关知识分享 3755

嵌入式开发源码

配套数据:https://www.linuxprobe.com/embedded-linux-development.html

Ubuntu构建内核源码树

输入:apt-cache search linux-source //查看内核版本 输入:apt-get install linux-source-3.0.0 //获取对应版本的内核,默认安装在/usr/src目录下 见: Ubuntu下构建内核源码树的方法   ubuntu下编译本机模块是否需要下载内核源码呢? 答案是可以的。 dmesg | tai

BeWithYou818的专栏 755

嵌入式系统编程源代码分析

随着工业自动化的来临,嵌入式系统越来越广泛地应用在各行各业中,对嵌入式软件的需求也日趋增大。与过去不同,开发嵌入式软件的工作正在变得更容易也更快速。本书主要介绍了嵌入式系统的基本概念、实际应用、硬件结构、软件开发环境和工具,并通过对大量实例的研究,提供了使用各种硬件平台、操作系统、编程语言和开发工具来完成嵌入式软件开发的方法。本书还对嵌入式系统和嵌入式软件开发的未来趋势进行了讨论。  本书所附带的超值光盘中包含7800行源代码,均为专业质量的嵌入式系统应用程序。  本书重点突出,语言简练,内容丰富,实用性强,适合具备一定C、C++和Java应用知识并且想要从事嵌入式软件开发工作的软件专业人士使用,对于想要了解嵌入式系统的读者也有启迪作用。

自己移植的x210开发板uboot源码

自己移植的x210开发板uboot源码

在ubuntu下获取对应内核源码命令

输入:apt-cache search linux-source //查看内核版本 输入:apt-get install linux-source-3.0.0 //获取对应版本的内核,默认安装在/usr/src目录下 见: Ubuntu下构建内核源码树的方法   ubuntu下编译本机模块是否需要下载内核源码呢? 答案是可以的。 dmesg | tai

haokaihaohe110的专栏 2万+

SQL注入绕过information_schema:实战技法与替代路径详解

SQL注入是Web安全领域的核心漏洞类型,其原理是通过构造恶意SQL语句,干扰应用程序与数据库的正常交互逻辑,从而窃取或篡改数据。在渗透测试与CTF竞赛中,绕过常见防护措施是提升技术能力的关键。当标准的信息收集方式受阻时,例如无法访问information_schema数据库,攻击者需要掌握替代的元数据获取方法。这些技术价值在于模拟真实环境中日益严密的防御体系,锻炼在受限条件下的系统性信息收集思维。典型的应用场景包括存在WAF过滤、权限限制或编码干扰的实战环境。本文将围绕SQL注入这一核心,深入探讨如何利用

weixin_33980459的博客 429

linux构建内核树,为arm平台构建linux内核树

为arm平台构建linux内核树(2011-06-22 09:39:07)转载▼标签:分类:Linux杂谈前面说到要编写Linux 2.6的驱动,必须建立内核源码树,前面建立的源码树是针对i686平台的,但是我么嵌入式系统用的是arm平台,所以也要建立arm平台的内核源码树。首先下载与你嵌入式系统平台版本号一致的linux内核,我的版本为2.6.30.第一步:先解压源代码tar -jxvf lin...

weixin_29740913的博客 158

从Delphi 7到Delphi 10.4.1的代码迁移:关键挑战与实用解决方案

本文详细探讨了从Delphi 7升级到Delphi 10.4.1进行代码迁移的关键挑战与实用解决方案。核心内容包括应对Unicode字符串处理、64位数据类型变化、VCL/FMX界面框架选择、第三方组件迁移以及数据库层现代化改造(如从BDE迁移至FireDAC)。文章为开发者提供了系统的迁移前准备、核心问题攻克策略及测试落地指南,旨在帮助团队高效、平稳地完成系统现代化升级。

weixin_29250403的博客 531

Kettle 连接 Oracle 数据库全流程指南

例如:C:\Oracle\product\19.0.0\dbhome_1\jdbc\lib\ojdbc8.jar 2. 替换 Kettle 驱动文件 将驱动文件复制到 Kettle 的 目录: 删除旧版本驱动:如 ojdbc14.jar 只能保留一个oracle驱动 重启 Kettle 以加载新驱动 二、配置数据库连接 1. 启动 Kettle 并新建转换 运行 (Windows)或 (Linux)。 新建转换(Transformation),添加 “表输入” 步骤,双击进入配置。 2.

qq_44724453的博客 3481

内核源码树的构建2

J 博客园首页新随笔订阅管理 随笔- 59  文章- 0  评论- 20  为arm平台构建linux内核树 前面说到要编写Linux 2.6的驱动,必须建立内核源码树,前面建立的源码树是针对i686平台的,但是我么嵌入式系统用的是arm平台,所以也要建立arm平台的内核源码树。 首先下载与你嵌入式系统平台版本号一致

heixiaolong7的博客 557

S32DS IDE调试技巧:如何用Attach功能高效定位汽车电子MCU的Bootloader问题

本文详细介绍了在汽车电子MCU开发中,如何利用S32DS IDE的Attach调试模式高效定位Bootloader与应用程序的协同问题。通过对比常规调试与Attach模式的本质差异,并深入讲解工程配置、镜像合并及实战调试流程,帮助开发者在不复位、不重新下载程序的前提下,实时分析系统状态,快速解决内存映射冲突、中断向量表重定向等疑难杂症。

weixin_29168393的博客 266

为arm平台构建linux内核树

http://www.cnblogs.com/Jezze/archive/2011/12/23/2299873.html 前面说到要编写Linux 2.6的驱动,必须建立内核源码树,前面建立的源码树是针对i686平台的,但是我么嵌入式系统用的是arm平台,所以也要建立arm平台的内核源码树。 首先下载与你嵌入式系统平台版本号一致的linux内核,我的版本为2.6.30. 第一步:先

ccsu_ms的专栏 608

ODrive0.5.5源码分析(1) ADC的处理

odrive 0.5.5 ADC

danger的博客 4307

第6章: MMU Notifier在KVM虚拟化中的应用

本文分析了KVM如何利用MMU Notifier机制维护客户机与宿主机地址映射一致性。KVM采用三层地址空间转换架构(GVA→GPA→HPA),通过硬件辅助虚拟化(EPT/NPT)实现高效转换。重点探讨了KVM MMU Notifier回调实现,包括invalidate_range_start/end等核心函数,以及HVA范围处理流程。当宿主机内存变化时,KVM通过注册的notifier回调及时更新映射关系,确保虚拟化环境的内存一致性。文章详细解析了相关数据结构和关键代码实现,揭示了KVM内存管理的核心机制

图形/计算GPU的驱动与虚拟化技术分享园地 2321

x86下构建arm的的linux内核树

为arm平台构建linux内核树 日期:2011-06-22 | 分类:Linux | Tags:杂谈 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://jezze.blogbus.com/logs/156176240.html     前面说到要编写Linux 2.6的驱动,必须建立内核源码树,前面建立的源码树是针对i686平台的

HULIHONG的专栏 1076

基于Simulink的四足机器人关节力矩优化仿真建模示例

高自由度:每个腿至少有3个自由度(DOF),增加了控制的复杂性。非线性动力学:涉及多体系统的相互作用,包括接触力、摩擦力等。能量消耗:减少不必要的能量消耗是提升续航能力和效率的关键。可以是最小化能量消耗或最大化稳定性等。matlab深色版本% 示例代码通过本指南,我们介绍了如何基于Simulink搭建一个四足机器人的关节力矩优化模型,并进行了仿真以验证其基本功能。

amy_mhd的博客 171

嵌入式Linux驱动开发环境深度配置:从内核树构建到GDB调试

嵌入式Linux驱动开发环境深度配置的关键环节包括内核树构建与GDB调试。内核树构建涉及获取内核源码、配置Makefile、选择配置方式(makemenuconfig等)、编译内核及安装模块等步骤,需要注意目标平台适配和依赖库安装。GDB调试需要安装调试工具并移植GDBserver到开发板,掌握break、continue、step等核心调试命令,通过调试案例可有效定位驱动问题。开发过程中可能遇到内核配置错误、调试符号缺失等问题,需针对性解决。随着物联网等技术的发展,嵌入式驱动开发工具将趋向自动化与智能化。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 814

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: ANSI,ASCII,Unicode,UTF-8的区别。自认为写得最好的一篇
下一篇: ubuntu12.04 64位构建ARM交叉编译环境
ZeroSkyrim
博客等级 码龄16年 34粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值