编译2022年最新的Linux kernel源码,并用QEMU模拟器运行

作者 将狼才鲸
创建日期 2022-11-26
  • Gitee源码和工程地址:才鲸嵌入式 / 嵌入式QEMU教程
  • CSDN文章地址:项目介绍:嵌入式QEMU教程

  • 前提:编译U-Boot和Linux kernel源码时,源码版本、PC主机Linux系统版本、交叉编译器版本都有影响,最好按照网上教程中相同的版本来尝试,要不然经常会遇到编译时遇到了问题,但又搜不到解决方法的尴尬局面。

  • 必须在Linux系统中编译(如Ubuntu),不能在MSYS2中编译。

1)直接编译Linux源码并运行

2、编译Linux kernel

  • 如果要编译用于BCM2836或ARM CoreTile Express开发板的Linux kernel,则必须要在Linux环境如Ubuntu中编译。一是因为编译过程中有各种依赖库;二是因为kernel源码中有三个以aux命名的文件,这个文件名在Windows环境中不允许存在,在Windows中解压或者拷贝kernel源码时都会报错;如果一定要在Windows下的MinGW中编译,网上找不到任何教程,你可以在kernel源码中强行修改aux文件名和对应的Kconfig、Makefile后,并安装各种依赖库,只能自行尝试;在MSYS2中安装各种依赖库软件也是需要自行摸索的,应该很少有教程。

    • 不要在Windows下git clone kernel源码后再拷贝到Linux系统中编译,会丢失软连接,导致dt-bindings/pinctrl/xxx.h文件明明有,但是链接器提示找不到文件的报错,该问题很难解决。
    • (使用)Linux kernel官方源码中也支持BCM2835/6/7和ARM CoreTile Express,源码查看路径为https://gitee.com/mirrors/linux_old1 ;我当前使用Linux官方最新的源码,下载路径为v6.1-rc6。整个仓库带所有Git历史的源码有好几G,如果用git clone的方式拉代码,中间时间比较久,一旦中间网络中断,则无法恢复,需要重新clone;推荐直接下载zip压缩包,这样只有250M。
    • (当前不使用)树莓派官方提供了从Linux kernel中派生的源码,但是版本比kernel官方低很多,路径为https://github.com/raspberrypi/linux 。
  • Ubuntu主机和交叉编译工具可以直接用上面U-Boot同样的环境,下面介绍的是32位Ubuntu16.04下使用的交叉编译工具;Linux kernel在此环境下也能编译通过。


  • 这是在32位Ubuntu16.04下编译kernel的步骤,可以不看,后面有64位Ubuntu18.04中编译的介绍。
  • 因为我虚拟机中的64位Ubuntu18.04系统运行起来很慢,所以我最终都会在Ubuntu16.04中编译内核。
  • (使用)Linaro旧版本的地址支持32位主机的工具下载:https://releases.linaro.org/components/toolchain/binaries ,这里面Linaro gcc的最新版本是7.5.0;因为我虚拟机中安装的是32位的Ubuntu 16.04系统,32位的系统可以省去在64位系统中安装32位编译所需环境的步骤,所以我使用gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf.tar.xz
  • (不使用)树莓派官方也提供了交叉编译工具:https://github.com/raspberrypi/tools ,但是比ARM官方或者Linaro官方的编译器版本要低。下载解压后,BCM2836能用的交叉编译工具的目录在 ./arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/;注意:这只能编译U-Boot、Linux kernel和Linux应用,不能编译ARM裸机程序;但是该编译器编译最新的Linux kernel源码会报错。
  • 如果用Linux官方的kernel源码,则不能使用树莓派的交叉编译工具:
    • Linux kernel源码的下载路径:https://gitee.com/mirrors/linux_old1/tree/v6.1-rc4
    • 先在Linux系统环境中修改芯片类型和编译器名称:
    • export ARCH=arm
    • export CROSS_COMPILE=arm-linux-gnueabihf-
    • 再输出你自己编译器的路径,如:
    • export PATH=$PATH:/home/jim/Desktop/tools/arm-gnu-toolchain/bin
    • 再 make bcm2835_defconfig
    • 当前Linux kernel源码要求最低的gcc版本为Minimum GCC version: 5.1.0,而树莓派提供的版本为4.8.3,版本太低。
  • (不使用)ARM官网的交叉编译工具,当前只支持64位主机下的软件:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
    • 当前ARM gcc的版本是12.2.0,arm官网从从2016年的GCC6开始只提供64位Linux的交叉编译器可执行文件
  • (不使用)Linaro gcc交叉编译器,最新的gcc版本是11.3,当前只支持64位主机下的下载地址:https://snapshots.linaro.org/gnu-toolchain/11.3-2022.06-1/arm-linux-gnueabihf/
  • 安装了Ubuntu 16.04 32位系统,在里面下载了Linux kernel源码,安装了Linaro gcc7.5.0交叉编译器后
    • make bcm2835_defconfig 生成.config,源码里 没有BCM2836的默认配置,只有2835的,先用这个,然后再在里面改。
    • make menuconfig 打开kernel配置界面。
    • 在kernel字符配置界面中:System type --> Platform selection 取消armv6的选择,只保留armv7;
    • make 因为之前已经配置了ARCH和CROSS_COMPILE变量(也可以只在kernel .config或者Makefile中指定这两个环境变量),直接make ,如果你不是虚拟机,可以make -j8,8核并行编译,加快编译速度;编译时间比较久,可能要几分钟到几十分钟;要生成uImage的话要指定地址,例如make uImage LOADADDR=0x8000,生成的uImage在arch/arm/boot/中。
    • 如果遇到编译报错,提示某些.h文件找不到,则一般是电脑上没安装对应的库;将报错信息百度,按照搜到的文章安装缺少的库,再重新编译即可。
  • 设备树在2011年3月在从Linux kernel源码3.1版本中正式替代寄存器头文件。
    • .dtsi设备树文件中只有各个模块的起始寄存器地址,没有每个寄存器详细的描述,而每个模块的寄存器定义和偏移则在每个驱动的源文件中,不会有一个统一的.h头文件包含了所有的寄存器地址定义。
    • 设备树添加之前的2.6.xx版本中,能在/arch/arm/plat-xxx和/arch/arm/mach-xxx中看到芯片的所有模块的寄存器基地址,和模块中所有寄存器的头文件宏定义。例如:https://gitee.com/mirrors/linux_old1/blob/v3.0/arch/arm/mach-bcmring/include/mach/csp/mm_addr.h ,https://gitee.com/mirrors/linux_old1/blob/v3.0/arch/arm/include/asm/hardware/dec21285.h 和 https://gitee.com/mirrors/linux_old1/blob/v3.0/arch/arm/mach-bcmring/include/mach/reg_umi.h 等。

  • 下面是在64位Ubuntu 18.04中编译Linux kernel的步骤

    • 编译好的zImage和vexpress-v2p-ca9.dtb文件我已经放在另一个仓库中,地址为:https://gitee.com/langcai1943/linux_kernel_u-boot_busybox_code_comments/tree/develop/bin/v1.0.0
  • 交叉编译环境保持和上面编译U-Boot时相同

  • 下载最新的Linux kernel源码:v6.1-rc4

  • 编译:

    • make vexpress_defconfig
    • make zImage dtbs -j4
  • 安装过程中遇到了报错,需要安装依赖库:

    • sudo apt-get install g++
    • sudo apt-get install libmpc-dev
    • 将arch/arm/boot/zImage和arch/arm/boot/dts/vexpress-v2p-ca9.dtb拷贝出来
  • 运行:

    • qemu-system-arm -M vexpress-a9 -m 256M -nographic -kernel zImage -dtb vexpress-v2p-ca9.dtb
    • 能正常运行,但是会提示没有文件系统
    • 编译好的zImage和vexpress-v2p-ca9.dtb文件我已经放在另一个仓库中,地址为:https://gitee.com/langcai1943/linux_kernel_u-boot_busybox_code_comments/tree/develop/bin/v1.0.0
  • 运行效果:

jim@DESKTOP-SVP3BEM MSYS /d/1_git/cj-security-camera/linux
$ qemu-system-arm -M vexpress-a9 -m 256M -nographic -kernel zImage -dtb vexpress-v2p-ca9.dtb
Booting Linux on physical CPU 0x0
Linux version 6.1.0-rc6 (jim@jim) (arm-none-linux-gnueabihf-gcc (Arm GNU Toolchain 11.3.Rel1) 11.3.120220712, GNU ld (Arm GNU Toolchain 11.3.Rel1) 2.38.20220708) #1 SMP Fri Nov 25 23:17:29 CST 2022
CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
OF: fdt: Machine model: V2P-CA9
Memory policy: Data cache writeback
Reserved memory: created DMA memory pool at 0x4c000000, size 8 MiB
OF: reserved mem: initialized node vram@4c000000, compatible id shared-dma-pool
cma: Reserved 16 MiB at 0x6f000000
Zone ranges:Normal   [mem 0x0000000060000000-0x000000006fffffff]
Movable zone start for each node
Early memory node rangesnode   0: [mem 0x0000000060000000-0x000000006fffffff]
Initmem setup node 0 [mem 0x0000000060000000-0x000000006fffffff]
CPU: All CPU(s) started in SVC mode.
......
---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---
  • 参考网址

    • QEMU 实验(一): u-boot 和 kernel 编译
    • QEMU搭建Kernel模拟调试开发环境
    • arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别
    • 在家学习嵌入式2–在qemu环境下使用uboot启动linux
    • 【qemu】qemu运行linux内核总结
    • QEMU体验最新Linux-5.9.2内核
    • QEMU调试Linux内核环境搭建
    • qemu 搭建 ARM Linux环境

11 编译2022年最新的Linux kernel 6.1源码,并用QEMU模拟器运行相关推荐

  1. 09 编译2022年最新的Linux kernel、U-Boot和BusyBox rootfs源码,并用QEMU模拟器运行

    编译2022年最新的Linux kernel.U-Boot和BusyBox rootfs源码,并用QEMU模拟器运行 作者 将狼才鲸 创建日期 2022-11-26 Gitee源码和工程地址:才鲸嵌入 ...

  2. 12 编译2022年最新的BusyBox rootfs 1.35.0源码,并用QEMU模拟器运行

    编译2022年最新的BusyBox rootfs 1.35.0源码,并用QEMU模拟器运行 作者 将狼才鲸 创建日期 2022-11-26 Gitee源码和工程地址:才鲸嵌入式 / 嵌入式QEMU教程 ...

  3. 10 编译2022年最新的U-Boot v2023.01-rc2源码,并用QEMU模拟器运行

    编译2022年最新的U-Boot v2023.01-rc2源码,并用QEMU模拟器运行 作者 将狼才鲸 创建日期 2022-11-26 Gitee源码和工程地址:才鲸嵌入式 / 嵌入式QEMU教程 C ...

  4. 2022年最新云开发去水印小程序源码

    这款去水印小程序,界面干净,非常简洁. 小程序是属于云开发的,需要HBuider进行编译发布,关联阿里云.腾讯云免费空间,可以免除服务器和备案域名高成本的烦恼,节约运营成本. 虽不同于一般的云开发,本 ...

  5. 2022年最新Q绑查询HTML网页源码

    正文: 2022最新版的,API接口已经更新,程序无需安装,直接上传到主机或者服务器上面就可以了,当然,直接上传到二级目录运行也是支持的,但是不建议这样做. 下载方式: lanzou.com/i4QN ...

  6. ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核

    ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核 原以为会是很简单的事,结果还是颇废一番周折.很多情况是没有遇到过得.所以这里记录一下. 问题记录的 ...

  7. ffmpeg编译gb28181_RTSP/GB28181协议/海康SDK/Ehome协议视频上云网关EasyCVR视频平台在linux环境下ffmpeg源码单步调试环境搭建...

    目前TSINGSEE青犀视频研发的视频上云服务平台EasyCVR已经可集成海康EHome私有协议,并且在前文中我也跟大家讲过EHome协议的配置和调用流程,有兴趣的可以阅读一下:配置及协议介绍.Eho ...

  8. 2022最新轻量级影视搜索播放器源码+已修复版

    正文: 2022最新轻量级影视搜索播放器源码+已修复版,因为之前API失效了,需要重新写规则,所以本次我花了点时间修复了下源码,有兴趣自行去研究. 更新日志: 2020/7/14 前端修正了一些显示, ...

  9. Linux驱动入门(三)——源码下载阅读、分析和嵌入式文件系统介绍

    文章目录 从内核出发 获取内核源码 使用Git 安装内核源码 使用补丁 阅读Linux内核源码 Source Insight简介 阅读源码 内核开发的特点 无libc库抑或无标准头文件 GNU C 没 ...

最新文章

  1. 华为路由器ospf路由表解读_华为动态路由OSPF实例详解之多区域配置-华为路由器设置...
  2. 基于通用权限管理系统实现的单点登录
  3. Android Studio系列教程二:基本设置与运行
  4. ap的ht模式_AP6256 STA模式操作示例
  5. JZOJ 5477. 【NOIP2017提高组正式赛】宝藏
  6. beanshell变量无法传到jmeter_学会BeanShell,才敢说自己懂Jmeter
  7. 二叉树的定义、性质、存储
  8. oracle 数据库的非指令备份方法
  9. linux ubuntu ssh,Linux(Ubuntu)安装ssh服务
  10. 如何使用Elixir和Phoenix快速入门构建CRUD REST API
  11. js 节点 选中ztree_zTree使用
  12. 人工智能之语音识别技术【科普】
  13. 【转】数字签名与数字证书
  14. 降准对房价与股市的影响!
  15. 推荐 10 款适合 C/C++ 开发人员的 IDE
  16. 详解语言模型NGram及困惑度Perplexity
  17. 百度地图车辆运动轨迹
  18. Pycharm:解决点击重运行(Rerun)没有反应
  19. eclipse注释出现问号
  20. Git和小乌龟的下载安装及简单使用

热门文章

  1. Java™ 教程(目录)
  2. Android在线预览音乐、视频、pdf、word、Excel
  3. Ubuntu 国内iso下载
  4. 学生会招新PPT模板
  5. Autoit3-WinZip 的自动化安装
  6. 共享办公室出租,沉浸体验式办公
  7. H5-video视频播放标签-隐藏部分controls
  8. 有八个Led接在P1口。
  9. 带你深入理解传递参数
  10. Android面试之Dalvik和ART