鸿蒙关键技术研究,鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程 | 百篇博客分析HarmonyOS源码 | v54.02...

d8ef81145cb22bd53ae89b61ad1da221.png

百篇博客系列篇.本篇为:

下图是一个可执行文件编译,链接的过程.

164580f4314d0b69634f4f89283a5ca8.png

本篇将通过一个完整的小工程来阐述ELF编译,链接过程,并分析.o和bin文件中各区,符号表之间的关系.从一个崭新的视角去看中间过程,阅读之前建议先看

准备工作

先得有个小工程,麻雀虽小,但五脏俱全,标准的文件夹和Makefile结构,如下:

目录结构

root@5e3abe332c5a:/home/docker/test4harmony/54# tree

.

├── bin

│ └── weharmony

├── include

│ └── part.h

├── Makefile

├── obj

│ ├── main.o

│ └── part.o

└── src

├── main.c

└── part.c

看到 .c .h .o 就感觉特别的亲切 : ),项目很简单,但具有代表性,有全局变量/函数,extern,多文件链接,和动态链接库的printf,用cat命令看看三个文件内容.

cat .c .h

root@5e3abe332c5a:/home/docker/test4harmony/54# cat ./src/main.c

#include

#include "part.h"

extern int g_int;

extern char *g_str;

int main() {

int loc_int = 53;

char *loc_str = "harmony os";

printf("main 开始 - 全局 g_int = %d, 全局 g_str = %s.\n", g_int, g_str);

func_int(loc_int);

func_str(loc_str);

printf("main 结束 - 全局 g_int = %d, 全局 g_str = %s.\n", g_int, g_str);

return 0;

}

root@5e3abe332c5a:/home/docker/test4harmony/54# cat ./src/part.c

#include

#include "part.h"

int g_int = 51;

char *g_str = "hello world";

void func_int(int i) {

int tmp = i;

g_int = 2 * tmp ;

printf("func_int g_int = %d,tmp = %d.\n", g_int,tmp);

}

void func_str(char *str) {

g_str = str;

printf("func_str g_str = %s.\n", g_str);

}

root@5e3abe332c5a:/home/docker/test4harmony/54# cat ./include/part.h

#ifndef _PART_H_

#define _PART_H_

void func_int(int i);

void func_str(char *str);

#endif

cat Makefile

Makefile采用标准写法,关于makefile系列篇会在编译过程篇中详细说明,此处先看点简单的.

root@5e3abe332c5a:/home/docker/test4harmony/54# cat Makefile

DIR_INC = ./include

DIR_SRC = ./src

DIR_OBJ = ./obj

DIR_BIN = ./bin

SRC = $(wildcard ${DIR_SRC}/*.c)

OBJ = $(patsubst %.c,${DIR_OBJ}/%.o,$(notdir ${SRC}))

TARGET = weharmony

BIN_TARGET = ${DIR_BIN}/${TARGET}

CC = gcc

CFLAGS = -g -Wall -I${DIR_INC}

${BIN_TARGET}:${OBJ}

$(CC) $(OBJ) -o $@

${DIR_OBJ}/%.o:${DIR_SRC}/%.c

$(CC) $(CFLAGS) -c $< -o $@

.PHONY:clean

clean:

find ${DIR_OBJ} -name *.o -exec rm -rf {}

编译.链接.运行.看结果

root@5e3abe332c5a:/home/docker/test4harmony/54# make

gcc -g -Wall -I./include -c src/part.c -o obj/part.o

gcc -g -Wall -I./include -c src/main.c -o obj/main.o

gcc ./obj/part.o ./obj/main.o -o bin/weharmony

root@5e3abe332c5a:/home/docker/test4harmony/54# ./bin/weharmony

main 开始 - 全局 g_int = 51, 全局 g_str = hello world.

func_int g_int = 106,tmp = 53.

func_str g_str = harmony os.

main 结束 - 全局 g_int = 106, 全局 g_str = harmony os.

结果很简单,没什么好说的.

开始分析

准备工作完成,开始了真正的分析. 因为命令输出内容太多,本篇做了精简,去除了干扰项.对这些命令还不行清楚的请翻看系列篇其他文章,此处不做介绍,阅读本篇需要一定的基础.

readelf 大S小s ./obj/main.o

root@5e3abe332c5a:/home/docker/test4harmony/54# readelf -S ./obj/main.o

There are 22 section headers, starting at offset 0x1498:

Section Headers:

[Nr] Name Type Address Offset

Size EntSize Flags Link Info Align

[ 0] NULL 0000000000000000 00000000

0000000000000000 0000000000000000 0 0 0

[ 1] .text PROGBITS 0000000000000000 00000040

000000000000007b 0000000000000000 AX 0 0 1

[ 2] .rela.text RELA 0000000000000000 00000c80

0000000000000108 0000000000000018 I 19 1 8

[ 3] .data PROGBITS 0000000000000000 000000bb

0000000000000000 0000000000000000 WA 0 0 1

[ 4] .bss NOBITS 0000000000000000 000000bb

0000000000000000 0000000000000000 WA 0 0 1

[ 5] .rodata PROGBITS 0000000000000000 000000c0

000000000000007d 0000000000000000 A 0 0 8

......

root@5e3abe332c5a:/home/docker/test4harmony/54# readelf -s ./obj/main.o

Symbol table '.symtab' contains 22 entries:

Num: Value Size Type Bind Vis Ndx Name

0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND

1: 0000000000000000 0 FILE LOCAL DEFAULT ABS main.c

2: 0000000000000000 0 SECTION LOCAL DEFAULT 1

...

15: 0000000000000000 123 FUNC GLOBAL DEFAULT 1 main

16: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND g_str

17: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND g_int

18: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_

19: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND printf

20: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND func_int

21: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND func_str

解读

编译 main.c 后 main.o 告诉了链接器以下信息

有一个文件 叫 main.c (Type=FILE)

文件中有个函数叫 main (Type=FUNC),并且这是一个全局函数,(Bind = GLOBAL , Vis = DEFAULT,全局的意思就是可以被外部文件所引用.

剩下的g_str,printf,func_int,....,都是需要外部提供,并未在本文件中定义的符号 (Ndx = UND , Type = NOTYPE),至于怎么顺藤摸瓜找到这些符号那我不管,.o文件是独立存在,它只是告诉你我用了哪些东西,但我也不知道在哪里.

printf和func_int对它来说一视同仁,都是外部链接符号,没有特殊对待.

readelf 大S小s ./obj/part.o

root@5e3abe332c5a:/home/docker/test4harmony/54# readelf -S ./obj/part.o

[ 1] .text PROGBITS 0000000000000000 00000040

0000000000000078 0000000000000000 AX 0 0 1

[ 2] .rela.text RELA 0000000000000000 00000cf0

00000000000000c0 0000000000000018 I 21 1 8

[ 3] .data PROGBITS 0000000000000000 000000b8

0000000000000004 0000000000000000 WA 0 0 4

[ 4] .bss NOBITS 0000000000000000 000000bc

0000000000000000 0000000000000000 WA 0 0 1

[ 5] .rodata PROGBITS 0000000000000000 000000c0

0000000000000045 0000000000000000 A 0 0 8

[ 6] .data.rel.local PROGBITS 0000000000000000 00000108

0000000000000008 0000000000000000 WA 0 0 8

......

root@5e3abe332c5a:/home/docker/test4harmony/54# readelf -s ./obj/part.o

Symbol table '.symtab' contains 22 entries:

Num: Value Size Type Bind Vis Ndx Name

0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND

1: 0000000000000000 0 FILE LOCAL DEFAULT ABS part.c

2: 0000000000000000 0 SECTION LOCAL DEFAULT 1

...

16: 0000000000000000 4 OBJECT GLOBAL DEFAULT 3 g_int

17: 0000000000000000 8 OBJECT GLOBAL DEFAULT 6 g_str

18: 0000000000000000 52 FUNC GLOBAL DEFAULT 1 func_int

19: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_

20: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND printf

21: 0000000000000034 57 FUNC GLOBAL DEFAULT 1 func_str

解读

编译 part.c 后part.o告诉了链接器以下信息

有一个文件 叫 part.c (Type=FILE)

文件中有两个函数叫 func_int,func_str (Type=FUNC),并且都是全局函数,(Bind = GLOBAL , Vis = DEFAULT,全局的意思就是可以被外部文件所引用.

文件中有两个对象叫 g_int,g_str (Type=OBJECT),并且都是全局对象,同样可以被外部使用.

剩下的printf,_GLOBAL_OFFSET_TABLE_,都是需要外部提供,并未在本文件中定义的符号 (Ndx = UND , Type = NOTYPE)

另外 part.c的局部变量tmp并没有出现在符号表中.因为符号表相当于外交部,只有对外的内容.

func_int,func_str在1区代码区.text.

g_int 在3区.data数据区, 打开3区,发现了 0x33 就是源码中 int g_int = 51;的值 root@5e3abe332c5a:/home/docker/test4harmony/54# readelf -x 3 ./obj/part.o

Hex dump of section '.data':

0x00000000 33000000 3...

g_str 在6区,.data.rel.local数据区,打开6区看结果 root@5e3abe332c5a:/home/docker/test4harmony/54# readelf -x 6 ./obj/part.o

Hex dump of section '.data.rel.local':

NOTE: This section has relocations against it, but these have NOT been applied to this dump.

0x00000000 00000000 00000000 ........ 并未发现 char *g_str = "hello world";的身影,反而抛下一句话 NOTE: This section has relocations against it, but these have NOT been applied to this dump.翻译过来是 注意:此部分已针对它进行重定位,但是尚未将其应用于此转储. 最后在5区 '.rodata'找到了 hello world root@5e3abe332c5a:/home/docker/test4harmony/54# readelf -x 5 ./obj/part.o

Hex dump of section '.rodata':

0x00000000 68656c6c 6f20776f 726c6400 00000000 hello world.....

0x00000010 66756e63 5f696e74 20675f69 6e74203d func_int g_int =

0x00000020 2025642c 746d7020 3d202564 2e0a0066 %d,tmp = %d...f

0x00000030 756e635f 73747220 675f7374 72203d20 unc_str g_str =

0x00000040 25732e0a 00 %s.. 至于重定向是如何实现的,在系列篇 重定向篇中已有详细说明,不再此展开说.

看完两个符号表总结下来就是三句话

我是谁,我在哪

我能提供什么给别人用

我需要别人提供什么给我用.

readelf 大S小s ./bin/weharmony

weharmony是将 main.o,part.o和库文件链接完成后的可执行文件.

root@5e3abe332c5a:/home/docker/test4harmony/54# readelf -S ./bin/weharmony

There are 36 section headers, starting at offset 0x4908:

Section Headers:

[Nr] Name Type Address Offset

Size EntSize Flags Link Info Align

......

[16] .text PROGBITS 0000000000001060 00001060

0000000000000255 0000000000000000 AX 0 0 16

[17] .fini PROGBITS 00000000000012b8 000012b8

000000000000000d 0000000000000000 AX 0 0 4

[18] .rodata PROGBITS 0000000000002000 00002000

00000000000000cd 0000000000000000 A 0 0 8

......

[25] .data PROGBITS 0000000000004000 00003000

0000000000000020 0000000000000000 WA 0 0 8

[26] .bss NOBITS 0000000000004020 00003020

0000000000000008 0000000000000000 WA 0 0 1

root@5e3abe332c5a:/home/docker/test4harmony/54# readelf -s ./bin/weharmony

Symbol table '.dynsym' contains 7 entries:

Num: Value Size Type Bind Vis Ndx Name

0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND

1: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab

2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.2.5 (2)

3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)

4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__

5: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable

6: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@GLIBC_2.2.5 (2)

Symbol table '.symtab' contains 75 entries:

Num: Value Size Type Bind Vis Ndx Name

0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND

1: 0000000000000318 0 SECTION LOCAL DEFAULT 1

2: 0000000000000338 0 SECTION LOCAL DEFAULT 2

3: 0000000000000358 0 SECTION LOCAL DEFAULT 3

....

33: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c

34: 0000000000001090 0 FUNC LOCAL DEFAULT 16 deregister_tm_clones

35: 00000000000010c0 0 FUNC LOCAL DEFAULT 16 register_tm_clones

36: 0000000000001100 0 FUNC LOCAL DEFAULT 16 __do_global_dtors_aux

37: 0000000000004020 1 OBJECT LOCAL DEFAULT 26 completed.8060

38: 0000000000003dc0 0 OBJECT LOCAL DEFAULT 22 __do_global_dtors_aux_fin

39: 0000000000001140 0 FUNC LOCAL DEFAULT 16 frame_dummy

40: 0000000000003db8 0 OBJECT LOCAL DEFAULT 21 __frame_dummy_init_array_

41: 0000000000000000 0 FILE LOCAL DEFAULT ABS part.c

42: 0000000000000000 0 FILE LOCAL DEFAULT ABS main.c

43: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c

44: 000000000000225c 0 OBJECT LOCAL DEFAULT 20 __FRAME_END__

45: 0000000000000000 0 FILE LOCAL DEFAULT ABS

46: 0000000000003dc0 0 NOTYPE LOCAL DEFAULT 21 __init_array_end

47: 0000000000003dc8 0 OBJECT LOCAL DEFAULT 23 _DYNAMIC

48: 0000000000003db8 0 NOTYPE LOCAL DEFAULT 21 __init_array_start

49: 00000000000020c0 0 NOTYPE LOCAL DEFAULT 19 __GNU_EH_FRAME_HDR

50: 0000000000003fb8 0 OBJECT LOCAL DEFAULT 24 _GLOBAL_OFFSET_TABLE_

51: 0000000000001000 0 FUNC LOCAL DEFAULT 12 _init

52: 00000000000012b0 5 FUNC GLOBAL DEFAULT 16 __libc_csu_fini

53: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab

54: 0000000000004000 0 NOTYPE WEAK DEFAULT 25 data_start

55: 0000000000004020 0 NOTYPE GLOBAL DEFAULT 25 _edata

56: 00000000000012b8 0 FUNC GLOBAL HIDDEN 17 _fini

57: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@@GLIBC_2.2.5

58: 0000000000004010 4 OBJECT GLOBAL DEFAULT 25 g_int

59: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_

60: 0000000000004000 0 NOTYPE GLOBAL DEFAULT 25 __data_start

61: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__

62: 0000000000004008 0 OBJECT GLOBAL HIDDEN 25 __dso_handle

63: 0000000000004018 8 OBJECT GLOBAL DEFAULT 25 g_str

64: 0000000000002000 4 OBJECT GLOBAL DEFAULT 18 _IO_stdin_used

65: 0000000000001240 101 FUNC GLOBAL DEFAULT 16 __libc_csu_init

66: 0000000000001149 52 FUNC GLOBAL DEFAULT 16 func_int

67: 0000000000004028 0 NOTYPE GLOBAL DEFAULT 26 _end

68: 0000000000001060 47 FUNC GLOBAL DEFAULT 16 _start

69: 000000000000117d 57 FUNC GLOBAL DEFAULT 16 func_str

70: 0000000000004020 0 NOTYPE GLOBAL DEFAULT 26 __bss_start

71: 00000000000011b6 123 FUNC GLOBAL DEFAULT 16 main

72: 0000000000004020 0 OBJECT GLOBAL HIDDEN 25 __TMC_END__

73: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable

74: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@@GLIBC_2.2

解读

链接后的可执行文件 weharmony将告诉加载器以下信息

涉及文件有哪些 Type = FILE

涉及函数有哪些 Type = FUNC func_str,func_int,_start,main

涉及对象有哪些 Type = OBJECT g_int,g_str,....它将这些数据统一归到了25区. 前往25区查看下数据,同样只发现了 int g_int = 51; 的数据. root@5e3abe332c5a:/home/docker/test4harmony/54# readelf -x 25 ./bin/weharmony

Hex dump of section '.data':

0x00004000 00000000 00000000 08400000 00000000 .........@......

0x00004010 33000000 00000000 08200000 00000000 3........ ...... 是不是和part.o一样也被放在了.rodata区,再反查 18区,果然发了 main.c和part.c的数据都放在了这里. root@5e3abe332c5a:/home/docker/test4harmony/54# readelf -x 18 ./bin/weharmony

Hex dump of section '.rodata':

0x00002000 01000200 00000000 68656c6c 6f20776f ........hello wo

0x00002010 726c6400 00000000 66756e63 5f696e74 rld.....func_int

0x00002020 20675f69 6e74203d 2025642c 746d7020 g_int = %d,tmp

0x00002030 3d202564 2e0a0066 756e635f 73747220 = %d...func_str

0x00002040 675f7374 72203d20 25732e0a 00000000 g_str = %s......

0x00002050 6861726d 6f6e7920 6f730000 00000000 harmony os......

0x00002060 6d61696e 20e5bc80 e5a78b20 2d20e585 main ...... - ..

0x00002070 a8e5b180 20675f69 6e74203d 2025642c .... g_int = %d,

0x00002080 20e585a8 e5b18020 675f7374 72203d20 ...... g_str =

0x00002090 25732e0a 00000000 6d61696e 20e7bb93 %s......main ...

0x000020a0 e69d9f20 2d20e585 a8e5b180 20675f69 ... - ...... g_i

0x000020b0 6e74203d 2025642c 20e585a8 e5b18020 nt = %d, ......

0x000020c0 675f7374 72203d20 25732e0a 00 g_str = %s...

另外还有注意printf的变化,从Type = NOTYPE 变成了Type = FUNC,告诉了后续的动态链接这是个函数 57: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@@GLIBC_2.2.5 但是内容依然是Ndx=UND,weharmony也提供不了,内容需要运行时环境提供.并在需要动态链接表中也已经注明了内容清单,运行环境必须提供以下内容才能真正跑起来weharmony. Symbol table '.dynsym' contains 7 entries:

Num: Value Size Type Bind Vis Ndx Name

0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND

1: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab

2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.2.5 (2)

3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)

4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__

5: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable

6: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@GLIBC_2.2.5 (2) 本例在windows环境中一般是跑不起来的.除非提供对应的运行时环境.

百篇博客.往期回顾

在加注过程中,整理出以下文章.内容立足源码,常以生活场景打比方尽可能多的将内核知识点置入某种场景,具有画面感,容易理解记忆.说别人能听得懂的话很重要! 百篇博客绝不是百度教条式的在说一堆诘屈聱牙的概念,那没什么意思.更希望让内核变得栩栩如生,倍感亲切.确实有难度,自不量力,但已经出发,回头已是不可能的了.:P 与代码有bug需不断debug一样,文章和注解内容会存在不少错漏之处,但会反复修正,持续更新,.xx代表修改的次数,精雕细琢,言简意赅,力求打造精品内容.

关于 51 .c .h .o

看系列篇文章会常看到 51 .c .h .o,希望这对大家阅读不会造成影响. 分别对应以下四个站点的首个字符,感谢这些站点一直以来对系列篇的支持和推荐,尤其是 oschina gitee ,很喜欢它的界面风格,简洁大方,让人感觉到开源的伟大!

而巧合的是.c .h .o是C语言的头/源/目标文件,这就很有意思了,冥冥之中似有天数,将这四个宝贝以这种方式融合在一起. 51 .c .h .o , 我要CHO ,嗯嗯,hin 顺口 : )

百万汉字注解.百篇博客分析

关注不迷路.代码即人生

原创不易,欢迎转载,但麻烦请注明出处.

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

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

相关文章

敏捷研发项目,我们该如何度量?

简介&#xff1a;作为项目负责人&#xff0c;我们如何及时获悉当前项目的最新进展和问题&#xff0c;了解项目的整体状况&#xff1f;作为项目管理人员&#xff0c;我们如何跟进和推进项目的正常进行&#xff1f;如何借助云效效能洞察平台 Insight&#xff0c;帮助项目管理者及…

iofsstat:帮你轻松定位 IO 突高,前因后果一目了然 | 龙蜥技术

简介&#xff1a;磁盘被打满到底是真实的业务需求量上来了呢&#xff1f;还是有什么野进程在占用 IO&#xff1f; iofsstat 帮你精准定位。 编者按&#xff1a;sysAK&#xff08;system analyse kit&#xff09;&#xff0c;是龙蜥社区系统运维 SIG 下面的一个开源项目&#x…

补招开发岗需要80天?软件开发人员短缺的几个“真相”

作者 | Jani Bagheri 供稿 | Mendix 许多企业已经意识到对遗留系统进行现代化改造、提高运营效率并通过创新的解决方案吸引客户的重要性&#xff0c;意味着企业需要招聘更多的软件开发人员。技术创新需要专业的软件开发人才与开发工具&#xff0c;没有软件开发人员就不会有新技…

html视频标签不显示,HTML视频标签无法正确显示视频

这里是我的JS&#xff1a;function video() {navigator.device.capture.captureVideo(onSuccess, onFail,{limit: 1,duration: constants.MAX_DURATION_OF_VIDEO});function onSuccess(mediaFiles) {console.log("MEDIA FILE");console.log(mediaFiles);var i, path,…

晋中计算机专业对口大学,山西晋中计算机专业好就业吗?,计算机专业

【山西大众技工学校】将学生的日常管理、学习成绩、操行考核融为一体&#xff0c;结合校园全封闭管理形成一套完整的学生管理办法&#xff0c;做到每个环节都有标准与要求&#xff0c;每个过程都有管理和考核。山西晋中计算机专业好就业吗&#xff1f;另一种称为“编译”&#…

实战 Kubectl 创建 Deployment 部署应用

作者 | 洲的学习笔记来源 | CSDN博客本篇文章主要是实战 Kubectl 创建 Deployment 部署应用。通过本期文章&#xff1a;我们将学习创建在 Kubernetes 集群上运行应用程序的 Deployment 所需的最常见的 Kubectl 命令。用 Kubectl 创建 Deployment当运行 Kubernetes 集群&#xf…

性能提升一倍,云原生网关支持 TLS 硬件加速

简介&#xff1a;业界在优化 HTTPS 的性能上也做了诸多探索&#xff0c;传统的软件优化方案有 Session 复用、OCSP Stapling、False Start、dynamic record size、TLS1.3、HSTS 等, 但软件层面如何优化也无法满足流量日益增长的速度&#xff0c;加上 CPU 摩尔定律已入暮年&…

Linux 中如何检查开放的端口

作者 | 刘光录来源 | TIAP无论你的服务器是用的Linux还是桌面系统&#xff0c;了解系统开放的端口&#xff0c;和正在使用的端口&#xff0c;在各种情况下都会有所帮助。比如&#xff0c;如果你的服务器中正在运行着 Apache或者Nginx&#xff0c;那么其端口应该为80或者443&…

微服务应用实现无损上下线实践

简介&#xff1a;本文是阿里云微服务引擎MSE在应用发布时提供的无损上下线和服务预热能力最佳实践介绍。 本文是阿里云微服务引擎MSE在应用发布时提供的无损上下线和服务预热能力最佳实践介绍。假设应用的架构由Zuul网关以及后端的微服务应用实例&#xff08;Spring Cloud&…

计算机策划知识竞赛有创意的主题,【社团活动】首届创意·科技文化节--第八届计算机趣味知识竞赛决赛...

就21世纪而言&#xff0c;计算机莫过于是至今最成功的创新&#xff0c;作为计算机科学系的学子们担当着社会的前行者&#xff0c;从语言不和的英文代码&#xff0c;到逻辑化的函数循环&#xff0c;甚至有人开玩笑高呼着“c从入门到放弃”。谁又忍心让大家始终学习在枯燥中呢&am…

3月2日,阿里云开源 PolarDB 企业级架构即将发布

简介&#xff1a;2022年3月2日&#xff0c;开源 PolarDB 企业级架构将迎来重磅发布&#xff01;本次发布会将首次公开开源 PolarDB 的总体结构设计和企业级特性&#xff0c;对 PolarDB for PostgreSQL 的存储计算分离架构、HTAP架构、三节点高可用架构进行全面介绍。 2021年&a…

产学研专家共议中国金融机构数字化转型,“守正创新”成主基调

《中国金融机构数字化转型》白皮书同期发布。 7月12日&#xff0c;由华为云与《清华金融评论》联合主办&#xff0c;清华五道口“数字中国”企业家课程项目提供学术支持的《中国金融机构数字化转型》专题研讨会在线上举办&#xff0c;并在央视财经等平台直播。研讨会邀请到多位…

极速生成缩略图,Serverless 支撑赛事转播锁定冬奥亮点

简介&#xff1a;阿里云函数计算&#xff08;FC&#xff09;支撑用户开发赛事视频截图的核心业务代码&#xff0c;实现了弹性高可用免运维的直播视频截图服务&#xff0c;满足用户开发成本低、一键部署的业务需求&#xff0c;比赛期间完美支撑视频转播实时锁定冬奥亮点。 作者…

html拼接日期,html日期加减

//显示某年某月某日function getForecastTime(date) {date new Date(date);var nDate date.getFullYear() "年";nDatedate.getMonth() 1 "月" date.getDate() "日";return nDate;}//日期加减function dateChange(num, date) {debugger;if…

“电信级”运行多年,亚信科技推出核心交易数据库AntDB7.0

亚信科技AntDB数据库为全国24个省份的10亿多用户提供7*24小时实时在线服务&#xff0c;已在通信运营商核心系统持续稳定运行多年。同时&#xff0c;AntDB在金融、交通、能源、公共服务等多个领域商用落地。 数字化浪潮和信创的趋势下&#xff0c;国产数据库市场迎来了快速发展期…

关于质量标准化的思考和实践

简介&#xff1a;最近部门在推质量标准化&#xff0c;通过质量标准化&#xff0c;推动质量内建&#xff0c;从而提高研发部门的交付质量&#xff0c;作者深度参与其中&#xff0c;并在推进过程中总结了一些经验以及思考&#xff0c;在此通过以下定义、共识、实践三个大方向和大…

计算机科学与因果关系,计算机科学与技术

摘要&#xff1a;In order to improve the detection reliability of effective connectivity in brain network, an fMRI (Functional Magnetic Resonance Imaging) analytical approach of effective connectivity is proposed based on the Granger causality (GC) and the …

看懂这5幅图,研发效能分析和改进就容易了

简介&#xff1a;作为 CTO 或企业管理者&#xff0c;我们如何去了解和衡量研发团队的研发效能呢&#xff1f;作为 PMO 和效能负责人&#xff0c;我们该从哪几个维度来回答关于研发效能的问题呢&#xff1f;如何通过效能数据分析&#xff0c;帮助企业管理者透明化研发效能水平和…

关于挂载存储的这个小细节,值得你关注一下

作者 | 江小南来源 | 江小南和他的小伙伴们引言前两天&#xff0c;公司有个同事跑过来问我一件事&#xff1a;我在制作镜像的时候明明把文件已经放到镜像里面去了&#xff0c;为什么kubernetes部署应用的时候文件没有了&#xff1f;听完这话&#xff0c;我看了看Dockerfile是这…

PolarDB 并行查询的前世今生

简介&#xff1a;本文会深入介绍PolarDB MySQL在并行查询这一企业级查询加速特性上做的技术探索、形态演进和相关组件的实现原理&#xff0c;所涉及功能随PolarDB MySQL 8.0.2版本上线。 作者 | 遥凌 来源 | 阿里技术公众号 本文会深入介绍PolarDB MySQL在并行查询这一企业级查…