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

Postgresql源码(146)二进制文件格式分析

相关
Linux函数调用栈的实现原理(X86)

速查

# 查看elf头
readelf -h bin/postgres# 查看Section
readelf -S bin/postgres
(gdb) info file
(gdb) maint info sections# 查看代码段汇编
disassemble 0x48e980 , 0x48e9b0
disassemble main# 查看代码段某个地址属于拿个函数
info line *0x7b7d90# 执行视角查看segments
readelf -l bin/postgres

可执行文件格式

常见的可执行文件格式:

  • Windows:PE(Portable Executable)
  • Unix:ELF(Executable and Linkable Format)
  • MacOS IOS:Mach-O

postgres在linux平台编译后,生成可执行文件为ELF文件格式。

$ file bin/postgresbin/postgres: ELF 64-bit LSB executable, 
x86-64, 
version 1 (SYSV), 
dynamically linked, 
interpreter /lib64/ld-linux-x86-64.so.2, 
for GNU/Linux 3.2.0, 
BuildID[sha1]=c7ab1c85b211f05bbc06a69566f82b05233782f5, 
with debug_info, 
not stripped, 
too many notes (256)

libpq.a 静态库

$ file lib/libpq.alib/libpq.a: current ar archive

libpq.so动态库

$ file lib/libpq.so.5.16lib/libpq.so.5.16: ELF 64-bit LSB shared object, 
x86-64, version 1 (SYSV), 
dynamically linked, 
BuildID[sha1]=7bd87aa5ae3f13463c4ddd66f8d7f6cf1beab3fa, 
with debug_info, 
not stripped

ELF文件两种视角

  • 静态视角:Linking View
  • 执行视角:Execution View
    在这里插入图片描述

动态视角 vs 静态视角​:

  • ​静态视角​:由Section组成,描述链接时的代码/数据分区(如 .text、.rodata)。
  • 动态视角​:由Segment组成,描述运行时内存如何组织。一个Segment可能包含多个Section
  • Section组成的静态视图,Segment组成了动态视图。Segment实际运行时如何在进程虚拟地址空间内组织数据(Virtual Address Space)。

Segment在 ELF 文件中的意义​:

  • ELF 文件的 ​Program Header(程序头)​​ 中的 ​Segment(段)​​ 描述了程序加载到内存时的布局。每个 Segment 指定了以下信息:
  • 需要加载到进程 VAS 的哪些虚拟地址范围(如代码段 .text、数据段 .data)。
  • 访问权限(可读、可写、可执行)。
  • 文件偏移量和内存大小(p_offset、p_filesz、p_memsz)。

静态视角使用GDB分析ELF文件

postgres文件

$ readelf -h bin/postgres
ELF Header:Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00Class:                             ELF64Data:                              2's complement, little endianVersion:                           1 (current)OS/ABI:                            UNIX - System VABI Version:                       0Type:                              EXEC (Executable file)Machine:                           Advanced Micro Devices X86-64Version:                           0x1Entry point address:               0x48e980Start of program headers:          64 (bytes into file)Start of section headers:          41318232 (bytes into file)Flags:                             0x0Size of this header:               64 (bytes)Size of program headers:           56 (bytes)Number of program headers:         9Size of section headers:           64 (bytes)Number of section headers:         38Section header string table index: 37
  • Magic字段可以宽度判断是否为ELF文件。45 4c 46 对应 E L F的ASCII码。
  • ELF类型:EXEC (Executable file)
  • 程序运行时将会执行的第一条指令的位置:0x48e980

gdb确认0x48e980地址再text段(所有程序代码都会在text段)

(gdb) info file
Symbols from "/data/mingjie/pgroot99/pghome/bin/postgres".
Local exec file:`/data/mingjie/pgroot99/pghome/bin/postgres', file type elf64-x86-64.Entry point: 0x48e9800x0000000000400238 - 0x0000000000400254 is .interp              # 动态链接器路径    0x0000000000400254 - 0x0000000000400274 is .note.ABI-tag        # 编译环境元数据0x0000000000400274 - 0x0000000000400298 is .note.gnu.build-id0x0000000000400298 - 0x0000000000414748 is .gnu.hash            # 动态符号表的哈希表,加速符号查找0x0000000000414748 - 0x0000000000454300 is .dynsym              # 动态链接符号表(函数/变量名)及其字符串表0x0000000000454300 - 0x0000000000485903 is .dynstr              # 动态链接符号表(函数/变量名)及其字符串表0x0000000000485904 - 0x000000000048adfe is .gnu.version0x000000000048ae00 - 0x000000000048afa0 is .gnu.version_r0x000000000048afa0 - 0x000000000048b138 is .rela.dyn0x000000000048b138 - 0x000000000048d2e0 is .rela.plt0x000000000048d2e0 - 0x000000000048d2fb is .init0x000000000048d300 - 0x000000000048e980 is .plt       # 动态跳转表(.plt)及全局偏移表(.got.plt),用于延迟绑定动态库函数0x000000000048e980 - 0x0000000000bf4e04 is .text      # 所有可执行代码​   <<<<<<< 0x48e9800x0000000000bf4e04 - 0x0000000000bf4e11 is .fini0x0000000000bf5000 - 0x0000000000e662e0 is .rodata    # 只读数据(字符串常量、全局常量等)0x0000000000e662e0 - 0x0000000000e95a5c is .eh_frame_hdr0x0000000000e95a60 - 0x0000000000f55668 is .eh_frame  # 异常处理信息0x0000000001155cd0 - 0x0000000001155cd8 is .init_array  # 构造函数指针列表0x0000000001155cd8 - 0x0000000001155ce0 is .fini_array  # 析构函数指针列表0x0000000001155ce0 - 0x0000000001155d68 is .data.rel.ro0x0000000001155d68 - 0x0000000001155fc8 is .dynamic0x0000000001155fc8 - 0x0000000001155fe8 is .got0x0000000001156000 - 0x0000000001156b50 is .got.plt0x0000000001156b60 - 0x000000000116e9b8 is .data      # 已初始化的全局变量/静态变量(非零值)0x000000000116e9c0 - 0x00000000011a4a60 is .bss       # 未初始化或零初始化的全局/静态变量(运行时自动清零)

maint也可以查询

(gdb) maint info sections
Exec file:`/data/mingjie/pgroot99/pghome/bin/postgres', file type elf64-x86-64.[0]      0x00400238->0x00400254 at 0x00000238: .interp ALLOC LOAD READONLY DATA HAS_CONTENTS[1]      0x00400254->0x00400274 at 0x00000254: .note.ABI-tag ALLOC LOAD READONLY DATA HAS_CONTENTS[2]      0x00400274->0x00400298 at 0x00000274: .note.gnu.build-id ALLOC LOAD READONLY DATA HAS_CONTENTS[3]      0x00400298->0x00414748 at 0x00000298: .gnu.hash ALLOC LOAD READONLY DATA HAS_CONTENTS[4]      0x00414748->0x00454300 at 0x00014748: .dynsym ALLOC LOAD READONLY DATA HAS_CONTENTS[5]      0x00454300->0x00485903 at 0x00054300: .dynstr ALLOC LOAD READONLY DATA HAS_CONTENTS[6]      0x00485904->0x0048adfe at 0x00085904: .gnu.version ALLOC LOAD READONLY DATA HAS_CONTENTS[7]      0x0048ae00->0x0048afa0 at 0x0008ae00: .gnu.version_r ALLOC LOAD READONLY DATA HAS_CONTENTS[8]      0x0048afa0->0x0048b138 at 0x0008afa0: .rela.dyn ALLOC LOAD READONLY DATA HAS_CONTENTS[9]      0x0048b138->0x0048d2e0 at 0x0008b138: .rela.plt ALLOC LOAD READONLY DATA HAS_CONTENTS[10]     0x0048d2e0->0x0048d2fb at 0x0008d2e0: .init ALLOC LOAD READONLY CODE HAS_CONTENTS[11]     0x0048d300->0x0048e980 at 0x0008d300: .plt ALLOC LOAD READONLY CODE HAS_CONTENTS[12]     0x0048e980->0x00bf4e04 at 0x0008e980: .text ALLOC LOAD READONLY CODE HAS_CONTENTS[13]     0x00bf4e04->0x00bf4e11 at 0x007f4e04: .fini ALLOC LOAD READONLY CODE HAS_CONTENTS[14]     0x00bf5000->0x00e662e0 at 0x007f5000: .rodata ALLOC LOAD READONLY DATA HAS_CONTENTS[15]     0x00e662e0->0x00e95a5c at 0x00a662e0: .eh_frame_hdr ALLOC LOAD READONLY DATA HAS_CONTENTS[16]     0x00e95a60->0x00f55668 at 0x00a95a60: .eh_frame ALLOC LOAD READONLY DATA HAS_CONTENTS[17]     0x01155cd0->0x01155cd8 at 0x00b55cd0: .init_array ALLOC LOAD DATA HAS_CONTENTS[18]     0x01155cd8->0x01155ce0 at 0x00b55cd8: .fini_array ALLOC LOAD DATA HAS_CONTENTS[19]     0x01155ce0->0x01155d68 at 0x00b55ce0: .data.rel.ro ALLOC LOAD DATA HAS_CONTENTS[20]     0x01155d68->0x01155fc8 at 0x00b55d68: .dynamic ALLOC LOAD DATA HAS_CONTENTS[21]     0x01155fc8->0x01155fe8 at 0x00b55fc8: .got ALLOC LOAD DATA HAS_CONTENTS[22]     0x01156000->0x01156b50 at 0x00b56000: .got.plt ALLOC LOAD DATA HAS_CONTENTS[23]     0x01156b60->0x0116e9b8 at 0x00b56b60: .data ALLOC LOAD DATA HAS_CONTENTS[24]     0x0116e9c0->0x011a4a60 at 0x00b6e9b8: .bss ALLOC[25]     0x00000000->0x0000005a at 0x00b6e9b8: .comment READONLY HAS_CONTENTS[26]     0x015a4a60->0x015a8ef4 at 0x00b6ea14: .gnu.build.attributes READONLY HAS_CONTENTS[27]     0x00000000->0x00009770 at 0x00b72ea8: .debug_aranges READONLY HAS_CONTENTS[28]     0x00000000->0x011476f4 at 0x00b7c618: .debug_info READONLY HAS_CONTENTS[29]     0x00000000->0x000bd016 at 0x01cc3d0c: .debug_abbrev READONLY HAS_CONTENTS[30]     0x00000000->0x004fdf94 at 0x01d80d22: .debug_line READONLY HAS_CONTENTS[31]     0x00000000->0x00181834 at 0x0227ecb6: .debug_str READONLY HAS_CONTENTS[32]     0x00000000->0x0000b990 at 0x024004ea: .debug_ranges READONLY HAS_CONTENTS[33]     0x00000000->0x0022b286 at 0x0240be7a: .debug_macro READONLY HAS_CONTENTS

.text段

用x打印text段的地址,gdb会自动加上函数名,非常方便。

(gdb) x/32 0x48e980
0x48e980 <_start>:	0xfa1e0ff3	0x8949ed31	0x89485ed1	0xe48348e2
0x48e990 <_start+16>:	0x495450f0	0x4d80c0c7	0xc74800bf	0xbf4d10c1
0x48e9a0 <_start+32>:	0xc7c74800	0x007b7d7d	0x762a15ff	0x90f400cc
0x48e9b0 <_dl_relocate_static_pie>:	0xfa1e0ff3	0x0f2e66c3	0x0000841f	0x90000000
0x48e9c0 <deregister_tm_clones>:	0xf13d8d48	0x4800cdff	0xffea058d	0x394800cd
0x48e9d0 <deregister_tm_clones+16>:	0x481574f8	0x75ee058b	0x854800cc	0xff0974c0
0x48e9e0 <deregister_tm_clones+32>:	0x801f0fe0	0x00000000	0x801f0fc3	0x00000000
0x48e9f0 <register_tm_clones>:	0xc13d8d48	0x4800cdff	0xffba358d	0x294800cd(gdb) x/32 main
0x7b7d7d <main>:	0xe5894855	0x20ec8348	0x48ec7d89	0xc6e07589
0x7b7d8d <main+16>:	0xc601ff45	0x9ba44905	0x8b480100	0x8b48e045
0x7b7d9d <main+32>:	0xc7894800	0x43770ce8	0x05894800	0x009e6c33
0x7b7dad <main+48>:	0x2c058b48	0x48009e6c	0xc8e8c789	0x48000002

_start的作用是调用函数入口main函数,main函数的入口地址是0x7b7d7d,_start是怎么调用进来的?用disassemble看下汇编:

(gdb) disassemble 0x48e980 , 0x48e9b0
Dump of assembler code from 0x48e980 to 0x48e9b0:0x000000000048e980 <_start+0>:	endbr640x000000000048e984 <_start+4>:	xor    %ebp,%ebp0x000000000048e986 <_start+6>:	mov    %rdx,%r90x000000000048e989 <_start+9>:	pop    %rsi0x000000000048e98a <_start+10>:	mov    %rsp,%rdx0x000000000048e98d <_start+13>:	and    $0xfffffffffffffff0,%rsp0x000000000048e991 <_start+17>:	push   %rax0x000000000048e992 <_start+18>:	push   %rsp0x000000000048e993 <_start+19>:	mov    $0xbf4d80,%r80x000000000048e99a <_start+26>:	mov    $0xbf4d10,%rcx0x000000000048e9a1 <_start+33>:	mov    $0x7b7d7d,%rdi0x000000000048e9a8 <_start+40>:	callq  *0xcc762a(%rip)        # 0x1155fd80x000000000048e9ae <_start+46>:	hlt0x000000000048e9af <.annobin_static_reloc.c_end+0>:	nop

mov $0x7b7d7d,%rdi将main地址存入rip,callq调用riq即完成main函数的调用。

如果想要插件某个函数的汇编代码,disassemble后面可以接地址也可以接函数名:

(gdb) disassemble main
Dump of assembler code for function main:0x00000000007b7d7d <+0>:	push   %rbp0x00000000007b7d7e <+1>:	mov    %rsp,%rbp0x00000000007b7d81 <+4>:	sub    $0x20,%rsp0x00000000007b7d85 <+8>:	mov    %edi,-0x14(%rbp)0x00000000007b7d88 <+11>:	mov    %rsi,-0x20(%rbp)0x00000000007b7d8c <+15>:	movb   $0x1,-0x1(%rbp)0x00000000007b7d90 <+19>:	movb   $0x1,0x9ba449(%rip)        # 0x11721e0 <reached_main>0x00000000007b7d97 <+26>:	mov    -0x20(%rbp),%rax0x00000000007b7d9b <+30>:	mov    (%rax),%rax0x00000000007b7d9e <+33>:	mov    %rax,%rdi0x00000000007b7da1 <+36>:	callq  0xbef4b2 <get_progname>0x00000000007b7da6 <+41>:	mov    %rax,0x9e6c33(%rip)        # 0x119e9e0 <progname>0x00000000007b7dad <+48>:	mov    0x9e6c2c(%rip),%rax        # 0x119e9e0 <progname>......

拿到一个地址想知道对应哪个函数,起止地址是什么?例如上面main函数中的一行0x7b7d90

(gdb) info line *0x7b7d90
Line 64 of "main.c" starts at address 0x7b7d90 <main+19> and ends at 0x7b7d97 <main+26>.

.rodata

rodata段适用gdb打印不太方便,用objdump输出比较直观:

$ objdump -s bin/postgres --section=.rodata | morebin/postgres:     file format elf64-x86-64Contents of section .rodata:bf5000 01000200 00000000 00000000 00000000  ................bf5010 00000000 00000000 00000000 00000000  ................bf5020 2e2e2f2e 2e2f2e2e 2f2e2e2f 7372632f  ../../../../src/bf5030 696e636c 7564652f 73746f72 6167652f  include/storage/bf5040 6974656d 7074722e 68004974 656d506f  itemptr.h.ItemPobf5050 696e7465 72497356 616c6964 28706f69  interIsValid(poibf5060 6e746572 29000000 2e2e2f2e 2e2f2e2e  nter)...../../..bf5070 2f2e2e2f 7372632f 696e636c 7564652f  /../src/include/bf5080 73746f72 6167652f 6275666d 67722e68  storage/bufmgr.hbf5090 00627566 6e756d20 3c3d204e 42756666  .bufnum <= NBuffbf50a0 65727300 6275666e 756d203e 3d202d4e  ers.bufnum >= -Nbf50b0 4c6f6342 75666665 72004275 66666572  LocBuffer.Bufferbf50c0 49735661 6c696428 62756666 65722900  IsValid(buffer).bf50d0 6272696e 2e630000 69647852 656c2d3e  brin.c..idxRel->bf50e0 72645f72 656c2d3e 72656c6b 696e6420  rd_rel->relkindbf50f0 3d3d2052 454c4b49 4e445f49 4e444558  == RELKIND_INDEXbf5100 20262620 69647852 656c2d3e 72645f72   && idxRel->rd_rbf5110 656c2d3e 72656c61 6d203d3d 20425249  el->relam == BRIbf5120 4e5f414d 5f4f4944 00000000 00000000  N_AM_OID........bf5130 72657175 65737420 666f7220 4252494e  request for BRINbf5140 2072616e 67652073 756d6d61 72697a61   range summarizabf5150 74696f6e 20666f72 20696e64 65782022  tion for index "bf5160 25732220 70616765 20257520 77617320  %s" page %u wasbf5170 6e6f7420 7265636f 72646564 00627269  not recorded.bribf5180 6e696e73 65727420 63787400 746d7020  ninsert cxt.tmpbf5190 2b206c65 6e203d3d 20707472 00000000  + len == ptr....bf51a0 286b6579 2d3e736b 5f666c61 67732026  (key->sk_flags &bf51b0 20534b5f 49534e55 4c4c2920 7c7c2028   SK_ISNULL) || (bf51c0 6b65792d 3e736b5f 636f6c6c 6174696f  key->sk_collatiobf51d0 6e203d3d 20547570 6c654465 73634174  n == TupleDescAtbf51e0 74722862 64657363 2d3e6264 5f747570  tr(bdesc->bd_tupbf51f0 64657363 2c206b65 79617474 6e6f202d  desc, keyattno -bf5200 2031292d 3e617474 636f6c6c 6174696f   1)->attcollatiobf5210 6e29006e 6b657973 5b6b6579 6174746e  n).nkeys[keyattnbf5220 6f202d20 315d203d 3d203000 6e6e756c  o - 1] == 0.nnulbf5230 6c6b6579 735b6b65 79617474 6e6f202d  lkeys[keyattno -bf5240 20315d20 3d3d2030 00627269 6e676574   1] == 0.bringetbf5250 6269746d 61702063 78740000 00000000  bitmap cxt......bf5260 286e6b65 79735b61 74746e6f 202d2031  (nkeys[attno - 1bf5270 5d203e20 30292026 2620286e 6b657973  ] > 0) && (nkeys
...
...
...
...

地址从0xbf5000起始,和gdb查出来的也能对应上。

	0x0000000000bf5000 - 0x0000000000e662e0 is .rodata    # 只读数据(字符串常量、全局常量等)

执行视角分析ELF文件

$ readelf -l bin/postgresElf file type is EXEC (Executable file)
Entry point 0x48e980
There are 9 program headers, starting at offset 64Program Headers:Type           Offset             VirtAddr           PhysAddrFileSiz            MemSiz              Flags  AlignPHDR           0x0000000000000040 0x0000000000400040 0x00000000004000400x00000000000001f8 0x00000000000001f8  R      0x8INTERP         0x0000000000000238 0x0000000000400238 0x00000000004002380x000000000000001c 0x000000000000001c  R      0x1[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]LOAD           0x0000000000000000 0x0000000000400000 0x00000000004000000x0000000000b55668 0x0000000000b55668  R E    0x200000LOAD           0x0000000000b55cd0 0x0000000001155cd0 0x0000000001155cd00x0000000000018ce8 0x000000000004ed90  RW     0x200000DYNAMIC        0x0000000000b55d68 0x0000000001155d68 0x0000000001155d680x0000000000000260 0x0000000000000260  RW     0x8NOTE           0x0000000000000254 0x0000000000400254 0x00000000004002540x0000000000000044 0x0000000000000044  R      0x4GNU_EH_FRAME   0x0000000000a662e0 0x0000000000e662e0 0x0000000000e662e00x000000000002f77c 0x000000000002f77c  R      0x4GNU_STACK      0x0000000000000000 0x0000000000000000 0x00000000000000000x0000000000000000 0x0000000000000000  RW     0x10GNU_RELRO      0x0000000000b55cd0 0x0000000001155cd0 0x0000000001155cd00x0000000000000330 0x0000000000000330  R      0x1Section to Segment mapping:Segment Sections...0001     .interp02     .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame03     .init_array .fini_array .data.rel.ro .dynamic .got .got.plt .data .bss04     .dynamic05     .note.ABI-tag .note.gnu.build-id06     .eh_frame_hdr0708     .init_array .fini_array .data.rel.ro .dynamic .got
  • Program Headers:每个Segment的情况。
  • Section to Segment mapping: Section和Segment的对应关系。

LOAD类型的Segment会在程序运行时被加载到VAS,而其余Segment主要用于辅助程序的正常运行。

第一个LOAD范围:0x0000000000000000 - 0x0000000000b55668
权限是RE对应

   02     .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame

第二个LOAD范围:0x0000000000b55cd0 - 0x0000000000018ce8
权限是RW对应

   03     .init_array .fini_array .data.rel.ro .dynamic .got .got.plt .data .bss

在这里插入图片描述

相关文章:

Postgresql源码(146)二进制文件格式分析

相关 Linux函数调用栈的实现原理&#xff08;X86&#xff09; 速查 # 查看elf头 readelf -h bin/postgres# 查看Section readelf -S bin/postgres (gdb) info file (gdb) maint info sections# 查看代码段汇编 disassemble 0x48e980 , 0x48e9b0 disassemble main# 查看代码段某…...

spring ai mcp 和现有业务逻辑如何结合,现有项目用的是spring4.3.7

将 Spring AI 的 MCP&#xff08;Model Context Protocol&#xff09;协议集成到基于 Spring 4.3.7 的现有项目中&#xff0c; 需解决版本兼容性和架构适配问题。 有两种方式&#xff1a;1 mcp tool 封装&#xff0c; 2&#xff1a;如果是微服务&#xff0c;可以用spring ai a…...

【设计模式-4.11】行为型——解释器模式

说明&#xff1a;本文介绍行为型设计模式之一的解释器模式 定义 解释器模式&#xff08;Interpreter Pattern&#xff09;指给定一门语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来解释语言中的句子。解释器模式是一种…...

【已解决】MACOS M4 芯片使用 Docker Desktop 工具安装 MICROSOFT SQL SERVER

1. 环境准备 确认 Docker Desktop 配置 确保已安装 Docker Desktop for Mac (Apple Silicon)&#xff08;版本 ≥ 4.15.0&#xff09;。开启 Rosetta&#xff08;默认开启&#xff09;&#xff1a; 打开 Docker Desktop → Settings → General → Virtual Machine Options …...

Quipus系统的视频知识库的构建原理及使用

1 原理 VideoRag在LightRag基础上增加了对视频的处理&#xff0c;详细的分析参考LightRag的兄弟项目VideoRag系统分析-CSDN博客。 Quipus的底层的知识库的构建的核心流程与LightRag类似&#xff0c;但在技术栈的选择和处理有所不同。Quipus对于视频的处理实现&#xff0c;与Vi…...

web3-去中心化金融深度剖析:DEX、AMM及兑换交易传播如何改变世界

web3-去中心化金融深度剖析&#xff1a;DEX、AMM及兑换交易传播如何改变世界 金融问题 1.个人投资&#xff1a;在不同的时间和可能的情况&#xff08;状态&#xff09;下积累财富 2.商业投资&#xff1a;为企业家和企业提供投资生产性活动的资源 目标&#xff1a;跨越时间和…...

国芯思辰|SCS5501/5502芯片组打破技术壁垒,重构车载视频传输链路,兼容MAX9295A/MAX96717

在新能源汽车产业高速发展的背景下&#xff0c;电机控制、智能驾驶等系统对高精度信号处理与高速数据传输的需求持续攀升。 针对车载多摄像头与自动驾驶辅助系统对长距离、低误码率、高抗干扰性数据传输的需求&#xff0c;SCS5501串行器与SCS5502解串器芯片组充分利用了MIPI A…...

【图像处理3D】:点云图是怎么生成的

点云图是怎么生成的 **一、点云数据的采集方式****1. 激光雷达&#xff08;LiDAR&#xff09;****2. 结构光&#xff08;Structured Light&#xff09;****3. 双目视觉&#xff08;Stereo Vision&#xff09;****4. 飞行时间相机&#xff08;ToF Camera&#xff09;****5. 其他…...

压敏电阻的选型都要考虑哪些因素?同时注意事项都有哪些?

压敏电阻&#xff0c;英文名简称VDR&#xff0c;电子元器件中重要的成员之一&#xff0c;是一种非线性伏安特性的电阻器件&#xff0c;有电阻特性的同时&#xff0c;也拥有其他自身的特性&#xff0c;广泛应用于众多领域。在电源系统、安防系统、浪涌抑制器、电动机保护、汽车电…...

用WPDRRC模型,构建企业安全防线

文章目录 前言什么是 WPDRRC 模型预警&#xff08;Warning&#xff09;保护&#xff08;Protection&#xff09;检测&#xff08;Detection&#xff09;响应&#xff08;Response&#xff09;恢复&#xff08;Recovery&#xff09;反击&#xff08;Counterattack&#xff09; W…...

使用 Amazon Q Developer CLI 快速搭建各种场景的 Flink 数据同步管道

在 AI 和大数据时代&#xff0c;企业通常需要构建各种数据同步管道。例如&#xff0c;实时数仓实现从数据库到数据仓库或者数据湖的实时复制&#xff0c;为业务部门和决策团队分析提供数据结果和见解&#xff1b;再比如&#xff0c;NoSQL 游戏玩家数据&#xff0c;需要转换为 S…...

Java应用服务在Kubernetes集群中的改造与配置

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; 微服务架构与容器化 微服务架构的优势 微服务架构是一种将应用程序构建为一组小型独立服务的方法。每个服务负责完成特定的业务功能&#xff0c;并且可以独立地进行开发、部署和扩展。这种架构在Kubernetes环境…...

Linux 里 su 和 sudo 命令这两个有什么不一样?

《小菜狗 Linux 操作系统快速入门笔记》目录&#xff1a; 《小菜狗 Linux 操作系统快速入门笔记》&#xff08;01.0&#xff09;文章导航目录【实时更新】 Linux 是一个多用户的操作系统。在 Linux 中&#xff0c;理论上来说&#xff0c;我们可以创建无数个用户&#xff0c;但…...

「数据分析 - Pandas 函数」【数据分析全栈攻略:爬虫+处理+可视化+报告】

- 第 105 篇 - Date: 2025 - 06 - 05 Author: 郑龙浩/仟墨 Pandas 核心功能详解与示例 文章目录 Pandas 核心功能详解与示例1. 数据结构基础1.1 Series 创建与操作1.2 DataFrame 创建与操作 2. 数据选择与过滤2.1 基本选择方法2.2 布尔索引 3. 数据处理与清洗3.1 缺失值处理3.…...

JAVASCRIPT 简化版数据库--智能编程——仙盟创梦IDE

// 数据模型class 仙盟创梦数据DM {constructor(key) {this.key ${STORAGE_PREFIX}${key};this.data this.加载数据();}加载数据() {return JSON.parse(localStorage.getItem(this.key)) || [];}保存() {localStorage.setItem(this.key, JSON.stringify(this.data));}新增(it…...

YAML在自动化测试中的三大核心作用

YAML在自动化测试中的三大核心作用 配置中心&#xff1a;管理测试环境/参数 # config.yaml environments:dev: url: "http://dev.api.com"timeout: 5prod:url: "https://api.com"timeout: 10数据驱动&#xff1a;分离测试数据与脚本 # test_data.yaml lo…...

命名管道实现本地通信

目录 命名管道实现通信 命名管道通信头文件 创建命名管道mkfifo 删除命名管道unlink 构造函数 以读方式打开命名管道 以写方式打开命名管道 读操作 写操作 析构函数 服务端 客户端 运行结果 命名管道实现通信 命名管道通信头文件 #pragma#include <iostream> #include &l…...

iOS上传应用包错误问题 “Invalid bundle. The “UIInterfaceOrientationPortrait”“

引言 在开发 iOS 应用的整个生命周期中&#xff0c;打包上传到 App Store 是一个至关重要的步骤。每一次提交&#xff0c;Xcode 都会在后台执行一系列严格的校验流程&#xff0c;包括对 Info.plist 配置的检查、架构兼容性的验证、资源完整性的审查等。如果某些关键项配置不当…...

【LeetCode】1061. 按字典序排列最小的等效字符串(并查集)

LeetCode 1061. 按字典序排列最小的等效字符串 (中等) 题目链接&#xff1a;LeetCode 1061. 按字典序排列最小的等效字符串 (中等) 题目描述 给出长度相同的两个字符串s1 和 s2 &#xff0c;还有一个字符串 baseStr 。 其中 s1[i] 和 s2[i] 是一组等价字符。 举个例子&#…...

猎板厚铜PCB工艺能力如何?

在电子产业向高功率、高集成化狂奔的今天&#xff0c;电路板早已不是沉默的配角。当5G基站、新能源汽车、工业电源等领域对电流承载、散热效率提出严苛要求时&#xff0c;一块能够“扛得住大电流、耐得住高温”的厚铜PCB&#xff0c;正成为决定产品性能的关键拼图。而在这条赛道…...

Flutter快速上手,入门教程

目录 一、参考文档 二、准备工作 下载Flutter SDK&#xff1a; 配置环境 解决环境报错 zsh:command not found:flutter 执行【flutter doctor】测试效果 安装Xcode IOS环境 需要安装brew&#xff0c;通过brew安装CocoaPods. 复制命令行&#xff0c;打开终端 分别执行…...

算法:前缀和

1.【模版】前缀和 【模板】前缀和_牛客题霸_牛客网 这道题如果使用暴力解法时间复杂度为O(n*m)&#xff0c;会超时&#xff0c;所以要使用前缀和算法。 前缀和->快速求出数组中某一个连续区间的和。 第一步&#xff1a;预处理出一个前缀和数组 dp。 dp[i]表示[1, i] 区间…...

DEVICENET转MODBUS TCP网关与AB数据输出模块的高效融合方案研究

在工业自动化领域&#xff0c;多样化的设备通常采用不同的通信协议&#xff0c;这为系统集成带来了显著的挑战。特别是在需要将遵循DeviceNet协议的设备与基于MODBUS TCP协议的系统进行互连时&#xff0c;这一挑战尤为突出。AB数据输出作为一种功能卓越的DeviceNet分布式输入/输…...

牛客小白月赛113

前言&#xff1a;这场的E题补的我头皮都发麻了。 A. 2025 题目大意&#xff1a;一个仅有‘-’‘*’组成的字符串&#xff0c;初始有一个sum 1&#xff0c; 从左到右依次遍历字符串&#xff0c;遇到-就让sum--&#xff1b;遇到*就让sum* 2&#xff0c;问sum有没有可能大于等于…...

Mac版本Android Studio配置LeetCode插件

第一步&#xff1a;Android Studio里面找到Settings&#xff0c;找到Plugins&#xff0c;在Marketplace里面搜索LeetCode Editor。 第二步&#xff1a;安装对应插件&#xff0c;并在Tools->LeetCode Plugin页面输入帐号和密码。 理论上&#xff0c;应该就可以使用了。但是&a…...

电子电路基础1(杂乱)

电路基础知识 注意&#xff1a;电压源与电流源的表现形式 注意&#xff1a;在同一根导线上电势相等 电阻电路的等效变换 电子元器件基础 电阻...

rocketmq延迟消息的底层原理浅析

rocketmq延迟消息的底层原理 消息实体 延时消息是指允许消息在指定延迟时间后才被消费者消费 Apache RocketMQ 中&#xff0c;消息的核心实体类是 org.apache.rocketmq.common.message.Message public class Message implements Serializable {private String topic; …...

【openssl】升级为3.3.1,避免安全漏洞

本文档旨在形成 对Linux系统openssl版本进行升级 的搭建标准操作过程&#xff0c;搭建完成后&#xff0c;实现 openssl 达到3.3以上版本&#xff0c;避免安全漏洞 效果。 一、查看当前版本 版本不高于3.1的&#xff0c;均需要升级。 # 服务器上运行以下命令&#xff0c;查看…...

使用 HTML +JavaScript 从零构建视频帧提取器

在视频编辑、内容分析和多媒体处理领域&#xff0c;常常需要从视频中提取关键帧。手动截取不仅效率低下&#xff0c;还容易遗漏重要画面。本文介绍的视频帧提取工具通过 HTML5 技术栈实现了一个完整的浏览器端解决方案&#xff0c;用户可以轻松选择视频文件并进行手动或自动帧捕…...

基于若依前后分离版-用户密码错误锁定

sys_config配置参数 user.password.maxRetryCount&#xff1a;最大错误次数 user.password.lockTime&#xff1a;锁定时长 //SysLoginController//登录 PostMapping("/login") public AjaxResult login(RequestBody LoginBody loginBody) {AjaxResult ajax AjaxR…...