鸿蒙关键技术研究,鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程 | 百篇博客分析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…

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;比赛期间完美支撑视频转播实时锁定冬奥亮点。 作者…

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

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

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

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

看懂这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在并行查询这一企业级查…

上海音乐学院计算机基础,上海音乐学院

2018年(第11届)中国大学生计算机设计大赛计算机音乐创作类决赛于8月26日—30日在浙江音乐学院举行&#xff0c;上海音乐学院音乐工程系大二学生蔡岳均作品《埙钹革》、大四学生赵子仪作品《踏风》(指导老师均为刘灏副教授)在决赛中分别获得计算机音乐创作专业组二、三等奖。中国…

从技术到管理,程序员如何实现螺旋上升?

作者 | 李昊 出品 | 《新程序员》编辑部从开发者到技术管理者应该如何提升能力&#xff1f;在李昊看来&#xff0c;开发和管理之间的“鸿沟”并非很难跨越&#xff0c;他将从“深入理解基层技术管理岗位角色、纠偏对技术管理者的认识误区&#xff0c;以及通过日常执行层真正…

80%的软件环境管理问题,根因都在这里

简介&#xff1a;80%的软件环境管理问题&#xff0c;根因都在这里&#xff0c;云效云原生应用管理平台AppStack正是基于OAM的应用交付平台&#xff0c;企业在云效AppStack&#xff0c;可以通过应用编排、占位符、变量等声明式定义&#xff0c;实现一套编排多环境差异化部署&…