11 编译2022年最新的Linux kernel源码,并用QEMU模拟器运行
创始人
2024-04-13 07:25:14

编译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-
    • 再 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文件放在本仓库根目录/linux/文件夹下,可以直接运行查看效果

  • 交叉编译环境保持和上面编译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/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环境

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...