Qemu arm操作系统开发环境

news2025/6/13 6:28:38

使用qemu虚拟arm硬件比较合适。

步骤如下:

  1. 安装qemu
apt install qemu-system
  1. 安装aarch64-none-elf-gcc

需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-elf.tar.xz?rev=a05df3001fa34105838e6fba79ee1b23&hash=DCB97F9E407955B162E4652F4E78B6CCDF75E4FF

下载后无需编译。下载完虎,执行如下命令设置编译环境:

vim ~/.bashrc

export PATH=$PATH:/home/ljg/aarch/arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-elf/aarch64-none-elf/bin

source ~/.bashrc
  1. 编译uart.c源文件

代码:

void outputstr(char * str){

        int * base = (int*)0x9000000;
        while(*str){
                *base = (int)*str;
               str++;
        }
}

int main(){
        outputstr("hello world!\r\n");

        return 0x12345678;
}

在这里插入图片描述

命令:

aarch64-none-elf-gcc -I -include -c uart.c -o uart.o
  1. 编写start.s汇编源文件

代码:


.global _start

_start:
ldr x30,=stack_top
mov sp,x30
bl main
b .

在这里插入图片描述

命令:

aarch64-none-elf-as -c start.s -o start.o
  1. 链接

链接脚本文件:


ENTRY(_start)
SECTIONS
{
        . = 0x40000000;
        .startup . : {start.o(.text)}
        .text :{*(.text)}
        .data : {*(.data)}
        .bss : {*(.bss COMMON)}
        . = ALIGN(8);
        . = .+0x1000;
        stack_top = .;
}

在这里插入图片描述

命令:

aarch64-none-elf-ld -Tlink.ld  uart.o start.o -o hello.elf
  1. 制作镜像文件。

aarch64-none-elf-objcopy -O binary hello.elf hello.bin
  1. 运行测试
qemu-system-aarch64 -M virt -cpu cortex-a710 -monitor none -kernel hello.bin

或者:

qemu-system-aarch64 -M virt -cpu cortex-a710 -monitor none -nographic -serial stdio -kernel hello.bin

在这里插入图片描述

在这里插入图片描述
virt虚拟机设备树:


		
Working FDT set to 6000000
/ {
	interrupt-parent = <0x00008002>;
	model = "linux,dummy-virt";
	#size-cells = <0x00000002>;
	#address-cells = <0x00000002>;
	compatible = "linux,dummy-virt";
	psci {
		migrate = <0xc4000005>;
		cpu_on = <0xc4000003>;
		cpu_off = <0x84000002>;
		cpu_suspend = <0xc4000001>;
		method = "hvc";
		compatible = "arm,psci-1.0", "arm,psci-0.2", "arm,psci";
	};
	memory@40000000 {
		reg = <0x00000000 0x40000000 0x00000000 0x80000000>;
		device_type = "memory";
	};
	platform-bus@c000000 {
		interrupt-parent = <0x00008002>;
		ranges = <0x00000000 0x00000000 0x0c000000 0x02000000>;
		#address-cells = <0x00000001>;
		#size-cells = <0x00000001>;
		compatible = "qemu,platform", "simple-bus";
	};
	fw-cfg@9020000 {
		dma-coherent;
		reg = <0x00000000 0x09020000 0x00000000 0x00000018>;
		compatible = "qemu,fw-cfg-mmio";
	};
	virtio_mmio@a000000 {
		dma-coherent;
		interrupts = <0x00000000 0x00000010 0x00000001>;
		reg = <0x00000000 0x0a000000 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a000200 {
		dma-coherent;
		interrupts = <0x00000000 0x00000011 0x00000001>;
		reg = <0x00000000 0x0a000200 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a000400 {
		dma-coherent;
		interrupts = <0x00000000 0x00000012 0x00000001>;
		reg = <0x00000000 0x0a000400 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a000600 {
		dma-coherent;
		interrupts = <0x00000000 0x00000013 0x00000001>;
		reg = <0x00000000 0x0a000600 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a000800 {
		dma-coherent;
		interrupts = <0x00000000 0x00000014 0x00000001>;
		reg = <0x00000000 0x0a000800 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a000a00 {
		dma-coherent;
		interrupts = <0x00000000 0x00000015 0x00000001>;
		reg = <0x00000000 0x0a000a00 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a000c00 {
		dma-coherent;
		interrupts = <0x00000000 0x00000016 0x00000001>;
		reg = <0x00000000 0x0a000c00 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a000e00 {
		dma-coherent;
		interrupts = <0x00000000 0x00000017 0x00000001>;
		reg = <0x00000000 0x0a000e00 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a001000 {
		dma-coherent;
		interrupts = <0x00000000 0x00000018 0x00000001>;
		reg = <0x00000000 0x0a001000 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a001200 {
		dma-coherent;
		interrupts = <0x00000000 0x00000019 0x00000001>;
		reg = <0x00000000 0x0a001200 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a001400 {
		dma-coherent;
		interrupts = <0x00000000 0x0000001a 0x00000001>;
		reg = <0x00000000 0x0a001400 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a001600 {
		dma-coherent;
		interrupts = <0x00000000 0x0000001b 0x00000001>;
		reg = <0x00000000 0x0a001600 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a001800 {
		dma-coherent;
		interrupts = <0x00000000 0x0000001c 0x00000001>;
		reg = <0x00000000 0x0a001800 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a001a00 {
		dma-coherent;
		interrupts = <0x00000000 0x0000001d 0x00000001>;
		reg = <0x00000000 0x0a001a00 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a001c00 {
		dma-coherent;
		interrupts = <0x00000000 0x0000001e 0x00000001>;
		reg = <0x00000000 0x0a001c00 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a001e00 {
		dma-coherent;
		interrupts = <0x00000000 0x0000001f 0x00000001>;
		reg = <0x00000000 0x0a001e00 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a002000 {
		dma-coherent;
		interrupts = <0x00000000 0x00000020 0x00000001>;
		reg = <0x00000000 0x0a002000 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a002200 {
		dma-coherent;
		interrupts = <0x00000000 0x00000021 0x00000001>;
		reg = <0x00000000 0x0a002200 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a002400 {
		dma-coherent;
		interrupts = <0x00000000 0x00000022 0x00000001>;
		reg = <0x00000000 0x0a002400 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a002600 {
		dma-coherent;
		interrupts = <0x00000000 0x00000023 0x00000001>;
		reg = <0x00000000 0x0a002600 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a002800 {
		dma-coherent;
		interrupts = <0x00000000 0x00000024 0x00000001>;
		reg = <0x00000000 0x0a002800 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a002a00 {
		dma-coherent;
		interrupts = <0x00000000 0x00000025 0x00000001>;
		reg = <0x00000000 0x0a002a00 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a002c00 {
		dma-coherent;
		interrupts = <0x00000000 0x00000026 0x00000001>;
		reg = <0x00000000 0x0a002c00 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a002e00 {
		dma-coherent;
		interrupts = <0x00000000 0x00000027 0x00000001>;
		reg = <0x00000000 0x0a002e00 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a003000 {
		dma-coherent;
		interrupts = <0x00000000 0x00000028 0x00000001>;
		reg = <0x00000000 0x0a003000 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a003200 {
		dma-coherent;
		interrupts = <0x00000000 0x00000029 0x00000001>;
		reg = <0x00000000 0x0a003200 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a003400 {
		dma-coherent;
		interrupts = <0x00000000 0x0000002a 0x00000001>;
		reg = <0x00000000 0x0a003400 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a003600 {
		dma-coherent;
		interrupts = <0x00000000 0x0000002b 0x00000001>;
		reg = <0x00000000 0x0a003600 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a003800 {
		dma-coherent;
		interrupts = <0x00000000 0x0000002c 0x00000001>;
		reg = <0x00000000 0x0a003800 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a003a00 {
		dma-coherent;
		interrupts = <0x00000000 0x0000002d 0x00000001>;
		reg = <0x00000000 0x0a003a00 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a003c00 {
		dma-coherent;
		interrupts = <0x00000000 0x0000002e 0x00000001>;
		reg = <0x00000000 0x0a003c00 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	virtio_mmio@a003e00 {
		dma-coherent;
		interrupts = <0x00000000 0x0000002f 0x00000001>;
		reg = <0x00000000 0x0a003e00 0x00000000 0x00000200>;
		compatible = "virtio,mmio";
	};
	gpio-keys {
		compatible = "gpio-keys";
		poweroff {
			gpios = <0x00008004 0x00000003 0x00000000>;
			linux,code = <0x00000074>;
			label = "GPIO Key Poweroff";
		};
	};
	pl061@9030000 {
		phandle = <0x00008004>;
		clock-names = "apb_pclk";
		clocks = <0x00008000>;
		interrupts = <0x00000000 0x00000007 0x00000004>;
		gpio-controller;
		#gpio-cells = <0x00000002>;
		compatible = "arm,pl061", "arm,primecell";
		reg = <0x00000000 0x09030000 0x00000000 0x00001000>;
	};
	pcie@10000000 {
		interrupt-map-mask = <0x00001800 0x00000000 0x00000000 0x00000007>;
		interrupt-map = <0x00000000 0x00000000 0x00000000 0x00000001 0x00008002 0x00000000 0x00000000 0x00000000 0x00000003 0x00000004 0x00000000 0x00000000 0x00000000 0x00000002 0x00008002 0x00000000 0x00000000 0x00000000 0x00000004 0x00000004 0x00000000 0x00000000 0x00000000 0x00000003 0x00008002 0x00000000 0x00000000 0x00000000 0x00000005 0x00000004 0x00000000 0x00000000 0x00000000 0x00000004 0x00008002 0x00000000 0x00000000 0x00000000 0x00000006 0x00000004 0x00000800 0x00000000 0x00000000 0x00000001 0x00008002 0x00000000 0x00000000 0x00000000 0x00000004 0x00000004 0x00000800 0x00000000 0x00000000 0x00000002 0x00008002 0x00000000 0x00000000 0x00000000 0x00000005 0x00000004 0x00000800 0x00000000 0x00000000 0x00000003 0x00008002 0x00000000 0x00000000 0x00000000 0x00000006 0x00000004 0x00000800 0x00000000 0x00000000 0x00000004 0x00008002 0x00000000 0x00000000 0x00000000 0x00000003 0x00000004 0x00001000 0x00000000 0x00000000 0x00000001 0x00008002 0x00000000 0x00000000 0x00000000 0x00000005 0x00000004 0x00001000 0x00000000 0x00000000 0x00000002 0x00008002 0x00000000 0x00000000 0x00000000 0x00000006 0x00000004 0x00001000 0x00000000 0x00000000 0x00000003 0x00008002 0x00000000 0x00000000 0x00000000 0x00000003 0x00000004 0x00001000 0x00000000 0x00000000 0x00000004 0x00008002 0x00000000 0x00000000 0x00000000 0x00000004 0x00000004 0x00001800 0x00000000 0x00000000 0x00000001 0x00008002 0x00000000 0x00000000 0x00000000 0x00000006 0x00000004 0x00001800 0x00000000 0x00000000 0x00000002 0x00008002 0x00000000 0x00000000 0x00000000 0x00000003 0x00000004 0x00001800 0x00000000 0x00000000 0x00000003 0x00008002 0x00000000 0x00000000 0x00000000 0x00000004 0x00000004 0x00001800 0x00000000 0x00000000 0x00000004 0x00008002 0x00000000 0x00000000 0x00000000 0x00000005 0x00000004>;
		#interrupt-cells = <0x00000001>;
		ranges = <0x01000000 0x00000000 0x00000000 0x00000000 0x3eff0000 0x00000000 0x00010000 0x02000000 0x00000000 0x10000000 0x00000000 0x10000000 0x00000000 0x2eff0000 0x03000000 0x00000080 0x00000000 0x00000080 0x00000000 0x00000080 0x00000000>;
		reg = <0x00000040 0x10000000 0x00000000 0x10000000>;
		msi-map = <0x00000000 0x00008003 0x00000000 0x00010000>;
		dma-coherent;
		bus-range = <0x00000000 0x000000ff>;
		linux,pci-domain = <0x00000000>;
		#size-cells = <0x00000002>;
		#address-cells = <0x00000003>;
		device_type = "pci";
		compatible = "pci-host-ecam-generic";
	};
	pl031@9010000 {
		clock-names = "apb_pclk";
		clocks = <0x00008000>;
		interrupts = <0x00000000 0x00000002 0x00000004>;
		reg = <0x00000000 0x09010000 0x00000000 0x00001000>;
		compatible = "arm,pl031", "arm,primecell";
	};
	pl011@9000000 {
		clock-names = "uartclk", "apb_pclk";
		clocks = <0x00008000 0x00008000>;
		interrupts = <0x00000000 0x00000001 0x00000004>;
		reg = <0x00000000 0x09000000 0x00000000 0x00001000>;
		compatible = "arm,pl011", "arm,primecell";
	};
	pmu {
		interrupts = <0x00000001 0x00000007 0x00000104>;
		compatible = "arm,armv8-pmuv3";
	};
	intc@8000000 {
		phandle = <0x00008002>;
		reg = <0x00000000 0x08000000 0x00000000 0x00010000 0x00000000 0x08010000 0x00000000 0x00010000>;
		compatible = "arm,cortex-a15-gic";
		ranges;
		#size-cells = <0x00000002>;
		#address-cells = <0x00000002>;
		interrupt-controller;
		#interrupt-cells = <0x00000003>;
		v2m@8020000 {
			phandle = <0x00008003>;
			reg = <0x00000000 0x08020000 0x00000000 0x00001000>;
			msi-controller;
			compatible = "arm,gic-v2m-frame";
		};
	};
	flash@0 {
		bank-width = <0x00000004>;
		reg = <0x00000000 0x00000000 0x00000000 0x04000000 0x00000000 0x04000000 0x00000000 0x04000000>;
		compatible = "cfi-flash";
	};
	cpus {
		#size-cells = <0x00000000>;
		#address-cells = <0x00000001>;
		cpu-map {
			socket0 {
				cluster0 {
					core0 {
						cpu = <0x00008001>;
					};
				};
			};
		};
		cpu@0 {
			phandle = <0x00008001>;
			reg = <0x00000000>;
			compatible = "arm,cortex-a57";
			device_type = "cpu";
		};
	};
	timer {
		interrupts = <0x00000001 0x0000000d 0x00000104 0x00000001 0x0000000e 0x00000104 0x00000001 0x0000000b 0x00000104 0x00000001 0x0000000a 0x00000104>;
		always-on;
		compatible = "arm,armv8-timer", "arm,armv7-timer";
	};
	apb-pclk {
		phandle = <0x00008000>;
		clock-output-names = "clk24mhz";
		clock-frequency = <0x016e3600>;
		#clock-cells = <0x00000000>;
		compatible = "fixed-clock";
	};
	chosen {
		stdout-path = "/pl011@9000000";
		rng-seed = <0x36ea9704 0x0df0b009 0x5a442122 0x709ca37a 0x3beb236b 0x1fed8df1 0xef91ac7e 0x653b2401>;
		kaslr-seed = <0xc809d522 0xf3a4a8e0>;
	};
};


参考链接:

  1. https://blog.csdn.net/jingyu_1/article/details/135631512
  2. https://zhuanlan.zhihu.com/p/16952747762
  3. https://stdrc.cc/post/2021/02/23/u-boot-qemu-virt/
  4. https://zhuanlan.zhihu.com/p/708166648
  5. https://www.qemu.org/docs/master/system/arm/virt.html

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

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

相关文章

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…