Yocto:将kernel, u-boot, atf单独建库编译摒弃掉打patch方式

用过yocto都知道,如果要修改kernel源代码,需要生成patch, 并修改.bb文件让其编译的时候打上patch。但是这样其实个人觉得不是很方便。按之前安卓开发都是修改好代码后直接将其提交到git仓库。那么要如何将BSP开发经常用到几个库独立出来,编译的时候直接从指定的代码库里面去编译呢?下面就讲讲我摸索的办法。

工程默认的代码架构:

.
├── nxp-setup-alb.sh
└── sources

期望修改成如下:

.
├── nxp-setup-alb.sh
├── s32-atf
├── s32-kernel
├── s32-uboot
└── sources

让其编译kernel,u-boot, atf是源码从工程的根目录去获取。下面以kernel为例子进行讲解。

先看一下kernel有哪些task,其中有些task需要我们重新定义,让其按我们的想法走。

someone@ubt:/work/projects/b33_2/build_s32g274ardb2$ bitbake virtual/kernel -c listtasks
Loading cache: 100% |###########################################################################################################################| Time: 0:00:00
Loaded 4897 entries from dependency cache.
Parsing recipes: 100% |#########################################################################################################################| Time: 0:00:00
Parsing of 3299 .bb files complete (3298 cached, 1 parsed). 4895 targets, 289 skipped, 6 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "1.48.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "aarch64-fsl-linux"
MACHINE              = "s32g274ardb2"
DISTRO               = "fsl-auto"
DISTRO_VERSION       = "33.0"
TUNE_FEATURES        = "aarch64 armv8a crc cortexa53 crypto"
TARGET_FPU           = ""
meta
meta-poky
meta-yocto-bsp       = "HEAD:6a751048e50c00261d99c2d8d69534f7a8da38a9"
meta-oe
meta-multimedia
meta-python          = "HEAD:cd80c236199d885c7e89ff184b28a29241bbbd95"
meta-python2         = "HEAD:a964c78e39a575bcb2ca15f461e6689ce61a07cd"
meta-networking
meta-gnome
meta-filesystems
meta-webserver
meta-perl
meta-xfce            = "HEAD:cd80c236199d885c7e89ff184b28a29241bbbd95"
meta-virtualization  = "HEAD:c9397c38ada45030a40cf2ed690ff4edd6fa3e97"
meta-optee           = "HEAD:608874173d66d40cdd41d38962576d539220b2cf"
meta-security        = "HEAD:cb1ada6f60e163b91c99c8c28c9e7b78e619e094"
meta-freescale       = "HEAD:211af419458cbb3c3af506320fff061b1711974f"
meta-alb             = "HEAD:12dda07b693c9d1ec68a69e3a12fd5ccef0072a8"

Initialising tasks: 100% |######################################################################################################################| Time: 0:00:01
Sstate summary: Wanted 0 Found 0 Missed 0 Current 0 (0% match, 0% complete)
NOTE: No setscene tasks
NOTE: Executing Tasks
do_build                              Default task for a recipe - depends on all other normal tasks required to 'build' a recipe
do_bundle_initramfs                   Combines an initial ramdisk image and kernel together to form a single image
do_checkuri                           Validates the SRC_URI value
do_clean                              Removes all output files for a target
do_cleanall                           Removes all output files, shared state cache, and downloaded source files for a target
do_cleansstate                        Removes all output files and shared state cache for a target
do_compile                            Compiles the source in the compilation directory
do_compile_kernelmodules              Compiles loadable modules for the Linux kernel
do_configure                          Configures the source by enabling and disabling any build-time and configuration options for the software being built
do_deploy                             Writes deployable output files to the deploy directory
do_deploy_setscene                    Writes deployable output files to the deploy directory (setscene version)
do_deploy_source_date_epoch
do_deploy_source_date_epoch_setscene   (setscene version)
do_devpyshell                         Starts an interactive Python shell for development/debugging
do_devshell                           Starts a shell with the environment set up for development/debugging
do_diffconfig                         Compares the old and new config files after running do_menuconfig for the kernel
do_fetch                              Fetches the source code
do_install                            Copies files from the compilation directory to a holding area
do_kernel_link_images                 Creates a symbolic link in arch/$arch/boot for vmlinux and vmlinuz kernel images
do_listtasks                          Lists all defined tasks for a target
do_menuconfig                         Runs 'make menuconfig' for the kernel
do_merge_delta_config
do_package                            Analyzes the content of the holding area and splits it into subsets based on available packages and files
do_package_qa                         Runs QA checks on packaged files
do_package_qa_setscene                Runs QA checks on packaged files (setscene version)
do_package_setscene                   Analyzes the content of the holding area and splits it into subsets based on available packages and files (setscene version)
do_package_write_rpm                  Creates the actual RPM packages and places them in the Package Feed area
do_package_write_rpm_setscene         Creates the actual RPM packages and places them in the Package Feed area (setscene version)
do_packagedata                        Creates package metadata used by the build system to generate the final packages
do_packagedata_setscene               Creates package metadata used by the build system to generate the final packages (setscene version)
do_patch                              Locates patch files and applies them to the source code
do_populate_lic                       Writes license information for the recipe that is collected later when the image is constructed
do_populate_lic_setscene              Writes license information for the recipe that is collected later when the image is constructed (setscene version)
do_populate_sysroot                   Copies a subset of files installed by do_install into the sysroot in order to make them available to other recipes
do_populate_sysroot_setscene          Copies a subset of files installed by do_install into the sysroot in order to make them available to other recipes (setscene version)
do_preconfigure
do_prepare_recipe_sysroot
do_savedefconfig                      Creates a minimal Linux kernel configuration file
do_shared_workdir
do_shared_workdir_setscene             (setscene version)
do_sizecheck                          Checks the size of the kernel image against KERNEL_IMAGE_MAXSIZE (if set)
do_strip                              Strips unneeded sections out of the Linux kernel image
do_symlink_kernsrc
do_unpack                             Unpacks the source code into a working directory
NOTE: Tasks Summary: Attempted 1 tasks of which 0 didn't need to be rerun and all succeeded.

方便讲述这里也贴一下kernel对应bb文件部分内容

DESCRIPTION = "Linux kernel for S32 platforms"
SECTION = "kernel"
LICENSE = "GPLv2"

inherit kernel

inherit fsl-kernel-localversion

SCMVERSION ?= "y"
LOCALVERSION = ""
DELTA_KERNEL_DEFCONFIG ?= ""

URL ?= "git://source.codeaurora.org/external/autobsps32/linux;protocol=https"
BRANCH ??= "${RELEASE_BASE}-${PV}-rt"
SRC_URI = "${URL};branch=${BRANCH}"

DEPENDS_append = " libgcc dtc-native"

KERNEL_CC_append = " ${TOOLCHAIN_OPTIONS}"
KERNEL_LD_append = " ${TOOLCHAIN_OPTIONS}"

S = "${WORKDIR}/git"
MAJ_VER =  "${@oe.utils.trim_version("${PV}", 2)}"

默认情况下编译kernel会做如下task

do_fetch:  从git://source.codeaurora.org/external/autobsps32/linux对应branch分支,以clone bare的方式指定的到downloads/git2/source.codeaurora.org.external.autobsps32.linux目录下

do_unpack: 从downloads/git2/source.codeaurora.org.external.autobsps32.linux git clone到指定的文件夹build_s32g274ardb2/tmp/work/s32g274ardb2-fsl-linux/linux-s32/5.10.109-r0/git

do_symlink_kernsrc: 做了两件事,先将build_s32g274ardb2/tmp/work/s32g274ardb2-fsl-linux/linux-s32/5.10.109-r0/git文件夹move到build_s32g274ardb2/tmp/work-shared/s32g274ardb2/kernel-source。 再将build_s32g274ardb2/tmp/work-shared/s32g274ardb2/kernel-source链接到build_s32g274ardb2/tmp/work/s32g274ardb2-fsl-linux/linux-s32/5.10.109-r0/git

someone@ubt:/work/projects/nxp_b33/build_s32g274ardb2$ ls tmp/work/s32g274ardb2-fsl-linux/linux-s32/5.10.109-r0/ -al
total 36
drwxrwxr-x 7 someone someone 4096 8月  29 11:13 .
drwxrwxr-x 3 someone someone 4096 8月  29 11:13 ..
drwxr-xr-x 2 someone someone 4096 8月  29 11:13 build
-rw-rw-r-- 1 someone someone 35 7月  29 11:31 gcc75compat.config
lrwxrwxrwx 1 someone someone 84 8月  29 11:13 git -> /work/projects/nxp_b33/build_s32g274ardb2/tmp/work-shared/s32g274ardb2/kernel-source
drwxrwxr-x 2 someone someone 4096 8月  29 11:13 recipe-sysroot
drwxrwxr-x 3 someone someone 4096 8月  29 11:13 recipe-sysroot-native
drwxr-xr-x 2 someone someone 4096 8月  29 11:13 source-date-epoch
drwxrwxr-x 2 someone someone 4096 8月  29 11:13 temp

根据上面的task步骤, 修改成让其kernel源码用项目根目录的s32-kernel。具体的修改如下

--- a/recipes-kernel/linux/linux-s32.inc
+++ b/recipes-kernel/linux/linux-s32.inc
@@ -10,9 +10,9 @@ SCMVERSION ?= "y"
 LOCALVERSION = ""
 DELTA_KERNEL_DEFCONFIG ?= ""

-URL ?= "git://source.codeaurora.org/external/autobsps32/linux;protocol=https"
-BRANCH ??= "${RELEASE_BASE}-${PV}-rt"
-SRC_URI = "${URL};branch=${BRANCH}"
+#URL ?= "git://source.codeaurora.org/external/autobsps32/linux;protocol=https"
+#BRANCH ??= "${RELEASE_BASE}-${PV}-rt"
+#SRC_URI = "${URL};branch=${BRANCH}"

 DEPENDS_append = " libgcc dtc-native"

@@ -21,6 +21,26 @@ KERNEL_LD_append = " ${TOOLCHAIN_OPTIONS}"

 S = "${WORKDIR}/git"
 MAJ_VER =  "${@oe.utils.trim_version("${PV}", 2)}"
+PROJECT_DIR = "${@os.path.dirname("${TOPDIR}")}/s32-kernel"
+
+do_fetch(){
+}
+
+do_unpck(){
+}
+
+do_symlink_kernsrc(){
+    rm -rf ${TMPDIR}/work-shared/${MACHINE}/kernel-source
+    ln -sf ${PROJECT_DIR} ${TMPDIR}/work-shared/${MACHINE}/kernel-source
+    rm -rf ${S}
+    ln -sf ${PROJECT_DIR} ${S}
+}
+
+do_clean[postfuncs] += "git_repository_checkout"
+git_repository_checkout(){
+       cd ${PROJECT_DIR}
+       git clean -fd && git checkout -f
+}

修改点说明如下:

1.注释掉git仓库地址,重写task do_fetch使其为空函数。也就是说不让其从网上git clone仓库下来。

2.重新do_unpack函数,使其为空,不用编译系统git clone kernel源代码到build_s32g274ardb2/tmp/work/s32g274ardb2-fsl-linux/linux-s32/5.10.109-r0/git

3.重写do_symlink_kernsrc,主要工作在这里。

1)将build_s32g274ardb2/tmp/work/s32g274ardb2-fsl-linux/linux-s32/5.10.109-r0/git软链接到s32-kernel目录去。

2)  将build_s32g274ardb2/tmp/work-shared/s32g274ardb2/kernel-source 也软链接到 s32-kernel目录去。链接好后如下

someone@ubt:/work/projects/b33_2/build_s32g274ardb2$ ls -al tmp/work/s32g274ardb2-fsl-linux/linux-s32/5.10.109-r0/ -al
total 248
drwxrwxr-x 26 someone someone   4096 8月  29 12:25 .
drwxrwxr-x  3 someone someone   4096 8月  26 17:56 ..
drwxr-xr-x 20 someone someone   4096 8月  29 12:25 build
-rw-rw-r--  1 someone someone 116205 8月  29 12:23 defconfig
drwxr-xr-x  2 someone someone   4096 8月  29 12:25 deploy-linux-s32
drwxr-xr-x  3 someone someone   4096 8月  29 12:25 deploy-rpms
drwxrwxr-x  2 someone someone   4096 8月  29 12:23 deploy-source-date-epoch
lrwxrwxrwx  1 someone someone     31 8月  29 12:23 git -> /work/projects/b33_2/s32-kernel
drwxr-xr-x  5 someone someone   4096 8月  29 12:25 image
drwxrwxr-x  3 someone someone   4096 8月  29 12:23 license-destdir
-rw-r--r--  1 someone someone   4365 8月  29 12:25 linux-s32.spec
drwxr-xr-x  4 someone someone   4096 8月  29 12:25 package
drwxr-xr-x 11 someone someone   4096 8月  29 12:25 packages-split
drwxr-xr-x  7 someone someone   4096 8月  29 12:25 pkgdata
drwxr-xr-x  7 someone someone   4096 8月  29 12:25 pkgdata-pdata-input
drwxr-xr-x  6 someone someone   4096 8月  29 12:25 pkgdata-sysroot
drwxrwxr-x  2 someone someone   4096 8月  29 12:25 pseudo
drwxrwxr-x  5 someone someone   4096 8月  29 12:25 recipe-sysroot
drwxrwxr-x  8 someone someone   4096 8月  29 12:25 recipe-sysroot-native
drwxrwxr-x  2 someone someone   4096 8月  29 12:23 source-date-epoch
drwxrwxr-x  2 someone someone   4096 8月  26 17:56 sstate-install-deploy
drwxrwxr-x  2 someone someone   4096 8月  26 17:56 sstate-install-deploy_source_date_epoch
drwxrwxr-x  2 someone someone   4096 8月  26 17:56 sstate-install-packagedata
drwxrwxr-x  2 someone someone   4096 8月  26 17:56 sstate-install-package_qa
drwxrwxr-x  2 someone someone   4096 8月  26 17:56 sstate-install-package_write_rpm
drwxrwxr-x  2 someone someone   4096 8月  26 17:56 sstate-install-populate_lic
drwxrwxr-x  2 someone someone   4096 8月  26 17:56 sstate-install-populate_sysroot
drwxr-xr-x  3 someone someone   4096 8月  29 12:25 sysroot-destdir
drwxrwxr-x  2 someone someone  20480 8月  29 12:25 temp
someone@ubt:/work/projects/b33_2/build_s32g274ardb2$ ls tmp/work-shared/s32g274ardb2/kernel-source -al
lrwxrwxrwx 1 someone someone 31 8月  29 12:23 tmp/work-shared/s32g274ardb2/kernel-source -> /work/projects/b33_2/s32-kernel

4. 最后追加写了git_repository_checkout函数,这个函数是相当于do_clean后追加执行的。有点类似do_clean_append函数。但为什么不直接重写do_clean_append函数呢?其实开始的时候我是重写了do_clean_append函数,但是do_clean_append不能直接执行shell命令。究其原因是do_clean_append函数使用python去解析执行的(PS, 应该是和yocto的版本有关,记得几年前刚接触yocto时do_clean_append也是用shell去解释执行的,现在新版本不行了)。而像do_clean是用shell去解析执行的。而我有不想重写do_clean函数,只想在do_clean函数后追加执行我像要执行的命令(cd s32-kernel文件夹中执行git clean -fd && git checkout -f)。后面找了下发现可以用do_clean[postfuncs]加一个自定义函数。

do_clean[postfuncs] += "git_repository_checkout"
git_repository_checkout(){
       cd ${PROJECT_DIR}
       git clean -fd && git checkout -f
}

最后说一点PROJECT_DIR这个是自己定义的。当时为了获取到工程的根目录也是想了大半天。

PROJECT_DIR = "${@os.path.dirname("${TOPDIR}")}/s32-kernel"最后用这个获取到的。

.bb文件其实是用python去解析的。由于知道TOPDIR=/work/projects/b33_2/build_s32g274ardb2

所以这里调用python库函数os.path.dirname("${TOPDIR}")获取到/work/projects/b33_2/的根目录,后面在连接上s32-kernel后就正确指定了PROJECT_DIR=/work/projects/b33_2/s32-kernel

后续修改kernel代码就可以在工程根目录s32-kernel下进行,修改后直接git add , git commit , git push到服务器。修改完成后就直接可以bitbake 编译了。bitbake virtual/kernel -c compile -f

不需要之前繁琐的修改完成kernel代码后需要先生成patch, 再把patch拷贝到sources/meta-alb/recipes-kernel/linux/files/目录下,再修改对应的bb文件。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

关于重写do_clean_append函数,编译好像解析时就报错了。

+do_clean_append(){
+       cd ${PROJECT_DIR}
+       git clean -fd && git checkout -f
+}
+
t.DataSmart object at 0x7fef7ca97c70>):
                     parser = bb.codeparser.PythonParser(key, logger)
    >                parser.parse_python(value, filename=varflags.get("filename"), lineno=varflags.get("lineno"))
                     deps = deps | parser.references
  File "/work/projects/b33_2/sources/poky/bitbake/lib/bb/codeparser.py", line 308, in PythonParser.parse_python(node='\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    """clear the build and temp directories"""\n    dir = d.expand("${WORKDIR}")\n    bb.note("Removing " + dir)\n    oe.path.remove(dir)\n\n    dir = "%s.*" % d.getVar(\'STAMP\')\n    bb.note("Removing " + dir)\n    oe.path.remove(dir)\n\n    for f in (d.getVar(\'CLEANFUNCS\') or \'\').split():\n        bb.build.exec_func(f, d)\n\tcd ${PROJECT_DIR}\n\tgit clean -fd && git checkout -f\n', lineno='25', filename='/work/projects/b33_2/sources/poky/meta/classes/utility-tasks.bbclass'):
             node = "\n" * int(lineno) + node
    >        code = compile(check_indent(str(node)), filename, "exec",
                            ast.PyCF_ONLY_AST)
  File "/work/projects/b33_2/sources/poky/meta/classes/utility-tasks.bbclass", line 37
    cd ${PROJECT_DIR}
                    ^
TabError: inconsistent use of tabs and spaces in indentation

上面例子是用的do_clean[postfuncs] 去执行git_repository_checkout

do_clean[postfuncs] += "git_repository_checkout"
git_repository_checkout(){
       cd ${PROJECT_DIR}
       git clean -fd && git checkout -f
}

其实也可以用这种方法

git_repository_checkout(){
     cd ${PROJECT_DIR}
     git clean -fd && git checkout -f
}
 
do_clean_append() {
     bb.build.exec_func("git_repository_checkout", d)
}

注意自定义函数时,取名的时候不要加_append, _prepend,否则会报如下错误

kernel_append(){
    cd ${PROJECT_DIR}
    git clean -fd && git checkout -f
}
 
do_clean_append() {
     bb.build.exec_func("kernel_append", d)
}
ds', d=<bb.data_smart.DataSmart object at 0x7f3d58f5dfa0>):
                     parser = bb.codeparser.ShellParser(key, logger)
    >                parser.parse_shell(parsedvar.value)
                     deps = deps | shelldeps
  File "/work/projects/b33_2/sources/poky/bitbake/lib/bb/codeparser.py", line 343, in ShellParser.parse_shell(value=None):

    >        self._parse_shell(value)
             self.execs = set(cmd for cmd in self.allexecs if cmd not in self.funcdefs)
  File "/work/projects/b33_2/sources/poky/bitbake/lib/bb/codeparser.py", line 354, in ShellParser._parse_shell(value=None):
             except Exception:
    >            bb.error('Error during parse shell code, the last 5 lines are:\n%s' % '\n'.join(value.split('\n')[-5:]))
                 raise
AttributeError: 'NoneType' object has no attribute 'split'

最后贴一些.bb里面可能会用到的一些变量

TOPDIR=/work/projects/b33_2/build_s32g274ardb2

TMPDIR=/work/projects/b33_2/build_s32g274ardb2/tmp

B=/work/projects/b33_2/build_s32g274ardb2/tmp/work/s32g274ardb2-fsl-linux/linux-s32/5.10.109-r0/build

WORKDIR=/work/projects/b33_2/build_s32g274ardb2/tmp/work/s32g274ardb2-fsl-linux/linux-s32/5.10.109-r0

COMPONENTS_DIR=/work/projects/b33_2/build_s32g274ardb2/tmp/sysroots-components

DEPLOY_DIR=/work/projects/b33_2/build_s32g274ardb2/tmp/deploy

DL_DIR=/work/projects/b33_2/downloads

LOG_DIR=/work/projects/b33_2/build_s32g274ardb2/tmp/log

PKGDATA_DIR=/work/projects/b33_2/build_s32g274ardb2/tmp/pkgdata/s32g274ardb2

STAMPS_DIR=/work/projects/b33_2/build_s32g274ardb2/tmp/stamps

THISDIR=/work/projects/b33_2/sources/meta-alb/recipes-kernel/linux

SYSROOT_DIRS=     /usr/include     /usr/lib     /lib     /lib     /usr/share

STAMP=/work/projects/b33_2/build_s32g274ardb2/tmp/stamps/s32g274ardb2-fsl-linux/linux-s32/5.10.109-r0

MACHINE=s32g274ardb2

PN=linux-s32

PV=5.10.109

PR=r0

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
# 学习对象在全民造车、造芯的大时代,在努力去解决卡脖子的时代,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开发技术能有质的飞越,能找到自己心仪的工作。在购买之前,也建议大家看一看第一章第一节的课程介绍。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值