使用Qemu模拟32位ARM系统
一、环境
实验环境如下:
主机:x86_64
操作系统:Ubuntu 20.04.6 LTS
Qemu版本:QEMU emulator version 4.2.1
Linux内核版本:linux-4.4.240
Busybox版本:busybox-1.35.0
二、前置准备
下载 linux-4.4.240
源码文件: linux-4.4.240
下载 busybox-1.35.0
:busybox-1.35.0
下载 qemu
:
sudo apt install qemu-system-arm
qemu
版本号如下:
QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.30)
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers
可以使用以下命令 qemu-system-arm -M help
查看 qemu
支持哪些 ARM 开发板,本文将选择 vexpress-a9
和 vexpress-a15
开发板进行模拟:
$ qemu-system-arm -M help
Supported machines are:
akita Sharp SL-C1000 (Akita) PDA (PXA270)
ast2500-evb Aspeed AST2500 EVB (ARM1176)
ast2600-evb Aspeed AST2600 EVB (Cortex A7)
borzoi Sharp SL-C3100 (Borzoi) PDA (PXA270)
canon-a1100 Canon PowerShot A1100 IS
cheetah Palm Tungsten|E aka. Cheetah PDA (OMAP310)
collie Sharp SL-5500 (Collie) PDA (SA-1110)
connex Gumstix Connex (PXA255)
cubieboard cubietech cubieboard (Cortex-A8)
emcraft-sf2 SmartFusion2 SOM kit from Emcraft (M2S010)
highbank Calxeda Highbank (ECX-1000)
imx25-pdk ARM i.MX25 PDK board (ARM926)
integratorcp ARM Integrator/CP (ARM926EJ-S)
kzm ARM KZM Emulation Baseboard (ARM1136)
lm3s6965evb Stellaris LM3S6965EVB
lm3s811evb Stellaris LM3S811EVB
mainstone Mainstone II (PXA27x)
mcimx6ul-evk Freescale i.MX6UL Evaluation Kit (Cortex A7)
mcimx7d-sabre Freescale i.MX7 DUAL SABRE (Cortex A7)
microbit BBC micro:bit
midway Calxeda Midway (ECX-2000)
mps2-an385 ARM MPS2 with AN385 FPGA image for Cortex-M3
mps2-an505 ARM MPS2 with AN505 FPGA image for Cortex-M33
mps2-an511 ARM MPS2 with AN511 DesignStart FPGA image for Cortex-M3
mps2-an521 ARM MPS2 with AN521 FPGA image for dual Cortex-M33
musca-a ARM Musca-A board (dual Cortex-M33)
musca-b1 ARM Musca-B1 board (dual Cortex-M33)
musicpal Marvell 88w8618 / MusicPal (ARM926EJ-S)
n800 Nokia N800 tablet aka. RX-34 (OMAP2420)
n810 Nokia N810 tablet aka. RX-44 (OMAP2420)
netduino2 Netduino 2 Machine
none empty machine
nuri Samsung NURI board (Exynos4210)
palmetto-bmc OpenPOWER Palmetto BMC (ARM926EJ-S)
raspi2 Raspberry Pi 2
realview-eb ARM RealView Emulation Baseboard (ARM926EJ-S)
realview-eb-mpcore ARM RealView Emulation Baseboard (ARM11MPCore)
realview-pb-a8 ARM RealView Platform Baseboard for Cortex-A8
realview-pbx-a9 ARM RealView Platform Baseboard Explore for Cortex-A9
romulus-bmc OpenPOWER Romulus BMC (ARM1176)
sabrelite Freescale i.MX6 Quad SABRE Lite Board (Cortex A9)
smdkc210 Samsung SMDKC210 board (Exynos4210)
spitz Sharp SL-C3000 (Spitz) PDA (PXA270)
swift-bmc OpenPOWER Swift BMC (ARM1176)
sx1 Siemens SX1 (OMAP310) V2
sx1-v1 Siemens SX1 (OMAP310) V1
terrier Sharp SL-C3200 (Terrier) PDA (PXA270)
tosa Sharp SL-6000 (Tosa) PDA (PXA255)
verdex Gumstix Verdex (PXA270)
versatileab ARM Versatile/AB (ARM926EJ-S)
versatilepb ARM Versatile/PB (ARM926EJ-S)
vexpress-a15 ARM Versatile Express for Cortex-A15
vexpress-a9 ARM Versatile Express for Cortex-A9
virt-2.10 QEMU 2.10 ARM Virtual Machine
virt-2.11 QEMU 2.11 ARM Virtual Machine
virt-2.12 QEMU 2.12 ARM Virtual Machine
virt-2.6 QEMU 2.6 ARM Virtual Machine
virt-2.7 QEMU 2.7 ARM Virtual Machine
virt-2.8 QEMU 2.8 ARM Virtual Machine
virt-2.9 QEMU 2.9 ARM Virtual Machine
virt-3.0 QEMU 3.0 ARM Virtual Machine
virt-3.1 QEMU 3.1 ARM Virtual Machine
virt-4.0 QEMU 4.0 ARM Virtual Machine
virt-4.1 QEMU 4.1 ARM Virtual Machine
virt QEMU 4.2 ARM Virtual Machine (alias of virt-4.2)
virt-4.2 QEMU 4.2 ARM Virtual Machine
witherspoon-bmc OpenPOWER Witherspoon BMC (ARM1176)
xilinx-zynq-a9 Xilinx Zynq Platform Baseboard for Cortex-A9
z2 Zipit Z2 (PXA27x)
一个开发板可能支持不同的CPU,可以通过以下命令查看对应的开发板 vexpress-a9
支持哪些CPU:
$ qemu-system-arm -M vexpress-a9 --cpu help
Available CPUs:arm1026arm1136arm1136-r2arm1176arm11mpcorearm926arm946cortex-a15cortex-a7cortex-a8cortex-a9cortex-m0cortex-m3cortex-m33cortex-m4cortex-r5cortex-r5fmaxpxa250pxa255pxa260pxa261pxa262pxa270-a0pxa270-a1pxa270pxa270-b0pxa270-b1pxa270-c0pxa270-c5sa1100sa1110ti925t
安装交叉编译工具链
sudo apt-get install crossbuild-essential-armhf
工具链版本如下:
$ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
交叉编译 ARM32 Linux内核
cd linux-4.4.420/
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- O=build vexpress_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- O=build -j8
说明:
ARCH
:指定目标CPU架构;CROSS_COMPILE
:指定交叉编译器;O=build
:O是Out的缩写,表示编译输出文件放在build目录,不跟源码混在一起,保持源码的整洁性;- 要模拟
vexpress
开发板,所以选择vexpress_defconfig
配置文件(对应原厂默认内核配置文件arch/arm/configs/vexpress_defconfig
),make 的过程会根据原厂默认配置文件生成可直接用于编译的内核配置文件.config
。
查看下内核编译出来的原始内核文件 vmlinux
,是ARM 32-bit版本:
$ file build/vmlinux
build/vmlinux: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, BuildID[sha1]=1d1a062137cad67734d7da3c441fbda869a74e59, with debug_info, not stripped
vmlinux
不能直接引导Linux系统启动,能引导Linux系统启动的是 bzImage
文件,由 vmlinux
经objcopy
处理后的二进制内核映像,下文用到的内核镜像就是 bzImage
:
$ file build/arch/arm/boot/zImage
build/arch/arm/boot/zImage: ARM OpenFirmware FORTH Dictionary, Text length: -509607936 bytes, Data length: -509607936 bytes, Text Relocation Table length: -369098749 bytes, Data Relocation Table length: 24061976 bytes, Entry Point: 0x00000000, BSS length: 3505288 bytes
同时也会生成多个 vexpress
开发板的设备树文件,分别对应前文 ARM Versatile Express提到的三种开发板:
$ ls -l build/arch/arm/boot/dts/vexpress*.dtb
-rw-rw-r-- 1 wurusai wurusai 18770 3月 30 13:56 build/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dtb
-rw-rw-r-- 1 wurusai wurusai 13092 3月 30 13:56 build/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dtb
-rw-rw-r-- 1 wurusai wurusai 12714 3月 30 13:56 build/arch/arm/boot/dts/vexpress-v2p-ca5s.dtb
-rw-rw-r-- 1 wurusai wurusai 14360 3月 30 13:56 build/arch/arm/boot/dts/vexpress-v2p-ca9.dtb
交叉编译 ARM32 Busybox
BusyBox
将许多常见UNIX实用程序的微型版本组合到单个小型可执行文件中。用来代替通常在 GNU fileutils,shellutils
等大多数实用程序。BusyBox
中的实用程序通常比其功能齐全的GNU表亲少一些选项。但是,所包含的选项提供了预期的功能,并且其行为与GNU对应项非常相似。BusyBox
为任何小型或嵌入式系统提供了一个相当完整的环境。
$ cd busybox-1.35.0/
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
在 menuconfig
菜单中:
- 选中
Settings –> Build Options –> [*] Build static binary(no share libs)
; - 取消勾选
Shells ---> [ ] Job control
;
接着继续进行编译安装:
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j 8
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- install
安装完后会默认安装到源码目录的 _install/
目录下:
$ ls _install/
bin linuxrc sbin usr
最关键的就是 _install/bin/busybox
,其他都是链接文件:
$ file _install/bin/busybox
_install/bin/busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, BuildID[sha1]=742ae0c792359d80187b66b73e21511b9df9a880, for GNU/Linux 3.2.0, stripped
三、准备启动
方式一
使用busybox制作initramfs
创建虚拟 rootfs
中的 init
启动脚本,并赋予可执行权限:
$ cd busybox-1.35.0/_install/
$ mkdir proc sys dev tmp
$ touch init
$ chmod +x init
init
脚本内容如下:
#!/bin/sh# 挂载一些必要的文件系统
mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs none /tmp
mount -t devtmpfs none /devecho
echo "Hello 32-bit ARM Linux"# 显示开机消耗时间
echo "This boot took $(cut -d' ' -f1 /proc/uptime) seconds"
echo# 停留在控制台
exec /bin/sh
制作 initramfs
文件,它是多个文件通过 cpio
打包和 gzip
压缩的文件,是一个 cpio
格式的内存文件系统:
$ find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.cpio.gz
打包出来的文件如下:
使用QEMU启动ARM32 Linux内核
1.模拟 vexpress-a9
开发板
vexpress-a9
开发板,其处理器是 32-bit 的 Cortex-A9
,4核。
以字符界面方式启动QEMU(不启动图形界面),同时日志输出到控制台:
$ qemu-system-arm \-M vexpress-a9 \-cpu cortex-a9 \-smp 4 \-m 1G \-nographic \-kernel ./linux-4.4.420/build/arch/arm/boot/zImage \-dtb ./linux-4.4.420/build/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \-initrd ./busybox-1.35.0/initramfs.cpio.gz \-append "init=/init console=ttyAMA0"
QEMU参数说明(更多可参考:Standard options):
-M
:指定模拟的开发板,可通过qemu-system-arm -M help
查看;-cpu
:指定模拟的cpu,可通过qemu-system-arm -M vexpress-a9 --cpu help
查看;-smp
:指定cpu核数量,启动后可以使用nproc
命令核对,vexpress-a9
最多只支持4核,可少不可多,超过启动会报错;-m
:指定内存大小,vexpress-a9
最大支持1GB
,可少不可多 ,超过启动会报错,启动后可以使用free -h
命令核对;-kernel
:指定启动的内核镜像;-initrd
:指定启动的内存文件系统;-append
:传递给内核的启动参数;启动后可使用cat /proc/cmdline
命令核对;-nographic
:启动字符界面(不启动图形界面),输出重定向到宿主机命令行,与参数console=ttyAMA0
组合使用。
2.模拟 vexpress-a15
开发板
以字符界面方式启动QEMU(不启动图形界面),同时日志输出到控制台:
$ qemu-system-arm \-M vexpress-a15 \-cpu cortex-a15 \-smp 2 \-m 2G \-nographic \-kernel ./linux-4.4.420/build/arch/arm/boot/zImage \-dtb ./linux-4.4.420/build/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dtb \-initrd ./busybox-1.35.0/initramfs.cpio.gz \-append "init=/init console=ttyAMA0"
说明:
vexpress-a15
的CPU数最多支持2核,-smp
配置超过启动不会报错,但启动后只能看到2核;vexpress-a15
的内存最大支持2G,-m
配置超过启动不会报错,但启动后只能看到2G
内存。
问题
在使用 QEMU 启动 Linux 内核时,如果通过 -initrd
参数直接加载一个预先打包好的 initramfs.cpio.gz
作为根文件系统(如你的命令所示),那么默认情况下 所有文件操作都仅在内存中进行,关闭 QEMU 后修改会丢失 。
当前方案的限制
- initramfs
是一个临时内存文件系统,所有文件在启动时解压到内存中,运行时修改仅影响内存副本,不会回写到原始的 .cpio.gz
文件。
- 如果在 QEMU 中通过 touch /newfile
或 rm /file
修改文件系统,这些改动仅在本次运行中有效。关闭 QEMU 后,下次启动仍会从原始的 .cpio.gz
文件加载初始状态。若想保留修改,必须重新打包 initramfs
并重启。
实验
1.先启动 qemu
2.尝试创建 /home
目录,创建一个文件 a.txt
3.退出后重新启动 qemu
由此可见之前的修改并没有生效!
方式二(推荐)
busybox 初始化配置
BusyBox
的编写考虑了尺寸的优化和有限的资源。它也是非常模块化的,因此可以在编译时轻松地包含或排除命令(或功能)。这使自定义嵌入式系统变得容易。要创建一个工作系统,只需在 /dev
中添加一些设备节点,在 /etc
中添加一些配置文件,以及一个 Linux
内核。
解压后编译 busybox
:
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- install
编译完成后在 busybox
目录下生成了 _intall
目录,将作为我们构建根文件系统的目录,在根文件系统目录下补充一些内容。 增加以下目录:
执行命令:
mkdir {etc,proc,sys,tmp,dev,lib}
etc
:主要存放一些配置文件如:inittab
(init
进程会解析此文件,看进一步动作);fstab
(主要包含一些挂载的文件系统,如sys proc
)init.rd/rcS
(可存放一些可执行脚本,配合inittab
使用)proc
:proc
文件系统挂载点sys
:sys
文件系统挂载点tmp
:tmp
文件系统挂载点dev
: 设备文件lib
: 库文件目录(如果busybox采用动态链接库,则需要将交叉编译链的库文件拷这里)
注意:本文采用的是静态链接库,所以不需要拷贝库到这个 lib
目录下。但是静态链接库,会占用更多的内存。
去 dev
目录下静态创建如下节点:
sudo mknod -m 666 tty1 c 4 1
sudo mknod -m 666 tty2 c 4 2
sudo mknod -m 666 tty3 c 4 3
sudo mknod -m 666 tty4 c 4 4
sudo mknod -m 666 console c 5 1
sudo mknod -m 666 null c 1 3
console
和 null
是必须的,如果没有则会报错。
etc/inittab
文件内容如下,可参考 busyboxdir/examples/inittab
编写:
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
::restart:/sbin/init
tty2::askfirst:/bin/sh
tty3::askfirst:/bin/sh
tty4::askfirst:/bin/sh
etc/fstab
文件内容如下,主要目的是指明一些文件系统挂载点:
#device mount-point type option dump fsck order
proc /proc proc defaults 0 0
#temps /tmp rpoc defaults 0 0
none /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
mdev /dev ramfs defaults 0 0
etc/init.d/rcS
文件内容如下,inittab
第一条指明了从 rcS
中去执行脚本
#!/bin/sh
mount -a
echo "/sbin/mdev" > /proc/sys/kernel/hotplug
/sbin/mdev -s # 根据/etc/mdev.conf中的配置进行生成设备节点
mount -a
最后修改 rcS
的权限:
chmod 777 etc/init.d/rcS
创建根文件系统
使用 dd
命令创建一个空白的 512M
(根据实际情况)文件:
dd if=/dev/zero of=rootfs.ext3 bs=1M count=512
将该空白文件格式化为 ext3
格式(内核默认支持文件系统,如果使用其他需要配置内核):
mkfs.ext3 rootfs.ext3
将该空白文件,挂载在一个目录下:
mkdir rootfs
sudo mount -o loop rootfs.ext3 ./rootfs
将 busybox
构建的根文件系统拷贝到挂载点下,然后再卸载:
sudo cp -rf busybox-1.35.0/_install/* ./rootfs
sudo umount rootfs
使用QEMU启动ARM32 Linux内核
执行以下命令启动:
qemu-system-arm \-M vexpress-a9 \-kernel ./linux-4.4.240/build/arch/arm/boot/zImage \-nographic \-m 512M \-smp 4 \-dtb ./linux-4.4.240/build/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \-sd rootfs.ext3 \-append "init=/linuxrc root=/dev/mmcblk0 rw rootwait earlyprintk console=ttyAMA0"
上述命令:
-M
指定了目标板;-kernel
指定了linux内核镜像;-nographic
指定无图形显示;-m 512M
指定了运行内存大小;-smp
指定4核;-sd
指定了外部有1个sd
卡,卡内是rootfs.ext3
镜像文件;-dtb
指定了设备树文件;-append
指定了bootargs
;bootargs
中init=/linuxrc
指定了init
进程是根文件系统下的linuxrc
(busybox生成),root=/dev/mmcblk0
指定了根文件系统为sd
卡,console
指定了ttyAMA0
,即控制台。
四、参考
- QEMU启动ARM32 Linux内核
- 使用qemu运行自己编译的arm内核
相关文章:
使用Qemu模拟32位ARM系统
一、环境 实验环境如下: 主机:x86_64 操作系统:Ubuntu 20.04.6 LTS Qemu版本:QEMU emulator version 4.2.1 Linux内核版本:linux-4.4.240 Busybox版本:busybox-1.35.0二、前置准备 下载 linux-4.4.240 源…...
【初阶数据结构】栈
文章目录 一、概念与结构 二、栈的实现 栈的定义 1.初始化 2.入栈 3.判断栈是否为空 4.出栈 5.取栈顶元素 6.获取栈中有效元素个数 2.销毁 三、完整码源 总结 一、概念与结构 栈: 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据…...
docker-compose部署prometheus+grafana+node_exporter
目录 docker-compose文件 配置文件 文件层级关系,docker-compose和配置文件位于同级目录 node_exporter页面json文件 涉及离线包 一.docker-compose文件 [rootsulibao prometheus]# cat docker-compose.yml version: 3services:prometheus:image: registry.c…...
maya调整全局关节显示大小
请按以下步骤操作: 在 Maya 主菜单栏中,找到 Display (显示) 菜单。 在 Display 菜单下,找到 Animation (动画) 子菜单。 在 Animation 子菜单中,点击 Joint Size... (关节大小...)。 这时会弹出一个小窗口或者直接在界面上出现…...
“屏幕“的实现_程序中如何将数据映射到硬件_C++实战
前言 程序里的数据,最后都需要将数据对象写入硬件.C/C最大的优势体现也是在这里,他既是高级语言方便被程序员使用,又能和硬件沟通. 引入 以"屏幕"的实现,总结数据映射到硬件的代码写法 分析 软件部分 1.屏幕是数据对象---一切都是数据,一切都是对象;数据有类型,屏…...
R --- Error in library(***) : there is no package called ‘***’ (服务器非root用户)
步骤 步骤一:在自己目录下创建R包安装路径步骤二:配置用户本地的R库路径步骤三:安装缺失的包(在终端)步骤四:验证安装 步骤一:在自己目录下创建R包安装路径 mkdir -p ~/R_libs步骤二࿱…...
Go中的逃逸分析
什么是逃逸? 逃逸是指一个变量本来应该分配在栈(stack)上,但由于某些原因,最终被分配到了堆(heap)上。 类比: 栈就像一个临时的快餐盒,用来存放短期使用的数据。堆就像…...
解决 Android AGP 最新版本中 BuildConfig 报错问题
在最新版本的 Android Gradle Plugin (AGP) 中,Google 对构建系统做了不少改动,可能会导致一些与 BuildConfig 相关的问题。以下是常见问题及解决方案: 常见问题及修复方法 1. BuildConfig 类完全缺失 原因:AGP 8.0 默认不再为库模…...
Rollup系列之安装和入门
Rollup Rollup.js的主要用途是将小的代码片段编译成更大、更复杂的代码,例如库或应用程序。它特别适用于将ES模块编译成不同的模块形式,如AMD、CommonJS、UMD等,以便在不同的环境中使用。 Rollup的应用场景与好处: 插件或…...
Kafka 4.0 发布:KRaft 替代 Zookeeper、新一代重平衡协议、点对点消息模型、移除旧协议 API
KRaft 全面替代 ZooKeeper Apache Kafka 4.0 是一个重要的里程碑,标志着第一个完全无需 Apache ZooKeeper 运行的主要版本。 通过默认运行在 KRaft 模式下,Kafka 简化了部署和管理,消除了维护单独 ZooKeeper 集群的复杂性。 这一变化显著降…...
MQTT之重复消息(6、在项目中遇到的问题)
项目背景: 在 Spring Boot MQTT 5.0 环境中,RTU设备向SpringBoot平台发送心跳数据、业务监控数据。同时SpringBoot平台可以向RTU设备下发指令,RTU在执行完指令之后向平台发送响应数据。 问题一、SpingBoot平台发送指令给RTU设备,RTU设备能够…...
8、linux c 信号机制
一、信号概述 1. 信号概念 信号是一种在软件层次上对中断机制的模拟,是一种异步通信方式。信号的产生和处理都由操作系统内核完成,用于在进程之间传递信息或通知某些事件的发生。 2. 信号的产生 信号可以通过以下方式产生: 按键产生&…...
Set,Map,WakeSet,WakeMap
简介 Set、Map、WeakMap 和 WeakSet 是 ES6 引入的高级数据结构,它们的底层实现和特性与传统的对象和数组有显著差异 强弱引用了解: link Set Set对象 是一种用于存储 唯一值 的可迭代集合,可存储任意类型的值(原始值、对象引用等&…...
NSSCTF(MISC)—[HITCTF 2021]PNG
相应的做题地址:https://www.nssctf.cn/problem/819 import zlib from Crypto.Cipher import AES import base64 def decode(data, key, iv): cipher AES.new(key, AES.MODE_CBC, iv) decryptByts base64.b64decode(data) msg cipher.decrypt(decryptByts) msgs…...
只出现一次的数字
这个题目动了点脑筋,由于它们时无序的,所以我们如果去找的话比较费劲,可能要循环嵌套再嵌套,所以我们先利用库中自带的sort函数进行排序,把这些数从小到大以此排列,然后我们进行判断哪个数出现了一次即可。…...
【编程中的框架】
编码中常用的框架及其使用方法和好处 框架(Framework)是一种为解决特定问题而设计的软件架构,它提供了一组预定义的组件、模式和工具,帮助开发者更高效地构建应用程序。框架通常不仅仅是方法库,它们提供了一种结构化的…...
Python-常用关键字
基础值 1. False - 意义:布尔类型假值(首字母大写) - 用法示例: if condition is False: print("条件为假") 2. True - 意义:布尔类型真值(首字母大写) - 用法示例&…...
【计算机网络】DHCP工作原理
DHCP(动态主机配置协议) Dynamic Host Configuration Protocol 基于UDP协议传输 DHCP分配IP地址的过程 (1)DHCP DISCOVER客户机请求 IP 地址: 当一个 DHCP 客户机启动时,客户机还没有 IP 地址,所以客户机要通过 DHC…...
python 原型链污染学习
复现SU的时候遇到一道python原型链污染的题,借此机会学一下参考: 【原型链污染】Python与Jshttps://blog.abdulrah33m.com/prototype-pollution-in-python/pydash原型链污染 文章目录 基础知识对父类的污染命令执行对子类的污染pydash原型链污染打污染的…...
量子计算:未来计算技术的革命性突破
在当今科技飞速发展的时代,量子计算正逐渐从理论走向实践,成为计算技术领域最具潜力的革命性突破之一。与传统计算机基于二进制的计算方式不同,量子计算利用量子比特(qubit)的叠加和纠缠特性,能够在处理复杂…...
Maven:Java项目构建与依赖管理工具
Maven 是什么 Maven 将项目开发过程和管理过程抽象成一个项目对象模型(POM),本质上是一个项目管理工具。Maven 主要用于Java项目的依赖管理、编译、测试、打包和部署等操作。 Maven的核心设计围绕标准化和自动化,通过一系列约定和…...
内积相似系数——内积度量相似系数
内积与相似系数 内积(Inner Product) 内积(Inner Product),也称为点积(Dot Product)或标量积,两个向量点积的结果是一个标量(通常是实数或复数)。 内积&…...
问题:md文档转换word,html,图片,excel,csv
文章目录 问题:md文档转换word,html,图片,excel,csv,ppt**主要职责****技能要求****发展方向****学习建议****薪资水平** 方案一:AI Markdown内容转换工具打开网站md文档转换wordmd文档转换pdfm…...
GET 和 POST 有什么区别
GET 和 POST 是 HTTP 协议中两种最常见的请求方法,它们在用途、安全性、数据传递方式等方面有显著的区别。以下是它们的主要区别: 1. 用途 • GET: • 用于从服务器获取资源(数据)。 • 是一种无状态的操作…...
AI Agent 人工智能相关公开比赛汇总
参与 AI 相关比赛是提升技术能力、接触前沿算法、积累项目经验的绝佳方式。以下是全球知名的比赛,以及适合不同水平选手的竞赛分类。 1. 全球知名 AI & 计算机竞赛 (1) Kaggle 竞赛(Kaggle Competitions) 简介:全球最知名的…...
Java 多线程编程之 Object.wait 方法(工作原理、高级特性、notify 方法与 notifyAll 方法)
一、wait 方法 1、基本介绍 wait 方法是 Java 中每个对象都拥有的方法,它继承自 Object 类 wait 方法使当前线程进入等待状态,直到其他线程调用该对象的 notify 方法或 notifyAll 方法 wait 方法必须在同步代码块中使用,否则抛出 Interrup…...
python下载m3u8格式视频
一、安装 m3u8库 pip install requests pip install requests m3u8 二、编码实现 import os import re import requests import subprocess# 下载ts文件 def down_ts_file(base_url, m3u8_url, download_dir):# 从m3u8文件中获取所有ts的分片名称信息response requests.get…...
3.30 代码随想录第三十天打卡
准备:01背包理论基础(二维) 1.有n个物品每个物品只有一个 2.完全背包是有n个物品每个物品有无限多个 3.多重背包是有n个物品每种物品个数各不相同 (1)题目描述: (2)解题思路; 1…...
01 相机标定与相机模型介绍
学完本文,您将了解不同相机模型分类、内参意义,及对应的应用代码模型 标定的意义 建模三维世界点投影到二维图像平面的过程。标定输出的是相机模型。 相机模型 相机模型可以解理解为投影模型 +...
鸿蒙学习手册(HarmonyOSNext_API16)_应用开发UI设计:相对布局
概述 RelativeContainer 就像个「智能拼图板」,帮你把界面组件像拼图一样自由组合,不用一层套一层地堆叠。每个组件可以直接「贴」到其他组件旁边或容器边缘,省去多层嵌套的麻烦,让复杂界面更高效。 举个接地气的例子 dz…...
关于为什么使用redis锁,不使用zk锁的原因
实际项目中,redis一直是最为稳定、可靠的部分,你根本不用担心redis本身的问题。至于ap模型的问题,绝大多数分布式锁只是用于避免一些极端情况的,若单一数据会有那么高的并发量你还加锁,那就要考虑这个业务场景设置的合…...
string的基本使用
C基础格式 C语言语法STL。蓝桥杯选用C11的版本。 #include <bits/stdc.h> #include <iostream> using namespace std; int main() {cout<<"Hello World!"<<endl;printf("Hello World!");return 0; } 基本数据类型 #include &l…...
论文阅读笔记——PointVLA: Injecting the 3D World into Vision-Language-Action Models
PointVLA 论文 现有的 VLA 基于 2D 视觉-语言数据表现良好但缺乏 3D 几何先验导致空间推理缺陷。传统方案:1)3D->2D 投影,造成几何信息损失;2)3D 数据集少。PointVLA 保留原有 VLA,提取点云特征…...
MySQL数据库精研之旅第四期:解锁库操作高阶技能
专栏:MySQL数据库成长记 个人主页:手握风云 目录 一、查看所有表 1.1. 语法 二、创建表 2.1. 语法 2.2. 示例 2.3. 表在磁盘上对应的⽂件 三、查看表结构 3.1. 语法 3.2. 示例 四、修改表 4.1. 语法 4.2. 示例 五、删除表 5.1. 语法 5.2.…...
自定义一个C语言字符串取整函数
一、字符串取整的主要思路 1、遍历每个字符; 2、获得0到9的字符对应的整数值; 3、把对应位置的十进制权重相乘; 4、把所有的相乘结果相加; 5、返回相加结果; 二、主要代码 // 主要是把十进制的整数字符转成十进制变量值…...
Ruby 命令行选项
Ruby 命令行选项 概述 Ruby 是一种广泛使用的编程语言,它拥有强大的命令行工具,可以帮助开发者进行各种任务。了解 Ruby 的命令行选项对于提高开发效率至关重要。本文将详细介绍 Ruby 的常用命令行选项,帮助开发者更好地利用 Ruby 的命令行功能。 Ruby 命令行选项概述 R…...
3.29:数据结构-绪论线性表-上
一、时间复杂度 1、ADT 2、定义法计算时间复杂度:统计核心语句的总执行次数 (1)例题1,与2022年的真题对比着写 此题关键在于求和公式的转化,类型为:线性循环嵌套非线性循环 2022年那道题如果考场上实在脑…...
【百日精通 JAVA | SQL篇 | 第一篇】初识数据库
一、数据库是什么? 数据库是一类软件,数据库的作用用于管理系统(这是一款成品软件,内部应用了很多数据结构)。 二、数据库分为两大类 1.关系型数据库 对于数据的要求比较严格 通常是以表格的方式来组织数据的。(和Excel差不多) 典型代表…...
yum repolist all全部禁用了 怎么办
文章目录 步骤思考解决yum仓库全部被禁用的问题步骤思考: 检查仓库状态:运行yum repolist all,查看所有仓库的启用状态。 被禁用的仓库会显示为disabled。 启用所有仓库:可以逐一启用,或者使用命令批量启用。 例如使用yum-config-manager --enable ‘*’,但需要注意是否有…...
gnvm切换node版本号
1. gnvm下载官网 GNVM - Node.js version manager on Windows by Go 2. 安装 2.1 不存在 Node.js 环境 下载并解压缩 gnvm.exe 保存到任意文件夹,并将此文件夹加入到环境变量 Path。 2.2 存在 Node.js 环境 下载并解压缩 gnvm.exe 保存到 Node.js 所在的文件夹。 2.…...
maven高级
1.分模块开发与设计 理解并实现分模块开发 能够使用聚合工程快速构建项目 能够使用继承简化项目配置 能够根据需求配置生成、开发、测试环境,并在各个环境间切换运行 了解Maven的私服 1.1分模块开发:将别人写好的功能或是包直接使用, 引入依赖…...
MyBatis-Plus 多数据源配置与读写分离实战
一、引言 在实际的项目开发中,我们常常会遇到需要操作多个数据库的情况,比如纯粹多库、读写分离、一主多从、混合模式等。本文将详细介绍如何使用 MyBatis-Plus 实现纯粹多库的场景,并探讨读写分离的实现思路。 二、环境准备 开发工具&…...
pip install cryptacular卡住,卡在downloading阶段
笔者安装pip install cryptacular卡在downloading阶段,但不知道为何 Collecting cryptacularCreated temporary directory: /tmp/pip-unpack-qfbl8f08http://10.170.22.41:8082 "GET http://repo.huaweicloud.com/repository/pypi/packages/42/69/34d478310d6…...
Baklib解析企业内容管理与内容中台核心差异
企业内容管理技术架构解析 在企业数字化进程中,企业内容管理系统(ECM)以结构化技术框架为核心,通过文档全生命周期管理与元数据控制实现内容资产的高效治理。其架构通常包含分布式存储引擎、多层级权限体系及标准化工作流模块&am…...
力扣每日一题:2716——最小化字符串长度
2716——最小化字符串长度 题目示例示例 1示例 2示例 3 题解理解 题目 给你一个下标从 0 开始的字符串 s ,重复执行下述操作任意次: 在字符串中选出一个下标i ,并使 c 为字符串下标i处的字符。并在 i 左侧(如果有)和…...
掌握正则表达式:从基础到实用示例
目录 一、简单谈谈正则 二、基础知识学习 (一)正则元字符 1.特殊单字符 2.空白符 3.量词 4.范围备和选项 综合练习 (二)贪婪、非贪婪与独占模式 1.贪婪模式 2.非贪婪模式(懒惰模式) 3.独占模式…...
Python 中列表(List)、元组(Tuple)、集合(Set)和字典(Dict)四大数据结构的完整对比
以下是 Python 中列表(List)、元组(Tuple)、集合(Set)和字典(Dict)四大数据结构的完整对比分析,结合了核心特性、操作方式和应用场景的深度总结: 一、核心特性…...
LK光流和特征点的关系
uv方程 光流有两个假设: 1.亮度恒定,即图像相同位置的灰度短时不变。两帧中对应像素灰度/亮度相同 2.时间持续性(微小移动),这意味着时间的变化不会引起像素位置的剧烈变化,这样像素的灰度值才能对位置求…...
Rocky Linux 9.5中完美迁移mysql5.6.17到mysql5.7.11
首先Rocky Linux 9.5中,默认官方建议使用的是mysql8.0,项目要兼容以往数据,经过测试跟mysql5.7.11能做兼容。 一:工具准备以及安装步骤 1、官网下载地址:https://downloads.mysql.com/archives/community/ 下载版本…...
练习题:113
目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 定义列表: for 循环遍历列表: 输出元素: 运行思路 结束语 Python题目 题目 使用for循环遍历一个列表并输出每个元素。 题目分析 需求理…...