u-boot(三) - 编译

一,u-boot编译过程总结

编译时的Makefile log:

//链接得到ELF格式的u-boot
arm-buildroot-linux-gnueabihf-ld.bfd   -pie  --gc-sections -Bstatic -Ttext 0x87800000 -o u-boot -T u-boot.lds arch/arm/cpu/armv7/start.o
--start-group  arch/arm/cpu/built-in.o  arch/arm/cpu/armv7/built-in.o  arch/arm/imx-common/built-in.o  arch/arm/lib/built-in.o  board/freescale/common/built-in.o  board/freescale/mx6ullevk/built-in.o  cmd/built-in.o  
common/built-in.o  disk/built-in.o  drivers/built-in.o  drivers/dma/built-in.o  drivers/gpio/built-in.o  drivers/i2c/built-in.o  drivers/mmc/built-in.o  drivers/mtd/built-in.o  drivers/mtd/onenand/built-in.o  drivers/mtd/spi/built-in.o  
drivers/net/built-in.o  drivers/net/phy/built-in.o  drivers/pci/built-in.o  drivers/power/built-in.o  drivers/power/battery/built-in.o  drivers/power/domain/built-in.o  drivers/power/fuel_gauge/built-in.o  drivers/power/mfd/built-in.o  
drivers/power/pmic/built-in.o  drivers/power/regulator/built-in.o  drivers/serial/built-in.o  drivers/spi/built-in.o  drivers/usb/cdns3/built-in.o  drivers/usb/common/built-in.o  drivers/usb/dwc3/built-in.o  drivers/usb/emul/built-in.o  
drivers/usb/eth/built-in.o  drivers/usb/gadget/built-in.o  drivers/usb/gadget/udc/built-in.o  drivers/usb/host/built-in.o  drivers/usb/musb-new/built-in.o  drivers/usb/musb/built-in.o  drivers/usb/phy/built-in.o  drivers/usb/ulpi/built-in.o  
fs/built-in.o  lib/built-in.o  net/built-in.o  test/built-in.o  test/dm/built-in.o --end-group arch/arm/lib/eabi_compat.o  arch/arm/lib/lib.a -Map u-boot.map


//无设备树的u-boot-nodtb.bin
arm-buildroot-linux-gnueabihf-objcopy --gap-fill=0xff  -j .text -j .secure_text -j .secure_data -j .rodata -j .hash -j .data -j .got -j .got.plt -j .u_boot_list -j .rel.dyn -j .efi_runtime -j .efi_runtime_rel -O binary  u-boot u-boot-nodtb.bin


//编译设备树
make -f ./scripts/Makefile.build obj=dts dtbs
make -f ./scripts/Makefile.build obj=arch/arm/dts dtbs


test -e arch/arm/dts/imx6ull-14x14-evk.dtb || (                        \
echo >&2;                            \
echo >&2 "Device Tree Source is not correctly specified.";    \
echo >&2 "Please define 'CONFIG_DEFAULT_DEVICE_TREE'";        \
echo >&2 "or build with 'DEVICE_TREE=<device_tree>' argument";    \
echo >&2;                            \
/bin/false)


//最终的设备树
  cat arch/arm/dts/imx6ull-14x14-evk.dtb > dts/dt.dtb


//含有设备树的 bin
  cat u-boot-nodtb.bin dts/dt.dtb > u-boot-dtb.bin
make -f ./scripts/Makefile.build obj=arch/arm/imx-common u-boot-dtb.imx
mkdir -p board/freescale/mx6ullevk/
  arm-buildroot-linux-gnueabihf-gcc -E -Wp,-MD,board/freescale/mx6ullevk/.imximage.cfg.cfgtmp.d  -nostdinc -isystem /home/zhuwg1/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include -Iinclude   -I./arch/arm/include -include ./include/linux/kconfig.h -I. -D__KERNEL__ -D__UBOOT__    -D__ARM__ -marm -mno-thumb-interwork  -mabi=aapcs-linux  -mword-relocations  -fno-pic  -mno-unaligned-access  -ffunction-sections -fdata-sections -fno-common -ffixed-r9  -msoft-float   -pipe  -march=armv7-a -D__LINUX_ARM_ARCH__=7     -x c -o board/freescale/mx6ullevk/imximage.cfg.cfgtmp board/freescale/mx6ullevk/imximage.cfg


//制作映像文件 u-boot-dtb.imx
  ./tools/mkimage -n board/freescale/mx6ullevk/imximage.cfg.cfgtmp -T imximage -e 0x87800000 -d u-boot-dtb.bin u-boot-dtb.imx
Image Type:   Freescale IMX Boot Image
Image Ver:    2 (i.MX53/6/7 compatible)
Mode:         DCD
Data Size:    524288 Bytes = 512.00 KiB = 0.50 MiB
Load Address: 877ff420
Entry Point:  87800000

二,具体的编译过程

1,结论

细节如下:

  • 执行make命令时,要编译得到哪些文件由ALL-y 决定

        *规则如下

include config.mk # 里面会包含arch/arm/config.mk(含有ALL-y +=
u-boot-dtb.imx)

_all : all

# Always append ALL so that arch config.mk's can add custom ones
ALL-y += u-boot.srec u-boot.bin u-boot.sym System.map binary_size_check

ALL-$(CONFIG_OF_SEPARATE) += u-boot.dtb

all: $(ALL-y)

        *ALL-y 的值为:

checkarmreloc u-boot-dtb.imx u-boot.srec u-boot.bin u-boot.sym
System.map binary_size_check u-boot.dtb
  • u-boot-dtb.imx依赖于u-boot-dtb.bin,u-boot-dtb.bin又依赖于u-boot-nodtb.bin和dts/dt.dtb

  • 各类u-boot文件都依赖于u-boot,先编译得到u-boot,它由u-boot-init 、u-boot-main 两部分链接而成

        * u-boot-init为:arch/arm/cpu/armv7/start.o

        *u-boot-main为:lib/built-in.o fs/built-in.o net/built-in.o 等等

        *如何编译各个built-in.o,以lib/built-in.o为例

执行: `make -f ./scripts/Makefile.build obj=lib
会包含lib/Makefile,里面定义了obj-y
使用Makefile.build的规则把各个obj-y编译、链接为built-in.o

        *使用如下的命令链接得到u-boot:

quiet_cmd_u-boot__ ?= LD $@
    cmd_u-boot__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_u-boot) -o $@ \
    -T u-boot.lds $(u-boot-init) \
    --start-group $(u-boot-main) --end-group \
    $(PLATFORM_LIBS) -Map u-boot.map
  • 再编译得到设备树文件: make -f ./scripts/Makefile.build obj=dts dtbs

        *顶层Makefile如下:

dts/dt.dtb: checkdtc u-boot
$(Q)$(MAKE) $(build)=dts dtbs

        *scripts/Makefile.build中,会包含 dts/Makefile

DTB := arch/$(ARCH)/dts/$(DEVICE_TREE).dtb
$(DTB): arch-dtbs
$(obj)/dt.dtb: $(DTB) FORCE
    $(call if_changed,shipped)
targets += dt.dtb

$(DTB): arch-dtbs
    $(Q)test -e $@ || ( \
    echo >&2; \
    echo >&2 "Device Tree Source is not correctly specified."; \
    echo >&2 "Please define 'CONFIG_DEFAULT_DEVICE_TREE'"; \
    echo >&2 "or build with 'DEVICE_TREE=<device_tree>' argument"; \
    echo >&2; \
    /bin/false)

arch-dtbs:
    $(Q)$(MAKE) $(build)=arch/$(ARCH)/dts dtbs

.SECONDARY: $(obj)/dt.dtb.S

obj-$(CONFIG_OF_EMBED) := dt.dtb.o

dtbs: $(obj)/dt.dtb
    @:
  • 最后把u-boot、设备树打包: make -f ./scripts/Makefile.build obj=arch/arm/imx-common u-boot-dtb.imx
include config.mk # 里面会包含arch/arm/config.mk(含有ALL-y += uboot-
dtb.imx)

%.imx: %.bin
    $(Q)$(MAKE) $(build)=arch/arm/imx-common $@

2,顶层Makefile

顶层Makefile里:

  • 包含架构相关的Makefile,里面指定了第1个文件(head-y)

  • 指定了要编译哪些子目录(libs-y)。

从顶层Makefile开始分析:

include config.mk # 里面会包含arch/arm/config.mk(含有ALL-y += u-bootdtb.imx)
include arch/$(ARCH)/Makefile # arch/arm/Makefile, 里面含有head-y libs-y

libs-y += lib/
libs-$(HAVE_VENDOR_COMMON_LIB) += board/$(VENDOR)/common/
libs-$(CONFIG_OF_EMBED) += dts/
libs-y += fs/
libs-y += net/
libs-y += disk/
libs-y += drivers/
libs-y += drivers/dma/
libs-y += drivers/gpio/
libs-y += drivers/i2c/
libs-y += drivers/mmc/

libs-y += $(if $(BOARDDIR),board/$(BOARDDIR)/)

libs-y := $(sort $(libs-y))

u-boot-dirs := $(patsubst %/,%,$(filter %/, $(libs-y))) tools examples

u-boot-alldirs := $(sort $(u-boot-dirs) $(patsubst %/,%,$(filter %/,$(libs-))))

libs-y := $(patsubst %/, %/built-in.o, $(libs-y))

u-boot-init := $(head-y)
u-boot-main := $(libs-y)

ALL-y += u-boot.srec u-boot.bin u-boot.sym System.map binary_size_check

对于arch/arm/Makefile :

head-y := arch/arm/cpu/$(CPU)/start.o

libs-y += arch/arm/cpu/$(CPU)/
libs-y += arch/arm/cpu/
libs-y += arch/arm/lib/

所以,顶层Makefile包含了arch/arm/Makefile ,确定了head-y为arch/arm/cpu/armv7/start.o 。

还定义了libs-y变量,它里面含有多个目录。

3,编译子目录

顶层Makefile里定义了libs-y,会进入里面每一目录,使用它的Makefile进行编译:

boot-main := $(libs-y)

$(sort $(u-boot-init) $(u-boot-main)): $(u-boot-dirs) ;

u-boot-dirs := $(patsubst %/,%,$(filter %/, $(libs-y))) tools examples

$(u-boot-dirs): prepare scripts
    # make -f $(srctree)/scripts/Makefile.build obj=arch/arm/cpu/arm7
    $(Q)$(MAKE) $(build)=$@

比如:u-boot-main里面含有一个目录"arch/arm/cpu/armv7/",在u-boot-dirs中它末尾的"/"被取消,

就变成:arch/arm/cpu/armv7。

然后使用scripts/Makefile.build进行处理:$(Q)$(MAKE) $(build)=$@ ,展开就是:

make -f scripts/Makefile.build obj=arch/arm/cpu/armv7/

scripts/Makefile.build是编译u-boot源码的关键:

src := $(patsubst $(prefix)/%,%,$(obj)) # obj=arch/arm/cpu/arm7/,
src=arch/arm/cpu/armv7


# 第1个目标
__build:


# The filename Kbuild has precedence over Makefile
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuilddir)/
Kbuild,$(kbuild-dir)/Makefile)
include $(kbuild-file) # 包含 arch/arm/cpu/arm7/Makefile


ifneq ($(strip $(lib-y) $(lib-m) $(lib-)),)
lib-target := $(obj)/lib.a # 如果包含的arch/arm/cpu/armv7/Makefile里定义了lib-y
endif


ifneq ($(strip $(obj-y) $(obj-m) $(obj-) $(subdir-m) $(lib-target)),)
builtin-target := $(obj)/built-in.o # 如果包含的arch/arm/cpu/armv7/Makefile里定义了
obj-y
endif


__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
    $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
    $(subdir-ym) $(always)
    @:


# Built-in and composite module parts
$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
    $(call cmd,force_checksrc)
    $(call if_changed_rule,cc_o_c)


ifdef builtin-target
quiet_cmd_link_o_target = LD $@
# If the list of objects to link is empty, just create an empty built-in.o
cmd_link_o_target = $(if $(strip $(obj-y)),\
                        $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^) \
                        $(cmd_secanalysis),\
                        rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@)


$(builtin-target): $(obj-y) FORCE
    $(call if_changed,link_o_target)


targets += $(builtin-target)
endif # builtin-target

核心脚本Makefile.build脚本分析:

4,链接得到u-boot

顶层Makefile里:

libs-y := $(patsubst %/, %/built-in.o, $(libs-y))


u-boot-init := $(head-y)
u-boot-main := $(libs-y)


# Rule to link u-boot
# May be overridden by arch/$(ARCH)/config.mk
/*
*执行cmd_u-boot__指令
*
arm-buildroot-linux-gnueabihf-ld.bfd   -pie  --gc-sections -Bstatic -Ttext 0x87800000 -o u-boot -T u-boot.lds arch/arm/cpu/armv7/start.o
--start-group  arch/arm/cpu/built-in.o  arch/arm/cpu/armv7/built-in.o  arch/arm/imx-common/built-in.o  arch/arm/lib/built-in.o  board/freescale/common/built-in.o  board/freescale/mx6ullevk/built-in.o  cmd/built-in.o  
common/built-in.o  disk/built-in.o  drivers/built-in.o  drivers/dma/built-in.o  drivers/gpio/built-in.o  drivers/i2c/built-in.o  drivers/mmc/built-in.o  drivers/mtd/built-in.o  drivers/mtd/onenand/built-in.o  drivers/mtd/spi/built-in.o  
drivers/net/built-in.o  drivers/net/phy/built-in.o  drivers/pci/built-in.o  drivers/power/built-in.o  drivers/power/battery/built-in.o  drivers/power/domain/built-in.o  drivers/power/fuel_gauge/built-in.o  drivers/power/mfd/built-in.o  
drivers/power/pmic/built-in.o  drivers/power/regulator/built-in.o  drivers/serial/built-in.o  drivers/spi/built-in.o  drivers/usb/cdns3/built-in.o  drivers/usb/common/built-in.o  drivers/usb/dwc3/built-in.o  drivers/usb/emul/built-in.o  
drivers/usb/eth/built-in.o  drivers/usb/gadget/built-in.o  drivers/usb/gadget/udc/built-in.o  drivers/usb/host/built-in.o  drivers/usb/musb-new/built-in.o  drivers/usb/musb/built-in.o  drivers/usb/phy/built-in.o  drivers/usb/ulpi/built-in.o  
fs/built-in.o  lib/built-in.o  net/built-in.o  test/built-in.o  test/dm/built-in.o --end-group arch/arm/lib/eabi_compat.o  arch/arm/lib/lib.a -Map u-boot.map
*/
quiet_cmd_u-boot__ ?= LD $@
    cmd_u-boot__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_u-boot) -o $@ \
    -T u-boot.lds $(u-boot-init) \
    --start-group $(u-boot-main) --end-group \
    $(PLATFORM_LIBS) -Map u-boot.map


quiet_cmd_smap = GEN common/system_map.o
cmd_smap = \
    smap=`$(call SYSTEM_MAP,u-boot) | \
        awk '$$2 ~ /[tTwW]/ {printf $$1 $$3 "\\\\000"}'` ; \
    $(CC) $(c_flags) -DSYSTEM_MAP="\"$${smap}\"" \
        -c $(srctree)/common/system_map.c -o common/system_map.o


//cmd_u-boot__
u-boot: $(u-boot-init) $(u-boot-main) u-boot.lds FORCE
    $(call if_changed,u-boot__)


ifeq ($(CONFIG_KALLSYMS),y)
    $(call cmd,smap)
    $(call cmd,u-boot__) common/system_map.o
endif

链接得到u-boot:

5,映像文件的依赖

对于IMX6ULL,要使用的是u-boot-dtb.imx,它含有u-boot和设备树。

在顶层Makefile里:

include config.mk # 里面会包含arch/arm/config.mk(含有ALL-y += u-bootdtb.imx)

%.imx: %.bin
    $(Q)$(MAKE) $(build)=arch/arm/imx-common $@

u-boot-dtb.imx依赖于u-boot-dtb.bin,u-boot-dtb.bin又依赖于u-boot-nodtb.bin和dts/dt.dtb。

在顶层Makefile里:

u-boot-dtb.bin: u-boot-nodtb.bin dts/dt.dtb FORCE
    $(call if_changed,cat)

u-boot-nodtb.bin: u-boot FORCE
    $(call if_changed,objcopy)
    $(call DO_STATIC_RELA,$<,$@,$(CONFIG_SYS_TEXT_BASE))
    $(BOARD_SIZE_CHECK)

所以,编译出u-boot后,会先制作u-boot-nodtb.bin;然后编译dts/dt.dtb;最后生成u-boot-dtb.bin、imx文件:

6,编译设备树

顶层Makefile里:

dts/dt.dtb: checkdtc u-boot
    # make -f $(srctree)/scripts/Makefile.build obj=dts dtbs
    $(Q)$(MAKE) $(build)=dts dtbs

需要用到scripts/Makefile.build中,它会包含 dts/Makefile, dts/Makefile中含有dtbs目标:

DEVICE_TREE ?= $(CONFIG_DEFAULT_DEVICE_TREE:"%"=%)
DTB := arch/$(ARCH)/dts/$(DEVICE_TREE).dtb # 就是 arch/arm/dts/imx6ull-14x14-evk.dtb

$(obj)/dt.dtb: $(DTB) FORCE
    $(call if_changed,shipped)

targets += dt.dtb

$(DTB): arch-dtbs
    $(Q)test -e $@ || ( \
    echo >&2; \
    echo >&2 "Device Tree Source is not correctly specified."; \
    echo >&2 "Please define 'CONFIG_DEFAULT_DEVICE_TREE'"; \
    echo >&2 "or build with 'DEVICE_TREE=<device_tree>' argument"; \
    echo >&2; \
    /bin/false)

arch-dtbs:
    $(Q)$(MAKE) $(build)=arch/$(ARCH)/dts dtbs

.SECONDARY: $(obj)/dt.dtb.S

obj-$(CONFIG_OF_EMBED) := dt.dtb.o

dtbs: $(obj)/dt.dtb
    @:

最后会使用$(Q)$(MAKE) $(build)=arch/$(ARCH)/dts dtbs 来处理,使用arch/arm/dts/Makefile,里面定了dtb-y:

dtb-$(CONFIG_MX6) += imx6ul-14x14-ddr3-arm2.dtb \
    imx6ul-14x14-ddr3-arm2-emmc.dtb \
    imx6ul-14x14-ddr3-arm2-gpmi-weim.dtb \
    imx6ul-14x14-lpddr2-arm2.dtb \
    imx6ul-14x14-evk.dtb \
    imx6ul-14x14-evk-emmc.dtb \

PHONY += dtbs
dtbs: $(addprefix $(obj)/, $(dtb-y))
    @:

要编译出各类dtb文件,用到scripts/Makefile.lib,规则如下:

quiet_cmd_dtc = DTC $@
# Modified for U-Boot
# Bring in any U-Boot-specific include after the '/dts-v1/;' header
cmd_dtc = mkdir -p $(dir ${dtc-tmp}) ; \
        cat $< $(if $(u_boot_dtsi),\
            | sed '/^\/ {$$/{x;s%$$%\#include \"$(u_boot_dtsi)\"%;G;}') | \
            $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) - ;
\
        $(DTC) -O dtb -o $@ -b 0 \
            -i $(dir $<) $(DTC_FLAGS) \
            -d $(depfile).dtc.tmp $(dtc-tmp) ; \
        cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)


$(obj)/%.dtb: $(src)/%.dts FORCE
    $(call if_changed_dep,dtc)

7,制作映像文件

当制作出设备树文件后,在顶层Makefile里有如下规则,进而制作出u-boot-dtb.bin:

u-boot-dtb.bin: u-boot-nodtb.bin dts/dt.dtb FORCE
    $(call if_changed,cat)

回到顶层Makefile,看看如何制作imx映像文件:

include config.mk # 里面会包含arch/arm/config.mk(含有ALL-y += u-bootdtb.imx)

%.imx: %.bin
    $(Q)$(MAKE) $(build)=arch/arm/imx-common $@

现在u-boot-dtb.imx的依赖文件u-boot-dtb.bin已经生成了,将会使用arch/arm/imxcommon/Makefile来生产imx文件:

u-boot.imx: u-boot.bin $(IMX_CONFIG) $(PLUGIN).bin FORCE
    $(call if_changed,mkimage)

最后会使用如下命令生产imx映像文件:

./tools/mkimage -n board/freescale/mx6ullevk/imximage.cfg.cfgtmp -T imximage -e
0x87800000 -d u-boot-dtb.bin u-boot-dtb.imx

u-boot-dtb.imx生成过程总结:

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

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

相关文章

【杂谈】-不同种类放大器及其区别

不同种类放大器及其区别 文章目录 不同种类放大器及其区别1、概述2、放大器种类2.1 如何衡量保真度2.2 如何测量放大器的效率 3、放大器分类3.1 A类放大器3.2 B 类放大器3.3 AB类放大器3.4 C类放大器3.5 其他放大器类别 1、概述 放大器是电子产品中最常用的电路之一。有几种类…

联邦学习论文阅读:2018 Federated learning with non-IID data

介绍 这是一篇2018年挂在arXiv上的文章&#xff0c;是一篇针对FL中数据Non-IID的工作。 作者发现&#xff0c;对于高度Non-IID的数据集&#xff0c;FedAvg的准确性下降了55%。 作者提出了可以用权重散度&#xff08;weight divergence&#xff09;来解释这种性能下降&#xff…

创新入门|生成式AI创新赋能优势解析,获取生成式AI知识的10大方法

生成式AI技术对员工和企业影响深远。对于员工而言&#xff0c;生成式AI能够提升工作效率&#xff0c;简化重复性任务&#xff0c;并为创意和决策提供支持。对于企业而言&#xff0c;生成式AI在产品创新、市场营销、客户服务和运营优化等方面发挥重要作用&#xff0c;帮助预测市…

亚信安慧AntDB数据库与云信达eCloud Data Master 云数据管理系统软件V4完成兼容性互认证

日前&#xff0c;湖南亚信安慧科技有限公司&#xff08;简称&#xff1a;亚信安慧&#xff09;与南京云信达科技有限公司&#xff08;简称&#xff1a;云信达&#xff09;&#xff0c;完成了AntDB数据库产品与云信达eCloud Data Master云数据管理系统软件V4的兼容性互认证。 双…

git clone 项目报“鉴权失败”的解决办法

#问题展示# git clone https://gitee.com/soaringsoft/.....git 正克隆到...... Username for https://gitee.com:...... Password for https://.....gitee.com:...... remote: [session-1440f183] Unauthorized fatal: git clone https://gitee.com/soaringsoft/.....gi…

ARM-V9 RME(Realm Management Extension)系统架构之功耗管理

安全之安全(security)博客目录导读 目录 一、系统功耗管理 1、功耗状态 2、PE功耗管理 3、系统和PE集群功耗管理 4、系统功耗状态 二、RME组件功耗管理 本节规定了RME系统的功耗管理规则。 功耗管理流程定义了系统及其组件如何在各种电源状态之间进行转换&#xff0c;以…

ansible-Role角色批量按照node_export节点,并追加信息到Prometheus文件中

文章目录 剧本功能 inventory.yaml文件定义deploy.yaml角色定义node_exporter_lock角色定义任务角色main.yamlnode_exporter_tasks.yml角色触发任务notifyextra_tasks.yml角色prometheus_node_config.j2模板文件 执行命令查看变量 剧本功能 功能1&#xff1a; 批量执行node_ex…

记一次 .NET某工厂报警监控设置 崩溃分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友在微信上丢了一个崩溃的dump给我&#xff0c;让我帮忙看下为什么出现了崩溃&#xff0c;在 Windows 的事件查看器上显示的是经典的 访问违例 &#xff0c;即 c0000005 错误码&#xff0c;不管怎么说有dump就可以上windbg开干了。…

Python图像处理——基于Pytorch框架ResNet152特征提取的MNIST手写数字识别

1. 数据集介绍 MNIST手写数字数据集&#xff1a; http://yann.lecun.com/exdb/mnist/ MNIST 数据集一共有 7 万张图片&#xff0c;其中 6 万张是训练集&#xff0c; 1 万张是测试集。每张图片是 28 28 的 0−9 的手写数字图片组成。每个图片是黑底白字的形式&#xff0c;黑底…

前端技术回顾系列 10|TS 泛型在类和接口中的应用

在微信中阅读,关注公众号:CodeFit。 创作不易,如果你觉得这篇文章对您有帮助,请不要忘了 点赞、分享 和 关注 我的公众号:CodeFit,为我的持续创作提供动力。 上文回顾:约束泛型(Generic Constraints) 上一篇文章我们回顾了 泛型 在 TypeScript 中的高级用法 —— 泛型…

uniapp开发微信小程序预加载分包

微信小程序分包是一种优化小程序项目结构和性能的方式。它允许开发者将小程序代码包拆分成多个子包&#xff0c;在用户需要时动态加载这些子包&#xff0c;从而减少小程序的首次加载时间和主包的体积。&#xff08;总体积不得大于20M&#xff0c;主包&#xff08;共同文件静态资…

nest : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\nest.ps1,因为在此系统上禁止运行脚本。

完整报错&#xff1a; nest : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\nest.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkI D135170 中的 about_Execution_Policies。 问题原因&#xff1a; …

Ubuntu基础-vim编辑器

目录 前言: 一. 安装 二. 配置 三. 基本使用 1.使用 Vim 编辑文本文件 2.代码编辑 3.多窗口编辑 四. 总结 前言: Vim 是从 VI 发展出来的一个文本编辑器&#xff0c;具有代码补充、错误跳转等功能&#xff0c;在程序员中被广泛使用。它的设计理念是命令的组合&#xff…

Django后台忘记管理员的账号

使用命令启动项目&#xff1a; python manage.py runserver输入后缀/admin&#xff0c;进入后台管理员&#xff0c;如果此时忘记你先前设置的用户名与密码怎么办&#xff1f; 终端输入&#xff1a; python manage.py shell 输入以下内容&#xff0c;并查看返回结果&#xff…

ASM字节码插桩实现点击防抖

思路&#xff1a;在点击事件onclick的时候&#xff0c;将view的onclick在给定的时间给拦截掉。以前我们可能都是用一个util来拦截&#xff0c;这样在每个点击事件都得去判断&#xff0c;那么这里就用字节码插桩的形式来实现一下。 ASM的引入 dependencies {implementation gr…

【因果推断python】31_合成控制1

目录 一个了解无从知晓事情的超酷数学技巧 我们有时间 一个了解无从知晓事情的超酷数学技巧 当我们审视双重差分法时&#xff0c;我们有来自 2 个不同城市的多个客户的数据&#xff1a;阿雷格里港和弗洛里亚诺波利斯。数据跨越 2 个不同的时间段&#xff1a;在阿雷格里港进行…

关于头条项目经验面试题的总结

文章目录 前言一、论坛项目经典话术二、请你介绍一下你最近的项目吧2.1 话术1 三、你的公司的开发环境是怎么搭建的&#xff1f;四、登录你们是怎么做的&#xff1f;4.1 账号密码登录4.2 手机验证码发送4.2.1 手机验证码发送4.2.2 手机验证码登录 五、用户行为限流是怎么做的&a…

oracle 删除当前用户下所有表

荆轲刺秦王 通常呢 我们将正式环境的 oracle 数据库 导出成 dmp 文件&#xff0c;然后导入到测试环境或者本地环境&#xff0c;期间可能会出现各种问题。那么如何使错误的导入数据全部删除呢。可以这样做&#xff1a; 1. 本地虚拟机启动 oracle 服务 2. sqldeveloper 连接 o…

数据桥梁:无缝连接信息孤岛与分析前沿

在数字化浪潮席卷全球的今天&#xff0c;数据已成为推动社会进步和经济发展的重要力量。然而&#xff0c;在实际应用中&#xff0c;我们常常遇到的一个挑战是如何将分散、孤立的数据资源进行有效整合&#xff0c;打破“信息孤岛”&#xff0c;实现数据的无缝连接和高效利用。本…

【智能算法应用】基于粒子群算法的多尺度Retinex图像去雾方法

目录 1.算法原理2.粒子群算法的多尺度Retinex图像去雾方法3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】粒子群算法&#xff08;PSO&#xff09;原理及实现 多尺度Retinex算法 在Retinex算法中&#xff0c;雾化图像的形成可以总结为入射光和反射光的乘积: I ( x…