6.管理Flash和DDR及shell介绍

本文介绍了U-Boot阶段Flash和DDR的分区方法,详细解释了分区的重要性和常见规则。同时,文章还探讨了Shell作为操作系统终端命令行及编程语言的角色,包括其运行机制和常用语言类型。

9.1.uboot阶段Flash的分区
(1)所谓分区就是指对Flash进行分块管理,一般Flash中分为uboot、var环境变量、Kernel、rootfs、自由空间这5个分区(见图A)。
(2)在PC机中,因为大家都是在操作系统下使用硬盘的,整个硬盘由操作系统统一管理,操作系统会使用文件系统管理硬盘空间,所以用户不需要太在意分区问题。
(3)在uboot中没有操作系统,所以我们对Flash(即硬盘)的管理必须事先使用分区界定(uboot和kernel中都有个分区表,分区表即我们做系统移植时对Flash的整体管理分配方法)。我们在部署系统时按照事先规划好的分区界定方法来部署,uboot和kernel中的软件也按照该分区界定方法进行工作,从而不会出错。
(4)分区方法是可以变动的,但是一般在设计系统移植时就会定好。分区方法制定规则:uboot(uboot必须从Flash起始地址开始存放,也许是扇区0/扇区1,取决于SoC的启动设计;uboot分区大小一般为512KB或者1MB)、var环境变量(环境变量分区一般紧贴uboot存放;分区大小一般为32KB或更大一点)、kernel(kernel分区一般紧贴环境变量分区存放;分区大小一般为3MB或5MB或其他)、rootfs(rootfs分区一般紧贴kernel分区存放,分区大小要看具体的根文件系统的大小)、自由分区(一般kernel启动后将自由分区挂载到rootfs下使用)。
(5)总结:整个Flash从开头到结尾充分利用,各分区彼此相连;uboot必须在Flash的开头,其他分区相对位置可变;各个分区的大小由系统移植工程师自己决定成合适大小(太小容易溢出,太大浪费空间);分区在系统移植前需确定好,在uboot和kernel中需使用同一个分区表,将来在系统部署时和系统代码中的分区方法也必须一样。


9.2.uboot阶段DDR的分区
(1)DDR的分区和Flash的分区不同,因为DDR掉电消失而Flash掉电存在,所以说DDR是每次系统运行时才部署使用的。
(2)内存的分区主要是在linux内核启动起来之前,linux内核启动后内核的内存管理模块会接管整个内存空间,我们可以撒手不管了。
(3)内存分区的关键在于内存中的哪一块用来干什么必须分配好,避免各个不同功能使用了同一块内存区域造成相互踩踏。譬如说我们tftp 0x23E00000 zImage去下载zImage到内存的0x23E00000处就会出错,因为这个内存处实际是uboot的镜像所在。这样下载会导致下载的zImage把内存中的uboot给冲掉。


9.3.shell是操作系统的终端命令行
(1)shell可理解为软件操作系统提供给用户操作的命令行界面,它是人机交互的一种方式。
(2)我们可使用shell和操作系统、uboot等软件系统进行交互。具体来说即我们通过shell给软件系统输入命令然后回车执行,执行完成后又会回到shell命令行,然后可以再次输入命令执行。
(3)上述操作方式在一般情况下工作很好,但是有缺陷。譬如当我们需在linux下创建100个文件分别为a1.c~a100.c,在这种情况下我们手工输入命令创建文件会很累。最好的做法是把文件创建过程写成一个shell脚本程序,执行这个程序的效果和手工输入命令的效果相同即可。


9.4.shell是一类编程语言
(1)编写shell脚本时使用的语言是shell语言,又叫脚本语言。
(2)shell脚本其实是一类语言的总称,它不是单独的某种语言。


9.5.常用的shell语言-sh、bash、csh、ksh、perl、python等
(1)在linux下常用的脚本语言是bash、sh这两种。perl、python这样的高级脚本语言常用在网络管理配置等领域,系统运维人员一般要学习这些。
(2)脚本语言作为一种工具在嵌入式程序中主要是用来做配置。每个复杂的嵌入式程序都是可配置的,脚本语言实现其配置过程。我们自然不会使用过于复杂的脚本语言特性,因此只需要针对性的学习即可。
(3)linux下最常用的脚本是bash,我们学习也是以bash为主。


9.6.shell脚本的运行机制-解释运行
(1)C语言编写出源代码后无法直接运行,需要编译链接形成可执行的二进制程序后才能运行;而脚本程序编写好源代码后即可直接运行,没有编译链接过程。
(2)shell程序是解释运行的,所谓解释运行就是说当一个shell程序执行时,shell解析器会逐行的解释shell程序代码,然后逐行的运行,类似C语言中的顺序结构。
(3)CPU实际只认识二进制代码,根本不认识源代码;脚本源代码被逐行解释执行时完成脚本源代码转成二进制的过程,该过程不一定是编译链接,因为这行脚本程序可能早就编译链接好了,在这里我们只是调用它而已。


这里写图片描述


1.2.4. 安装交叉编译工具链¶ 发布包提供了工具链: glibc: gcc-11.1.0-20210608-sigmastar-glibc-x86_64_arm-linux-gnueabihf.tar.xz uclibc: arm-sigmastar-linux-uclibcgnueabihf-9.1.0.tar.xz 安装步骤如下: step1. 新建工具目录: sudo mkdir -p /tools/toolchain 或者 sudo mkdir -p /opt/sstar(本文以/tools/toolchain为例) step2. 解压安装: sudo tar -xvf ./gcc-11.1.0-20210608-sigmastar-glibc-x86_64_arm-linux-gnueabihf.tar.xz -C /tools/toolchain step3. 可直接在每次编译时export 或 直接添加到/etc/profile、~/.bashrc等启动脚本位置 例:export PATH=${PATH}:/tools/toolchain/gcc-11.1.0-20210608-sigmastar-glibc-x86_64_arm-linux-gnueabihf/bin 1.3. 其他配置¶ 1.3.1. 默认shell配置¶ 编译脚本默认使用的是bash,要求系统的默认shell为bash,可通过ls -la /bin/sh命令来确认。以最常用的Ubuntu为例,高版本的Ubuntu默认shell为dash,修改方式如下: # ls -la /bin/sh lrwxrwxrwx 1 root root 4 Jun 15 08:49 /bin/sh -> dash # sudo dpkg-reconfigure dash #在弹出的界面选择<NO> # ls -la /bin/sh lrwxrwxrwx 1 root root 4 Jun 15 08:49 /bin/sh -> bash 1.3.2. 设置默认python版本为python2.x¶ python2与python3的语义有差别,SDK编译脚本使用的是python2的语义,因此需要将系统默认python版本设置为python2.x,修改方式请参考网络上的相关文档,比如使用update-alternatives工具来配置。 注意:mksquashfs ubuntu自带有,若没有,再根据提示安装即可。 如果使用低版本的Ubuntu,如在Ubuntu 16.04上建议进行更新源的操作,具体操作请参考网络上的相关文档,若不更新可能会导致后续的编译错误。 1.3.3. 设置默认awk实现¶ 编译脚本默认使用awk/gawk,系统的awk版本需要为awk/gawk,可通过awk --helpawk --version命令来确认。以Ubuntu为例: # awk --help Usage: awk [POSIX or GNU style options] -f progfile [--] file ... Usage: awk [POSIX or GNU style options] [--] 'program' file ... POSIX options: GNU long options: (standard) -f progfile --file=progfile -F fs --field-separator=fs -v var=val --assign=var=val ... # awk --version GNU Awk 4.1.4, API: 1.1 (GNU MPFR 4.0.1, GNU MP 6.1.2) Copyright (C) 1989, 1991-2016 Free Software Foundation. ... 如果默认awk实现不是awk/gawk,安装gawk,然后修改awk实现为gawk: sudo apt-get install gawk sudo update-alternatives --config awk # 选择 gawk 作为默认的 awk 实现 3. 编译¶ 在SDK中编译有所区分,通过不同的配置文件来实现编译不同的uboot defconfig/kernel defconfig,以及打包成不同类型的文件系统格式。SDK中包含了最新的bootkernel的sourceCode,SDK的编译过程主要包括: 编译uboot生成uboot image 编译kernel生成kernel image 依赖kernel build环境,将闭源MI模块如xxx.oxxx_init.c编译链接成xxx.koxxx.so 制作分区,打包上述镜像及其余提前编译放置的SDK中的其他binary,生成不同类型的文件系统格式estar烧录的脚本。 以本芯片支持的SPI NAND/NOR启动方式为例,举例SDK编译方法。 3.1. Toolchain配置¶ 3.1.1. glibc¶ export PATH=$PATH:/tools/toolchain/gcc-11.1.0-20210608-sigmastar-glibc-x86_64_arm-linux-gnueabihf/bin <若1.2.4中已添加至环境变量,则此步骤可省略> export CROSS_COMPILE=arm-linux-gnueabihf- export ARCH=arm 3.1.2. uclibc¶ export PATH=$PATH:/tools/toolchain/arm-sigmastar-linux-uclibcgnueabihf-9.1.0/bin <若1.2.4中已添加至环境变量,则此步骤可省略> export CROSS_COMPILE=arm-sigmastar-linux-uclibcgnueabihf- export ARCH=arm 3.2. 编译生成image¶ 解压SourceCode cd SourceCode tar zxvf xxx.tar.gz For BGA12 DDR4: 编译NOR: cd project make ipc_iford.nor.glibc-11.1.0-squashfs.ssc029a.512.bga12_ddr4_defconfig make clean;make image -j32 编译SPINAND: cd project make ipc_iford.spinand.glibc-11.1.0-squashfs.ssc029a.512.bga12_ddr4_defconfig make clean;make image -j32 For QFN128 DDR3: 编译NOR: cd project make ipc_iford.nor.glibc-11.1.0-squashfs.ssc029c.256.qfn128_ddr3_defconfig make clean;make image -j32 编译SPINAND: cd project make ipc_iford.spinand.glibc-11.1.0-squashfs.ssc029c.256.qfn128_ddr3_defconfig make clean;make image -j32 BGA11: NA(待补充) 从alkaid/project/image/output/images目录可获取烧录所需的所有bin档 注意: 切换不同的defconfig编译,需要先执行make clean,再执行make xxx_defconfig。 否则可能会执行报错 3.3. defconfig命名说明¶ 编译之前需要选择对应的defconfig,defconfig各字段说明如下: $(PRODUCT).$(FLASH).$(TOOLCHAIN)-$(TOOLCHAIN_VERSION)-$(FS_TYPE).$(BAROD).$(DDR_SIZE).$(PACKAGE)_[$(DDR_TYPE)]_[$(OPTION)]_defconfig 字段 字段说明 举例 PRODUCT 产品形态 如:ipc/usbcam/nvr/dispcam/ipc-rtos FLASH flash类型 如:nor/nand/emmc TOOLCHAIN 编译链 如:glibc/uclibc TOOLCHAIN_VERSION 编译链版本 如:11.1.0/10.2.1 FS_TYPE 文件系统类型 如:ramdisk/ext4fs/ramfs/squashfs BAROD 板子类型 如:ssc029a/ssm00a/ssm00c DDR_SIZE DDR大小 如:256/512x512(两颗512) PACKAGE 芯片封装类型 如:bga1/bga2/qfn128 DDR_TYPE DDR类型,此字段为可选字段 如:ddr4/ddr3/lpddr3/lpddr4/lpddr4x。如果此字段为空,DDR类型为ddr4 OPTION 标识其它一些功能,此字段为可选字段 如:hyp/optee/pm_rtos_dram/str 其中DDR_SIZE的含义,以512为例:DDR SIZE 512MB,对应.config文件中的LX_MEM的大小: 512MB=512*1024*1024Byte=0x20000000Byte 同样对应boot下bootargs参数中的LX_MEM=0x20000000 3.4. 编译闭源MI模块说明¶ Sigmastar SDK里kernel的source code是开源的,为了避免多媒体MI模块代码直接与kernel代码耦合,导致客户开关某些kernel config项需要重新编译MI ko/so,软件采用如下结构: 其中MI module driver以 xxx.o(如vif.o)形式提供给用户,位于sdk/linux/xxx/目录下; MI module init.c以xxx_init.c(如vif_init.c)形式提供给用户,位于sdk/linux/xxx/目录下; Cam wrapper driver位于kernel/drivers/sstar/cam_fs_wrapper/cam_os_wrapper,最终编译进kenrel image; 当用户对kernel config有重大改动时,按照3.2章节编译project image: make xxx_defconfig 选择对应的project 编译config; make menuconfig,指定kernel编译时使用的客户自己的config; make clean;make image -j32 即可在project\release\chip\iford$(PRODUCT)\common$(TOOLCHAIN)$(TOOLCHAIN_VERSION)\release\modules\5.10\下获取 MI ko。 这是厂商demo编译的教程,详细为我介绍
09-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值