linux remoteproc驱动中elf解析函数实现分析

news2024/11/15 8:20:16

linux remoteproc驱动中elf解析函数实现分析

  • 1 ELF文件组织结构
  • 2 ELF_GEN_FIELD_GET_SET
  • 3 elf 各种header解析接口以及其实现
    • 3.1 elf header
      • 3.1.1 elf header解析接口
      • 3.1.2 elf header各个解析函数为:
        • 3.1.2.1 ELF_GEN_FIELD_GET_SET(hdr, e_entry, u64)
        • 3.1.2.2 ELF_GEN_FIELD_GET_SET(hdr, e_phnum, u16)
        • 3.1.2.3 ELF_GEN_FIELD_GET_SET(hdr, e_shnum, u16)
        • 3.1.2.4 ELF_GEN_FIELD_GET_SET(hdr, e_phoff, u64)
        • 3.1.2.5 ELF_GEN_FIELD_GET_SET(hdr, e_shoff, u64)
        • 3.1.2.6 ELF_GEN_FIELD_GET_SET(hdr, e_shstrndx, u16)
        • 3.1.2.7 ELF_GEN_FIELD_GET_SET(hdr, e_shstrndx, u16)
        • 3.1.2.8 ELF_GEN_FIELD_GET_SET(hdr, e_machine, u16)
        • 3.1.2.9 ELF_GEN_FIELD_GET_SET(hdr, e_type, u16)
        • 3.1.2.10 ELF_GEN_FIELD_GET_SET(hdr, e_version, u32)
        • 3.1.2.11 ELF_GEN_FIELD_GET_SET(hdr, e_ehsize, u32)
        • 3.1.2.12 ELF_GEN_FIELD_GET_SET(hdr, e_phentsize, u16)
        • 3.1.2.13 ELF_GEN_FIELD_GET_SET(hdr, e_shentsize, u16)
    • 3.2 elf program header
      • 3.2.1 elf program header解析接口
      • 3.2.2 elf program header各个解析函数为
        • 3.2.2.1 ELF_GEN_FIELD_GET_SET(phdr, p_paddr, u64)
        • 3.2.2.2 ELF_GEN_FIELD_GET_SET(phdr, p_vaddr, u64)
        • 3.2.2.3 ELF_GEN_FIELD_GET_SET(phdr, p_filesz, u64)
        • 3.2.2.4 ELF_GEN_FIELD_GET_SET(phdr, p_memsz, u64)
        • 3.2.2.5 ELF_GEN_FIELD_GET_SET(phdr, p_type, u32)
        • 3.2.2.6 ELF_GEN_FIELD_GET_SET(phdr, p_offset, u64)
        • 3.2.2.7 ELF_GEN_FIELD_GET_SET(phdr, p_flags, u32)
        • 3.2.2.8 ELF_GEN_FIELD_GET_SET(phdr, p_align, u64)
    • 3.3 elf section header
      • 3.3.1 elf section header解析接口
      • 3.3.2 elf section header各个解析函数为:
        • 3.3.2.1 ELF_GEN_FIELD_GET_SET(shdr, sh_type, u32)
        • 3.3.2.2 ELF_GEN_FIELD_GET_SET(shdr, sh_flags, u32)
        • 3.3.2.3 ELF_GEN_FIELD_GET_SET(shdr, sh_entsize, u16)
        • 3.3.2.4 ELF_GEN_FIELD_GET_SET(shdr, sh_size, u64)
        • 3.3.2.5 ELF_GEN_FIELD_GET_SET(shdr, sh_offset, u64)
        • 3.3.2.6 ELF_GEN_FIELD_GET_SET(shdr, sh_name, u32)
        • 3.3.2.7 ELF_GEN_FIELD_GET_SET(shdr, sh_addr, u64)

在linux中存在的remoteproc的驱动中用到了很多elf解析的函数,比如 elf_size_of_phdrelf_phdr_get_p_paddr以及 elf_hdr_get_e_phnum等等接口。当我们直接搜对应的函数时会发现无法找到其定义,其实这些函数的实现被定义在 drivers/remoteproc/remoteproc_elf_helpers.h头文件中。

1 ELF文件组织结构

下面以ELF64为例

  • Start of program headers: 64 (bytes into file)
  • Start of section headers: 220982296 (bytes into file)
  • Size of this header: 64 (bytes)
  • Size of program headers: 56 (bytes)
  • Size of section headers: 64 (bytes)
$ readelf -hW vmlinux
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           AArch64
  Version:                           0x1
  Entry point address:               0xffff800008000000
  Start of program headers:          64 (bytes into file)
  Start of section headers:          220982296 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         5
  Size of section headers:           64 (bytes)
  Number of section headers:         40
  Section header string table index: 39
$

在这里插入图片描述

2 ELF_GEN_FIELD_GET_SET

ELF_GEN_FIELD_GET_SET是对应组织hdr,phdr,shdr各个头解析函数的最根本的函数。
其实现为如下所示:

  • ELF_GEN_FIELD_GET_SET最终会生成两个inline函数,一个为elf_##__s##_get_##__field一个为elf_##__s##_set_##__field,具体函数名字会依据ELF_GEN_FIELD_GET_SET参数的不同而不同。
  • ##表示的是字符串链接符,比如ELF_GEN_FIELD_GET_SET(hdr, e_entry, u64),最终会被解析为elf_hdr_get_e_entryelf_hdr_set_e_entry两个函数,两个函数的返回类型为u64。
/* Generate getter and setter for a specific elf struct/field */
#define ELF_GEN_FIELD_GET_SET(__s, __field, __type) \
static inline __type elf_##__s##_get_##__field(u8 class, const void *arg) \
{ \
        if (class == ELFCLASS32) \
                return (__type) ((const struct elf32_##__s *) arg)->__field; \
        else \
                return (__type) ((const struct elf64_##__s *) arg)->__field; \                         
} \
static inline void elf_##__s##_set_##__field(u8 class, void *arg, \
                                             __type value) \
{ \
        if (class == ELFCLASS32) \
                ((struct elf32_##__s *) arg)->__field = (__type) value; \
        else \
                ((struct elf64_##__s *) arg)->__field = (__type) value; \
}

3 elf 各种header解析接口以及其实现

3.1 elf header

elf32和elf64 header数据结构如下所示,其分别对应于下面的elf header解析函数。

#define EI_NIDENT       16

typedef struct elf32_hdr{
  unsigned char e_ident[EI_NIDENT];
  Elf32_Half    e_type;
  Elf32_Half    e_machine;                                                                             
  Elf32_Word    e_version;
  Elf32_Addr    e_entry;  /* Entry point */
  Elf32_Off     e_phoff;
  Elf32_Off     e_shoff;
  Elf32_Word    e_flags;
  Elf32_Half    e_ehsize;
  Elf32_Half    e_phentsize;
  Elf32_Half    e_phnum;
  Elf32_Half    e_shentsize;
  Elf32_Half    e_shnum;
  Elf32_Half    e_shstrndx;
} Elf32_Ehdr;

typedef struct elf64_hdr {
  unsigned char e_ident[EI_NIDENT];     /* ELF "magic number" */
  Elf64_Half e_type;
  Elf64_Half e_machine;
  Elf64_Word e_version;
  Elf64_Addr e_entry;           /* Entry point virtual address */
  Elf64_Off e_phoff;            /* Program header table file offset */
  Elf64_Off e_shoff;            /* Section header table file offset */
  Elf64_Word e_flags;
  Elf64_Half e_ehsize;
  Elf64_Half e_phentsize;
  Elf64_Half e_phnum;
  Elf64_Half e_shentsize;
  Elf64_Half e_shnum;
  Elf64_Half e_shstrndx;
} Elf64_Ehdr;

3.1.1 elf header解析接口

ELF_GEN_FIELD_GET_SET(hdr, e_entry, u64)
ELF_GEN_FIELD_GET_SET(hdr, e_phnum, u16)
ELF_GEN_FIELD_GET_SET(hdr, e_shnum, u16)
ELF_GEN_FIELD_GET_SET(hdr, e_phoff, u64)
ELF_GEN_FIELD_GET_SET(hdr, e_shoff, u64)
ELF_GEN_FIELD_GET_SET(hdr, e_shstrndx, u16)
ELF_GEN_FIELD_GET_SET(hdr, e_machine, u16)                                                             
ELF_GEN_FIELD_GET_SET(hdr, e_type, u16)
ELF_GEN_FIELD_GET_SET(hdr, e_version, u32)
ELF_GEN_FIELD_GET_SET(hdr, e_ehsize, u32)
ELF_GEN_FIELD_GET_SET(hdr, e_phentsize, u16)
ELF_GEN_FIELD_GET_SET(hdr, e_shentsize, u16)

3.1.2 elf header各个解析函数为:

3.1.2.1 ELF_GEN_FIELD_GET_SET(hdr, e_entry, u64)

static inline u64 elf_hdr_get_e_entry(u8 class, const void *arg)
static inline u64 elf_hdr_set_e_entry(u8 class, void *arg, u64 value))

3.1.2.2 ELF_GEN_FIELD_GET_SET(hdr, e_phnum, u16)

static inline u16 elf_hdr_get_e_phnum(u8 class, const void *arg)
static inline u16 elf_hdr_set_e_phnum(u8 class, void *arg, u16 value))

3.1.2.3 ELF_GEN_FIELD_GET_SET(hdr, e_shnum, u16)

static inline u16 elf_hdr_get_e_shnum(u8 class, const void *arg)
static inline u16 elf_hdr_set_e_shnum(u8 class, void *arg, u16 value))

3.1.2.4 ELF_GEN_FIELD_GET_SET(hdr, e_phoff, u64)

static inline u64 elf_hdr_get_e_phoff(u8 class, const void *arg)
static inline u64 elf_hdr_set_e_phoff(u8 class, void *arg, u64 value))

3.1.2.5 ELF_GEN_FIELD_GET_SET(hdr, e_shoff, u64)

static inline u64 elf_hdr_get_e_shoff(u8 class, const void *arg)
static inline u64 elf_hdr_set_e_shoff(u8 class, void *arg, u64 value))

3.1.2.6 ELF_GEN_FIELD_GET_SET(hdr, e_shstrndx, u16)

static inline u16 elf_hdr_get_e_shstrndx(u8 class, const void *arg)
static inline u16 elf_hdr_set_e_shstrndx(u8 class, void *arg, u16 value))

3.1.2.7 ELF_GEN_FIELD_GET_SET(hdr, e_shstrndx, u16)

static inline u16 elf_hdr_get_e_shstrndx(u8 class, const void *arg)
static inline u16 elf_hdr_set_e_shstrndx(u8 class, void *arg, u16 value))

3.1.2.8 ELF_GEN_FIELD_GET_SET(hdr, e_machine, u16)

static inline u16 elf_hdr_get_e_machine(u8 class, const void *arg)
static inline u16 elf_hdr_set_e_machine(u8 class, void *arg, u16 value))

3.1.2.9 ELF_GEN_FIELD_GET_SET(hdr, e_type, u16)

static inline u16 elf_hdr_get_e_type(u8 class, const void *arg)
static inline u16 elf_hdr_set_e_type(u8 class, void *arg, u16 value))

3.1.2.10 ELF_GEN_FIELD_GET_SET(hdr, e_version, u32)

static inline u32 elf_hdr_get_e_version(u8 class, const void *arg)
static inline u32 elf_hdr_set_e_version(u8 class, void *arg, u32 value))

3.1.2.11 ELF_GEN_FIELD_GET_SET(hdr, e_ehsize, u32)

static inline u32 elf_hdr_get_e_ehsize(u8 class, const void *arg)
static inline u32 elf_hdr_set_e_ehsize(u8 class, void *arg, u32 value))

3.1.2.12 ELF_GEN_FIELD_GET_SET(hdr, e_phentsize, u16)

static inline u16 elf_hdr_get_e_phentsize(u8 class, const void *arg)
static inline u16 elf_hdr_set_e_phentsize(u8 class, void *arg, u16 value))

3.1.2.13 ELF_GEN_FIELD_GET_SET(hdr, e_shentsize, u16)

static inline u16 elf_hdr_get_e_shentsize(u8 class, const void *arg)
static inline u16 elf_hdr_set_e_shentsize(u8 class, void *arg, u16 value))

3.2 elf program header

elf32和elf64 program header数据结构如下所示,其分别对应于下面的elf program header解析函数。

/* These constants define the permissions on sections in the program
   header, p_flags. */
#define PF_R            0x4
#define PF_W            0x2
#define PF_X            0x1

typedef 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;

3.2.1 elf program header解析接口

ELF_GEN_FIELD_GET_SET(phdr, p_paddr, u64)
ELF_GEN_FIELD_GET_SET(phdr, p_vaddr, u64)
ELF_GEN_FIELD_GET_SET(phdr, p_filesz, u64)
ELF_GEN_FIELD_GET_SET(phdr, p_memsz, u64)
ELF_GEN_FIELD_GET_SET(phdr, p_type, u32)
ELF_GEN_FIELD_GET_SET(phdr, p_offset, u64)                                                             
ELF_GEN_FIELD_GET_SET(phdr, p_flags, u32)
ELF_GEN_FIELD_GET_SET(phdr, p_align, u64)

3.2.2 elf program header各个解析函数为

3.2.2.1 ELF_GEN_FIELD_GET_SET(phdr, p_paddr, u64)

static inline u64 elf_phdr_get_p_paddr(u8 class, const void *arg)
static inline u64 elf_phdr_set_p_paddr(u8 class, void *arg, u64 value))

3.2.2.2 ELF_GEN_FIELD_GET_SET(phdr, p_vaddr, u64)

static inline u64 elf_phdr_get_p_vaddr(u8 class, const void *arg)
static inline u64 elf_phdr_set_p_vaddr(u8 class, void *arg, u64 value))

3.2.2.3 ELF_GEN_FIELD_GET_SET(phdr, p_filesz, u64)

static inline u64 elf_phdr_get_p_filesz(u8 class, const void *arg)
static inline u64 elf_phdr_set_p_filesz(u8 class, void *arg, u64 value))

3.2.2.4 ELF_GEN_FIELD_GET_SET(phdr, p_memsz, u64)

static inline u64 elf_phdr_get_p_memsz(u8 class, const void *arg)
static inline u64 elf_phdr_set_p_memsz(u8 class, void *arg, u64 value))

3.2.2.5 ELF_GEN_FIELD_GET_SET(phdr, p_type, u32)

static inline u32 elf_phdr_get_p_type(u8 class, const void *arg)
static inline u32 elf_phdr_set_p_type(u8 class, void *arg, u32 value))

3.2.2.6 ELF_GEN_FIELD_GET_SET(phdr, p_offset, u64)

static inline u64 elf_phdr_get_p_offset(u8 class, const void *arg)
static inline u64 elf_phdr_set_p_offset(u8 class, void *arg, u64 value))

3.2.2.7 ELF_GEN_FIELD_GET_SET(phdr, p_flags, u32)

static inline u32 elf_phdr_get_p_flags(u8 class, const void *arg)
static inline u32 elf_phdr_set_p_flags(u8 class, void *arg, u32 value))

3.2.2.8 ELF_GEN_FIELD_GET_SET(phdr, p_align, u64)

static inline u64 elf_phdr_get_p_align(u8 class, const void *arg)
static inline u64 elf_phdr_set_p_align(u8 class, void *arg, u64 value))

3.3 elf section header

elf32和elf64 section header数据结构如下所示,其分别对应于下面的elf 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;

3.3.1 elf section header解析接口

ELF_GEN_FIELD_GET_SET(shdr, sh_type, u32)
ELF_GEN_FIELD_GET_SET(shdr, sh_flags, u32)
ELF_GEN_FIELD_GET_SET(shdr, sh_entsize, u16)
ELF_GEN_FIELD_GET_SET(shdr, sh_size, u64)
ELF_GEN_FIELD_GET_SET(shdr, sh_offset, u64)
ELF_GEN_FIELD_GET_SET(shdr, sh_name, u32)
ELF_GEN_FIELD_GET_SET(shdr, sh_addr, u64)

3.3.2 elf section header各个解析函数为:

3.3.2.1 ELF_GEN_FIELD_GET_SET(shdr, sh_type, u32)

static inline u32 elf_shdr_get_sh_type(u8 class, const void *arg)
static inline u32 elf_shdr_set_sh_type(u8 class, void *arg, u32 value))

3.3.2.2 ELF_GEN_FIELD_GET_SET(shdr, sh_flags, u32)

static inline u32 elf_shdr_get_sh_flags(u8 class, const void *arg)
static inline u32 elf_shdr_set_sh_flags(u8 class, void *arg, u32 value))

3.3.2.3 ELF_GEN_FIELD_GET_SET(shdr, sh_entsize, u16)

static inline u16 elf_shdr_get_sh_entsize(u8 class, const void *arg)
static inline u16 elf_shdr_set_sh_entsize(u8 class, void *arg, u16 value))

3.3.2.4 ELF_GEN_FIELD_GET_SET(shdr, sh_size, u64)

static inline u64 elf_shdr_get_sh_size(u8 class, const void *arg)
static inline u64 elf_shdr_set_sh_size(u8 class, void *arg, u64 value))

3.3.2.5 ELF_GEN_FIELD_GET_SET(shdr, sh_offset, u64)

static inline u64 elf_shdr_get_sh_offset(u8 class, const void *arg)
static inline u64 elf_shdr_set_sh_offset(u8 class, void *arg, u64 value))

3.3.2.6 ELF_GEN_FIELD_GET_SET(shdr, sh_name, u32)

static inline u32 elf_shdr_get_sh_name(u8 class, const void *arg)
static inline u32 elf_shdr_set_sh_name(u8 class, void *arg, u32 value))

3.3.2.7 ELF_GEN_FIELD_GET_SET(shdr, sh_addr, u64)

static inline u64 elf_shdr_get_sh_addr(u8 class, const void *arg)
static inline u64 elf_shdr_set_sh_addr(u8 class, void *arg, u64 value))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/855227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[OnWork.Tools]系列 07-Web浏览器

简介 简易的web浏览器,适合临时使用 组件安装 第一次使用时可能需要安装相关组件 点击确定 会打开官方地址 WebView2 - Microsoft Edge Developer 点击立即下载 跳转到新的地址 WebView2 - Microsoft Edge Developer 有外网的选择第一个,无网络的在有网络的电脑打开后选择…

SpringCloud实用篇4——MQ RabbitMQ SpringAMQP

目录 1 初识MQ1.1 同步和异步通讯1.1.1 同步通讯1.1.2 异步通讯 1.2 技术对比 2.快速入门2.1 安装RabbitMQ2.1.1 单机部署2.1.2集群部署 2.2 RabbitMQ消息模型2.3.导入Demo工程2.4 入门案例2.4.1 publisher实现2.4.2 consumer实现 3 SpringAMQP3.1 Basic Queue 简单队列模型3.1…

【源码分析】Nacos如何是现在CP模式下基于Raft协议的节点注册逻辑

而对于持久节点,有一个Raft协议的实现 我们知道Raft算法作为一个CP协议,它通过的是Leader节点来向各个节点进行数据的同步。 所以会先判断当前节点是否是Leader节点,如果不是则将请求转发到Leader节点进行处理。 而如果就是Leader节点&am…

二、Linux中权限、shell命令及运行原理

shell命令及运行原理 我们使用Linux时,并不是直接访问操作系统,为什么不是直接访问操作系统呢? 如果用户直接访问操作系统,不仅使用难度大,而且不安全,容易把系统文件损坏。 那么我们通常是如何访问操作系统…

全网最牛,接口自动化测试实现详细总结,23年测试进阶之路...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 为什么要做接口自…

Java String类【超详细】

文章目录 1. 字符串构造2. String对象的比较2.1 比较是否引用同一个对象2. 2boolean equals(Object anObject) 方法:按照字典序比较2.3 int compareTo(String s) 方法: 按照字典序进行比较2.4 int compareToIgnoreCase(String str) 方法:与compareTo方式…

图像 处理 - 开源算法集合

图像 处理 - 开源算法集合 1. 图像 检测 - MMDetection 简介2. 图像 分割 - MMSegmentation 简介3. 图像 其他 - MMPreTrain 以下介绍的每个 开源算法集合 均包含多种 开源算法 1. 图像 检测 - MMDetection 简介 简介:MMDetection 是一个基于 PyTorch 的目标检测开…

【C++进阶之路】map与set的基本使用

文章目录 一、set系列1.set①insert②find③erase④lower_bound与upper_bound 2.multiset①count②equal_range 二、map系列1.map①insert1.插入pair的四种方式2.常用两种方式 ②[]2.multimap①count②equal_range 一、set系列 1.set ①insert 函数分析(C98&…

解决Windows:Call to undefined function exif_imagetype()

很明显,是php安装时没有打开某些扩展,以致不能执行exif_imagetype()这个方法,因此需要打开。 网上很多人说需要打开下面这两个扩展: extension=php_exif.dll extension=php_mbstring.dll 但只说对了一半,我一开始也按照网上文章说的打开这两个扩展,但是还是同样错误。…

2. 软件需求 面向对象分析

目录 1. 软件需求 1.1 需求分类 1.2 需求获取 1.3 需求分析 2. 面向对象分析(OOA) 2.1 统一建模语言 UML 2.2 用例模型 2.2.1 用例图的元素 2.2.2 识别参与者 2.2.3 合并需求获得用例 2.2.4 细化用例描述 2.3 分析模型 2.3.1 定义概念类 …

3.1线程之间共享数据的问题

线程之间共享数据的问题 从整体上来看,所有线程之间共享数据的问题,都是修改数据导致的。如果所有的共享数据都是只读的,就没有问题,因为一个线程所读取的数据不受另一个线程是否正在读取相同的数据而影响。然而,如果…

慧算账的千亿财税市场之旅,从当好中小企业财税之友开始

数字化转型浪潮下,各个行业都在不断升级进化。不过,各领域中头部企业与中小企业数字化的方式有所不同。头部企业资金实力雄厚,对于数字化架构的搭建,往往会以内设部门加外部合作的方式来推进,而中小企业在可投入研发资…

Vscode无法写入文件 NoPermissions (FileSystemError): Error: EACCES: permission

用Vscode想要新建一个index.html的时候遇到了下图问题,说没有权限无法写入文件。 没有权限,咱们给他加上权限哈哈哈,博主是Mac电脑,如下操作: 1.找到你项目的根目录,右键,点击“显示简介”。 …

2023华数杯C题总结

前言 对这次比赛中遇到的问题和卡住的思路进行复盘,整理相关心得,供以后比赛参考 🧡1.认识数据类型🧡 连续变量:母亲年龄、妊娠时间、CBTS、EPDS、HADS、整晚睡醒时间、婴儿年龄 无序分类变量:婚姻状态、…

Java中ArrayList常用方法的学习

Java中ArrayList常用方法的学习 需求分析代码实现小结Time 需求分析 ArrayList集合的常用方法学习 代码实现 java.util.ArrayList;/*** Author:LQ* Description:* Date:Created in 16:45 2023/8/9*/ public class ListTest {public static void main(String[] args) {ArrayLis…

哪个版本的FL Studio更适合我?2023年到底应该入手哪一款FL Studio?

很多打算入手正版FL Studio的新手朋友都会纠结一个问题:哪个版本的FL Studio更适合我,2023年到底应该入手哪一款FL Studio?本文会介绍每个版本之间的差异点,并带大家选择适合自己的FL Sudio版本。 FL Studio Mac-安装包&#xff…

B2B2C线上直播购物商城开源搭建--多语言+自带商品库

要搭建一个B2B2C线上直播购物商城,可以考虑以下步骤: 1. 确定技术需求:确定前端和后端使用的技术栈。 2. 搭建基础环境:购买一个域名和服务器空间,安装和配置相应的操作系统和数据库。 3. 开发商城平台:…

LeetCode150道面试经典题--罗马数字转整数(简单)

目录 1.题目 2.示例 3.思路 4.案例代码(Java) 1.题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L …

UE 5 GAS Gameplay Ability System

游戏技能系统 简称(GAS),是一个健壮的,高度可扩展的gameplay框架,通常用于构件RPG、MOBA等游戏的完整战斗逻辑框架。 通过GAS,可以快速地制作游戏中的主动/被动技能、各种效果Buff、计算属性伤害、处理玩家…

openGauss学习笔记-31 openGauss 高级数据管理-索引

文章目录 openGauss学习笔记-31 openGauss 高级数据管理-索引31.1 语法格式31.2 参数说明31.3 示例 openGauss学习笔记-31 openGauss 高级数据管理-索引 索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的。 索引可以用来提高数据库查询性能&…