【嵌入式移植】5、U-Boot源码分析2—make nanopi_neo2_defconfig

U-Boot源码分析2—make nanopi_neo2_defconfig

  • 1 概述
  • 2 nanopi_neo2_defconfig
  • 3 编译过程分析
    • 3.1 编译目标
    • 3.2 scripts_basic
    • 3.2.1 prefix src定义
    • 3.2.2 PHONY
    • 3.2.3 __build
    • 3.2.4 fixdep
    • 3.3 obj=scripts/kconfig

1 概述

上一章中,对Makefile相关源码进行了初步分析,这里结合编译过程具体分析其执行过程。

2 nanopi_neo2_defconfig

nanopi_neo2_defconfig文件位于./config/目录下,内容如下

CONFIG_ARM=y
CONFIG_ARCH_SUNXI=y
CONFIG_MACH_SUN50I_H5=y
CONFIG_DRAM_CLK=672
CONFIG_DRAM_ZQ=3881977
CONFIG_DEFAULT_DEVICE_TREE="sun50i-h5-nanopi-neo2"
# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
CONFIG_SPL=y
# CONFIG_CMD_FLASH is not set
# CONFIG_CMD_FPGA is not set
# CONFIG_SPL_DOS_PARTITION is not set
# CONFIG_SPL_ISO_PARTITION is not set
# CONFIG_SPL_EFI_PARTITION is not set
CONFIG_SUN8I_EMAC=y
CONFIG_USB_EHCI_HCD=y
CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y

3 编译过程分析

首先通过make nanopi_neo2_defconfig -n命令,-n表示仅输出执行过程中的命令序列,而不真正执行

make -f ./scripts/Makefile.build obj=scripts/basic
set -e;  echo '  HOSTCC  scripts/basic/fixdep'; cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer      -o scripts/basic/fixdep scripts/basic/fixdep.c  ; scripts/basic/fixdep scripts/basic/.fixdep.d scripts/basic/fixdep 'cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer      -o scripts/basic/fixdep scripts/basic/fixdep.c  ' > scripts/basic/.fixdep.tmp; rm -f scripts/basic/.fixdep.d; mv -f scripts/basic/.fixdep.tmp scripts/basic/.fixdep.cmd
:
rm -f .tmp_quiet_recordmcount
make -f ./scripts/Makefile.build obj=scripts/kconfig nanopi_neo2_defconfig
set -e;  echo '  HOSTCC  scripts/kconfig/conf.o'; cc -Wp,-MD,scripts/kconfig/.conf.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DCURSES_LOC="<ncurses.h>" -DNCURSES_WIDECHAR=1 -DLOCALE   -c -o scripts/kconfig/conf.o scripts/kconfig/conf.c; scripts/basic/fixdep scripts/kconfig/.conf.o.d scripts/kconfig/conf.o 'cc -Wp,-MD,scripts/kconfig/.conf.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DCURSES_LOC="<ncurses.h>" -DNCURSES_WIDECHAR=1 -DLOCALE   -c -o scripts/kconfig/conf.o scripts/kconfig/conf.c' > scripts/kconfig/.conf.o.tmp; rm -f scripts/kconfig/.conf.o.d; mv -f scripts/kconfig/.conf.o.tmp scripts/kconfig/.conf.o.cmd
echo '  SHIPPED scripts/kconfig/zconf.tab.c'; cat scripts/kconfig/zconf.tab.c_shipped > scripts/kconfig/zconf.tab.c
echo '  SHIPPED scripts/kconfig/zconf.lex.c'; cat scripts/kconfig/zconf.lex.c_shipped > scripts/kconfig/zconf.lex.c
echo '  SHIPPED scripts/kconfig/zconf.hash.c'; cat scripts/kconfig/zconf.hash.c_shipped > scripts/kconfig/zconf.hash.c
set -e;  echo '  HOSTCC  scripts/kconfig/zconf.tab.o'; cc -Wp,-MD,scripts/kconfig/.zconf.tab.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DCURSES_LOC="<ncurses.h>" -DNCURSES_WIDECHAR=1 -DLOCALE  -Iscripts/kconfig -c -o scripts/kconfig/zconf.tab.o scripts/kconfig/zconf.tab.c; scripts/basic/fixdep scripts/kconfig/.zconf.tab.o.d scripts/kconfig/zconf.tab.o 'cc -Wp,-MD,scripts/kconfig/.zconf.tab.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DCURSES_LOC="<ncurses.h>" -DNCURSES_WIDECHAR=1 -DLOCALE  -Iscripts/kconfig -c -o scripts/kconfig/zconf.tab.o scripts/kconfig/zconf.tab.c' > scripts/kconfig/.zconf.tab.o.tmp; rm -f scripts/kconfig/.zconf.tab.o.d; mv -f scripts/kconfig/.zconf.tab.o.tmp scripts/kconfig/.zconf.tab.o.cmd
set -e;  echo '  HOSTLD  scripts/kconfig/conf'; cc  -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o  ; printf '%s\n' 'cmd_scripts/kconfig/conf := cc  -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o  ' > scripts/kconfig/.conf.cmd
scripts/kconfig/conf  --defconfig=arch/../configs/nanopi_neo2_defconfig Kconfig

也可以通过make nanopi_neo2_defconfig V=1命令查看编译过程中的详细输出

make -f ./scripts/Makefile.build obj=scripts/basic
  cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer      -o scripts/basic/fixdep scripts/basic/fixdep.c  
rm -f .tmp_quiet_recordmcount
make -f ./scripts/Makefile.build obj=scripts/kconfig nanopi_neo2_defconfig
  cc -Wp,-MD,scripts/kconfig/.conf.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DCURSES_LOC="<ncurses.h>" -DNCURSES_WIDECHAR=1 -DLOCALE   -c -o scripts/kconfig/conf.o scripts/kconfig/conf.c
  cat scripts/kconfig/zconf.tab.c_shipped > scripts/kconfig/zconf.tab.c
  cat scripts/kconfig/zconf.lex.c_shipped > scripts/kconfig/zconf.lex.c
  cat scripts/kconfig/zconf.hash.c_shipped > scripts/kconfig/zconf.hash.c
  cc -Wp,-MD,scripts/kconfig/.zconf.tab.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DCURSES_LOC="<ncurses.h>" -DNCURSES_WIDECHAR=1 -DLOCALE  -Iscripts/kconfig -c -o scripts/kconfig/zconf.tab.o scripts/kconfig/zconf.tab.c
  cc  -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o  
scripts/kconfig/conf  --defconfig=arch/../configs/nanopi_neo2_defconfig Kconfig
#
# configuration written to .config
#

下面根据上述内容,对照Makefile源码进行分析

3.1 编译目标

执行make nanopi_neo2_defconfig V=1时,编译目标为nanopi_neo2_defconfig ,即MAKECMDGOALS = nanopi_neo2_defconfig

在Makefile源码中搜索:defconfig:无相关项,搜索config:有两处匹配
请添加图片描述
对应Makefile中源码为
请添加图片描述
根据上一章3.16节的分析,当执行make xxx_defconfig时,此时config-targets = 1, mixed-targets = 0, dot-config = 1,满足第467行条件 ,因此分支有效。

根据编译目标MAKECMDGOALS = nanopi_neo2_defconfig,与第478行匹配(其中%为通配符),即nanopi_neo2_defconfig依赖项为scripts_basic outputmakefile FORCE,其中FORCE在第1702行定义
请添加图片描述
FORCE的依赖项与执行语句均为空,即为没有命令或者依赖的规则,这样的规则每次在执行时,目标总会被认为是最新的(更新过的),因此当它被作为其它规则的依赖时,由于FORCE总是被认为是更新过的,所以在FORCE所在的规则中定义的命令总会被执行

也就是说,由于FORCE是没有命令或者依赖的规则,而nanopi_neo2_defconfig依赖项包含FORCE,每次都会执行nanopi_neo2_defconfig规则的命令

将Makefile源码中的变量替换为其值,得到nanopi_neo2_defconfig规则的全貌(其中$@为Makefile的自动化变量,表示目前规则中所有的目标的集合)

nanopi_neo2_defconfig: scripts_basic outputmakefile FORCE
	make -f ./scripts/Makefile.build obj=scripts/kconfig nanopi_neo2_defconfig

对于依赖项outputmakefile,根据上一章分析可知为空,因此

nanopi_neo2_defconfig: scripts_basic FORCE
	make -f ./scripts/Makefile.build obj=scripts/kconfig nanopi_neo2_defconfig

3.2 scripts_basic

搜索Makefile中scripts_basic规则,仅有一处
请添加图片描述
scripts_basic规则没有依赖项,其命令为(-f为指定其它文件为描述文件)

scripts_basic:
	make -f ./scripts/Makefile.build obj=scripts/basic
	rm -f .tmp_quiet_recordmcount

对应命令序列的第1行和第3行,也即编译过程中输出信息的第1行和第3行

后续对./scripts/Makefile.build文件进行分析

3.2.1 prefix src定义

第9行~17行,定义了2个变量,这里obj在执行命令时输入,为scripts/basic
请添加图片描述
最终结果为

prefix = .
src = scripts/basic

3.2.2 PHONY

第19行~54行,定义PHONY等变量,并包含一些文件
请添加图片描述
PHONY为第一个出现的规则,也为默认规则,实际上的默认目标为其依赖项__build,在这里__build暂时为空

第57行~59行,定义了kbuild-file并包含。
首先是kbuild-dir的赋值,这里if语句不满足条件,因此kbuild-dir的值为后半部分$(srctree)/$(src),即kbuild-dir = ./scripts/basic
./scripts/basic目录下无Kbuild文件,因此58行的if语句不满足条件,kbuild-file的值为后半部分$(kbuild-dir)/Makefile,即kbuild-file = ./scripts/basic/Makefile
第59行包含此Makefile

3.2.3 __build

查找__build,在**第116行119行**定义了依赖项和规则,116行118行为依赖项,119行为规则
请添加图片描述
这里KBUILD_BUILTINKBUILD_MODULES在顶层Makefile中定义:KBUILD_BUILTIN :=1 KBUILD_MODULES :=,因此__build规则为

__build: $(builtin-target) $(lib-target) $(extra-y) $(subdir-ym) $(always)
	@:

builtin-target在第108行~110行定义
请添加图片描述
其中obj-yobj-mobj-subdir-mextra-ysubdir-ym均为空,则lib-targetbuiltin-target也为空

因此__build规则为

__build: $(always)
	@:

always./scripts/basic/Makefile(根据前面的分析,在Makefile.build的第59行使用include关键字调用量,因此在第59行会先执行此Makefile文件中的内容)中赋值为always := $(hostprogs-y),而hostprogs-y := fixdep,并增加obj的值作为前缀请添加图片描述
always = scripts/basic/fixdep,因此__build规则最终为

__build: scripts/basic/fixdep
	@:

因此__build规则也即scripts_basic规则最终结果为生成fixdep,根据注释可知,fixdep是用于编译其它的宿主机程序

3.2.4 fixdep

使用grep命令grep -rnw fixdep搜索fixdep关键字
请添加图片描述
可以看到在scripts/Makefile.build文件中存在相应规则
请添加图片描述
可知fixdep通过调用make-cmd函数,输入参数为cc_o_c编译而来;搜索make-cmd关键字,在scripts/Kbuild.include中有定义
请添加图片描述
请添加图片描述
可知在make-cmd中,输入参数将组合成cmd_$(1),即cmd_cc_o_c;在scripts/路径下搜索cmd_cc_o_c
请添加图片描述
请添加图片描述
根据前述分析可知未定义CONFIG_MODVERSIONS,因此cmd_cc_o_c命令如下,其中@$为自动化变量,表示目标集合,@<表示所有的依赖集合

cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<

结合编译输出

make -f ./scripts/Makefile.build obj=scripts/basic
  cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer      -o scripts/basic/fixdep scripts/basic/fixdep.c  

即使用CC命令,将scripts/basic/fixdep.c编译为scripts/basic/fixdep

另:(通过gcc -v --help可以查看所有 <options >用法)

  • -Wp, <option>将逗号分隔的 <options >传递给预处理器(preprocessor);-MD,scripts/basic/.fixdep.d生成文件关联信息,包含目标文件所依赖的所有源代码,将输出导入到.d文件里面;
  • -Wall生成所有警告信息;
  • -Wstrict-prototypesWarn about unprototyped function declarations;
  • -O0不做任何优化,这是默认的编译选项;
  • -O1优化会消耗少多的编译时间,它主要对代码的分支,常量以及表达式等进行优化;
  • -O2会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间;
  • -O3在 O2 的基础上进行更多的优化,例如使用伪寄存器网络,普通函数的内联,以及针对循环的更多优化;
  • -Os主要是对代码大小的优化,我们基本不用做更多的关心。
`-O0`不做任何优化,这是默认的编译选项;
`-Os``-O1`对程序做部分编译优化,对于大函数,优化编译占用稍微多的时间和相当大的内存。使用本项优化,编译器会尝试减小生成代码的尺寸,以及缩短执行时间,但并不执行需要占用大量编译时间的优化;
`-O2`是比 O1 更高级的选项,进行更多的优化,Gcc 将执行几乎所有的不包含时间和空间折中的优化。当设置 O2 选项时,编译器并不进行循环打开 loop unrolling 以及函数内联。与 O1 比较而言,O2 优化增加了编译时间的基础上,提高了生成代码的执行效率;
`-O3`比 O2 更进一步的进行优化,打开`-finline-functions``-fweb``-frename-registers``-funswitch-loops`优化选项,即使用伪寄存器网络,普通函数的内联,以及针对循环的更多优化

任何级别的优化都将带来代码结构的改变。例如:对分支的合并和消除,对公用子表达式的消除,对循环内 load/store 操作的替换和更改等,都将会使目标代码的执行顺序变得面目全非,导致调试信息严重不足;在 O2 优化后,编译器会对影响内存操作的执行顺序

3.3 obj=scripts/kconfig

上述分析已经执行make nanopi_neo2_defconfig所需依赖目标scripts_basic进行了分析,结果为生成fixdep工具

nanopi_neo2_defconfig: scripts_basic FORCE
	make -f ./scripts/Makefile.build obj=scripts/kconfig nanopi_neo2_defconfig

现在来看后续的命令语句

	make -f ./scripts/Makefile.build obj=scripts/kconfig nanopi_neo2_defconfig

根据3.2.1节和3.2.2节中对./scripts/Makefile.build文件的分析,各变量取值为

obj         = scripts/kconfig
prefix      = . 
src         = scripts/kconfig
kbuild-dir  = scripts/kconfig
kbuild-file = scripts/kconfig/Makefile

第59行通过include $(kbuild-file)语句调用scripts/kconfig/Makefile,目标为nanopi_neo2_defconfig,因此在文件中查找关键字defconfig
请添加图片描述
可知在第120行存在目标规则匹配
请添加图片描述
根据文件内变量取值,此规则翻译如下,其中$<表示依赖项的挨个值,这里只有一个,即scripts/kconfig/conf

nanopi_neo2_defconfig: scripts/kconfig/conf
	scripts/kconfig/conf --defconfig=arch/../configs/nanopi_neo2_defconfig Kconfig

结合编译过程的输出,可知通过如下过程,编译出所需的conf工具
conf工具主要由conf.czconf.tab.czconf.lex.czconf.hash.c几个文件编译而来;其中zconf.tab.c-Bison解析器、zconf.lex.c-flex解析器、zconf.hash.c-哈希解析器?,从名字可知为不同解析器的函数源码;main函数在conf.c中)

make -f ./scripts/Makefile.build obj=scripts/kconfig nanopi_neo2_defconfig
  cc -Wp,-MD,scripts/kconfig/.conf.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DCURSES_LOC="<ncurses.h>" -DNCURSES_WIDECHAR=1 -DLOCALE   -c -o scripts/kconfig/conf.o scripts/kconfig/conf.c
  cat scripts/kconfig/zconf.tab.c_shipped > scripts/kconfig/zconf.tab.c
  cat scripts/kconfig/zconf.lex.c_shipped > scripts/kconfig/zconf.lex.c
  cat scripts/kconfig/zconf.hash.c_shipped > scripts/kconfig/zconf.hash.c
  cc -Wp,-MD,scripts/kconfig/.zconf.tab.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer    -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DCURSES_LOC="<ncurses.h>" -DNCURSES_WIDECHAR=1 -DLOCALE  -Iscripts/kconfig -c -o scripts/kconfig/zconf.tab.o scripts/kconfig/zconf.tab.c
  cc  -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o  

然后使用此conf工具,执行

scripts/kconfig/conf  --defconfig=arch/../configs/nanopi_neo2_defconfig Kconfig

根据conf.cmain函数,通过输入参数获取配置文件路径,然后调用conf_read函数读取文件内容,再调用conf_write,将内容写入默认的.config文件中

make nanopi_neo2_defconfig命令将生成fixdepconf两个工具,

然后根据默认的配置文件nanopi_neo2_defconfig生成U-Boot根目录下的.config文件

完结撒花✿✿ヽ(°▽°)ノ✿

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue-cli脚手架将组件挂载到全局

局部引用组件,直接将组件引入,注册组件即可,这篇文章讲组件挂载到全局的方法! main.js文件 将组件引入main.js文件中,并且注册 使用方法 在需要的地方使用组件即可 BaoGit.Vue代码 <template><div><a href"https://gitee.com/ah-ah-bao"><img …

【机器学习】正则化

正则化是防止模型过拟合的方法&#xff0c;它通过对模型的权重进行约束来控制模型的复杂度。 正则化在损失函数中引入模型复杂度指标&#xff0c;利用给W加权值&#xff0c;弱化了数据的噪声&#xff0c;一般不正则化b。 loss(y^,y)&#xff1a;模型中所有参数的损失函数&…

PID校正

一、Introduction to PID Control PID控制是一种应用非常广泛的控制算法。小到控制一个元件的温度&#xff0c;大到控制无人机的飞行姿态和飞行速度等等&#xff0c;都可以使用PID控制。PID(proportion integration differentiation)其实就是指比例&#xff0c;积分&#xff0…

Python tkinter (10) ——Combobox控件

本文主要是Python tkinter Combobox下拉控件介绍及使用示例。 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinte…

Springboot入门教程详解

Springboot入门教程详解 博客主页&#xff1a;划水的阿瞒的博客主页 欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ 系列专栏&#xff1a;Springboot入门教程详解首发时间&#xff1a;&#x1f39e;2024年1月29日&#x1f3a0; 如果觉得博主的文章还不错的话&#xff0c…

【DeepLearning-10】yolo.py文件关键代码parse_model(d, ch)函数

这段代码功能是根据提供的配置字典&#xff08;d&#xff09;和输入通道列表&#xff08;ch&#xff09;来解析并构建一个YOLOv5模型。函数的核心工作是遍历模型的每一层&#xff0c;并根据配置创建相应的神经网络层。 我们可以在函数中为新增模块配置构造参数设置。 函数中 f…

MyBatis 如何整合 Druid 连接池?

Mybatis 如何整合 Druid 数据连接池呢&#xff1f;首先打开创建的 Maven 工程&#xff0c;找到 pom.xml 文件&#xff0c;添加 Druid 依赖。 <!--druid连接池--> <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId&…

MySQL-窗口函数 简单易懂

窗口函数 考查知识点&#xff1a; • 如何用窗口函数解决排名问题、Top N问题、前百分之N问题、累计问题、每组内比较问题、连续问题。 什么是窗口函数 窗口函数也叫作OLAP&#xff08;Online Analytical Processing&#xff0c;联机分析处理&#xff09;函数&#xff0c;可…

HCIP复习课(mpls实验)

1、IP配置&#xff1a; R1&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a; R5&#xff1a; R6&#xff1a; R7&#xff1a; R8&#xff1a; 2、rip&#xff0c;ospf配置&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a; R5&#xff1a; R6&#xff1a…

MySQL知识点总结(一)——一条SQL的执行过程、索引底层数据结构、一级索引和二级索引、索引失效、索引覆盖、索引下推

MySQL知识点总结&#xff08;一&#xff09;——一条SQL的执行过程、索引底层数据结构、一级索引和二级索引、索引失效、索引覆盖、索引下推 一条SQL的执行过程索引底层数据结构为什么不使用二叉树&#xff1f;为什么不使用红黑树?为什么不使用hash表&#xff1f;为什么不使用…

屏蔽系统热键/关机/注入 Winlogon(中)

1 前言 在新的内容开始前&#xff0c;我想整理一些旧文&#xff0c;这一框题展示了在以前的系统上实现在用户关机/重启/注销时弹出对话框的功能。为什么需要先讲这个部分&#xff1f;因为这一部分需要拦截的函数是截至 Win 8 系统&#xff0c;微软所采用的关机/重启等途径上的…

海外推广是企业必须面临和重视的问

随着中国半导体国际化进程的加快&#xff0c;越来越多的企业开始走向海外市场&#xff0c;对于企业出海来说&#xff0c;想要最大限度的提高曝光度&#xff0c;提升企业核心竞争力&#xff0c;做好海外推广是企业必须面临和重视的问题。萨科微(www.slkoric.com)半导体积极布局海…

海思SD3403,SS928/926,hi3519dv500,hi3516dv500移植yolov7,yolov8(12)

上一篇用MindStudio转换完yolov8的om模型,准备在板卡里进行推理验证了。 我这里用的是我们自己的Tofu5m模块,40mm40mm含外壳尺寸。可以输入网络RTSP视频流直接进行推理。这次用hi3516dv500版本的Tofu5m模块。 SDK里的demo部分是H.264视频输入,为了保持一致来验证,先改成H.…

金融行业现场故障处理实录

KL银行现场服务记录—HA故障 服务时间 2019年9月10日星期二 14&#xff1a;40 到2019年9月11日星期三 0&#xff1a;30 服务内容 排查redhat RHEL 6.4 一个节点cman启动故障。 &#xff08;1&#xff09;、查看系统日志&#xff1b; &#xff08;2&#xff09;、查看ha日志…

工业PoE交换机的应用场景有哪些?

工业PoE&#xff08;Power over Ethernet&#xff09;交换机是一种特殊设计用于工业环境的网络设备&#xff0c;它不仅具备普通交换机的网络连接功能&#xff0c;还能提供电源供给支持PoE设备。以下是工业PoE交换机的一些常见应用场景&#xff1a; 监控系统&#xff1a; 工业…

勒索病毒如何预防?用什么工具

勒索病毒进入服务器加密文件&#xff0c;让文件变得不能访问&#xff0c;我们经常可以见到这样的新闻&#xff0c;被勒索后没什么好的办法&#xff0c;只能交钱。 碰到言而有信的黑客还好。有时候交钱了&#xff0c;坏人也未必给你解密文件。 有什么工具可以预防这样的勒索病…

Windows Qt C++ VTK 绘制三维曲线

Qt 自带数据可视化从文档上看&#xff0c;只能实现三维曲面。 QwtPlot3D在Qt6.6.0上没编译通过。 QCustomPlot 只能搞二维。 VTK~搞起。抄官网demo。 后续需求&#xff1a; 1、对数轴 2、Y轴逆序 3、Z轴值给色带&#xff0c;类似等高线图的色带 期待各位大佬多多指导。…

免费开源的微信小程序源码、小游戏源码精选70套!

微信小程序已经成为我们日常的一部分了&#xff0c;也基本是每个程序员都会涉及的内容&#xff0c;今天给大家分享从网络收集的70个小程序源码。其中这些源码包含&#xff1a;小游戏到商城小程序&#xff0c;再到实用的工具小程序&#xff0c;以及那些令人惊叹的防各大站点的小…

【Linux】动态库和静态库——动态库和静态库的打包和使用、gcc编译、拷贝到系统默认的路径、建立软连接

文章目录 动态库和静态库1.静态库和动态库的介绍2.静态库的打包和使用2.1生成静态库2.2使用静态库的三种方式2.2.1gcc编译2.2.2拷贝到系统默认的路径2.2.3建立软连接 3.动态库的打包和使用3.1生成动态库3.2使用动态库3.3解决加载不到动态库的方法 动态库和静态库 1.静态库和动…

1月全志芯片开源项目分享合辑

1、柚子爱AI相机&#xff08;YuzuAI-YuzuMaix-AIoT-V831&#xff09; 本项目于去年4月首次发布&#xff0c;是基于V831的AI相机开源项目&#xff0c;经过几个版本的迭代&#xff0c;最终运用了叠层的设计来实现AI摄像头掌控板的奇葩组合。 开发板主控是全志V831&#xff0c;采…