当前位置: 首页 > article >正文

Qemu arm操作系统开发环境

使用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 ~/.bashrcexport PATH=$PATH:/home/ljg/aarch/arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-elf/aarch64-none-elf/binsource ~/.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

相关文章:

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

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;详解 …...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

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

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

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

【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 庞大代码库的智能桥梁…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

脑机新手指南(七):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…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

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;增…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

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

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

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

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

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

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

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

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

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

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…...