secure boot (一)FIT Image

目录

前言

zImage,uImage, Legacy uImage 和 FIT uImage

FIT image的来源

制作FIT Image

its语法结构

uImage Tree 的根节点结构

'/images' node

Hash nodes

'/configurations' node

Configuration nodes

'/images' node

Hash nodes

'/configurations' node

Configuration nodes

举例

FIT Image的编译和启

bootm启动不同的配置

总结

本文参考


前言

secure boot 和FIT Image是前段时间接触到的,其实早就该总结下了,奈何懒癌犯了,拖了好久才写出来。

之前也有人问我,工作后最大的感受是什么?我的回答是:“快速学习”。

就嵌入式来讲,大多数应届生在校期间可能都没做过完整的项目,仅凭在校期间学习的内容很难胜任公司的要求。

就底层驱动来讲,虽然我之前也学习过韦东山老师的上s3c2440的课程,但是到了公司才发现,这些内容其实都已经过时了。

但并不是说这些内容都没有必要去学习了。在学习的过程中,认为最重要的是培养我们的自学能力。

很多初学者在刚开始学习时,可能就败在了搭建环境上。搭建环境时遇到问题不知道怎么办?

我们日常开发中遇到的90%的问题,在网上都有人遇到过,也有相应的解决办法。学会利用bing,google,stackoverflow等搜索工具是一项很重要的技能。

如果遇到了网上没有的问题怎么办?软件问题要先搞清楚原理,再去看代码逻辑。硬件问题看官方手册。像Linux kernel,ARM等都提供了完善的手册,大部分问题在手册中都有相应说明。

好了,扯远了。下面回归正题。

本文主要介绍了FIT Image起源,制作方法,its的语法结构,bootm 启动FIT Image的方式。

本文这篇文章是对后面介绍的secure boot做铺垫。ARMv8 secure boot一种实现的方式就是利用了FIT Image的特性。

zImage,uImage, Legacy uImage 和 FIT uImage

内核经过编译后,会生成一个elf的可执行程序,叫vmlinux,这个就是原始的未经任何处理加工的原版内核elf文件。不过,最终烧写在嵌入式设备上的并不是这个文件。而是经过objcopy工具加工后的专门用于烧录的镜像格式Image。

原则上Image就可以直接被烧录到Flash上进行启动执行,但linux的内核开发者觉得Image还是太大了,因此对Image进行了压缩,并且在Image压缩后的文件的前端附加了一部分解压缩代码,构成了一个压缩格式的镜像文件就叫zImage

解压的时候,通过zImage镜像头部的解压缩代码进行自解压,然后执行解压出来的内核镜像。

Uboot要正确启动Linux内核,就需要知道内核的一些信息,比如镜像的类型(kernel image,dtb,ramdisk image),镜像在内存的位置,镜像的链接地址,镜像文件是否有压缩等等。

Uboot为了拿到这些信息,发明了一种内核格式叫uImage,也叫Legacy uImage。uImage是由zImage加工得到的,uboot中有一个工具mkimage,该工具会给zImage加一个64字节的header,将启动内核所需的信息存储在header中。uboot启动后,从header中读取所需的信息,按照指示,进行相应的动作即可。

header格式可以参考:include/image.h。mkimage源码在tools/mkimage

FIT image的来源

有了Legacy uImage后,为什么又搞出来一个FIT uImage呢?

在Linus Torvalds 看来,内核中arch/arm/mach-xxx充斥着大量的垃圾代码。因为内核并不关心板级细节,比如板上的platform设备、resource、i2c_board_info、spi_board_info等等。大家有兴趣可以看下s3c2410的板级目录,代码量在数万行。

因此,ARM社区引入了Device Tree,使用Device Tree后,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。

为了更好的支持单个固件的通用性,Uboot也需要对这种uImage固件进行支持。FIT uImage中加入多个dtb文件 和ramdisk文件,当然如果需要的话,同样可以支持多个kernel文件。

内核中的FDT全程为flattened device tree,FIT全称叫flattened image tree。FIT利用了Device Tree Source files(DTS)的语法,生成的Image文件也和dtb文件类似(称作itb)。

这样的目的就是能够使同一个uImage能够在Uboot中选择特定的kernel/dtb和ramdisk进行启动了,达成一个uImage可以通用多个板型的目的。

制作FIT Image

制作FIT Image需要用到两个工具,mkimage和的dtc。dtc要导入到环境变量$PATH中,mkimage会调用dtc。

mkimage的输入为 image source file,它定义了启动过程中image的各种属性,扩展名为.its。its只是描述了Image的属性,实际的Image data 是在uImage中,具体路径由its指定。

如下是kernel 的its文件,后面会介绍各项内容的含义。

/*
 * Simple U-Boot uImage source file containing a single kernel
 */

/dts-v1/;

/ {
 description = "Simple image with single Linux kernel";
 #address-cells = <1>;

 images {
  kernel@1 {
   description = "Vanilla Linux kernel";
   data = /incbin/("./vmlinux.bin.gz"); # Image data 具体路径
   type = "kernel";
   arch = "ppc";
   os = "linux";
   compression = "gzip";
   load = <00000000>;
   entry = <00000000>;
   hash@1 {
    algo = "crc32";
   };
   hash@2 {
    algo = "sha1";
   };
  };
 };

 configurations {
  default = "config@1";
  config@1 {
   description = "Boot Linux kernel";
   kernel = "kernel@1";
  };
 };
};

mkimage的输出是一个后缀为.itb的二进制文件,包含了所有需要的数据(kernel,dtb,ramdisk)。itb文件制作好之后,就可以直接加载到嵌入式设备上,通过bootm命令启动。

总结下制作FIT Image的4个必要文件:

  • mkimage,

  • dtc

  • its(image source file (*.its))

  • image data file(s)。

its语法结构

uImage Tree 的根节点结构

/ o image-tree
    |- description = "image description"
    |- timestamp = <12399321>
    |- #address-cells = <1>
    |
    o images
    | |
    | o image@1 {...}
    | o image@2 {...}
    | ...
    |
    o configurations
      |- default = "conf@1"
      |
      o conf@1 {...}
      o conf@2 {...}
      ...
  • description:描述uImage的文本。

  • timestamp:修改Image镜像的时间,由mkimage工具自动生成。在security boot中,timestamp不同也会被认为是不同的Image。

  • images:子镜像,如kernel Image,ramdisk Image。

  • configurations:配置项节点,可以将不同类型的二进制文件,根据不同的场景,组合起来,形成一个个的配置项。u-boot在boot的时候,以配置项为单位加载、执行,这样就可以根据不同的场景,方便的选择不同的配置。

'/images' node

该节点中描述了Image镜像必要的信息.

 o image@1
   |- description = "component sub-image description"
   |- data = /incbin/("path/to/data/file.bin")
   |- type = "sub-image type name"
   |- arch = "ARCH name"
   |- os = "OS name"
   |- compression = "compression name"
   |- load = <00000000>
   |- entry = <00000000>
   |
   o hash@1 {...}
   o hash@2 {...}
   ...
  • description:子镜像的文本描述,可以随便写。

  • type:子镜像的类型,比如standalone,kernel,ramdisk,firmware等等。

  • data:包含该节点二进制文件的路径。

  • compression:压缩方式,比如none,gzip,bzip2。

  • os:操作系统的名称,如solaris,uboot,qnx等。

  • arch:平台架构,如arm,mips,i386等。

  • entry:二进制文件入口地址,即链接地址。

  • load:二进制文件的加载位置。

  • hash@1:镜像使用的校验算法,如sha256,crc32等。

Hash nodes

o hash@1
  |- algo = "hash or checksum algorithm name"
  |- value = [hash or checksum value]
  • algo:算法名称,如crc32,md5,sha256等。

  • value:算法校验值,即algo计算后的数值。

'/configurations' node

o configurations
  |- default = "default configuration sub-node unit name"
  |
  o config@1 {...}
  o config@2 {...}
  ...
  • default:默认的子节点的配置

  • config@1: 该配置具体使用那些kernel Image,ramdisk Image等。

Configuration nodes

o config@1
  |- description = "configuration description"
  |- kernel = "kernel sub-node unit name"
  |- ramdisk = "ramdisk sub-node unit name"
  |- fdt = "fdt sub-node unit-name" [, "fdt overlay sub-node unit-name", ...]
  |- fpga = "fpga sub-node unit-name"
  |- loadables = "loadables sub-node unit-name"

'/images' node

该节点中描述了Image镜像必要的信息.

 o image@1
   |- description = "component sub-image description"
   |- data = /incbin/("path/to/data/file.bin")
   |- type = "sub-image type name"
   |- arch = "ARCH name"
   |- os = "OS name"
   |- compression = "compression name"
   |- load = <00000000>
   |- entry = <00000000>
   |
   o hash@1 {...}
   o hash@2 {...}
   ...

Hash nodes

o hash@1
  |- algo = "hash or checksum algorithm name"
  |- value = [hash or checksum value]

'/configurations' node

o configurations
  |- default = "default configuration sub-node unit name"
  |
  o config@1 {...}
  o config@2 {...}
  ...

Configuration nodes

o config@1
  |- description = "configuration description"
  |- kernel = "kernel sub-node unit name"
  |- ramdisk = "ramdisk sub-node unit name"
  |- fdt = "fdt sub-node unit-name" [, "fdt overlay sub-node unit-name", ...]
  |- fpga = "fpga sub-node unit-name"
  |- loadables = "loadables sub-node unit-name"
  • description:该配置的名称。

  • kernel:镜像类型为kernel的单元的名称。

  • ramdisk:镜像类型为ramdisk的单元的名称。

  • fdt:镜像类型为fdt的单元的名称。

  • loadables:额外的可加载的二进制文件的列表,U-Boot将在给定的起始地址加载每个二进制文件。

  • description:描述uImage的文本。

  • timestamp:修改Image镜像的时间,由mkimage工具自动生成。在security boot中,timestamp不同也会被认为是不同的Image。

  • images:子镜像,如kernel Image,ramdisk Image。

  • configurations:配置项节点,可以将不同类型的二进制文件,根据不同的场景,组合起来,形成一个个的配置项。u-boot在boot的时候,以配置项为单位加载、执行,这样就可以根据不同的场景,方便的选择不同的配置。

  • description:子镜像的文本描述,可以随便写。

  • type:子镜像的类型,比如standalone,kernel,ramdisk,firmware等等。

  • data:包含该节点二进制文件的路径。

  • compression:压缩方式,比如none,gzip,bzip2。

  • os:操作系统的名称,如solaris,uboot,qnx等。

  • arch:平台架构,如arm,mips,i386等。

  • algo:算法名称,如crc32,md5,sha256等。

  • value:算法校验值,即algo计算后的数值。

  • default:默认的子节点的配置

  • config@1: 该配置具体使用那些kernel Image,ramdisk Image等。

  • description:该配置的名称。

  • kernel:镜像类型为kernel的单元的名称。

  • ramdisk:镜像类型为ramdisk的单元的名称。

  • fdt:镜像类型为fdt的单元的名称。

  • loadables:额外的可加载的二进制文件的列表,U-Boot将在给定的起始地址加载每个二进制文件。

举例

如下是一个有多种kernels, ramdisks and FDT blobs镜像多套配置的its文件。它包含了3种配置,每种配置使用了不同的kernel、ramdisk和fdt,默认配置项由“default”指定,当然也可以在运行时指定。

/*
 * U-Boot uImage source file with multiple kernels, ramdisks and FDT blobs
 */

/dts-v1/;

/ {
 description = "Various kernels, ramdisks and FDT blobs";
 #address-cells = <1>;

 images {
  kernel@1 {
   description = "vanilla-2.6.23";
   data = /incbin/("./vmlinux.bin.gz");
   type = "kernel";
   arch = "ppc";
   os = "linux";
   compression = "gzip";
   load = <00000000>;
   entry = <00000000>;
   hash@1 {
    algo = "md5";
   };
   hash@2 {
    algo = "sha1";
   };
  };

  kernel@2 {
   description = "2.6.23-denx";
   data = /incbin/("./2.6.23-denx.bin.gz");
   type = "kernel";
   arch = "ppc";
   os = "linux";
   compression = "gzip";
   load = <00000000>;
   entry = <00000000>;
   hash@1 {
    algo = "sha1";
   };
  };

  kernel@3 {
   description = "2.4.25-denx";
   data = /incbin/("./2.4.25-denx.bin.gz");
   type = "kernel";
   arch = "ppc";
   os = "linux";
   compression = "gzip";
   load = <00000000>;
   entry = <00000000>;
   hash@1 {
    algo = "md5";
   };
  };

  ramdisk@1 {
   description = "eldk-4.2-ramdisk";
   data = /incbin/("./eldk-4.2-ramdisk");
   type = "ramdisk";
   arch = "ppc";
   os = "linux";
   compression = "gzip";
   load = <00000000>;
   entry = <00000000>;
   hash@1 {
    algo = "sha1";
   };
  };

  ramdisk@2 {
   description = "eldk-3.1-ramdisk";
   data = /incbin/("./eldk-3.1-ramdisk");
   type = "ramdisk";
   arch = "ppc";
   os = "linux";
   compression = "gzip";
   load = <00000000>;
   entry = <00000000>;
   hash@1 {
    algo = "crc32";
   };
  };

  fdt@1 {
   description = "tqm5200-fdt";
   data = /incbin/("./tqm5200.dtb");
   type = "flat_dt";
   arch = "ppc";
   compression = "none";
   hash@1 {
    algo = "crc32";
   };
  };

  fdt@2 {
   description = "tqm5200s-fdt";
   data = /incbin/("./tqm5200s.dtb");
   type = "flat_dt";
   arch = "ppc";
   compression = "none";
   load = <00700000>;
   hash@1 {
    algo = "sha1";
   };
  };

 };

 configurations {
  default = "config@1";

  config@1 {
   description = "tqm5200 vanilla-2.6.23 configuration";
   kernel = "kernel@1";
   ramdisk = "ramdisk@1";
   fdt = "fdt@1";
  };

  config@2 {
   description = "tqm5200s denx-2.6.23 configuration";
   kernel = "kernel@2";
   ramdisk = "ramdisk@1";
   fdt = "fdt@2";
  };

  config@3 {
   description = "tqm5200s denx-2.4.25 configuration";
   kernel = "kernel@3";
   ramdisk = "ramdisk@2";
  };
 };
};

FIT Image的编译和启

在服务器上,可以使用mkimage工具制作 FIT Image。

如下是kernel_fdt.its,下面将使用该文件制作itb。

/*
 * Simple U-Boot uImage source file containing a single kernel and FDT blob
 */

/dts-v1/;

/ {
 description = "Simple image with single Linux kernel and FDT blob";
 #address-cells = <1>;

 images {
  kernel@1 {
   description = "Vanilla Linux kernel";
   data = /incbin/("./vmlinux.bin.gz");
   type = "kernel";
   arch = "ppc";
   os = "linux";
   compression = "gzip";
   load = <00000000>;
   entry = <00000000>;
   hash@1 {
    algo = "crc32";
   };
   hash@2 {
    algo = "sha1";
   };
  };
  fdt@1 {
   description = "Flattened Device Tree blob";
   data = /incbin/("./target.dtb");
   type = "flat_dt";
   arch = "ppc";
   compression = "none";
   hash@1 {
    algo = "crc32";
   };
   hash@2 {
    algo = "sha1";
   };
  };
 };

 configurations {
  default = "conf@1";
  conf@1 {
   description = "Boot Linux kernel with FDT blob";
   kernel = "kernel@1";
   fdt = "fdt@1";
  };
 };
};

$ mkimage -f kernel_fdt.its kernel_fdt.itb
DTC: dts->dtb  on file "kernel_fdt.its"
$
$ mkimage -l kernel_fdt.itb
FIT description: Simple image with single Linux kernel and FDT blob
Created:  Tue Mar 11 16:29:22 2008
 Image 0 (kernel@1)
  Description: Vanilla Linux kernel
  Type:  Kernel Image
  Compression: gzip compressed
  Data Size: 1092037 Bytes = 1066.44 kB = 1.04 MB
  Architecture: PowerPC
  OS:  Linux
  Load Address: 0x00000000
  Entry Point: 0x00000000
  Hash algo: crc32
  Hash value: 2c0cc807
  Hash algo: sha1
  Hash value: 264b59935470e42c418744f83935d44cdf59a3bb
 Image 1 (fdt@1)
  Description: Flattened Device Tree blob
  Type:  Flat Device Tree
  Compression: uncompressed
  Data Size: 16384 Bytes = 16.00 kB = 0.02 MB
  Architecture: PowerPC
  Hash algo: crc32
  Hash value: 0d655d71
  Hash algo: sha1
  Hash value: 25ab4e15cd4b8a5144610394560d9c318ce52def
 Default Configuration: 'conf@1'
 Configuration 0 (conf@1)
  Description: Boot Linux kernel with FDT blob
  Kernel: kernel@1
  FDT:  fdt@1

在当前目录下就可以找到kernel_fdt.itb,itb文件就可以加载到设备上启动。

> tftp 900000 /path/to/tftp/location/kernel_fdt.itb
Using FEC device
TFTP from server 192.168.1.1; our IP address is 192.168.160.5
Filename '/path/to/tftp/location/kernel_fdt.itb'.
Load address: 0x900000
Loading: #################################################################
  ###########
done
Bytes transferred = 1109776 (10ef10 hex)
=> iminfo

## Checking Image at 00900000 ...
   FIT image found
   FIT description: Simple image with single Linux kernel and FDT blob
   Created:     2008-03-11 15:29:22 UTC
    Image 0 (kernel@1)
     Description:  Vanilla Linux kernel
     Type:    Kernel Image
     Compression:  gzip compressed
     Data Start:   0x009000ec
     Data Size:    1092037 Bytes =  1 MB
     Architecture: PowerPC
     OS:    Linux
     Load Address: 0x00000000
     Entry Point:  0x00000000
     Hash algo:    crc32
     Hash value:   2c0cc807
     Hash algo:    sha1
     Hash value:   264b59935470e42c418744f83935d44cdf59a3bb
    Image 1 (fdt@1)
     Description:  Flattened Device Tree blob
     Type:    Flat Device Tree
     Compression:  uncompressed
     Data Start:   0x00a0abdc
     Data Size:    16384 Bytes = 16 kB
     Architecture: PowerPC
     Hash algo:    crc32
     Hash value:   0d655d71
     Hash algo:    sha1
     Hash value:   25ab4e15cd4b8a5144610394560d9c318ce52def
    Default Configuration: 'conf@1'
    Configuration 0 (conf@1)
     Description:  Boot Linux kernel with FDT blob
     Kernel:    kernel@1
     FDT:    fdt@1
=> bootm
## Booting kernel from FIT Image at 00900000 ...
   Using 'conf@1' configuration
   Trying 'kernel@1' kernel subimage
     Description:  Vanilla Linux kernel
     Type:    Kernel Image
     Compression:  gzip compressed
     Data Start:   0x009000ec
     Data Size:    1092037 Bytes =  1 MB
     Architecture: PowerPC
     OS:    Linux
     Load Address: 0x00000000
     Entry Point:  0x00000000
     Hash algo:    crc32
     Hash value:   2c0cc807
     Hash algo:    sha1
     Hash value:   264b59935470e42c418744f83935d44cdf59a3bb
   Verifying Hash Integrity ... crc32+ sha1+ OK
   Uncompressing Kernel Image ... OK
## Flattened Device Tree from FIT Image at 00900000
   Using 'conf@1' configuration
   Trying 'fdt@1' FDT blob subimage
     Description:  Flattened Device Tree blob
     Type:    Flat Device Tree
     Compression:  uncompressed
     Data Start:   0x00a0abdc
     Data Size:    16384 Bytes = 16 kB
     Architecture: PowerPC
     Hash algo:    crc32
     Hash value:   0d655d71
     Hash algo:    sha1
     Hash value:   25ab4e15cd4b8a5144610394560d9c318ce52def
   Verifying Hash Integrity ... crc32+ sha1+ OK
   Booting using the fdt blob at 0xa0abdc
   Loading Device Tree to 007fc000, end 007fffff ... OK
[    0.000000] Using lite5200 machine description
[    0.000000] Linux version 2.6.24-rc6-gaebecdfc (m8@hekate) (gcc version 4.0.0 (DENX ELDK 4.1 4.0.0)) #1 Sat Jan 12 15:38:48 CET 2008

bootm启动不同的配置

对于FIT Image,bootm有多种启动方式。

1. bootm <addr1>
2. bootm [<addr1>]:<subimg1>
3. bootm [<addr1>]#<conf>[#<extra-conf[#...]]
4. bootm [<addr1>]:<subimg1> [<addr2>]:<subimg2>
5. bootm [<addr1>]:<subimg1> [<addr2>]:<subimg2> [<addr3>]:<subimg3>
6. bootm [<addr1>]:<subimg1> [<addr2>]:<subimg2> <addr3>
7. bootm [<addr1>]:<subimg1> -     [<addr3>]:<subimg3>
8. bootm [<addr1>]:<subimg1> -     <addr3>

对于有多种镜像,多套配置的itb,都是以configurations 中default 指定的配置启动。

bootm 200000

也可以手动指定使用那套配置

bootm 200000#cfg@1

也可以手动搭配不同的镜像节点启动

bootm 200000:kernel@1 800000:ramdisk@2
bootm 200000:kernel@1 800000:ramdisk@1 800000:fdt@1
bootm 200000:kernel@2 200000:ramdisk@2 600000
bootm 200000:kernel@2 - 200000:fdt@1

如果bootm的时候不指定地址,则会使用CONFIG_SYS_LOAD_ADDR配置的地址。

总结

本文对FIT Image作了简单的介绍,更详细的内容可以参考官方文档。后面有时间会动手制作一个FIT Image在板子上跑下。

FIT Image可以兼容于多种板子,而无需重新进行编译烧写。对于有多个kernel节点或者fdt节点等等,兼容性更强。同时,可以有多种configurations,来对kernel、fdt、ramdisk来进行组合。

本文参考

https://www.elecfans.com/emb/20190402899374.html

http://www.wowotech.net/u-boot/fit_image_overview.html

howto.txt

command_syntax_extensions.txt

source_file_format.txt

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# 学习对象在全民造车、造芯的大时代,在努力去解决卡脖子的时代,ASIC硬件、SOC底层软件、Linux Kernel等操作系统软件(内核/驱动)、软硬件方面的系统架构师等的岗位需求也越来越明显,社会一直都是非常缺人的,缺的是核心的那一小撮、领头的那一小撮,社会所缺的更是能够软硬件融合的那一小撮人……总之,要想在这个时代,站稳自己的脚跟,能够在大公司或行业上拥有一席之地,就必需深入学习底层技术原理,核心技术才是您的看家本领。本课程设计之初,主要针对SOC底层软件开发的者、系统开发者,或者励志成为这样的人。既适合资深/高级工程师来查缺补漏,又适合初级工程师入门。(理论上该课程和ASIC硬件电路设计无关,该课程偏软件,但事实购买该课程的做ASIC的同学已然超过了15%)适用人群1、芯片开发者(包括底层软件、或做ASIC硬件的)。不限行业,例如车、云、物联网、移动端等领域;2、汽车行业开发者(主机厂、tier1、SOC厂家、各级供应商);3、嵌入式开发者、kernel开发者、驱动、软件工程师;4、学生。既适合学生从入门到精通,也适合资深工程师查缺补漏;您的收益:1、全体系的掌握ARMv8/ARMv9的核心知识点(ARM基础、异常中断GIC、MMU/Cache、architecture...);2、掌握ARM架构、掌握SOC架构、掌握常规IP(gic、smmu、timer、AXI/ACE/CHI、TZC400...);3、快速熟悉常规系统软件(bootrom、spl、ATF、TEE、bootloader、kernel...), Secureboot安全启动...4、技术水平提升N个level, 掌握快速的学习方法;# 学习什么在ARM蓬勃发展的年代,不仅仅涉及到物联网IOT、移动领域(如手机)、汽车电子领域,现在还涉及到PC、服务器的,简直就是各行各业。ARMv8出来已经有10年了,ARMv9也2年时间了。在技术不断更新迭代的背景下,此时再去学习十五年前的ARMv7、二十年前的ARMv5/v6显然不是明智的选择。本课程主要基于当前最新的架构,ARMv8的aarch64和ARMv9,如涉及具体的ARM Core IP主要还是以最新的ARM Core IP为主,软件架构也是以当前最主流的/未来所趋势的架构来讲解。以下也给大家列举初了一个ARM产品的timeline的总结(在本课程中有着大量的这种总结),从这张图中,您是可以清晰的看到本课程拥有独具一格的风格、拥有全网最新(且唯一)的资料总结或学习路线。# 本课程大纲和规划(课程持续更新中,课程总量统计:2022/10/02  当前是 61节课, 22小时)第一章:主要是快速学习: ARM简介、指令集、寄存器总结等。第二章:本系列视频的一大亮点,系统全面地讲解了arm异常中断gic等相关的软硬件知识,本人一直在倡导“学arm安全其实就是学arm架构,学arm架构其实就是学习arm的异常和中断”,异常中断是领着你进入架构的入门,是让你变成系统软硬件架构师的必走之路。第三章:安全专题,这也是本视频最核心的东西。因为你无论买书还是看博客等,你都很难找到讲解安全的教程,这里就是有和无的区别。本人系统的整理的安全的知识,带领你快速入门。第四章:mmu专题,透过事务看本质的讲解,白话式的演讲。在所有模块中,mmu也算是相对较简单模块。相信人人听得懂,人人学得会。第五章:cache专题,一切追求实事求是,不人云亦云,一切知识点都有迹可循,推翻了网络的很多观念。在众多模块中,cache算是一个比较难的模块。了解了cache后,才能算真正了解系统的软硬件架构。第六章:虚拟化,本人不擅长,会啥就随便讲点啥。(以后学会了再来补)第七章:architecture,就是零散和零碎的系统架构知识,如exclusive、arch timer、reset、系统启动、SOC设计、AMBA/AXI/ACE、DSU、WFE/WFI这样的。第八章: 新增的ARMv9 CCA/RME安全架构专题第九章:主要放置一些直播课。# 课程收益1、知道我学习什么,我要怎么去学习,从此之后有了一个明确的学习路线。2、认识一些共同目标的人,相互讨论问题,共同进步。勤学、共学、助学。3、ARM不再神秘,SOC不在神秘,让您短期内就能cover住全局4、熟悉ARM Architecture架构知识5、熟悉SOC架构知识6、熟悉主流的系统软件框架7、熟悉各项硬件原理和机制,如异常中断、MMU、cache、TLB、VMSA、Trustzone6、深入了解当前的系统架构、软硬件架构,能够看懂这些大家,将来也能够自己设计。7、熟悉系统的启动流程、Secureboot等8、熟悉各类标准和规范9、能够进入芯片厂商干活、能够在非芯片产生成为技术担当。10、学习资料的获取方法,会看11500多页的ARM手册,会看数以百计的ARM各项参考手册。 本课程会持续更新。也希望通过本课程的学习,能够让大家的ARMv8/ARMv9开发技术能有质的飞越,能找到自己心仪的工作。在购买之前,也建议大家看一看第一章第一节的课程介绍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值