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

ELF program/section segment解析

ELF program/section segment解析

  • 1 elf program segment
    • 1.1 elf program header
    • 1.2 ELF32和ELF64示例
      • 1.2.1 ELF32 program segment
      • 1.2.2 ELF64 program segment
    • 1.3 elf program segment数据流向图
  • 2 elf section
    • 2.1 eld section header
    • 2.2 ELF32和ELF64示例
      • 2.2.1 ELF32 section
      • 2.2.2 ELF64 section
    • 2.3 elf section数据流向图

在linux remoteproc驱动中elf解析函数实现分析文章中介绍了在linux remoteproc驱动中对elf文件各个不同类型header parse的函数以及对应的定义。
在该文中则重点解释program segment的含义以及对应数据处理。

1 elf program segment

1.1 elf program header

/* These constants define the permissions on sections in the programheader, p_flags. */
#define PF_R            0x4
#define PF_W            0x2
#define PF_X            0x1typedef struct elf32_phdr{Elf32_Word    p_type;Elf32_Off     p_offset;Elf32_Addr    p_vaddr;Elf32_Addr    p_paddr;Elf32_Word    p_filesz;Elf32_Word    p_memsz;Elf32_Word    p_flags;Elf32_Word    p_align;
} Elf32_Phdr;typedef struct elf64_phdr {Elf64_Word p_type;Elf64_Word p_flags;Elf64_Off p_offset;           /* Segment file offset */Elf64_Addr p_vaddr;           /* Segment virtual address */Elf64_Addr p_paddr;           /* Segment physical address */Elf64_Xword p_filesz;         /* Segment size in file */Elf64_Xword p_memsz;          /* Segment size in memory */Elf64_Xword p_align;          /* Segment alignment, file & memory */
} Elf64_Phdr;

1.2 ELF32和ELF64示例

1.2.1 ELF32 program segment

以test.elf为例来分析

  • Offset表示对应program segment数据在elf文件中的偏移地址
  • PhysAddr表示要将该program segment的数据拷贝到的物理地址
  • FileSiz表示当前program segment在elf文件中占的大小
  • MemSiz表示当前program segment在对应bin文件中占的大小
  • Flg表示当前program segment的属性
  • Align表示当前program segment的对齐大小
$ readelf -lW test.elf Elf file type is EXEC (Executable file)Entry point 0x0There are 6 program headers, starting at offset 52Program Headers:Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg AlignEXIDX          0x09262c 0x1016262c 0x1016262c 0x00008 0x00008 R   0x4LOAD           0x010000 0x00000000 0x00000000 0x00440 0x00440 RW  0x10000LOAD           0x020000 0x10000000 0x10000000 0x00800 0x00800 R E 0x10000LOAD           0x030000 0x10100000 0x10100000 0x62638 0x62638 R E 0x10000LOAD           0x092740 0x10172740 0x10172740 0x0900c 0x5d158a0 RW  0x10000LOAD           0x000000 0xa0000000 0xa0000000 0x00000 0x04100 RW  0x10000Section to Segment mapping:Segment Sections...00     .ARM.exidx 01     .reset .rom 02     .cpu_vectors 03     .init .text .fini .rodata .ARM.exidx .eh_frame 04     shell_cmd .data .init_array .fini_array .init_array.00000 .datasafe .bss .stack .heap 05     .ram_mpu $

1.2.2 ELF64 program segment

以linux编译生成的vmlinux为例:其一共包含5个program segments;

  • Offset表示对应program segment数据在elf文件中的偏移地址
  • PhysAddr表示要将该program segment的数据拷贝到的物理地址
  • FileSiz表示当前program segment在elf文件中占的大小
  • MemSiz表示当前program segment在对应bin文件中占的大小
  • Flg表示当前program segment的属性
  • Align表示当前program segment的对齐大小
$ readelf -lW vmlinux Elf file type is DYN (Shared object file)
Entry point 0xffff800008000000
There are 5 program headers, starting at offset 64Program Headers:Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg AlignLOAD           0x010000 0xffff800008000000 0xffff800008000000 0xd2c000 0xd2c000 RWE 0x10000LOAD           0xd40000 0xffff800008d40000 0xffff800008d40000 0x0588dc 0x0588dc R E 0x10000LOAD           0xda0000 0xffff800008da0000 0xffff800008da0000 0x397808 0x43ea24 RW  0x10000NOTE           0xd3aa50 0xffff800008d2aa50 0xffff800008d2aa50 0x000054 0x000054 R   0x4GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10Section to Segment mapping:Segment Sections...00     .head.text .text .got.plt .rodata __ksymtab __ksymtab_gpl __ksymtab_strings __param __modver __ex_table .notes .hyp.rodata 01     .init.text .exit.text .altinstructions 02     .init.data .data..percpu .hyp.data..percpu .hyp.reloc .rela.dyn .data __bug_table .mmuoff.data.write .mmuoff.data.read .bss 03     .notes 04     
$

1.3 elf program segment数据流向图

在这里插入图片描述

2 elf section

2.1 eld section header

typedef struct elf32_shdr {Elf32_Word    sh_name;Elf32_Word    sh_type;Elf32_Word    sh_flags;Elf32_Addr    sh_addr;Elf32_Off     sh_offset;Elf32_Word    sh_size;Elf32_Word    sh_link;Elf32_Word    sh_info;Elf32_Word    sh_addralign;                                                                          Elf32_Word    sh_entsize;
} Elf32_Shdr;typedef struct elf64_shdr {Elf64_Word sh_name;           /* Section name, index in string tbl */Elf64_Word sh_type;           /* Type of section */Elf64_Xword sh_flags;         /* Miscellaneous section attributes */Elf64_Addr sh_addr;           /* Section virtual addr at execution */Elf64_Off sh_offset;          /* Section file offset */Elf64_Xword sh_size;          /* Size of section in bytes */Elf64_Word sh_link;           /* Index of another section */Elf64_Word sh_info;           /* Additional section information */Elf64_Xword sh_addralign;     /* Section alignment */Elf64_Xword sh_entsize;       /* Entry size if section holds table */
} Elf64_Shdr;

2.2 ELF32和ELF64示例

2.2.1 ELF32 section

以test.elf为例来分析

  • Off表示对应section数据在elf文件中的偏移地址
  • Addr表示要将该section的数据拷贝到的物理地址
  • Size表示当前section的大小
  • Flg表示当前program segment的属性
  • Type表示当前section的类型
  • Name表示当前section的名字
  • Flg表示当前section的属性
$ readelf -SW test.elf 
There are 23 section headers, starting at offset 0x9b894:Section Headers:[Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al[ 0]                   NULL            00000000 000000 000000 00      0   0  0[ 1] .reset            PROGBITS        00000000 010000 000040 00   A  0   0  1[ 2] .rom              PROGBITS        00000100 010100 000340 00  WA  0   0  1[ 3] .ram_mpu          NOBITS          a0000000 0a0000 004100 00  WA  0   0  1[ 4] .cpu_vectors      PROGBITS        10000000 020000 000800 00  AX  0   0  4[ 5] .init             PROGBITS        10100000 030000 00000c 00  AX  0   0  4[ 6] .text             PROGBITS        10100010 030010 0555c0 00  AX  0   0 16[ 7] .fini             PROGBITS        101555d0 0855d0 00000c 00  AX  0   0  4[ 8] .rodata           PROGBITS        101555e0 0855e0 00d04c 00   A  0   0  8[ 9] .ARM.exidx        ARM_EXIDX       1016262c 09262c 000008 00  AL  6   0  4[10] .eh_frame         PROGBITS        10162634 092634 000004 00   A  0   0  4[11] shell_cmd         PROGBITS        10172740 092740 0000f0 00  WA  0   0 32[12] .data             PROGBITS        10172830 092830 004780 00  WA  0   0 16[13] .init_array       INIT_ARRAY      10176fb0 096fb0 000004 04  WA  0   0  4[14] .fini_array       FINI_ARRAY      10176fb4 096fb4 000004 04  WA  0   0  4[15] .init_array.00000 INIT_ARRAY      10176fb8 096fb8 000004 04  WA  0   0  4[16] .datasafe         PROGBITS        10176fbc 096fbc 004790 00  WA  0   0  1[17] .bss              NOBITS          1017b750 09b74c 07c888 00  WA  0   0 16[18] .stack            NOBITS          101f7fe0 09b74c 090000 00  WA  0   0  1[19] .heap             NOBITS          10287fe0 09b74c 5c00000 00  WA  0   0  1[20] .comment          PROGBITS        00000000 09b74c 000045 01  MS  0   0  1[21] .ARM.attributes   ARM_ATTRIBUTES  00000000 09b791 000035 00      0   0  1[22] .shstrtab         STRTAB          00000000 09b7c6 0000cb 00      0   0  1
Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings), I (info),L (link order), O (extra OS processing required), G (group), T (TLS),C (compressed), x (unknown), o (OS specific), E (exclude),y (purecode), p (processor specific)
$

2.2.2 ELF64 section

以linux的vmlinux为例来分析

  • Off表示对应section数据在elf文件中的偏移地址
  • Addr表示要将该section的数据拷贝到的物理地址
  • Size表示当前section的大小
  • Flg表示当前program segment的属性
  • Type表示当前section的类型
  • Name表示当前section的名字
  • Flg表示当前section的属性
$ readelf -SW vmlinux 
There are 40 section headers, starting at offset 0xd59a938:Section Headers:[Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al[ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0[ 1] .head.text        PROGBITS        ffff800008000000 010000 000040 00  AX  0   0  4[ 2] .text             PROGBITS        ffff800008010000 020000 a63d60 08  AX  0   0 65536[ 3] .got.plt          PROGBITS        ffff800008a73d60 a83d60 000018 08  WA  0   0  8[ 4] .rodata           PROGBITS        ffff800008a80000 a90000 25af18 00  WA  0   0 4096[ 5] __ksymtab         PROGBITS        ffff800008cdaf18 ceaf18 00d374 00   A  0   0  4[ 6] __ksymtab_gpl     PROGBITS        ffff800008ce828c cf828c 00fe10 00   A  0   0  4[ 7] __ksymtab_strings PROGBITS        ffff800008cf809c d0809c 02e361 01 AMS  0   0  1[ 8] __param           PROGBITS        ffff800008d26400 d36400 0028a0 00   A  0   0  8[ 9] __modver          PROGBITS        ffff800008d28ca0 d38ca0 000318 00  WA  0   0  8[10] __ex_table        PROGBITS        ffff800008d28fb8 d38fb8 001a98 00   A  0   0  8[11] .notes            NOTE            ffff800008d2aa50 d3aa50 000054 00   A  0   0  4[12] .hyp.rodata       PROGBITS        ffff800008d2b000 d3b000 001000 00  WA  0   0  8[13] .init.text        PROGBITS        ffff800008d40000 d40000 03fcf4 00  AX  0   0  4[14] .exit.text        PROGBITS        ffff800008d7fcf4 d7fcf4 0031c8 00  AX  0   0  4[15] .altinstructions  PROGBITS        ffff800008d82ebc d82ebc 015a20 00   A  0   0  1[16] .init.data        PROGBITS        ffff800008da0000 da0000 013298 00  WA  0   0 256[17] .data..percpu     PROGBITS        ffff800008db4000 db4000 009b58 00  WA  0   0 64[18] .hyp.data..percpu PROGBITS        ffff800008dbe000 dbe000 000ed0 00  WA  0   0 16[19] .hyp.reloc        PROGBITS        ffff800008dbeed0 dbeed0 000060 00   A  0   0  4[20] .rela.dyn         RELA            ffff800008dbef30 dbef30 1fa280 18   A 37   0  8[21] .data             PROGBITS        ffff800008fc0000 fc0000 162b20 00  WA  0   0 4096[22] __bug_table       PROGBITS        ffff800009122b20 1122b20 013e18 00  WA  0   0  4[23] .mmuoff.data.write PROGBITS        ffff800009137000 1137000 000018 00  WA  0   0 2048[24] .mmuoff.data.read PROGBITS        ffff800009137800 1137800 000008 00  WA  0   0  8[25] .bss              NOBITS          ffff800009138000 1137808 0a6a24 00  WA  0   0 4096[26] .debug_aranges    PROGBITS        0000000000000000 1137810 01f600 00      0   0 16[27] .debug_info       PROGBITS        0000000000000000 1156e10 8f735c0 00      0   0  1[28] .debug_abbrev     PROGBITS        0000000000000000 a0ca3d0 449e7e 00      0   0  1[29] .debug_line       PROGBITS        0000000000000000 a51424e f522ac 00      0   0  1[30] .debug_frame      PROGBITS        0000000000000000 b466500 261300 00      0   0  8[31] .debug_str        PROGBITS        0000000000000000 b6c7800 29f3dc 01  MS  0   0  1[32] .debug_ranges     PROGBITS        0000000000000000 b966be0 000230 00      0   0 16[33] .debug_line_str   PROGBITS        0000000000000000 b966e10 010dda 01  MS  0   0  1[34] .debug_loclists   PROGBITS        0000000000000000 b977bea 152ec46 00      0   0  1[35] .debug_rnglists   PROGBITS        0000000000000000 cea6830 2e8174 00      0   0  1[36] .comment          PROGBITS        0000000000000000 d18e9a4 000045 01  MS  0   0  1[37] .symtab           SYMTAB          0000000000000000 d18e9f0 26caa8 18     38 85372  8[38] .strtab           STRTAB          0000000000000000 d3fb498 19f2f0 00      0   0  1[39] .shstrtab         STRTAB          0000000000000000 d59a788 0001ab 00      0   0  1
Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings), I (info),L (link order), O (extra OS processing required), G (group), T (TLS),C (compressed), x (unknown), o (OS specific), E (exclude),p (processor specific)
$

2.3 elf section数据流向图

对于elf section的数据在boot阶段的流向是按照从elf文件的offset处,按照size大小去拷贝数据到addr的内存处,当各个section拷贝完成之后即可以触发复位操作,启动对应的core。

相关文章:

ELF program/section segment解析

ELF program/section segment解析 1 elf program segment1.1 elf program header1.2 ELF32和ELF64示例1.2.1 ELF32 program segment1.2.2 ELF64 program segment 1.3 elf program segment数据流向图 2 elf section2.1 eld section header2.2 ELF32和ELF64示例2.2.1 ELF32 secti…...

【golang】库源码文件

库源码文件是不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用(只要遵从Go语言规范的话)。 这里的“其他代码”可以与被使用的程序实体在同一个源码文件内,也可以在其他源码文件&#x…...

网络安全(黑客)常用工具(附配套资料+工具安装包)

几十年来,攻击方、白帽和安全从业者的工具不断演进,成为网络安全长河中最具技术特色的灯塔,并在一定程度上左右着网络安全产业发展和演进的方向,成为不可或缺的关键要素之一。 话不多说,2022年全球白帽常用工具排行榜…...

WebDAV之π-Disk派盘+Joplin

Joplin是一个优秀的开源笔记,可以组织到笔记本中的大量笔记和文本编辑器中进行复制,标记和修改。支持Evernote的笔记直接导入到Joplin应用程序中。Joplin还支持各种云服务同步,包括Dropbox、OneDrive、WebDAV或文件系统,方便对其进行检查、备份和移动。该应用程序可用于Win…...

Unity-UGUI优化策略

界面出栈规则: 界面目录导航、策划界面回退需求造成界面套娃问题,夹带一系列层级问题,应该和策划进行友好沟通,避免界面不合理的出栈入栈规则 overdraw: 尽量减少同屏 半透明物体渲染 Unity 之 UGUI优化(…...

【练】Linux中用共用体(联合体)的方式,判断本机的字节序

方法一&#xff1a;共用体 #include <stdio.h> union Byte {unsigned int a;char c; }; int main(int argc, const char *argv[]) {union Byte endianness;endianness.a0x87654321;printf("endianness.c%#x\n",endianness.c); if(0x21 endianness.c)pr…...

WebRTC | 音视频直播客户端框架

端到端通信互动技术可分解为以下几个技术难点&#xff1a;客户端技术、服务器技术、全球设备网络适配技术和通信互动质量监控与展示技术。 一、音视频直播 音视频直播可分成两条技术路线&#xff1a;一条是以音视频会议为代表的实时互动直播&#xff1b;另一条是以娱乐直播为代…...

flutter开发实战-实现marquee根据文本长度显示文本跑马灯效果

flutter开发实战-实现marquee文本跑马灯效果 最近开发过程中需要marquee文本跑马灯效果&#xff0c;这里使用到了flutter的插件marquee 效果图如下 一、marquee 1.1 引入marquee 在pubspec.yaml中引入marquee # 跑马灯效果marquee: ^2.2.31.2 marquee使用 marquee使用也是…...

8.10论文阅读

文章目录 The multimodal MRI brain tumor segmentation based on AD-Net摘要本文方法损失函数 实验结果 max-vit - unet:多轴注意力医学图像分割摘要本文方法实验结果 The multimodal MRI brain tumor segmentation based on AD-Net 摘要 基于磁共振成像(MRI)的多模态胶质瘤…...

【计算机网络笔记】第一章

1、计算机网络定义 计算机网络主要是由一些通用的、可编程的硬件&#xff08;包含CPU、计算机、手机、智能电器…&#xff09;互连而成的&#xff0c;而这些硬件并非专门用来实现某一特定目的&#xff08;例如&#xff0c;传送数据或视频信号&#xff09;。这些可编程的硬件能…...

开源力量再现,国产操作系统商业化的全新探索

文章目录 1. 开源运动的兴起2. 开源力量的推动3. 国产操作系统的崭露头角3.1 国产操作系统有哪些 4.国产操作系统的商业化探索5.开源力量对国产操作系统商业化的推动 操作系统作为连接硬件、中间件、数据库、应用软件的纽带&#xff0c;被认为是软件技术体系中最核心的基础软件…...

uni-app uView自定义底部导航栏

因项目需要自定义底部导航栏&#xff0c;我把它写在了组件里&#xff0c;基于uView2框架写的&#xff08;vue2&#xff09;&#xff1b; 一、代码 在components下创建tabbar.vue文件&#xff0c;代码如下&#xff1a; <template><view><u-tabbar :value"c…...

效率指数级提升的Intellij IDEA快捷键集合

温馨提示&#xff1a;全文有18个小技巧&#xff0c;为了阅读体验&#xff0c;可以直接先看文章目录。 1&#xff0c;打开一个文件中的所有方法展示框 CtrlF12 Alt7 2&#xff0c;打开一个类的所有使用位置 AltF7 3&#xff0c;打开一个类在项目使用的位置 CtrlAltF7 4&#…...

TS学习05-泛型

泛型 目的&#xff1a;可重用性 支持当前数据类型&#xff0c;也支持未来的数据类型。 提供灵活的功能 无法创建泛型枚举和泛型命名空间。 function identity(arg: any): any { return arg }function identity<T>(arg: T) : T { return arg}使用any类型会导致这个函数可以…...

windos wsl2 docker unix:///var/run/docker.sock

解决方案 问题如下 rootDESKTOP-VM0J0I4:~# docker ps Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?启动下docker sudo service docker startcsdn 等风来不如迎风去 htp://t.csdn.cn/Gh365...

前端面试经典手写题

1、手写Promise class Promise2 {state "pending";callbacks [];constructor(fn) {fn(this.resolve.bind(this), this.reject.bind(this));}resolve(result) {if (this.state ! "pending") return;this.state "fullFilled";nextTick(() > …...

Tomcat 部署及优化

Tomcat概述 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;是 Apache 软件基金会的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。在中小型系统和并发访问用户不是很…...

Selenium入门详细教程+实例演示

目录 1.Selenium概述 1.1什么是Selenium 1.2Selenium的优势 1.3Selenium WebDriver原理 2.Selenium环境搭建 3.Selenium 简单示例 4.八大元素定位 4.1定位方式 4.2定位方式的用法 5.Selenium API 5.1WebDriver 常用 API 5.2WebElement 常用 API 5.3代码示例 6.元素等待机…...

ATFX汇评:美国7月CPI数据即将揭晓,市场预期将有所反弹

ATFX汇评&#xff1a;今日20:30&#xff0c;美劳工部将公布7月未季调CPI年率&#xff0c;前值为3%&#xff0c;预期值3.3%&#xff1b;同一时间公布7月未季调核心CPI年率&#xff0c;前值为4.8%&#xff0c;预期值持平&#xff1b;至8月5日当周初请失业金人数也将同时发布&…...

23、springboot日志使用入门-- SLF4J+Logback 实现(springboot默认的日志实现),日志打印到控制台及日志输出到指定文件

springboot日志使用入门 ★ 典型的Spring Boot日志依赖&#xff1a; spring-boot-start.jar -- spring-boot-starter-logging.jar (Spring Boot的日志包&#xff09;-- logback&#xff08;core、classic&#xff09;-- log4j-to-slf4j.jar-- jul-to-slf4j.jar就是springboo…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践&#xff0c;很多人以为AI已经强大到不需要程序员了&#xff0c;其实不是&#xff0c;AI更加需要程序员&#xff0c;普通人…...