当前位置: 首页 > news >正文

Rockchip Android13 GKI开发指南

Rockchip Android13 GKI开发指南

文章目录

  • Rockchip Android13 GKI开发指南
    • GKI介绍
    • Google upstream kernel下载及编译
    • Rockchip SDK中GKI相关目录介绍
    • Rockchip GKI编译
      • 代码修改
      • 编译
      • 固件烧写
    • KO编译及修改
      • 添加新的模块驱动的方法
      • 调试ko方法
    • 开机log确认
      • uboot阶段
      • Android阶段
      • KO加载
      • KO加载报错
    • 调试技巧
      • 打印更多KO加载的log
      • 在RK的kernel打包中编译GKI使用的boot.img
      • 查看google发布的内核接口
    • 如何提交内核接口到upstream

GKI介绍

Android13 GMS和EDLA认证的一个难点是google强制要求要支持GKI。GKI通用内核映像,是google为了解决内核碎片化的问题,而设计的通过提供统一核心内核并将SoC和板级驱动从核心内核移至可加载模块中。核心内核为驱动模块提供了稳定的内核模块接口,模块驱动和核心内核可以独立进行更新。内核接口可以通过upstream的方式进行扩展。 Soc和板级厂商在驱动开发时需要使用已经定义的内核接口,如果要新加核心内核接口需要提交给google,这个周期会比较长,所以要提前做好开发准备。

Google upstream kernel下载及编译

Google的boot.img是定期发布,时间间隔比较长。 我们可以下载google的upstream的kernel源码自己编译boot.img进行验证和debug。

Google Upstream kernel下载链接:

repo init -u https://android.googlesource.com/kernel/manifest -b common-android13-5.10

需要翻墙下载

编译

tools/bazel run --config=fast //common:kernel_aarch64_dist -- --dist_dir=./out

生成boot.img

out/boot.img

Rockchip SDK中GKI相关目录介绍

  • kernel KO文件路径
mkcombinedroot/vendor_ramdisk/lib/modules/
  • Google boot.img路径
mkcombinedroot/prebuilts/boot-5.10.img
  • KO文件加载顺序配置文件
mkcombinedroot/res/vendor_ramdisk_modules.load
  • GPU mali库的路径
    GPU的mali库是单独编译在vendor.img中,源文件路径在
RK3588:
vendor/rockchip/common/gpu/MaliG610/lib/modules/bifrost_kbase.ko
RK356X:
vendor/rockchip/common/gpu/MaliG52/lib/modules/bifrost_kbase.ko
RK3326:
vendor/rockchip/common/gpu/MaliTDVx/lib/modules/mali_kbase.ko

Rockchip GKI编译

代码修改

GKI需要打开AB系统才能使用,具体代码修改如下:

  1. uboot需要打开AB配置
~/a2_Android13_sdk/u-boot$ git diff
diff --git a/configs/rk3568_defconfig b/configs/rk3568_defconfig
index fbd9820acc..e23e438792 100644
--- a/configs/rk3588_defconfig
+++ b/configs/rk3588_defconfig
@@ -207,6 +207,7 @@ CONFIG_RSA_N_SIZE=0x200
CONFIG_RSA_E_SIZE=0x10
CONFIG_RSA_C_SIZE=0x20
CONFIG_SHA512=y
CONFIG_LZ4=y
CONFIG_LZMA=y
CONFIG_SPL_GZIP=y
@@ -220,3 +221,4 @@ CONFIG_RK_AVB_LIBAVB_USER=y
CONFIG_OPTEE_CLIENT=y
CONFIG_OPTEE_V2=y
CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y
+CONFIG_ANDROID_AB=y
  1. Android的device产品目录下配置GKI选项
~/a2_Android13_sdk/device/rockchip/rk3588$ git diff
diff --git a/rk3588_t/BoardConfig.mk b/rk3588_t/BoardConfig.mk
old mode 100644
new mode 100755
index 50da541..06da5f3
--- a/rk3588_t/BoardConfig.mk
+++ b/rk3588_t/BoardConfig.mk
@@ -15,10 +15,21 @@#include device/rockchip/rk3588/BoardConfig.mkBUILD_WITH_GO_OPT := false
+BOARD_BUILD_GKI := true-# AB image definition
-BOARD_USES_AB_IMAGE := false
-BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := false
+ifeq ($(strip $(BOARD_BUILD_GKI)), true)
+    #for gki
+    # AB image definition
+    BOARD_USES_AB_IMAGE := true
+    BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := true
+    #PRODUCT_KERNEL_CONFIG := rockchip_defconfig android-13.config
+    PRODUCT_KERNEL_CONFIG := gki_defconfig rockchip_gki.config
+    BOARD_BOOT_HEADER_VERSION := 4
+else
+    BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := false
+    BOARD_USES_AB_IMAGE := false
+    PRODUCT_KERNEL_CONFIG := rockchip_defconfig android-13.config
+endifBOARD_GRAVITY_SENSOR_SUPPORT := trueBOARD_COMPASS_SENSOR_SUPPORT := true
@@ -26,14 +37,21 @@ BOARD_SENSOR_COMPASS_AK8963-64 := trueBOARD_GYROSCOPE_SENSOR_SUPPORT := trueBOARD_PROXIMITY_SENSOR_SUPPORT := trueBOARD_LIGHT_SENSOR_SUPPORT := trueifeq ($(strip $(BOARD_USES_AB_IMAGE)), true)include device/rockchip/common/BoardConfig_AB.mkTARGET_RECOVERY_FSTAB := device/rockchip/rk3588/rk3588_t/recovery.fstab_ABendif
-
+ifeq ($(strip $(BOARD_BUILD_GKI)), true)
+    #for gki
+    BOARD_SUPER_PARTITION_SIZE := 4294967296
+    BOARD_ROCKCHIP_DYNAMIC_PARTITIONS_SIZE := $(shell expr $(BOARD_SUPER_PARTITION_SIZE) - 4194304)
+endifPRODUCT_UBOOT_CONFIG := rk3588PRODUCT_KERNEL_DTS := rk3588-evb1-lp4-v10BOARD_GSENSOR_MXC6655XA_SUPPORT := trueBOARD_CAMERA_SUPPORT_EXT := true

编译

完整编译方式与非GKI的一样

source  build/envsetup.sh
lunch rk3588_t-userdebug
./build.sh -ACUKup

注意:这里编译的kernel只是为了编译出resource.img,kernel源码部分都是使用mkcombinedroot/vendor_ramdisk/lib/modules/下的ko文件直接打包成vendor_boot.img。内核部分使用的是google发布的boot.img,具体路径在mkcombinedroot/prebuilts/boot-5.10.img

编译完可以直接烧写 rockdev/Image-rk3588_t/update.img

在调试阶段也支持单独编译vendor_boot.img
编译命令:

make installclean;make vendorbootimage -j12

编译完可以直接烧写

out/target/product/rk3588_t/vendor_boot.img

固件烧写

固件烧写分2中方式:

  • 完整包update.img
    固件路径
rockdev/Image-rk3588_t/update.img

在这里插入图片描述

可以通过瑞芯微开发工具烧写

  • 散包烧写
    首先导入配置文件,方法是在工具 空白处右键-导入配置-选择导入txt文件-选择parameter.txt
    在这里插入图片描述
    然后依次选择rockdev/Image-rk3588_t/下对应的img文件进行烧写,分区A和B导入的固件是同一个
rockdev/Image-rk3588_t
├── baseparameter.img
├── boot.img
├── dtbo.img
├── init_boot.img
├── MiniLoaderAll.bin
├── misc.img
├── parameter.txt
├── resource.img
├── super.img
├── uboot.img
├── update.img
├── vbmeta.img
└── vendor_boot.img

在这里插入图片描述

KO编译及修改

添加新的模块驱动的方法

  1. 将驱动代码放到kernel-5.10对应的目录下,这里以新加触摸屏驱动gt1x为例进行说明。
    将gt1x的驱动放在drivers/input/touchscreen/下面,并添加对应的MakefileKconfig,这里按kernel的标准方式进行操作;
  2. 增加一个自己的config文件, 在arch/arm64/configs/下新建一个xxx_gki.config,并将CONFIG_TOUCHSCREEN_GT1X=m (m表示编译为ko)添加到xxx_gki.config中;
  3. 将ko文件名添加到load文件中, load文件在SDK的mkcombinedroot/res/目录下,如下

|.load文件名称| 对应分区 | makefile解析 |加载时间|
| - | - | - |
| vendor_ramdisk_modules.load | vendor_boot | vendor_ramdisk_gki.mk |ramdisk init阶段|
| vendor_modules.load | vendor | vendor_gki.mk |android启动时|
| recovery_modules.load | recovery | recovery_gki.mk |recovery阶段|

触摸屏驱动要在init阶段加载所以加到vendor_ramdisk_modules.load

echo "gt1x-ts.ko" >> res/vendor_ramdisk_modules.load

触摸屏驱动要在init阶段加载所以加到vendor_ramdisk_modules.load
同时要将也要在res/debug_list.load中添加,作为调试用,在这里面加编译的时候才会从kernel中更新对应的ko到vendor_boot.img中。 注意: res/debug_list.load仅做调试用,不需要提交到服务器上。

echo "gt1x-ts.ko" >> res/debug_list.load

注意 1:.load文件关乎驱动的加载顺序,请不要修改原有顺序,仅在需要时添加自己的驱动名称,否则可能会导致系统无法启动!!!

注意 2:如果使用A/B系统,请务必保证vendor_ramdisk_modules.loadrecovery_modules.load文件内容一致,否则会导致无法启动!代码默认使用软链接将二者链接起来,请不要自己修改!!!

注意 3:如果是在android启动的时候加载的ko可以放在vendor_modules.load中,但需要注意:vendor下的ko不会被系统主动加载!如果仅需要在开机阶段自动加载,可以使用Rockchip提供的默认加载脚本init.insmod.sh,该脚本会自动加载device/rockchip/common/rootdir/init.insmod.cfg配置中的所有ko。

  1. 编译
  • 进到kernel-5.10目录下进行ko文件编译

配置clang编译链(编译链版本请参考build.sh中的配置)

export PATH=../prebuilts/clang/host/linux-x86/clang-r450784d/bin:$PATH
make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 gki_defconfig rockchip_gki.config xxx_gki.config && make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 rk3588s-evb8-lp4x-v10.img -j32
  1. 拷贝KO文件到mkcombinedroot/vendor_ramdisk/lib/modules/
    KO编完后进到mkcombinedroot/下执行mkgki4.sh脚本自动从kernel-5.10下面拷贝; 也可以手动进行拷贝
cd ../mkcombinedroot/
./mkgki4.sh
  1. 编译vendor_boot.img
    在工程根目录下编译vendor_boot.img,命令如下。 这一步是将KO文件打包到vendor_boot.img,在降vendor_boot.img烧写到机器中。
make installclean;make vendorbootimage -j12
  1. 验证
  • 烧写out/target/product/rk3588_t/vendor_boot.img文件到机器中开机验证

  • 如果是放在vendor分区的ko可以在系统起来后直接push到机器内的vendor分区中,手动挂载进行验证

  • 如果有涉及到dts的修改,需要烧写kernel-5.10下的resource.img

附:AOSP定义的各类ko加载阶段

Boot modeStorageDisplayKeypadBatteryPMICTPNFC/Wi-Fi/BTSensorsCamera
RecoveryYYYYYNNNN
ChargerYYYYYNNNN
AndroidYYYYYYYYY

调试ko方法

  1. 在kernel-5.10目录下修改对应ko的驱动源码

  2. 使用如下命令进行ko编译

  • 配置clang编译链(编译链版本请参考build.sh中的配置)
    export PATH=../prebuilts/clang/host/linux-x86/clang-r450784d/bin:$PATH
    
  • 编译ko
    make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 gki_defconfig rockchip_gki.config xxx_gki.config && make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1 ARCH=arm64 rk3588s-evb8-lp4x-v10.img -j32
    
  1. 进到mkcombinedroot目录。将需要更新的ko文件名添加到res/debug_list.load

  2. 进到mkcombinedroot目录,配置dtb,执行./mkgki4.sh将ko文件打包到vender_boot.img

    cd ../mkcombinedroot/
    export MY_DTB=rk3588s-evb8-lp4x-v10
    ./mkgki4.sh
    
    1. 拷贝KO文件到mkcombinedroot/vendor_ramdisk/lib/modules/
      KO编完后进到mkcombinedroot/下执行mkgki4.sh脚本自动从kernel-5.10下面拷贝; 也可以手动进行拷贝
    cd ../mkcombinedroot/
    ./mkgki4.sh
    
    1. 编译vendor_boot.img
      在工程根目录下编译vendor_boot.img,命令如下。 这一步是将KO文件打包到vendor_boot.img,在降vendor_boot.img烧写到机器中。
     make installclean;make vendorbootimage -j12
    
    1. 验证
    • 烧写out/target/product/rk3588_t/vendor_boot.img文件到机器中开机验证
    • 如果是放在vendor分区的ko可以在系统起来后直接push到机器内的vendor分区中,手动挂载进行验证
    • 如果有涉及到dts的修改,需要烧写kernel-5.10下的resource.img
    1. 调试完成后,将vendor_ramdisk/lib/modules的ko文件(被脚本自动拷贝)进行提交

有关打包工具的详细说明,请参考:mkcombinedroot/README

注意:kernel编译ko的时候如果有修改了config,则编译中间会卡住很长一段时间,这是在做编译优化,根据编译服务器硬件配置不同优化的速度也不同,即卡住的时间也不同。 所以这个卡住是正常现象。

开机log确认

uboot阶段

内容header版本
vendor_ramdisk(v-ramdisk)V3+
bootconfigV4+
## Booting Android Image at 0x003ff000 ...
Kernel: 0x00400000 - 0x03088ffc (45604 KiB)
v-ramdisk:  0x0a200000 - 0x0a6944c8 (4690 KiB)
ramdisk:    0x0a6944c8 - 0x0a7e54df (1349 KiB)
bootconfig: 0x0a7e54df - 0x0a7e559c (1 KiB)
bootparams: 0x0a7e559c - 0x0a7e759c

Android阶段

GKI版本: Linux version 5.10.117-android13-9-00037-gbc08447eb7bd

[    0.000000][    T0] Booting Linux on physical CPU 0x0000000000 [0x412fd050]
[    0.000000][    T0] Linux version 5.10.117-android12-9-00037-gbc08447eb7bd (build-user@build-host) (Android (7284624, based on r416183b) clang version 
12.0.5 (https://android.googlesource.com/toolchain/llvm-project c935d99d7cf2016289302412d708641d52d2f7ee), LLD 12.0.5 (/buildbot/src/android/llvm-toolchai
n/out/llvm-project/lld c935d99d7cf2016289302412d708641d52d2f7ee)) #1 SMP PREEMPT Thu Aug 25 15:24:20 UTC 2022

Kernel command line: Header V4中不能存在androidboot.xxx这一类的命令行参数,这类参数全部在bootconfig中。此类参数可以通过cat /proc/bootconfig确认。

[    0.000000][    T0] Kernel command line: stack_depot_disable=on kasan.stacktrace=off kvm-arm.mode=protected cgroup_disable=pressure cgroup.memory=nokme
m storagemedia=emmc console=ttyFIQ0 firmware_class.path=/vendor/etc/firmware init=/init rootwait ro loop.max_part=7 bootconfig buildvariant=userdebug earl
ycon=uart8250,mmio32,0xfeb50000 irqchip.gicv3_pseudo_nmi=0 

KO加载

开始加载ko,可以看到log:

[    1.034730][    T1] Run /init as init process
[    1.036190][    T1] init: init first stage started!
[    1.040534][    T1] init: Loading module /lib/modules/io-domain.ko with args ''
[    1.042038][    T1] init: Loaded kernel module /lib/modules/io-domain.ko

KO加载报错

使用了未导出的符号,报错重启:

[    0.805736][    T1] cryptodev: Unknown symbol crypto_ahash_final (err -2)
[    0.806383][    T1] cryptodev: Unknown symbol sg_nents (err -2)
[    0.806972][    T1] cryptodev: Unknown symbol crypto_alloc_akcipher (err -2)
[    0.819768][    T1] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00007f00

注: 正常不会出现此问题,参考 名词解释阶段——ABI进行处理

调试技巧

打印更多KO加载的log

修改ratelimit的值,可以打印更多init的log,方便查问题,init信息太少会把ko加载的报错信息隐藏掉。

xxx@sys2_206:~/a2_Android13_29_sdk/kernel-5.10$ git diff
diff --git a/include/linux/ratelimit_types.h b/include/linux/ratelimit_types.h
index b676aa419eef..db7eb5be2d8b 100644
--- a/include/linux/ratelimit_types.h
+++ b/include/linux/ratelimit_types.h
@@ -7,7 +7,7 @@
#include <linux/spinlock_types.h>
#define DEFAULT_RATELIMIT_INTERVAL     (5 * HZ)
-#define DEFAULT_RATELIMIT_BURST                10
+#define DEFAULT_RATELIMIT_BURST                1000

在RK的kernel打包中编译GKI使用的boot.img

先按正常编译步骤编译kernel,生成arch/arm64/boot/Image
用如下命令打包boot.img
mkbootimg --kernel arch/arm64/boot/Image --header_version 4 --output …/mkcombinedroot/prebuilts/boot-5.10.img

查看google发布的内核接口

标准的内核接口定义在android目录下:

:~/a5_google_kenrel/common$ tree a
android/ arch/
wlq@sys2_206:~/a5_google_kenrel/common$ tree android/
android/
├── abi_gki_aarch64
├── abi_gki_aarch64_core
├── abi_gki_aarch64_db845c
├── abi_gki_aarch64_exynos
├── abi_gki_aarch64_fips140
├── abi_gki_aarch64_galaxy
├── abi_gki_aarch64_generic
├── abi_gki_aarch64_hikey960
├── abi_gki_aarch64_rockchip
├── abi_gki_aarch64_type_visibility
├── abi_gki_aarch64_virtual_device
├── abi_gki_aarch64.xml
├── abi_gki_modules_exports
├── abi_gki_modules_protected
├── gki_aarch64_fips140_modules
├── gki_aarch64_modules
└── gki_system_dlkm_modules

如何提交内核接口到upstream

如果需要添加新的内核接口,可以生成对应的patch,再将patch通过瑞芯微的redmine系统提交个瑞芯微审核然后再统一提交给google

diff --git a/android/abi_gki_aarch64_rockchip b/android/abi_gki_aarch64_rockchip
index 3344cf064e06..203c79ff1123 100644
--- a/android/abi_gki_aarch64_rockchip
+++ b/android/abi_gki_aarch64_rockchip
@@ -2560,6 +2560,9 @@sdhci_remove_hostsdhci_request+# required by sensorbox.ko
+  kernel_sigaction
+# required by sensor_dev.koclass_create_file_nsclass_remove_file_ns

相关文章:

Rockchip Android13 GKI开发指南

Rockchip Android13 GKI开发指南 文章目录Rockchip Android13 GKI开发指南GKI介绍Google upstream kernel下载及编译Rockchip SDK中GKI相关目录介绍Rockchip GKI编译代码修改编译固件烧写KO编译及修改添加新的模块驱动的方法调试ko方法开机log确认uboot阶段Android阶段KO加载KO…...

手把手教你原生JavaScript打造丝滑流畅的轮播图,让你的网站瞬间提升用户体验!

简介 轮播图是网页设计中常见的交互组件之一&#xff0c;用于展示多张图片或内容&#xff0c;让用户能够方便地浏览、切换和选择。本文将介绍如何使用原生 JavaScript 手写一个简单的轮播图&#xff0c;并且通过代码解释实现细节。 目录 简介 HTML 结构 CSS 样式 JavaScr…...

git常用基本操作

克隆远程代码更新本地代码 git clone <-b | -branch> [branch name] [repository URL] git pull #拉取远程仓库代码&#xff0c;更新本地仓库 git merge <branch-name> #合并目标分支 建立本地仓库分支 git branch #查看当…...

剑指 Offer —— 数组和字符串

文章目录剑指 Offer 04. 二维数组中的查找代码实现解题方案 思路算法步骤剑指 Offer 05. 替换空格题目描述代码实现解题方案 思路算法步骤剑指 Offer 11. 旋转数组的最小数字 - 解决方案题目描述剑指 Offer 04. 二维数组中的查找 在一个 n * m 的二维数组中&#xff1a; 每…...

Java 字符编码

编码&#xff1a;数据存储进计算机中需要转换为二进制存储&#xff0c;这个过程就是编码。 解码&#xff1a;计算机读取数据并展示在页面上&#xff0c;需要将二进制转换为人类语言的过程&#xff0c;叫做解码。 乱码&#xff1a;如果编码和解码时使用的码表不一样&#xff0c;…...

ubuntu-9-安装chrony时间同步

使用chrony搭建时间同步服务器 [Linux系列]Chrony时间同步服务器 配置chrony服务&#xff0c;实现服务器时间自动同步 linux上内网环境配置NTP时间同步详解 经验体会&#xff1a;解决Ubuntu 18.04Windows双系统时间不同步的问题 1 时间同步 我们知道一台电脑主机&#xff0c;…...

CMMI流程规范—服务与维护

服务与维护&#xff08;Service and Maintenance, SM&#xff09;是指产品销售之后的客户服务和产品维护。客户服务和产品维护的宗旨就是提高客户对产品以及对开发方的满意度。服务与维护过程域是SPP模型的重要组成部分。本规范阐述了服务与维护过程域的两个主要规程&#xff1…...

【蓝桥杯集训12】DFS(3 / 5)

目录 842. 排列数字 - DFS按位置枚举 843. n-皇后问题 - DFS按行枚举 165. 小猫爬山 - DFS枚举小猫 1209. 带分数 - DFS 3502. 不同路径数 - 842. 排列数字 - DFS按位置枚举 活动 - AcWing 题目&#xff1a; 给你一个整数n 要求将1~n的所有排列情况列出 比如&#xff1a…...

Elasticsearch:构建自动补全功能 - Autocomplete

什么是自动补全&#xff08;autocomplete&#xff09;功能呢&#xff1f;我们举一个很常见的例子。 每当你去谷歌并开始打字时&#xff0c;就会出现一个下拉列表&#xff0c;其中列出了建议。 这些建议与查询相关并帮助用户完成查询。 Autocomplete 正如维基百科所说的&#xf…...

One UI 5.1 更新来了

之前一直在关注One UI 5.0里提到的视频通话背景功能模块&#xff0c;结果5.0版本推送的时候没有引入&#xff0c;有先行者计划博主说是5.1里肯定会有的&#xff1b;前一两天One UI 5.1更新来了&#xff0c;然而该功能还是没有引入&#xff0c;表示很遗憾&#xff1b;本次更新新…...

Python学习笔记11:文件

文件 打开文件 函数open的参数mode的最常见取值 值描述‘r’读取模式&#xff08;默认值&#xff09;‘w’写入模式‘x’独占写入模式‘a’附加模式‘b’二进制模式&#xff08;与其他模式结合使用&#xff09;‘t’文本模式&#xff08;默认值&#xff0c;与其他模式结合使…...

django-filter的使用

django-filter是一个通用的、可重用的应用程序&#xff0c;它可以减轻视图代码的编写工作量。具体来说&#xff0c;它允许用户根据模型的字段筛选查询集&#xff0c;并显示表单让他们这样做。 安装 pip install django-filter快速开始 在settings.py中添加如下配置: INSTAL…...

时序预测 | MATLAB实现IWOA-BiLSTM和BiLSTM时间序列预测(改进的鲸鱼算法优化双向长短期记忆神经网络)

时序预测 | MATLAB实现IWOA-BiLSTM和BiLSTM时间序列预测(改进的鲸鱼算法优化双向长短期记忆神经网络) 目录时序预测 | MATLAB实现IWOA-BiLSTM和BiLSTM时间序列预测(改进的鲸鱼算法优化双向长短期记忆神经网络)预测效果基本介绍程序设计参考资料预测效果 基本介绍 MATLAB实现IWO…...

【C++】string的成员函数、成员常量和非成员函数

目录 string 1. string的成员函数 1.1 构造、析构和赋值运算符重载 1.1.1 构造函数 1.1.2 析构函数 1.1.3 赋值运算符重载 1.2 迭代器 1.3 容量 1.4 元素访问 1.4.1 遍历方法 1.5 修改器 1.6 字符串操作 2. string的成员常量 3. string的非成员函数 string 以下…...

网络互连模型:OSI 七层模型

OSI 七层模型 七层模型&#xff0c;亦称 OSI&#xff08;Open System Interconnection&#xff09;。OSI 七层参考模型是国际标准化组织&#xff08;ISO&#xff09;制定的一个用于计算机或通信系统间网络互联的标准体系&#xff0c;一般称为 OSI 参考模型或七层模型。OSI 七层…...

18跨越语言:不同语言间进行RPC通信

在最开始介绍gRPC时我们讲到,gRPC具有灵活的兼容性,可以支持很多种编程语言,下面我们就使用在后端领域最常用的两种编程语言Go和Java,来体验一下gRPC在不同语言的项目间是如何进行通信的。 逻辑架构 由上图我们可以看出,Go语言设计gRPC的服务端,Java语言设计gRPC的客户端…...

解压缩工具:Bandizip 中文

bandizip是一款可靠和快速的压缩软件&#xff0c;它可以解压RAR、7Z、ZIP、ISO等数十种格式&#xff0c;也可以压缩7Z、ZIP、ISO等好几种常用格式&#xff0c;在压缩文件方面毫不逊色于winrar&#xff0c;适用于多核心压缩、快速拖放、高速压缩等功能&#xff0c;采用了先进快速…...

JAVA知识点全面总结2:面向对象

二.面向对象 1.面向对象有哪些重要的关键字&#xff1f;作用是什么&#xff1f; 2.理解多态的使用&#xff1f; 3.接口与抽象类的相同点和不同点&#xff1f; 4.equals和toString的判断&#xff1f; 5.新建对象的流程是什么&#xff1f;new一个对象&#xff1f; 6.深拷贝…...

DNS作用及工作原理

文章目录1. DNS作用2 DNS 三个组成部分&#xff1a;2.1 客户端2.2Local DNS2.3 权威域 DNS 服务器3 工作过程1. DNS作用 DNS 分为 Client 和 Server&#xff0c;Client 扮演发问的角色&#xff0c;也就是问 Server 一个 Domain Name&#xff0c;而 Server 必须要回答此 Domain…...

Android 9.0 wifi的随机mac地址修改为固定不变

1.前言 在9.0的系统rom产品定制化开发中,在系统默认的wifi的mac地址是会在联网前后会变化,因为默认是随机显示mac地址,所以会在连上wifi后mac地址会变动但是如果根据mac地址来升级 会引起一系列问题,为了避免这些问题 所以就要求固定mac地址,这就需要看wifi模块怎么改变ma…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...