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

QEMU启动ARM64 Linux内核

目录

  • 前言
  • 前置知识
    • virt开发板
    • ARM处理器家族简介
  • 安装qemu-system-aarch64
  • 安装交叉编译工具
  • 交叉编译ARM64 Linux内核
  • 交叉编译ARM64 Busybox
  • 使用busybox制作initramfs
  • 使用QEMU启动ARM64 Linux内核

前言

本文介绍采用 qemu 模拟ARM-64bit开发板(针对ARM-32bit的有另一篇文章介绍),并启动ARM64 Linux内核。大致思路是:

  • 安装qemu-system-aarch64(ARM-64bit)模拟器;
  • 安装aarch64-linux-gnu(ARM-64bit)交叉编译器;
  • 交叉编译linux源码,得到ARM64 Linux内核镜像;
  • 交叉编译busybox源码,使用busybox制作initramfs;
  • 最后使用qemu-system-aarch64启用ARM64 Linux内核;

我的环境:

  • 宿主机硬件平台:x86_64
  • 宿主机操作系统:Ubuntu 20.04 (Linux 5.4.0-139-generic)
  • QEMU版本:qemu-4.2.1
  • 实验内核:linux-5.19
  • busybox版本:busybox-1.35.0

前置知识

virt开发板

截至书稿本文时,QEMU模拟了多大70几种的硬件开发板,可参考Arm System emulator。但ARM-64bit的QEMU模拟器非常少,以至于virt成了唯一的选择。virt支持PCI,virtio,较新的ARM CPU,大容量内存,比较遗憾的是它不支持图形界面,如果你不知道选择什么硬件开发板就选virt。

更详尽的内容可参考:

Why the “virt”board?
Installing Debian on QEMU’s 32-bit ARM “virt”board
Installing Debian on QEMU’s 64-bit ARM “virt”board

ARM处理器家族简介

ARM处理器与架构对应表
ARM处理器家族众多,哪些是32bit,哪些是64bit,可参考:
List_of_ARM_processors

很多厂家使用ARM核设计SOC芯片,这里罗列了很多,可参考:
List_of_products_using_ARM_processors

安装qemu-system-aarch64

安装:

$ sudo apt install qemu-system-arm

会同时安装ARM-32bit的qemu-system-arm版本和ARM-64bit的 qemu-system-aarch64版本,查看版本号:

$ qemu-system-aarch64 --version
QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.24)
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers

查看 qemu 支持的 ARM 内核开发板,本文选择virt开发板:

$ qemu-system-aarch64 -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
raspi3               Raspberry Pi 3
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)
sbsa-ref             QEMU 'SBSA Reference' ARM Virtual Machine
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
xlnx-versal-virt     Xilinx Versal Virtual development board
xlnx-zcu102          Xilinx ZynqMP ZCU102 board with 4xA53s and 2xR5Fs based on the value of smp
z2                   Zipit Z2 (PXA27x)

看下virt开发板支持的cpu列表,本文以64-bit的cortex-a57为例说明:

$ qemu-system-aarch64 -M virt --cpu help
Available CPUs:arm1026arm1136arm1136-r2arm1176arm11mpcorearm926arm946cortex-a15cortex-a53cortex-a57cortex-a7cortex-a72cortex-a8cortex-a9cortex-m0cortex-m3cortex-m33cortex-m4cortex-r5cortex-r5fmaxpxa250pxa255pxa260pxa261pxa262pxa270-a0pxa270-a1pxa270pxa270-b0pxa270-b1pxa270-c0pxa270-c5sa1100sa1110ti925t

安装交叉编译工具

我们是在X86平台下进行的开发,目标平台是arm架构,需要安装交叉编译工具链。有关arm-linux的交叉编译器主要有:

  • 针对ARM-32bit的arm-linux-gnueabi和arm-linux-gnueabihf。
  • 针对ARM-64bit的aarch64-linux-gnu。

交叉编译器各版本的区别可参考《arm系列交叉编译器各版本区别.doc》。

安装ARM-64bit的aarch64-linux-gnu版本:

$ sudo apt install gcc-aarch64-linux-gnu

查看版本:

$ aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 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.

交叉编译ARM64 Linux内核

下载源码:

$ mkdir ~/kvm-arm
$ cd ~/kvm-arm/
$ wget https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/snapshot/linux-5.19.tar.gz
$ tar -xf linux-5.19.tar.gz
$ cd linux-5.19/
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=build defconfig
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=build -j8

说明:

  • ARCH:指定目标CPU架构;
  • CROSS_COMPILE:指定交叉编译器;
  • O=build:O是Out的缩写,表示编译输出文件放在build目录,不跟源码混在一起,保持源码的整洁性。
  • make时只有defconfig配置可选,因为 linux-5.19/arch/arm64/configs/ 目录下有且只有defconfig一个。

查看下内核编译出来的原始内核文件vmlinux,是ARM 64-bit版本。

$ file build/vmlinux
build/vmlinux: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), statically linked, BuildID[sha1]=f2a5fd51bd2d59f90b7b26b8926f5afdeab60f36, not stripped

vmlinux不能直接引导Linux系统启动,能引导Linux系统启动的是Image文件(非压缩版)或Image.gz(压缩版),下文用到的内核镜像就是Image:

$ file build/arch/arm64/boot/Image
build/arch/arm64/boot/Image: MS-DOS executable PE32+ executable (EFI application) Aarch64 (stripped to external PDB), for MS Windows$ file build/arch/arm64/boot/Image.gz 
build/arch/arm64/boot/Image.gz: gzip compressed data, max compression, from Unix, original size modulo 2^32 36112896

交叉编译ARM64 Busybox

$ mkdir ~/kvm-arm
$ cd ~/kvm-arm/
$ wget https://busybox.net/downloads/busybox-1.35.0.tar.bz2
$ tar -xf busybox-1.35.0.tar.bz2
$ cd busybox-1.35.0/$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-linux-gnu-
$ make menuconfig# 修改配置,选中如下项目,静态编译
# Settings –> Build Options –> [*] Build static binary(no share libs)# 反选如下项目,否则后续qemu执行会提示 /bin/sh:can't access tty;job control turned off
# Shells  --->  [ ]   Job control$ make -j `nproc`
$ make install

装完后会 默认安装到源码目录的 _install/ 目录下:

$ ls _install/
bin  linuxrc  sbin  usr

最关键的就是_install/bin/busybox,其他都是链接文件。

$ file _install/bin/busybox 
_install/bin/busybox: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=3768162c347859f16ab4f0b01a48fb8c0502774d, for GNU/Linux 3.7.0, stripped

编译的过程中如果出现如下提示,可忽略:

Trying libraries: m resolv rtLibrary m is needed, can't exclude it (yet)Library resolv is needed, can't exclude it (yet)Library rt is not needed, excluding itLibrary m is needed, can't exclude it (yet)Library resolv is needed, can't exclude it (yet)
Final link with: m resolv

使用busybox制作initramfs

使用busybox快速制作initramfs。

创建虚拟rootfs中的inti启动脚本,并赋予可执行权限:

$ cd ~/kvm-arm/busybox-1.35.0/_install/
$ touch init
$ chmod +x init

脚本内容:

#!/bin/sh# 挂载一些必要的文件系统
mkdir /proc && mount -t proc none /proc
mkdir /sys  && mount -t sysfs none /sys
mkdir /tmp  && mount -t tmpfs none /tmpecho
echo "Hello 64-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启动ARM64 Linux内核

ARM Linux内核镜像和initramfs都准备好,就可以使用QEMU启动linux内核了。

以字符界面方式启动QEMU,同时日志输出到控制台:

$  qemu-system-aarch64 \-M virt \-cpu cortex-a57 \-smp 8 \-m 8G \-kernel ./linux-5.19/build/arch/arm64/boot/Image \-initrd ./busybox-1.35.0/initramfs.cpio.gz \-nographic \-append "init=/init console=ttyAMA0"

QEMU参数说明(更多可参考:Standard options):

  • -M:指定模拟的开发板,可通过qemu-system-aarch64 M help查看,截至书稿时,只有virt支持64-bit ARM。
  • -cpu:指定模拟的cpu,可通过qemu-system-aarch64 -M virt --cpu help查看,这里选择cortex-a57。
  • -smp:指定cpu核数量,启动后可以使用nproc命令核对。
  • -m:指定内存大小,virt 可支持超大内存,启动后可以使用free -h命令核对。
  • -kernel:指定启动的内核镜像;
  • -initrd:指定启动的内存文件系统;
  • -append:传递给内核的启动参数;启动后可使用cat /proc/cmdline命令核对。
  • -nographic:启动字符界面(不启动图形界面),输出重定向到宿主机命令行,与参数 console=ttyAMA0 组合使用;

9 参考

  • Arm System emulator
  • Arm Versatile Express boards (vexpress-a9, vexpress-a15)
  • List_of_products_using_ARM_processors
  • List_of_ARM_processors
  • Qemu使用及常见开发板的模拟
  • qemu-system-aarch64使用和相关参数介绍

相关文章:

QEMU启动ARM64 Linux内核

目录前言前置知识virt开发板ARM处理器家族简介安装qemu-system-aarch64安装交叉编译工具交叉编译ARM64 Linux内核交叉编译ARM64 Busybox使用busybox制作initramfs使用QEMU启动ARM64 Linux内核前言 本文介绍采用 qemu 模拟ARM-64bit开发板(针对ARM-32bit的有另一篇文…...

Linux->进程程序替换

目录 前言: 1 程序替换原理 2 单进程替换 3 替换函数 3.1 函数使用 4 程序去替换自己的另一个程序操作方式 5 实现自己的shell 前言: 通过我们之前对于子进程的应用,我相信大家一定是能够想到创建子进程的目的之一就是为了代劳父进程执…...

最强分布式锁工具:Redisson

1 Redisson概述1.1 什么是Redisson?Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, Sorted…...

Java9-17新特性

Java9-17新特性 一、接口的私有方法 Java8版本接口增加了两类成员: 公共的默认方法公共的静态方法 Java9版本接口又新增了一类成员: 私有的方法 为什么JDK1.9要允许接口定义私有方法呢?因为我们说接口是规范,规范时需要公开…...

电脑开机找不到启动设备怎么办?

电脑正常开机,却提示“找不到启动设备”,这时我们该怎么办呢?本文就为大家介绍几种针对该问题的解决方法,一起来看看吧!“找不到启动设备”是什么意思?可引导设备(又称启动设备)是一…...

使用langchain打造自己的大型语言模型(LLMs)

我们知道Openai的聊天机器人可以回答用户提出的绝大多数问题,它几乎无所不知,无所不能,但是由于有机器人所学习到的是截止到2021年9月以前的知识,所以当用户询问机器人关于2021年9月以后发送的事情时,它无法给出正确的答案&#x…...

assert()宏函数

assert()宏函数 assert是宏&#xff0c;而不是函数。在C的assert.h文件中 #include <assert.h> void assert( int expression );assert的作用是先计算表达式expression&#xff0c; 如果其值为假&#xff08;即为0&#xff09;&#xff0c;那么它会打印出来assert的内容…...

Docker圣经:大白话说Docker底层原理,6W字实现Docker自由

说在前面&#xff1a; 现在拿到offer超级难&#xff0c;甚至连面试电话&#xff0c;一个都搞不到。 尼恩的技术社群&#xff08;50&#xff09;中&#xff0c;很多小伙伴凭借 “左手云原生右手大数据”的绝活&#xff0c;拿到了offer&#xff0c;并且是非常优质的offer&#…...

Redis+Caffeine多级(二级)缓存,让访问速度纵享丝滑

目录多级缓存的引入多级缓存的优势CaffeineRedis实现多级缓存V1.0版本V2.0版本V3.0版本多级缓存的引入 在高性能的服务架构设计中&#xff0c;缓存是一个不可或缺的环节。在实际的项目中&#xff0c;我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中&#xff0…...

C#和.net框架之第一弹

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录C# 简介一、微软平台的编程二、使用VS创建第一个c#程序1、第一步2、第二步3、第三步4、第四步5、第五步C# 简介 C# 是一个现代的、通用的、面向对象的编程语言&…...

C++---背包模型---潜水员(每日一道算法2023.3.12)

注意事项&#xff1a; 本题是"动态规划—01背包"和"背包模型—二维费用的背包问题"的扩展题&#xff0c;优化思路不多赘述&#xff0c;dp思路会稍有不同&#xff0c;下面详细讲解。 题目&#xff1a; 潜水员为了潜水要使用特殊的装备。 他有一个带2种气体…...

C++类的成员变量和成员函数详解

类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类…...

(枚举)(模拟)(位运算)116. 飞行员兄弟

目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 116. 飞行员兄弟 - AcWing题库 我草&#xff0c;又~在&#xff5e;水&#xff5e;字&#xff5e;数&#xff5e;啦&#xff01;我草&#xff0c;又~在&#xff5e;水&#xff5e;字&#xff5e;数&#xff5e;啦…...

详解Array.prototype.shift.call(arguments)

经常看到如下代码&#xff1a; function foo() {let k Array.prototype.shift.call(arguments);console.log(k) } foo(11,22) //11 Array.prototype.shift.call(arguments)的作用是&#xff1a; 取 arguments 中的第一个参数 一、为啥要这么写&#xff0c;不直接使用argume…...

Tina_Linux_Wi-Fi_开发指南

Tina Linux Wi-Fi 开发指南 1 前言 1.1 文档简介 介绍Allwinner 平台上Wi-Fi 驱动移植&#xff0c;介绍Tina Wi-Fi 管理框架&#xff0c;包括Station&#xff0c;Ap 以及Wi-Fi 常见问题。 1.2 目标读者 适用Tina 平台的广大客户和对Tina Wi-Fi 感兴趣的同事。 1.3 适用范…...

Spring AOP(AOP概念、组成、Spring AOP实现及实现原理)

文章目录1. Spring AOP 是什么2. 为什么要用 AOP3. 怎么学 Spring AOP4. AOP 组成5. Spring AOP 实现5.1 添加 Spring AOP 框架支持5.2 定义切面和切点5.3 实现通知方法5.4 使⽤ AOP 统计 UserController 每个⽅法的执⾏时间 StopWatch5.4 切点表达式说明 AspectJ6. Spring AOP…...

8.条件渲染指令

目录 1 v-if v-show 2 v-if v-else-if v-else 1 v-if v-show v-if与v-show都可以控制DOM的显示与隐藏 由于flag是布尔值&#xff0c;所以这里可以直接写 v-if"flag" 当flag为true的时候&#xff0c;v-if与v-show控制的div都会被显示出来 当flag为false的时候&a…...

2023年全网最全最细最流行的自动化测试工具有哪些?你都知道吗!

下面就是我个人整理的一些比较常用的自动化测试工具&#xff0c;并且还有视频版本的详细介绍&#xff0c;同时在线学习人数超过1000人&#xff01; B站讲的最详细的Python接口自动化测试实战教程全集&#xff08;实战最新版&#xff09;一&#xff1a;前言 随着测试工程师技能和…...

网络安全——数据链路层安全协议

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.数据链路层安全协议简介 1.数据链路安全性 二.局域网数据链路层协议 1.…...

编译原理基础概念

一、什么是编译程序编译程序是一种程序&#xff0c;能够将某一种高级语言编写的源程序改造成另一种低级语言编写的目标程序&#xff0c;他们在逻辑上等价、完成相同的工作二、编译阶段1、当目标程序是机器语言时&#xff0c;编译阶段&#xff1a;&#xff08;1&#xff09;编译…...

蔬菜视觉分拣机器人的设计与实现(RoboWork参赛方案)

蔬菜视觉分拣机器人的设计与实现 文章目录蔬菜视觉分拣机器人的设计与实现1. 技术栈背景2. 整体设计3. 机械结构3.1 整体结构3.2 底座结构3.3 小臂结构3.4 大臂结构3.5 负载组件结构3.6 末端执行器结构4. 硬件部分4.1 视觉系统4.1.1 光源4.1.2 海康工业相机4.2 传送带系统4.2.1…...

【LVGL移植】STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT ST7735S跑LVGL图形demo

【LVGL移植】STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT ST7735S屏幕跑LVGL图形demo&#x1f3ac;运行LVGL 按键组件demo ✨基于STM32CubeMX配置工程是因为方便移植&#xff0c;只要是STM32芯片&#xff0c;拿到我的这个工程源码就可以根据自己的stm32芯片&#xff0c;自…...

写给20、21级学生的话

写给20、21级学生的话前言一、关于招聘变招生&#xff0c;你怎么看&#xff1f;二、对于即将实习/已经实习的学生&#xff0c;你有什么建议&#xff1f;1.学习方面2.提升方面三、思想成年真的很重要前言 最近&#xff0c;有一些同学遇到的实习问题&#xff0c;我统一回复下&…...

功能测试用例多次录制后,我丢掉了selenium,选择龙测AI-TestOps云平台

目录一、如何使用龙测AI-TestOps云平台1、进入龙测AI-TestOps云平台2、新建项目3、新建流程图4、创建任务5、查看任务状态6、查看报告、图片7、下载流程图、测试报告、excel用例二、龙测AI-TestOps云平台AI功能介绍1、NLP2、视频AI转流程图三、总结功能测试用例多次录制后&…...

【C++知识点】C++20 常用新特性总结

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;C/C知识点 &#x1f4e3;专栏定位&#xff1a;整理一下 C 相关的知识点&#xff0c;供大家学习参考~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;…...

数据库体系结构概念--集中式数据库、分布式数据库

数据库模式 前言&#xff1a; 平时我们接触的‘数据库’一般指的是DBMS&#xff0c;数据库管理系统&#xff0c;DBMS是软件如&#xff1a;mysql、oracle、dm等等都是集中式数据库&#xff0c;但它们不能代表整个数据库&#xff0c;只是通过这些软件来管理相应的数据内容&#…...

PyQt5数据库开发2 5.2 QSqlRelationalTableModel

目录 一、Qt窗体设计 1. 新建Qt项目 2. 添加组件 3. 添加资源 4. 添加Action 5. 添加工具栏 6. 添加菜单项 7. 添加退出功能 二、SQL Server下建表插数据 1. 建立表 2. 插入数据 3. 单表数据 4. 联合查询 三、代码实现 1. 新建项目目录 2. 编译窗体文件和资…...

树莓派——智能家居第一步

辛辛苦苦配了成功让树莓派开始工作了&#xff0c;开始搞智能家居&#xff01;大体思路&#xff1a;基于工厂模式&#xff0c;分模块来实现上图分为三部分&#xff1a;主控、外设、控制主控我采用的是树莓派的4b4G版本&#xff0c;外设包括四个区域的灯&#xff08;我的和上图有…...

【Golang】Golang基础入门级教程 -- 0基础安装搭建Go语言开发环境

目录 安装和下载GO语言 下载 下载地址 版本的选择 安装 Windows安装 Linux下安装 Mac下安装 检查 GOROOT和GOPATH GOPROXY Go开发编辑器 VS Code介绍 下载与安装 配置 Go扩展 第一个Go程序 Hello World go mod init 编写 编译 VSCode切换默认终端 本篇文章…...

MATLAB | 如何解决实验数据散点图重叠问题(overlap)

本期部分实验效果&#xff1a; 这期讲一下如果数据重合严重该咋办(overlap)&#xff0c;事先说明&#xff0c;本文中的绘图均使用一个几行的简单小代码进行了修饰&#xff1a; function defualtAxes axgca;hold on;box on ax.XGridon; ax.YGridon; ax.XMinorTickon; ax.YMinor…...

女孩子做网站推广/网络营销的优缺点

新开了公众号&#xff0c;欢迎关注 epoll epoll是linux下的一种I/O多路复用的操作方式&#xff0c;是event poll的意思 I/O多路复用&#xff0c;举个栗子&#xff0c;在酒吧&#xff0c;一个服务员&#xff0c;10个顾客在喝酒&#xff0c;服务员有这么几种服务方式 服务员…...

政府网站优化/搜狗站长推送工具

1. tencent://Message/?Uin395012095&amp;websiteNameq-zone.qq.com&amp;Menuyes 2. http://wpa.qq.com/msgrd?v3&amp;uin79114541511&amp;Site郑州SEO&amp;Menuyes 需要到http://shang.qq.com/开通QQ在线状态”服务...

济南做网站建设的公司/必应搜索引擎网址

大数据技术逐渐成为互联网发展的核心&#xff0c;对于专业的大数据技术人才需求量也是越来越多。更多的人选择了快餐式教学——去专业的大数据培训学校学习。但哪些技术点重要呢&#xff1f;哪些又是大数据培训的关键呢&#xff1f; 大数据培训关键在于能够完成大数据处理&…...

广州商城网站建设报价/友情链接源码

目录1.算术指令1.1 比较指令1.算术指令 作用&#xff1a;对两个操作数栈上的值进行某种特定运算&#xff08;加减乘除等&#xff09;&#xff0c;并且把结果重新压入操作数栈。分类&#xff1a;大体上可以分为对整数数据进行运算的指令和对浮点数进行运算的指令。对于byte、sh…...

装修设计网站哪个平台最好/网站查询ip地址查询

前言 从毕业到现在面试也就那么几家公司&#xff0c;单前几次都比较顺利&#xff0c;在面到第三家时都给到了我offer&#xff01;前面两次找工作&#xff0c;没考虑到以后需要什么&#xff0c;自己的对未来的规划是什么&#xff0c;只要有份工作&#xff0c;工资符合自己的要求…...

南宁手机建站公司/淘宝关键词优化技巧教程

点击上方蓝字关注我们1前言曾几何时&#xff0c;”云”还是指天上飘的那一朵朵白色的雾团&#xff0c;现在互联网上家家都说自己是”xx云”。“云”这个词&#xff0c;已经被赋上了新的含义。其实真正在做”云”的企业没几家。这篇文章会告诉大家&#xff0c;究竟什么是”云”&…...