分析orangepizero kernel编译过程

最近买了个orangepizero版本的,用的是全志的H2芯片。看起来有短小精悍。不过网上资料较少。看了下好多东西都是参考别人的弄过来的。所以看起来代码有一些混乱。但是如果做高层开发。这些都不是问题。因为高层开发不需要了解底层硬件的区别。只当做是一台电脑就行。不过遗憾的是,我是做驱动开发。
话不多说,详细的编译过程,可以参考官方给的文档。这里对里面的个别细节做展开分析。

一、代码的下载过程

第一步是通过git 下载到这个类似工程管理器的project,下载后运行一个脚本,通过用户选择脚本里面的开发板名字,进一步下载工程文件。没什么难度。但是有两个细节很郁闷。

  1. 1.github在墙内下载速度非常慢,经常断开,且git不能断点续传,兜兜转转,总是失败。
  2. orangepi zero有很多个版本,有zero,zero plus,plus2.第一次搞,下载错了版本,不能运行的。也是郁闷。标题也不醒目。

在这里插入图片描述
git下来后,就是对应的工程代码了,我下载的是这个
“OrangePiH2_mainline ”
下面,重点对这个这个目录里面的细节展开。

二、“OrangePiH2_mainline ”目录结构

在这里插入图片描述
从名字就能知道这些目录的作用了

目录 作用
build.sh 生成img的脚本
external 生成rootfs需要用到里面的文件
kernel 内核源码工程
output 编译生成的东西,会存放在这里
scripts orangpi 官方自己写的一些方便生成工程的脚本
toolchain 编译所需的工具链
uboot uboot源码目录

三、build.sh
这是一个软连接
在这里插入图片描述
使用软连接的好处,
1.方便用户调用。
2.执行的时候,脚本可以知道工程的根目录在哪里。因为软链接需要放在根目录里面,才能正常执行。

build.sh文件解读
大致流程
1.判断运行是否是root用户
2.运行前环境检查
3.给出图形化界面,让用户选择作业内容(如生成kernel等)

- 判断是否是root用户
分析orangepizero kernel编译过程_第1张图片

  • 包含其他的脚本文件。里面的函数就在这些脚本文件里面
    在这里插入图片描述

  • 环境检查
    这里要说下这个,对于第一次编译,一定要环境检查,因为编译需要安装很多额外的软件包(通过apt),需要从github里面检查是否有代码更新。
    在这里插入图片描述
    如果已经成功编译生成了img文件了,可以把这个prepare_host函数给注释掉。因为每次编译都去检查环境,很耗时,还要联网,网络环境不好,还会exit。
    这个函数在lib/general.sh这个脚本里面定义。

  • 作业选择
    脚本后面的代码,都是作业选择的代码,不贴出来了,都是一些case语句。
    对于我的开发板,我是对应这条case
    分析orangepizero kernel编译过程_第2张图片
    比较重要的是两个参数,ARCH变量和CHIP变量被赋值了
    在这里插入图片描述
    这两个参数很重要,在make的时候会用到。

如下代码是公共的作业内容选择对话脚本。
分析orangepizero kernel编译过程_第3张图片
可以看到不同的作业,对用不同的函数,封装的还是挺不错的。

四、kernel编译过程

上面选择编译kernel后,会调用compile_kernel函数。这个函数的定义在“lib/compilation.sh”脚本中

找到compile_kernel函数
分析orangepizero kernel编译过程_第4张图片
函数对不同平台应用不同的case语句,我的是
分析orangepizero kernel编译过程_第5张图片
其主要步骤有
1.生成.config文件
2.make kernel的img

  • 生成.config文件
    生成.config的方式为make xxx_defconfig的方式,不是make menuconfig的方式,切记。不过高级用户也能改成menuconfig的方式。
make -C $LINUX ARCH="${ARCH}" CROSS_COMPILE=$TOOLS "${CHIP}"smp_defconfig V=1

我在这一句的后面加上了V=1,这样可以在执行的时候,看到更详细的过程。这个命令,带了很多之前赋值的变量。
"${CHIP}"smp_defconfig 展开后对应的是目录“kernel/arch/arm/configs
”,里面的文件“sun8iw7p1smp_defconfig”
在这里插入图片描述

  • make kernel
make -C $LINUX ARCH="${ARCH}" CROSS_COMPILE=$TOOLS -j${CORES}

综合上述,如果要修改编译的内容。需要修改un8iw7p1smp_defconfig文件,将对应的编译开关打开。

你可能感兴趣的:(LINUX驱动)