ICS PA0

news2024/9/24 11:22:37

目录

    • 环境配置
    • 工具的使用及相关资源
    • Compling and Running NEMU
      • 配置系统make menuconfig
      • 项目构建make
      • 运行与调试
    • Submit

环境配置

  • Ubuntu安装中的分区不太明白
  • 安装了中文输入法和必要的工具链
  • 虚拟机与主机互联

工具的使用及相关资源

  • vim(vimtutor是vim的一个内置教程)
    主要修改一下配置文件,先进行备份:

$ cp /etc/vim/vimrc ~/.vimrc

然后回到家目录:

$ vi .vimrc

添加如下内容:

set tabstop=4
set softtabstop =4
set cindent
set shiftwidth=4

可以参考讲义里的配置

  • make
    基本的操作如下:

$ vi hello.c
$ gcc hello.c -o hello
$ ./hello

在hello.c所在目录下新建一个文件Makefile,输入以下内容并保存:

hello:hello.c gcc hello.c -o hello # 注意开头的 tab,而不是空格


.PHONY: clean


clean: rm hello # 注意开头的 tab,而不是空格

返回命令行,键入 make,你会发现 make 程序调用了 gcc 进行编译。

若连续多次执行 make,会得到 make: ‘hello’ is up to date. 的提示信息。

其中 .PHONY: clean 这一行的作用是防止同目录下的 clean 文件影响 Makefile 的执行。

  • git
    The workflow above shows how you will use branch in PAs:
    1. before starting a new PA, new a branch pa? and check out to it
    2. coding in the branch pa? (this will introduce lot of modifications)
    3. after finish the PA, merge the branch pa? into master, and check out back to master

Compling and Running NEMU

在nemu/文件夹中,我们需要进行 NEMU 项目中的配置系统和项目构建(更多内容详见 PA1 RTFSC)。

配置系统make menuconfig

执行这一步前,需要先安装 bison 和 flex(根据报错提示安装即可)

NEMU 中的配置系统为于 nemu/tools/kconfig,它来源于 GNU / Linux 项目中的 kconfig。

kconfig 定义了一套简单的语言,开发者可以使用这套语言来编写“配置描述文件”。

在 NEMU 项目中,“配置描述文件”的文件名都为 Kconfig,如 nemu/Kconfig。

当键入 make menuconfig 的时候,背后其实发生了如下事件:

  • 检查 nemu/tools/kconfig/build/mconf 程序是否存在,若不存在,则编译并生成 mconf
  • 检查 nemu/tools/kconfig/build/conf 程序是否存在,若不存在,则编译并生成 conf
  • 运行命令 mconf nemu/Kconfig,此时 mconf 将会解析 nemu/Kconfig 中的描述,以菜单树的形式展示各种配置选项,供开发者进行选择
  • 退出菜单时,mconf 会把开发者选择的结果记录到 nemu/.config 文件中
  • 运行命令 conf --syncconfig nemu/Kconfig,此时 conf 将会解析 nemu/Kconfig 中的描述,并读取选择结果 nemu/.config,结合两者来生成如下文件:
    • 可以被包含到 C 代码中的宏定义 (nemu/include/generated/autoconf.h),这些宏的名称都是形如 CONFIG_xxx 的形式
    • 可以被包含到 Makefile 中的变量定义 (nemu/include/config/auto.conf)
    • ……
+ CC src/memory/paddr.c
+ CXX src/utils/disasm.cc
src/utils/disasm.cc:5:10: fatal error: llvm/Support/TargetRegistry.h: No such file or directory
    5 | #include "llvm/Support/TargetRegistry.h"
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make: *** [/home/crx/ics2021/nemu/scripts/build.mk:40: /home/crx/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/utils/disasm.o] Error 1

经过stackoverflow的启发Stackoverflow:llvm/Support/TargetRegistry.h: No such file or directory,知道了是编译(8月31号开始)src/utils/disasm.cc的时候,出现了文件引用失败。这时候用到了一个命令apt-file来寻找这个TargetRegistry.h文件。在这里简单介绍下apt-file 的作用 apt-file。

apt-file:apt-file is a command line tool for searching files in packages for the APT package management system。apt-file 是一个命令行界面的 APT 包搜索工具。当我们在编译源代码时,时有缺少文件的情况发生。此时,通过 apt-file 就可以找出该缺失文件所在的包,然后将缺失的包安装后即可让编译顺利进行了。所以当我们通过执行命令

apt-file search TargetRegistry.h

后,可以发现

在这里插入图片描述
所以可以解决TargetRegistry.h文件缺失问题了:因为当前我们的llvm版本是14,TargetRegistry.h文件在/llvm/MC/下,而不是src/utils/disasm.cc文件的#include “llvm/Support/TargetRegistry.h”

项目构建make

liaobei@liaohaijin-vm:~/ics2021/nemu$ make
+ CC src/nemu-main.c
+ CC src/cpu/difftest/dut.c
+ CC src/cpu/cpu-exec.c
+ CC src/monitor/sdb/sdb.c
+ CC src/monitor/sdb/watchpoint.c
+ CC src/monitor/sdb/expr.c
+ CC src/monitor/monitor.c
+ CC src/utils/timer.c
+ CC src/utils/state.c
+ CC src/utils/log.c
+ CC src/utils/rand.c
+ CC src/memory/paddr.c
+ CC src/memory/vaddr.c
+ CC src/isa/riscv32/difftest/dut.c
+ CC src/isa/riscv32/reg.c
+ CC src/isa/riscv32/init.c
+ CC src/isa/riscv32/system/intr.c
+ CC src/isa/riscv32/system/mmu.c
+ CC src/isa/riscv32/instr/decode.c
+ CC src/isa/riscv32/logo.c
+ CC src/device/io/map.c
+ CC src/device/io/mmio.c
+ CC src/device/io/port-io.c
+ CC src/engine/interpreter/init.c
+ CC src/engine/interpreter/hostcall.c
+ CXX src/utils/disasm.cc
+ LD /home/liaobei/ics2021/nemu/build/riscv32-nemu-interpreter

下面是Makefile文件的内容,对其进行解读:

# Sanity check
ifeq ($(wildcard $(NEMU_HOME)/src/nemu-main.c),)
  $(error NEMU_HOME=$(NEMU_HOME) is not a NEMU repo)
endif

# Include variables and rules generated by menuconfig
-include $(NEMU_HOME)/include/config/auto.conf
-include $(NEMU_HOME)/include/config/auto.conf.cmd

remove_quote = $(patsubst "%",%,$(1))

# Extract variabls from menuconfig
GUEST_ISA ?= $(call remove_quote,$(CONFIG_ISA))
ENGINE ?= $(call remove_quote,$(CONFIG_ENGINE))
NAME    = $(GUEST_ISA)-nemu-$(ENGINE)

# Include all filelist.mk to merge file lists
FILELIST_MK = $(shell find ./src -name "filelist.mk")
include $(FILELIST_MK)

# Filter out directories and files in blacklist to obtain the final set of source files
DIRS-BLACKLIST-y += $(DIRS-BLACKLIST)
SRCS-BLACKLIST-y += $(SRCS-BLACKLIST) $(shell find $(DIRS-BLACKLIST-y) -name "*.c")
SRCS-y += $(shell find $(DIRS-y) -name "*.c")
SRCS = $(filter-out $(SRCS-BLACKLIST-y),$(SRCS-y))

# Extract compiler and options from menuconfig
CC = $(call remove_quote,$(CONFIG_CC))
CFLAGS_BUILD += $(call remove_quote,$(CONFIG_CC_OPT))
CFLAGS_BUILD += $(if $(CONFIG_CC_LTO),-flto,)
CFLAGS_BUILD += $(if $(CONFIG_CC_DEBUG),-ggdb3,)
CFLAGS_BUILD += $(if $(CONFIG_CC_ASAN),-fsanitize=address,)
CFLAGS_TRACE += -DITRACE_COND=$(if $(CONFIG_ITRACE_COND),$(call remove_quote,$(CONFIG_ITRACE_COND)),true)
CFLAGS  += $(CFLAGS_BUILD) $(CFLAGS_TRACE) -D__GUEST_ISA__=$(GUEST_ISA)
LDFLAGS += $(CFLAGS_BUILD)

# Include rules for menuconfig
include $(NEMU_HOME)/scripts/config.mk

ifdef CONFIG_TARGET_AM
include $(AM_HOME)/Makefile
LINKAGE += $(ARCHIVES)
else
# Include rules to build NEMU
include $(NEMU_HOME)/scripts/native.mk
endif
  • 与配置系统进行关联
    通过包含nemu/include/config/auto.conf,与kconfig生成的变量进行关联
-include $(NEMU_HOME)/include/config/auto.conf
  • 文件列表
    在nemu/src及其子目录下存在一些名为filelist.mk的文件:
liaobei@liaohaijin-vm:~/ics2021/nemu$ find ./ -name filelist.mk
./src/utils/filelist.mk
./src/filelist.mk
./src/isa/filelist.mk
./src/device/filelist.mk
./src/engine/filelist.mk

它们会根据menuconfig的配置对如下4个变量进行维护:

  • SRCS-y - 参与编译的源文件的候选集合
  • SRCS-BLACKLIST-y - 不参与编译的源文件的黑名单集合
  • DIRS-y -参与编译的目录集合, 该目录下的所有文件都会被加入到SRCS-y中
  • DIRS-BLACKLIST-y - 不参与编译的目录集合,该目录下的所有文件都会被加入到SRCS-BLACKLIST-y中
    Makefile中会包含项目中的所有filelist.mk文件,对上述4个变量的追加定义进行汇总,最终会过滤出在SRCS-y中但不在SRCS-BLACKLIST-y中的源文件,来作为最终参与编译的源文件的集合。
  • 编译和链接
    Makefile的编译规则在nemu/srcripts/build.mk中定义,见# Compilation patterns 后的部分:
.DEFAULT_GOAL = app

# Add necessary options if the target is a shared library
ifeq ($(SHARE),1)
SO = -so
CFLAGS  += -fPIC
LDFLAGS += -rdynamic -shared -fPIC
endif

WORK_DIR  = $(shell pwd)
BUILD_DIR = $(WORK_DIR)/build

INC_PATH := $(WORK_DIR)/include $(INC_PATH)
OBJ_DIR  = $(BUILD_DIR)/obj-$(NAME)$(SO)
BINARY   = $(BUILD_DIR)/$(NAME)$(SO)

# Compilation flags
ifeq ($(CC),clang)
CXX := clang++
else
CXX := g++
endif
LD := $(CXX)
INCLUDES = $(addprefix -I, $(INC_PATH))
CFLAGS  := -O2 -MMD -Wall -Werror $(INCLUDES) $(CFLAGS)
LDFLAGS := -O2 $(LDFLAGS)

OBJS = $(SRCS:%.c=$(OBJ_DIR)/%.o) $(CXXSRC:%.cc=$(OBJ_DIR)/%.o)

# Compilation patterns
$(OBJ_DIR)/%.o: %.c
	@echo + CC $<
	@mkdir -p $(dir $@)
	@$(CC) $(CFLAGS) -c -o $@ $<
	$(call call_fixdep, $(@:.o=.d), $@)

$(OBJ_DIR)/%.o: %.cc
	@echo + CXX $<
	@mkdir -p $(dir $@)
	@$(CXX) $(CFLAGS) $(CXXFLAGS) -c -o $@ $<
	$(call call_fixdep, $(@:.o=.d), $@)

# Depencies
-include $(OBJS:.o=.d)

# Some convenient rules

.PHONY: app clean

app: $(BINARY)

$(BINARY): $(OBJS) $(ARCHIVES)
	@echo + LD $@
	@$(LD) -o $@ $(OBJS) $(LDFLAGS) $(ARCHIVES) $(LIBS)

clean:
	-rm -rf $(BUILD_DIR)

$@表示所有参数列表,$<表示第一个依赖文件,call_fixdep的调用用于生成更合理的依赖关系(先忽略)。
可以通过输入make -nB让make程序以“只输出命令但不执行”的方式强制构建目标。
截取整理好的一段输出分析:

gcc -O2 -MMD -Wall -Werror -I/home/liaobei/ics2021/nemu/include -I/home/liaobei/ics2021/nemu/src/isa/riscv32/include -I/home/liaobei/ics2021/nemu/src/engine/interpreter -O2  -ggdb3  -DITRACE_COND=true -D__GUEST_ISA__=riscv32 -c -o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/nemu-main.o src/nemu-main.c
gcc -O2 -MMD -Wall -Werror -I/home/liaobei/ics2021/nemu/include -I/home/liaobei/ics2021/nemu/src/isa/riscv32/include -I/home/liaobei/ics2021/nemu/src/engine/interpreter -O2  -ggdb3  -DITRACE_COND=true -D__GUEST_ISA__=riscv32 -c -o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/cpu/difftest/dut.o src/cpu/difftest/dut.c
gcc -O2 -MMD -Wall -Werror -I/home/liaobei/ics2021/nemu/include -I/home/liaobei/ics2021/nemu/src/isa/riscv32/include -I/home/liaobei/ics2021/nemu/src/engine/interpreter -O2  -ggdb3  -DITRACE_COND=true -D__GUEST_ISA__=riscv32 -c -o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/cpu/cpu-exec.o src/cpu/cpu-exec.c
gcc -O2 -MMD -Wall -Werror -I/home/liaobei/ics2021/nemu/include -I/home/liaobei/ics2021/nemu/src/isa/riscv32/include -I/home/liaobei/ics2021/nemu/src/engine/interpreter -O2  -ggdb3  -DITRACE_COND=true -D__GUEST_ISA__=riscv32 -c -o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/monitor/sdb/sdb.o src/monitor/sdb/sdb.c
gcc -O2 -MMD -Wall -Werror -I/home/liaobei/ics2021/nemu/include -I/home/liaobei/ics2021/nemu/src/isa/riscv32/include -I/home/liaobei/ics2021/nemu/src/engine/interpreter -O2  -ggdb3  -DITRACE_COND=true -D__GUEST_ISA__=riscv32 -c -o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/monitor/sdb/watchpoint.o src/monitor/sdb/watchpoint.c
gcc -O2 -MMD -Wall -Werror -I/home/liaobei/ics2021/nemu/include -I/home/liaobei/ics2021/nemu/src/isa/riscv32/include -I/home/liaobei/ics2021/nemu/src/engine/interpreter -O2  -ggdb3  -DITRACE_COND=true -D__GUEST_ISA__=riscv32 -c -o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/monitor/sdb/expr.o src/monitor/sdb/expr.c
gcc -O2 -MMD -Wall -Werror -I/home/liaobei/ics2021/nemu/include -I/home/liaobei/ics2021/nemu/src/isa/riscv32/include -I/home/liaobei/ics2021/nemu/src/engine/interpreter -O2  -ggdb3  -DITRACE_COND=true -D__GUEST_ISA__=riscv32 -c -o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/monitor/monitor.o src/monitor/monitor.c
gcc -O2 -MMD -Wall -Werror -I/home/liaobei/ics2021/nemu/include -I/home/liaobei/ics2021/nemu/src/isa/riscv32/include -I/home/liaobei/ics2021/nemu/src/engine/interpreter -O2  -ggdb3  -DITRACE_COND=true -D__GUEST_ISA__=riscv32 -c -o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/utils/timer.o src/utils/timer.c
gcc -O2 -MMD -Wall -Werror -I/home/liaobei/ics2021/nemu/include -I/home/liaobei/ics2021/nemu/src/isa/riscv32/include -I/home/liaobei/ics2021/nemu/src/engine/interpreter -O2  -ggdb3  -DITRACE_COND=true -D__GUEST_ISA__=riscv32 -c -o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/utils/state.o src/utils/state.c
gcc -O2 -MMD -Wall -Werror -I/home/liaobei/ics2021/nemu/include -I/home/liaobei/ics2021/nemu/src/isa/riscv32/include -I/home/liaobei/ics2021/nemu/src/engine/interpreter -O2  -ggdb3  -DITRACE_COND=true -D__GUEST_ISA__=riscv32 -c -o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/utils/log.o src/utils/log.c
gcc -O2 -MMD -Wall -Werror -I/home/liaobei/ics2021/nemu/include -I/home/liaobei/ics2021/nemu/src/isa/riscv32/include -I/home/liaobei/ics2021/nemu/src/engine/interpreter -O2  -ggdb3  -DITRACE_COND=true -D__GUEST_ISA__=riscv32 -c -o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/utils/rand.o src/utils/rand.c
gcc -O2 -MMD -Wall -Werror -I/home/liaobei/ics2021/nemu/include -I/home/liaobei/ics2021/nemu/src/isa/riscv32/include -I/home/liaobei/ics2021/nemu/src/engine/interpreter -O2  -ggdb3  -DITRACE_COND=true -D__GUEST_ISA__=riscv32 -c -o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/memory/paddr.o src/memory/paddr.c
gcc -O2 -MMD -Wall -Werror -I/home/liaobei/ics2021/nemu/include -I/home/liaobei/ics2021/nemu/src/isa/riscv32/include -I/home/liaobei/ics2021/nemu/src/engine/interpreter -O2  -ggdb3  -DITRACE_COND=true -D__GUEST_ISA__=riscv32 -c -o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/memory/vaddr.o src/memory/vaddr.c
gcc -O2 -MMD -Wall -Werror -I/home/liaobei/ics2021/nemu/include -I/home/liaobei/ics2021/nemu/src/isa/riscv32/include -I/home/liaobei/ics2021/nemu/src/engine/interpreter -O2  -ggdb3  -DITRACE_COND=true -D__GUEST_ISA__=riscv32 -c -o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/isa/riscv32/difftest/dut.o src/isa/riscv32/difftest/dut.c

对比可知,我们可以知道,$<为src/nemu-main.c,$@为/home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/nemu-main.o,$(CC)为gcc等,这些Makefile中的变量,在/include/config/auto.conf定义了。

可以根据上述输出结果和 Makefile 反推 $(CFLAGS) 的值是如何形成的。

编译之后是一系列 git 操作,规则在 nemu/scripts/git.mk 中定义。下面是输出:

git add /home/liaobei/ics2021/nemu/.. -A --ignore-errors
while (test -e .git/index.lock); do sleep 0.1; done
sync


最后是链接操作:

g++ -o /home/liaobei/ics2021/nemu/build/riscv32-nemu-interpreter /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/nemu-main.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/cpu/difftest/dut.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/cpu/cpu-exec.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/monitor/sdb/sdb.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/monitor/sdb/watchpoint.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/monitor/sdb/expr.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/monitor/monitor.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/utils/timer.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/utils/state.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/utils/log.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/utils/rand.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/memory/paddr.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/memory/vaddr.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/isa/riscv32/difftest/dut.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/isa/riscv32/reg.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/isa/riscv32/init.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/isa/riscv32/system/intr.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/isa/riscv32/system/mmu.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/isa/riscv32/instr/decode.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/isa/riscv32/logo.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/device/io/map.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/device/io/mmio.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/device/io/port-io.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/engine/interpreter/init.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/engine/interpreter/hostcall.o /home/liaobei/ics2021/nemu/build/obj-riscv32-nemu-interpreter/src/utils/disasm.o -O2 -O2  -ggdb3   -lLLVM-14 -lreadline -ldl -pie

运行与调试

To run NEMU, type

make run

To debug NEMU with gdb, type

make gdb

Submit

需要有足够的耐心,对于不清楚的知识和看不懂的源码像Makefile的内容,不断进行RTFM和STFW,要有信心一定有工具能帮助我们更好的理解代码😆。

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

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

相关文章

Nginx跳转模块——location与rewrite

一、location 1、location作用 用于匹配uri&#xff08;文件、图片、视频&#xff09; uri&#xff1a;统一资源标识符。是一种字符串标识&#xff0c;用于标识抽象的或物理资源文件、图片、视频 2、locatin分类 1、精准匹配&#xff1a;location / {...} 2、一般匹配&a…

【80天学习完《深入理解计算机系统》】第三天 2.3 整数运算【正负溢出】【运算的溢出】【类型转换的二进制扩展】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

ATF(TF-A)安全通告 TFV-6 (CVE-2017-5753, CVE-2017-5715, CVE-2017-5754)

ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-6 (CVE-2017-5753, CVE-2017-5715, CVE-2017-5754) 二、Variant 1 (CVE-2017-5753) 三、Variant 2 (CVE-2017-5715) 四、Variant 3 (CVE-2017-5754) 一、ATF(TF-A)安全通告 TFV-6 (CVE-2017-5753, CVE-2017-5715, C…

向量数据库介绍

1.什么是向量数据 向量数据库是一种专门用于存储和检索向量数据的数据库。它不同于传统的关系型数据库&#xff0c;而是基于向量相似度匹配的方式来实现高效的数据查询和分析。 向量数据库的应用场景非常广泛&#xff0c;包括但不限于以下几个方面&#xff1a; 图片、音频和视频…

微服务02-docker

1、Docker架构 1.1 镜像和容器 Docker中有几个重要的概念&#xff1a; 镜像&#xff08;Image&#xff09;&#xff1a;Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起&#xff0c;称为镜像。Docker镜像是用于创建 Docker 容器的模板 。就像面向对象编…

js代码执行顺序(同步与异步)

1.同步与异步 异步任务又分为宏任务和微任务 2.执行规则 同步代码遇到,直接执行Promise中.then前的代码直接执行,.then后的代码丢入微任务队列中遇到定时器直接将里面的代码丢入宏任务队列中同步代码执行完&#xff0c;去看微任务,有则执行&#xff1b;再去看宏任务&#xf…

文件的权限

1、修改文件的所属者和所属组 2、修改文件某一类人&#xff08;所属者、所属组、其他人&#xff09;的权限 一、用户对于普通文件的权限 二、用户对于目录文件的权限 三、访问控制列表ACL 四、特殊权限&#xff08;了解&#xff09; wuneng创建了几个文件&#xff0c;xiaoming对…

【C语言】预处理详解

本文目录 1 预定义符号 2 #define 2.1 #define 定义标识符 2.2 #define 定义宏 2.3 #define 替换规则 2.4 #和## 2.5 带副作用的宏参数 2.6 宏和函数对比 2.7 命名约定 3 #undef 4 命令行定义 5 条件编译 6 文件包含 6.1 头文件被包含的方式 6.2 嵌套文件包含 1 预定义符号 __…

2023亚马逊秋季大促定档!卖家要做好准备!

亚马逊Prime秋季促销&#xff0c;又称亚马逊Prime会员早享日&#xff08;Prime Early AccessSale&#xff09;&#xff0c;是亚马逊在2022年才正式推出的一个面向Prime会员的促销活动&#xff0c;与每年7月举办的Prime Day大促是同等级活动&#xff0c;去年秋季大促也是在10月举…

C - The Battle of Chibi

题意&#xff1a;就是问你数组中长度为m的上升子序列(没说连续&#xff09;有多少个。 1&#xff1a;可以想到状态表示dp[ i ][ j ] 代表以 a[i] 为结尾的且长度为 j 的严格单增子序列的数目&#xff0c; 那么状态计算就为 , 那我们如果不优化直接写&#xff0c;一层n&am…

数据结构刷题训练——链表篇(一)

目录 前言 题目一&#xff1a;链表的中间节点 思路 分析 题解 题目二&#xff1a;链表中倒数第k个结点 思路 分析 题解 题目三&#xff1a;合并两个有序链表 思路 分析 题解 方法二 题解 题目四&#xff1a;链表的回文结构 思路 分析 题解 总结 前言 今天我将开…

家政小程序开发制作

家政小程序是一种基于移动互联网的工具&#xff0c;旨在为用户提供方便快捷的家政服务。下面是家政小程序的功能介绍&#xff1a; 1. 家政服务展示&#xff1a;家政小程序可以展示各类家政服务的详细信息&#xff0c;包括清洁、保姆、月嫂、保洁等多种服务项目&#xff0c;以及…

【vue3】基础知识点-pinia

学习vue3&#xff0c;都会从基础知识点学起。了解setup函数&#xff0c;ref&#xff0c;recative&#xff0c;watch、computed、pinia等如何使用 今天说vue3组合式api&#xff0c;pinia 戳这里&#xff0c;跳转pinia中文文档 官网的基础示例中提供了三种写法 1、选择式api&a…

性能测试场景分析并设计?超细案例讲解

前言 性能测试场景&#xff0c;其实和功能测试没什么区别&#xff0c;只是侧重点不同。 我们在功能测试中经常用到的等价类边界值等分析和设计测试case的方法&#xff0c;目的是为了尽可能的覆盖业务场景&#xff0c;避免遗漏导致的功能逻辑缺失或者未达到预期。 而在性能测试…

【C++】初识模板

C模板入门 一、泛型编程 二、函数模板1. 函数模板的概念2. 函数模板格式3. 函数模板的原理4. 函数模板的实例化5. 模板参数的匹配原则 三、类模板 一、泛型编程 假设我们想实现一个交换函数&#xff0c;并且支持不同类型的参数实现&#xff0c;我们可以用 typedef 将类型进行重…

V2MOM工作法

V2MOM分别代表愿景&#xff08;vision&#xff09;、价值&#xff08;values&#xff09;、方法&#xff08;methods&#xff09;、障碍&#xff08;obstacles&#xff09;、衡量指标&#xff08;measurement&#xff09;。 第一&#xff0c;我真正想要的是什么呢&#xff1f;这…

ubuntu磁盘管理

show partition information 挂载设备在这 显示文件系统信息 build file system mkfs -t ext4 /dev/nvme0n1p4命令作用&#xff1a;将/dev/nvme0n1p4 格式化为 ext4 建立交换分区 mkswap -c -v1 /dev/nvme0n1p4 102400-c&#xff1a;check -v1&#xff1a;新版交换分区 -v0&…

四、web应用程序技术——HTTP

文章目录 1 HTTP请求2 HTTP响应3 HTTP方法4 URL5 HTTP消息头5.1 常用消息头5.2 请求消息头5.3 响应消息头 6 cookie7 状态码8 HTTP代理9 HTTP身份验证 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是访问万维网使用的核心通信协议&…

Linux 1.2.13 -- IP分片重组源码分析

Linux 1.2.13 -- IP分片重组源码分析 引言为什么需要分片传输层是否存在分段操作IP分片重组源码分析ip_createip_findip_frag_createip_doneip_glueip_freeip_expireip_defragip_rcv 总结 本文源码解析参考: 深入理解TCP/IP协议的实现之ip分片重组 – 基于linux1.2.13 计网理论…

2023Android面试,如果想卷请继续。备战金九银十

随着移动互联网的快速发展&#xff0c;Android开发岗位竞争也越来越激烈。作为一名Android程序员&#xff0c;面试是进入理想公司的重要一步。本文将分析市场对Android开发岗位的需求&#xff0c;分析2022年的Android开发岗位面试情况&#xff0c;并总结出历年来常见的面试题目…