【嵌入式移植】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/basiccc -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_defconfigcc -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.ccat scripts/kconfig/zconf.tab.c_shipped > scripts/kconfig/zconf.tab.ccat scripts/kconfig/zconf.lex.c_shipped > scripts/kconfig/zconf.lex.ccat scripts/kconfig/zconf.hash.c_shipped > scripts/kconfig/zconf.hash.ccc -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.ccc  -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 FORCEmake -f ./scripts/Makefile.build obj=scripts/kconfig nanopi_neo2_defconfig

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

nanopi_neo2_defconfig: scripts_basic FORCEmake -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/basicrm -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/basiccc -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 FORCEmake -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/confscripts/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_defconfigcc -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.ccat scripts/kconfig/zconf.tab.c_shipped > scripts/kconfig/zconf.tab.ccat scripts/kconfig/zconf.lex.c_shipped > scripts/kconfig/zconf.lex.ccat scripts/kconfig/zconf.hash.c_shipped > scripts/kconfig/zconf.hash.ccc -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.ccc  -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文件

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

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

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

相关文章

从零开始:CentOS系统下搭建DNS服务器的详细教程

前言 如果你希望在CentOS系统上建立自己的DNS服务器,那么这篇文章绝对是你不容错过的宝藏指南。我们提供了详尽的步骤和实用技巧,让你能够轻松完成搭建过程。从安装必要的软件到配置区域文件,我们都将一一为你呈现。无论你的身份是运维人员,还是程序员,抑或是对网络基础设…

服务端开发小记02——Maven

这里写目录标题 Maven简介Maven在Linux下的安装Maven常用命令 Maven简介 Apache Maven Project是一个apache的开源项目&#xff0c;是用于构建和管理Java项目的工具包。 用Maven可以方便地创建项目&#xff0c;基于archetype可以创建多种类型的java项目&#xff1b;Maven仓库…

5G_RACH(一)

什么是RACH RACH 代表 Random Access Channel。这是开机时UE发给eNB的第一条消息。 为什么选择RACH &#xff1f;&#xff08;RACH 的功能是什么&#xff1f; 当你第一次听到RACH或RACH Process这个词时&#xff0c;你脑海中浮现的第一个问题是“为什么是RACH&#xff1f;”…

05 Redis之Benchmark+简单动态字符串SDS+集合的底层实现

3.8 Benchmark Redis安装完毕后会自动安装一个redis-benchmark测试工具&#xff0c;其是一个压力测试工具&#xff0c;用于测试 Redis 的性能。 src目录下可找到该工具 通过 redis-benchmark –help 命令可以查看到其用法 3.8.1 测试1 3.9 简单动态字符串SDS 无论是 Redis …

网络通信实现

【 一 】网络通信实现 【 1 】实现网络通信的四要素 本机的ip地址 子网掩码 网关的IP地址 DNS的IP地址( 域名系统) DNS服务器是指提供域名解析服务的服务器。它负责将域名转换为相应的IP地址&#xff0c;以便计算机可以通过IP地址与其他设备进行通信。 通过使用DNS服务器…

【C语言】linux内核ipoib模块 - ipoib_netdev_ops_pf结构

一、ipoib_netdev_ops_pf结构 static const struct net_device_ops ipoib_netdev_ops_pf {.ndo_init ipoib_ndo_init,.ndo_uninit ipoib_ndo_uninit,.ndo_open ipoib_open,.ndo_stop ipoib_stop,.ndo_change_mtu ipoib_change_mtu,.ndo_…

java servlet勤工助学家教管系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java servlet 勤工助学家教管系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myecli…

绝地求生:【PC】开发者日志:竞技比赛地图轮换

各位玩家大家好&#xff0c;欢迎收看闲游盒本期开发者日志。 今天闲游盒想和大家分享一下2024年竞技比赛地图轮换的几项主要改动。 从第28赛季第1轮更新&#xff08;2月&#xff09;开始&#xff0c;竞技比赛的地图阵容中将包含所有8x8尺寸的地图&#xff0c;在电竞赛事中出场…

SpringBoot-yml文件的配置与读取

配置 值前边必须要有空格&#xff0c;作为分隔符 使用空格作为缩进表示层级关系&#xff0c;相同的层级左侧对齐 获取 使用Value(”${键名}”) 使用ConfigurationProperties(prefix "前缀") 1.前缀要与yml配置文件中的前缀一致 2.实体类的字段名与配置文件中的键名一…

【微服务】springboot集成ELK使用详解

目录 一、前言 二、为什么需要ELK 三、ELK介绍 3.1 什么是elk 3.2 elk工作原理 四、ELK环境搭建 4.1 搭建es环境 4.1.1 获取es镜像 4.1.2 启动es容器 2.1.3 配置es参数 2.1.4 重启es容器并访问 4.2 搭建kibana 4.2.1 拉取kibana镜像 4.2.2 启动kibana容器 4.2.3 …

GitLab16.8配置webhooks、Jenkins2.4配置GitLab插件实现持续集成、配置宝塔面板实现持续部署

看本篇文章的前提是已经部署完GItlab和Jenkins服务器&#xff0c;已经可以手动构建成功&#xff0c;并且经过了很多次实践&#xff0c;对这两款软件基本熟悉。 建议大家按以下顺序看 前端自动化&#xff08;其一&#xff09;部署gitlab https://blog.csdn.net/weixin_45062076…

【Redis】Redis集群方案应该怎么做 都有哪些方案

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Redis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 &#xff08;1&#xff09;twemproxy &#xff08;2&#xff09;codis &#xff08;3&#xff09;redis cluster3.0自带的集群 …

爬虫基础-前端基础

Html是骨骼、css是皮肤、js是肌肉&#xff0c;三者之间的关系可以简单理解为m(html)-v(css)-c(js) 浏览器的加载过程 构建dom树 子资源加载-加载外部的css、图片、js等外部资源 样式渲染-css执行 DOM树 ajax、json、xml AJAX 是一种在无需重新加载整个网页的情况下&#xf…

iOS_Xcode_LLDB调试常用命令

文章目录 结构常用命令&#xff1a;1、流程控制&#xff1a;2、常用命令3、进程信息&#xff1a;4、寄存器&#xff1a;register5、镜像&#xff1a;image6、内存&#xff1a;memory7、符号断点&#xff1a;breakpoint8、内存断点&#xff1a;watchpoint9、Tips&#xff1a; 结…

MySQL 学习记录

基本常识 row-size-limitsblob&#xff1a; BLOB and TEXT columns cannot have DEFAULT values.Instances of BLOB or TEXT columns in the result of a query that is processed using a temporary table causes the server to use a table on disk rather than in memory b…

【vue】图片加载骨架

一、前言 在网速较低或者网站的服务器宽带只有几MB的情况下&#xff0c;网页中的图片加载时&#xff0c;要么空白&#xff0c;要么像打印机一样一行一行地“扫描”出来&#xff0c;为了提升用户体验&#xff0c;可以给图片标签外加一层骨架。 无骨架 有骨架 二、详细设计 每张…

MySQL之索引分类,语法以及SQL性能分析(慢日志,profile,explain)

索引分类 分类含义特定关键字主键索引针对于表中主键创建的索引默认自动创建&#xff0c;只能有一个PRIMARY唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE常规索引快速定位特定数据可以有多个全文索引全文索引查找的文本中的关键字&#xff0c;而不是比较索引中的…

如何在 VM 虚拟机中安装 Deft(数字证据及取证工具箱) 操作系统保姆级教程(附链接)

一、VMware Workstation 虚拟机 先得安装 VM 虚拟机&#xff0c;没有的可以参考这篇文章安装 VM 虚拟机 如何在 VM 虚拟机中安装 Win10 操作系统保姆级教程&#xff08;附链接&#xff09;https://eclecticism.blog.csdn.net/article/details/135713915 二、Deft 镜像 下载…

【缓存周总结】Redis缓存的使用以及数据安全的处理

前言 Redis非关系型数据库已经是很常见的工具了&#xff0c;项目中用到的也很多&#xff0c;这篇文章系统的分析下使用过程中可能会遇到的问题 一、缓存 缓存是数据交换的缓冲区&#xff0c;是存贮数据的临时地方&#xff0c;一般读写性能较高。 我们项目中引用的Redis目的就是…

【前端web入门第二天】02 表单-input标签-单选框-多选框

表单 文章目录: 1.input标签基本使用 1.1 input标签占位文本1.2 单选框 radio 1.3 多选框 checkbox 作用:收集用户信息。 使用场景: 登录页面注册页面搜索区域 1.input标签基本使用 input标签type属性值不同&#xff0c;则功能不同。 <input type"..."&g…