Linux环境配置编译orange,分析orangepizero kernel编译过程

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

话不多说,详细的编译过程,可以参考官方给的文档。这里对里面的个别细节做展开分析。

一、代码的下载过程

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

1.github在墙内下载速度非常慢,经常断开,且git不能断点续传,兜兜转转,总是失败。

orangepi zero有很多个版本,有zero,zero plus,plus2.第一次搞,下载错了版本,不能运行的。也是郁闷。标题也不醒目。

2df4c35f0dad5430753281dea87cb3a1.png

git下来后,就是对应的工程代码了,我下载的是这个

“OrangePiH2_mainline ”

下面,重点对这个这个目录里面的细节展开。

二、“OrangePiH2_mainline ”目录结构

17c15a0c069673321deec38971686579.png

从名字就能知道这些目录的作用了

目录

作用

build.sh

生成img的脚本

external

生成rootfs需要用到里面的文件

kernel

内核源码工程

output

编译生成的东西,会存放在这里

scripts

orangpi 官方自己写的一些方便生成工程的脚本

toolchain

编译所需的工具链

uboot

uboot源码目录

三、build.sh

这是一个软连接

28c1d8f47ef905b85283826aadfe7537.png

使用软连接的好处,

1.方便用户调用。

2.执行的时候,脚本可以知道工程的根目录在哪里。因为软链接需要放在根目录里面,才能正常执行。

build.sh文件解读

大致流程

1.判断运行是否是root用户

2.运行前环境检查

3.给出图形化界面,让用户选择作业内容(如生成kernel等)

- 判断是否是root用户

310417dc24a2c7038ce67d2b96a67884.png

包含其他的脚本文件。里面的函数就在这些脚本文件里面

fc7bafec2abad29077bece5be9423675.png

环境检查

这里要说下这个,对于第一次编译,一定要环境检查,因为编译需要安装很多额外的软件包(通过apt),需要从github里面检查是否有代码更新。

58982a08cc65fdf552888b5a4330dd9c.png

如果已经成功编译生成了img文件了,可以把这个prepare_host函数给注释掉。因为每次编译都去检查环境,很耗时,还要联网,网络环境不好,还会exit。

这个函数在lib/general.sh这个脚本里面定义。

作业选择

脚本后面的代码,都是作业选择的代码,不贴出来了,都是一些case语句。

对于我的开发板,我是对应这条case

1d62257e380ecb72b10d420f9e1ee20c.png

比较重要的是两个参数,ARCH变量和CHIP变量被赋值了

8ee023178a3c8737781ee2fb32fc8f8b.png

这两个参数很重要,在make的时候会用到。

如下代码是公共的作业内容选择对话脚本。

066bcbe7a30a3772f2813e717051dadb.png

可以看到不同的作业,对用不同的函数,封装的还是挺不错的。

四、kernel编译过程

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

找到compile_kernel函数

8d74b272717ae0dc86c46f061659f5ac.png

函数对不同平台应用不同的case语句,我的是

4739ec42509748479bf5ca45aaa881e7.png

其主要步骤有

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”

16877deeb7b68e8f897d80bcaad51c00.png

make kernel

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值