树莓派交叉编译和Linux内核编译

本文详细介绍了交叉编译的概念及其应用场景,特别是在资源有限的目标平台上。针对树莓派,解释了为何需要交叉编译,以及如何安装和配置交叉编译工具链。接着,讨论了如何进行带wiringPi库的交叉编译,解决库格式不匹配的问题。此外,文章还阐述了树莓派Linux内核的配置步骤和编译过程,包括驱动代码的编写、内核配置和模块编译。最后,讲解了如何将编译后的内核镜像和驱动文件安装到树莓派上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.什么是交叉编译:

        交叉编译 是在一个平台上生成另一个平台上的可执行代码。 我们再windows上面编写C51代码,并编译成可执行代码,如xx.hex, 是在c51上面运行,不是在windows上面运行,我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行,不是在ubuntu linux上面运行

编译:是在一个平台上生成在该平台上的可执行代码。

二.为什么要交叉编译:
        1.因为目的平台上的资源贫乏,无法运行我们所需要编译器
        2.树莓派是不是就不需要交叉编译?
            错。也要  树莓派有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器,操作系统也是代码,也要编译。

3.平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心

        宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
        目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。

三.交叉编译工具链的安装

        1.下载地址:https://github.com/raspberrypi/

        2.从共享文件夹拷贝到工作目录:cp /mnt/hgfs/share/tools-master.zip .
        3.解压:unzip tools-master.zip

        4.进入目标文件夹: cd /home/wkk/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
        5.pwd获得路径;echo $PATH 获得当前环境变量的值

        6.临时有效,配置环境变量
        PATH 环境变量 export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
        7.永久有效,配置环境变量

                7.1.修改工作目录下的.bashrc 隐藏文件,配置命令终端的:vi /home/CLC/.bashrc 
                7.2在文件最后一行加入export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
                7.3.source /home/CLC/.bashrc 加载配置文件,马上生效配置。

四.交叉编译文件:

        1.检查下交叉编译工具对不对:arm-linux-gnueabihf-gcc -v4.8.3

        2.编译文件:arm-linux-gnueabihf-gcc  xxx.c -o xxx

        3.如何把编译生成的可执行文件下载到开发板:
                scp clientInPi pi@192.168.43.30:/home/pi
                指令  文件名  开发板用户名@开发板地址:开发板的绝对路径

五. 带wiringPi库的交叉编译如何进行
        1. 正常我们先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的试试,链接库的格式也是正确的。
        2. 通过-I -L来指定:

                -I(大写i)表示将路径 /home/CLC/lessonPI/WiringPi/wiringPi作为第一个寻找头文件的目录,寻找的顺序是:/home/CLC/lessonPI/WiringPi/wiringPi-->/usr/include-->/usr/local/include 。

                -L 表示先以指定的路径作为第一个寻找库文件的目录,寻找的顺序是:指定路径-->/lib-->/usr/lib-->/usr/local/lib

                -l(小写L) 参数就是用来指定程序要在-L指定的路径中链接的库,-l参数紧接着就是库名。
         
                 因为链接的库的格式不对,是宿主机的平台,出现以下错误
        arm-linux-gnueabihf-gcc demo2.c -I /home/CLC/lessonPI/WiringPi/wiringPi -lwiringPi
        /home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lwiringPi
        collect2: error: ld returned 1 exit status

        3. 把树莓派的wringPI库拿上来用

               3.1 软链接:
                参考文章: https://www.cnblogs.com/zhangna1998517/p/11347364.html
                概念:
                     1. 软链接文件有类似于Windows的快捷方式。
                     2. 在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
                     3. 你选定的位置上生成一个文件的镜像,不会占用磁盘空间

                如何生成:
                                ln -s libwiringPi.so.2.50 libwiringPi.so 
                                指令 参数   要被链接的文件    软链接文件名字

                3.2硬链接:ln libwiringPi.so.2.50 libwiringPi.so 
                         它会在你选定的位置上生成一个和源文件大小相同的文件

六.树莓派Linux源码目录树分析

        1.参考资料:https://www.cnblogs.com/senior-engineer/p/4929703.html
        2.大约1.3w个C文件  1100w行代码,Linux是开源,免费,LInux开源社区工作者共同维护,爱好,Linux是一个开源的,支持多架构多平台代码,可以执行非常高,但是Linux内核编译出来一般就几M.   4M,因为支持多平台,多架构,所以编译之前要配置,配置成适合的目标平台来用

   ARM: 海思 友善之臂 RK 树莓派 nanoPi
    X86:           PowerPC   MIPS

七.树莓派Linux源码配置

        1.驱动代码的编写
                1.1驱动代码的编译需要一个提前编译好的内核,编译内核就必须配置,配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核
               1.2 厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码
                    第一种方式:
                        cp 厂家.config .config
                    第二种方式:
                        make menuconfig 一项项配置,通常是基于厂家的config来配置
                    第三种方式:
                        完全自己来
       2.如何配置树莓派的Linux内核

                    驱动两种加载方式:
                            1. 编译进内核  zImage包含了驱动
                            2. M 模块方式生成驱动文件xxx.ko  系统启动后,通过命令inmosd xxx.ko 加载
                   内核配置:
            ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
            指定ARM架构   指定编译器                      树莓派          主要核心指令

八.树莓派Linux内核编译  

                8.1编译:
            ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules
dtbs
                                                                            make指定用多少电脑资源进行编译
                                                                            zImage生成内核镜像
                                                                            modules要生成驱动模块
                                                                            dtbs生成配置文件

               8.2 编译成功后,看到源码树目录多了vmlinux,失败则无此文件,成功后,目标zImage镜像arch/arm/boot底下

               8.3 打包zImage成树莓派可用的xxx.img
                    ./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

               8.4 数据拷贝
                        8.4.1mkdir data1 data2(注意权限要为可读可写)
                        8.4.2 挂载U盘
                              ​​​​​​​  sudo mount /dev/sdb1 data1   一个fat分区,是boot相关的内容,kernel的img
                                sudo mount /dev/sdb2 data2   一个是ext4分区,也就是系统的根目录分区。

              8.5安装modules, 设备驱动文件:(支持 hdmi usb wifi io ...)
                       sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/chenlc/data2 modules_install

             8.6 安装更新 kernel.img 文件,注意镜像名字是kernel7.img
                       8.6.1 先备份
                                    cd /home/chenlc/data1
                                    cp kernel7.img kernel7OLD.img
                      8.6.2 再把编译新生成的拷贝到data1,起名kernel7.img
                                   cp kernel_new.img /home/chenlc/data1/kernel7.img
            8.7 拷贝配置文件
                        cp arch/arm/boot/dts/.*dtb* /home/chenlc/data1

目 录 译者序 第7版序言 第一部分 基础知识 第1章 数据库管理概述 1 1.1 引言 1 1.2 什么是数据库系统 3 1.3 什么是数据库 6 1.4 为什么用数据库 10 1.5 数据独立性 12 1.6 关系系统及其他 15 1.7 小结 17 练习 17 参考文献和简介 19 部分练习答案 19 第2章 数据库系统体系结构 22 2.1 引言 22 2.2 三级体系结构 22 2.3 外模式 24 2.4 概念模式 26 2.5 内模式 26 2.6 映象 27 2.7 数据库管理员 27 2.8 数据库管理系统 28 2.9 数据通信管理器 31 2.10 客户/服务器体系结构 31 2.11 工具 33 2.12 分布式处理 33 2.13 小结 35 练习 35 参考文献和简介 36 第3章 关系数据库介绍 38 3.1 引言 38 3.2 关系模型概述 38 3.3 关系和关系变量 41 3.4 关系的含义 42 3.5 优化 44 3.6 数据字典 45 3.7 基本关系变量和视图 46 3.8 事务 49 3.9 供应商和零件数据库 49 3.10 小结 51 练习 52 参考文献和简介 53 部分练习答案 54 第4章 SQL概述 55 4.1 引言 55 4.2 综述 56 4.3 目录 58 4.4 视图 59 4.5 事务 59 4.6 嵌入式SQL 59 4.7 SQL是不完美的 66 4.8 小结 66 练习 67 参考文献和简介 68 部分练习答案 73 第二部分 关系数据模型 第5章 域、关系和基本关系变量 77 5.1 引言 77 5.2 域 79 5.3 关系值 86 5.4 关系变量 90 5.5 SQL的支持 93 5.6 小结 96 练习 97 参考文献和简介 98 部分练习答案 101 第6章 关系代数 106 6.1 引言 106 6.2 关系封闭性 107 6.3 语法 109 6.4 语义 110 6.5 举例 117 6.6 关系代数的作用 119 6.7 附加的操作符 120 6.8 分组与分组还原 125 6.9 关系比较 127 6.10 小结 128 练习 129 参考文献和简介 131 部分练习答案 133 第7章 关系演算 140 7.1 引言 140 7.2 元组演算 141 7.3 举例 147 7.4 关系演算与关系代数的比较 149 7.5 计算能力 152 7.6 域演算 153 7.7 SQL语言 155 7.8 小结 162 练习 163 参考文献和简介 165 部分练习答案 167 第8章 完整性 179 8.1 引言 179 8.2 类型约束 180 8.3 属性约束 181 8.4 关系变量约束 182 8.5 数据库约束 182 8.6 黄金法则 183 8.7 静态约束和动态约束 184 8.8 码 185 8.9 SQL对完整性的支持 191 8.10 小结 194 练习 194 参考文献和简介 196 部分练习答案 201 第9章 视图 209 9.1 引言 209 9.2 视图的用途 211 9.3 视图检索 213 9.4 视图更新 214 9.5 快照 225 9.6 SQL对视图的支持 226 9.7 小结 227 练习 228 参考文献和简介 229 部分练习答案 232 第三部分 数据库设计 第10章 函数依赖 238 10.1 引言 238 10.2 基本概念 239 10.3 平凡的函数依赖和非平凡的函数 依赖 241 10.4 依赖集的闭包 241 10.5 属性集的闭包 242 10.6 最小函数依赖集 244 10.7 小结 245 练习 246 参考文献和简介 247 部分练习答案 249 第11章 进一步规范化Ⅰ:1NF、2NF、 3NF和BCNF 252 11.1 引言 252 11.2 无损分解和函数依赖 254 11.3 第一、第二和第三范式 257 11.4 保持函数依赖 262 11.5 BOYCE/CODD范式 264 11.6 具有关系值属性的关系变量 268 11.7 小结 270 练习 270 参考文献和简介 272 部分练习答案 274 第12章 进一步规范化Ⅱ:高级范式 282 12.1 引言 282 12.2 多值依赖与第四范式 282 12.3 连接依赖与第五范式 285 12.4 规范化过程小结 289 12.5 逆规范化 291 12.6 正交设计 292 12.7 其他的规范化形式 295 12.8 小结 296 练习 296 参考文献和简介 297 部分练习答案 302 第13章 语义建模 306 13.1 引言 306 13.2 总体方法 307 13.3 E/R模型 309 13.4 E/R图 312 13.5 基于E/R模型的数据库设计 313 13.6 简单分析 317 13.7 小结 319 练习 320 参考文献和简介 321 第四部分 事务管理 第14章 恢复 333 14.1 引言 333 14.2 事务 334 14.3 事务恢复 335 14.4 系统恢复 337 14.5 介质恢复 338 14.6 两阶段提交 338 14.7 SQL对事务的支持 339 14.8 小结 340 练习 341 参考文献和简介 341 部分练习答案 345 第15章 并发 347 15.1 引言 347 15.2 三个并发问题 347 15.3 锁 349 15.4 重提三个并发问题 350 15.5 死锁 352 15.6 可串行性 353 15.7 隔离级别 354 15.8 意向锁 355 15.9 SQL的支持 357 15.10 小结 358 练习 359 参考文献和简介 360 部分练习答案 365 第五部分 高级专题 第16章 安全性 369 16.1 引言 369 16.2 自主存取控制 371 16.3 强制存取控制 375 16.4 统计数据库 377 16.5 数据加密 381 16.6 SQL的支持 384 16.7 小结 386 练习 387 参考文献和简介 388 部分练习答案 390 第17章 优化 394 17.1 引言 394 17.2 一个启发性的例子 395 17.3 查询处理概述 396 17.4 表达式变换 399 17.5 数据库统计信息 403 17.6 分而治之的策略 404 17.7 关系操作的实现算法 406 17.8 小结 410 练习 411 参考文献和简介 413 部分练习答案 430 第18章 信息空缺 432 18.1 引言 432 18.2 3VL方法概述 433 18.3 上述方案所造成的某些结果 437 18.4 空值和码 440 18.5 外连接 442 18.6 特殊值 444 18.7 SQL的支持 444 18.8 小结 447 练习 448 参考文献和简介 449 部分练习答案 452 第19章 类型继承 454 19.1 引言 454 19.2 类型的层次结构 457 19.3 多态性和可置换性 459 19.4 变量与赋值 462 19.5 约束特化 465 19.6 比较 467 19.7 操作、版本和签名 470 19.8 一个圆是一个椭圆吗 473 19.9 约束特化—再次讨论 476 19.10 小结 478 练习 479 参考文献和简介 480 部分练习答案 481 第20章 分布式数据库 484 20.1 引言 484 20.2 一些预备知识 484 20.3 十二个目标 487 20.4 分布式系统面对的问题 493 20.5 客户/服务器系统 502 20.6 DBMS独立性 504 20.7 SQL的支持 508 20.8 小结 509 练习 509 参考文献和简介 510 第21章 决策支持 518 21.1 引言 518 21.2 决策支持的特征 519 21.3 决策支持的数据库设计 520 21.4 数据准备 525 21.5 数据仓库和数据集市 527 21.6 联机分析处理 530 21.7 数据挖掘 535 21.8 小结 536 练习 537 参考文献和简介 538 部分练习答案 540 第22章 时态数据库 541 22.1 引言 541 22.2 时态数据 542 22.3 问题是什么 544 22.4 时间间隔 548 22.5 间隔类型 549 22.6 间隔上的标量操作符 551 22.7 间隔上的聚集操作符 551 22.8 与间隔有关的关系操作符 552 22.9 间隔上的约束 557 22.10 间隔上的更新操作符 559 22.11 关于数据库设计 560 22.12 小结 562 练习 563 参考文献和简介 563 部分练习答案 565 第23章 基于逻辑的数据库 567 23.1 引言 567 23.2 综述 567 23.3 命题演算 569 23.4 谓词演算 572 23.5 数据库的证明理论观点 577 23.6 演绎数据库系统 580 23.7 递归查询过程 583 23.8 小结 588 练习 589 参考文献和简介 590 部分练习答案 596 第六部分 对象和对象/关系数据库 第24章 对象数据库 599 24.1 引言 599 24.2 对象、类、方法和消息 602 24.3 进一步的分析 605 24.4 一个详实的例子 611 24.5 混合性问题 618 24.6 小结 624 练习 626 参考文献和简介 627 部分练习答案 634 第25章 对象/关系数据库 637 25.1 引言 637 25.2 第一个根本性错误 639 25.3 第二个根本性错误 644 25.4 实现上的问题 645 25.5 真正融合的好处 647 25.6 小结 648 参考文献和简介 649 附 录 附录A SQL表达式 657 附录B SQL3概览 666 附录C 缩略语和符号 678
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值