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

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万+

opencv 常用函数总结

本文是一份OpenCV图像处理的常用函数总结,详细介绍了图像的读入、显示、保存、像素处理、图像属性获取、基础操作、阈值处理、图像平滑、形态学转换以及直方图处理等关键技术。文章通过代码示例和参数说明,帮助读者快速掌握OpenCV在图像处理领域的应用。

weixin_44063529的博客 1599

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

全本地AI代理实战:零数据外泄的本地化Agent工作流搭建

全本地AI代理是一种将大语言模型推理、长期记忆与工具调用完全运行于用户本地设备的智能体架构,其核心原理在于通过进程隔离与标准化协议实现模型层、记忆层和工具层的解耦协同。相比依赖云端API的传统方案,它在数据主权、响应确定性与环境复现性上具备不可替代的技术价值。典型应用场景包括法务合规文档处理、离线工业现场辅助决策、以及高敏感度企业知识管理。本文聚焦Qwen2+Ollama+SurrealDB+Agno技术栈,详解如何构建可落地的全本地AI代理系统,覆盖从硬件适配、向量记忆建模到多模态插件协同的完整链路。

weixin_34194964的博客 650

jemalloc实战:5分钟搞定C程序内存泄漏检测(附PDF报告生成技巧)

本文详细介绍了使用jemalloc的heap profiling功能快速检测C/C++程序内存泄漏的实战方法。通过预编译库和LD_PRELOAD注入,无需修改代码即可启动低开销剖析,并利用jeprof工具进行深度分析和生成可视化PDF报告,帮助开发者高效定位线上或开发环境中的内存问题。

i3j4k5的博客 224

内核源码树的构建2

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

heixiaolong7的博客 557

网工最容易搞混的三个概念:防火墙、网闸、堡垒机,一文让你轻松搞明白。

网闸的作用可以简单概括为:在两个或多个不同安全级别的网络(如内网和外网、普通网与高安全网、受限网与互联网)之间建立一个严格隔离、信息流转的安全桥梁。它的核心任务是实现数据安全传输与隔离,避免网络之间的直接连接带来的安全隐患。数据传输安全:网闸保证数据从一个网络到另一个网络时,能够进行审查、过滤和转换,防止恶意数据或非法信息被传入内部网络或外部泄露。高安全性隔离:网闸常常用于企业的内外网隔离、军事网络、政府机关等对数据隔离要求极高的环境。

HWP18612324139的博客 3636

为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

树莓派4B没有serial0或ttyS0,serial0没有映射到ttyS0,serial0和serial1调换映射

环境: 树莓派4B,ubuntu mate20 现象 终端输入ls -l /dev,发现只有serial1->ttyAMA0,没有serial0页没有ttyS0,更没有二者的映射。网上很多方法都是树莓派3B和3B+的,我自己试过,不太适用于4B,下面的方法是4B的,我自己用是成功的。 解决方法 cd /boot/firmware sudo gedit config.txt 注意不是/boot下的config,而是/boot/firmware下的config 打开文件后,找到enable_uart=0

qq_41208487的博客 7891

STM32F103C8T6 驱动2位共阳数码管(基于 74HC595 和 PNP 三极管)

整体设计思路是通过 STM32F103C8T6 控制 74HC595 和 PNP 三极管,实现共阳数码管的显示功能。最初的电路设计中,三极管发射极接 5V 电源,这导致了数码管两位显示相同数字的问题。数码管能够稳定显示 0-99的数字。

qq_40289410的博客 2212

x86下构建arm的的linux内核树

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

HULIHONG的专栏 1076

在 SAP 中,应收票据的收取、到期承兑、贴现均有标准操作路径与事务码,以下按业务场景给出操作步骤、T-code、会计分录(含附 / 不附追索权)

摘要:本文详细介绍了SAP系统中应收票据的全流程处理,包括收款(F-36)、到期承兑(F-34/F-20)和贴现(F-33)的标准操作。重点说明了不同业务场景下的事务码使用、操作步骤及对应的会计分录,特别区分了附追索权与不附追索权贴现的处理差异。同时提供了票据查询(FBL5N)和清账(F-32)的辅助功能指引,并汇总了各业务场景的核心会计分录,为财务人员提供了一套完整的SAP应收票据操作指南。(149字)

金牌架构师 263

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

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

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

Simulink仿真模块 - Signal Conversion

目录 说明 实例 创建总线信号的连续副本 ​将虚拟总线转换为非虚拟总线​ 将非虚拟总线转换为虚拟总线 将Muxed信号转换为矢量 模块特性 Signal Conversion:将信号转换为新类型,而不改变信号值 在仿真库中的位置为: Simulink / Signal Attributes HDL Coder / Signal Attributes 模型为: 说明 Signal Conversion模块可将信号从一种类型转换为另一种类型。要选择要...

jk_101的博客 3419

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: 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、付费专栏及课程。

余额充值