ubuntu24.04上使用qemu+buildroot+uboot+linux+tftp+nfs模拟搭建vexpress-ca9嵌入式linux开发环境
1 准备工作
1.1 安装依赖工具
sudo apt-get update && sudo apt-get install build-essential git bc flex libncurses5-dev libssl-dev device-tree-compiler
1.2 安装arm交叉编译工具链
sudo apt install gcc-arm-linux-gnueabihf
安装之后,在终端输入arm-linux- gnueabihf- 后按TAB键,出现下列命令,表示安装成功。
1.3 安装qemu-system-arm
sudo apt install qemu-system-arm
安装完毕后,在终端输入: qemu- 后按TAB键,弹出下列命令证明安装成功。
2 u-boot配置编译
2.1 下载u-boot
wget http://ftp.denx.de/pub/u-boot/u-boot-2018.03.tar.bz2
2.2 配置u-boot
解压并进入u-boot。
tar -xvf u-boot-2023.10.tar.bz2 && cd u-boot-2023.10
使用vexpress-ca9x4的默认配置进行配置。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_ca9x4_defconfig
2.3 修改u-boot
qemu模拟开发板,无法将u-boot环境变量固化到flash,所以每次启动需要重新设置环境变量,为了方便可以将相关环境变量写死在源码里,具体为include/configs/vexpress_common.h中的CFG_EXTRA_ENV_SETTINGS宏。
修改define CFG_EXTRA_ENV_SETTINGS 如下。其中10.211.55.10为QEMU模拟的开发板的IP,10.211.55.100为宿主系统ubuntu24.04的IP,需要根据实际环境IP进行修改。
#define CFG_EXTRA_ENV_SETTINGS \"ipaddr=10.211.55.10\0" \"serverip=10.211.55.100\0" \"bootcmd=tftp 0x60003000 uImage; \tftp 0x61000000 vexpress-v2p-ca9.dtb; \bootm 0x60003000 - 0x61000000\0" \"bootargs=root=/dev/nfs rw \nfsroot=10.211.55.100:/nfs/rootfs,nfsvers=4 init=/linuxrc \ip=10.211.55.10 console=ttyAMA0\0"
2.4 编译u-boot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
编译成功后,会在当前目录生成u-boot。
3 linux内核配置编译
3.1 下载linux内核
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.14.2.tar.xz
3.2 配置linux内核
解压并进入linux内核主目录。
tar -xvf linux-6.14.2.tar.xz && cd linux-6.14.2
3.2.1 使用vexpress-ca9开发板默认配置。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_defconfig
3.2.2 关键自定义配置
使用menuconfig进行自定义配置。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
- 启用 VirtIO 网络
Device Drivers ---> Network device support ---> Virtio network driver
- 启用 NFS 客户端
File systems ---> Network File Systems ---> NFS client support
把能选的client版本v2、v3、v4等都选了。
选中Root file system on NFS
- 支持自动挂载devtmpfs到/dev
Device Drivers ---> Generic Driver Options ---> Automount devtmpfs at /dev, after the kernel mounted the rootfs
不选中Automount devtmpfs at /dev, after the kernel mounted the rootfs, 后续buildroot制作的根文件系统无法生成/dev/ttyAMA0节点,导致无法进行系统,报下面的错误。
3.3 编译linux内核
编译u-boot的内核镜像,需要指定LOADADDR=0x60003000(即uboot通过tftp加载uImage的地址),以及生成的镜像格式为uImage.
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x60003000 uImage dtbs -j8
编译完成后,会在下面路径生成zImage内核镜像和dtb设备树文件。
arch/arm/boot/uImage # 内核镜像
arch/arm/boot/dts/arm/vexpress-v2p-ca9.dtb # 设备树
将uImage和vexpress-v2p-ca9.dtb拷贝到tfp服务器工作目录/tftpboot下,tftpboot在地5.2章节进行说明。
4 配置编译buildroot
4.1 下载buildroot
wget https://buildroot.org/downloads/buildroot-2024.02.tar.gz
4.2 配置buildroot
解压并进入buildroot主目录。
tar -xvf buildroot-2024.02.tar.gz && cd buildroot-2024.02
4.2.1 使用vexpress-ca9默认配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- qemu_arm_vexpress_defconfig
4.2.2 关键自定义配置
使用menuconfig进行自定义配置。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
- 文件系统
Filesystem images ---> ext2/3/4 root filesystem---> ext2/3/4 variant
- mdev支持
System configuration ---> dev management ---> Dynamic using devtmpfs + mdev
- nfs-utils
Target packages ---> Filesystem and flash utilities ---> nfs-utils---> NFSv4/NFSv4.1
4.3 编译根文件系统
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
编译完成后,会生成根文件镜像
output/images/rootfs.ext4 # ext4格式镜像
5 宿主机上配置tftp服务器
5.1 安装tftp服务器
sudo apt-get install tftpd-hpa
5.2 设置tftp服务器工作目录
sudo mkdir -p /tftpboot && sudo chmod -R 777 /tftpboot
5.3 配置tftp服务
sudo vi /etc/default/tftpd-hpa
修改配置如下:
TFTP_DIRECTORY="/tftpboot"
TFTP_OPTIONS="-l -c -s"
修改保存配置文件后,重启tftp服务使配置生效。
sudo systemctl restart tftpd-hpa
5.4 验证tftp服务
在tftp服务器目录创建一个测试文件,在其他文件夹下通过tftp get这个问题,get成功则说明tftp服务配置成功。
6 宿主机上配置NFS服务器
6.1 安装nfs服务
sudo apt-get install nfs-kernel-server
6.2 配置nfs服务
6.2.1 配置nfs根文件系统
- 创建rootfs文件夹
sudo mkdir -p /nfs/rootfs
- 拷贝根文件系统到rootfs文件夹
讲buildroot制作的rootfs拷贝到/nfs/rootfs文件夹。
sudo mount -t ext4 /home/cat/work/drv/buildroot-2024.02/output/images/rootfs.ext4 /mnt
sudo cp -rp /mnt/* /nfs/rootfs
sudo umount /mnt
6.2.2 修改nfs服务配置文件
sudo vi /etc/exports # 配置内容:
/nfs/rootfs *(rw,sync,no_root_squash,no_subtree_check,insecure)
注意,一定要加上no_root_squash,否则后面使用nfs加载根文件系统后,重复弹出让输用户名和密码,进不去系统,如下:
修改好exports文件后,执行
source /exports
使配置生效,然后重启nfs服务。
sudo systemctl restart nfs-kernel-server
6.3 验证nfs服务是否生效
使用如下命令将/nfs/rootfs挂载到/mnt,如果挂载成功则表示生效。
sudo mount -t nfs 127.0.0.1:/nfs/rootfs /mnt/
7 使用qemu模拟vexpress-ca9开发板
7.1 创建网桥
创建网桥用于开发板和ubuntu宿主机通信。
创建 /etc/netplan/01-netcfg.yaml配置文件,内容如下:
network:version: 2renderer: networkdethernets:enp0s5: #替换为你的物理网卡名(用 `ip a` 查看)dhcp4: nobridges:br0:interfaces: [enp0s5]dhcp4: no# 如果使用静态 IP:addresses: 10.211.55.100/24 #u-boot指定的serverip# gateway4: 192.168.1.1# nameservers:# addresses: [8.8.8.8, 1.1.1.1]
然后执行下面的命令,执行上面的配置
sudo netplan apply
然后执行
ip addr show br0
确认网桥是否生效。
7.2 使用qemu启动脚本启动开发板
#!/bin/bash# 随机生成 TAP 接口名(格式:tap-<随机4位16进制>)
TAP_IF="tap-$(openssl rand -hex 2 | cut -c1-4)"
BRIDGE_IF="br0" # 宿主机桥接接口名
USER=$(whoami)# 创建 TAP 接口并加入桥接
echo "Creating TAP interface: $TAP_IF"
sudo ip tuntap add dev $TAP_IF mode tap user $USER
sudo ip link set $TAP_IF up
sudo ip link set $TAP_IF master $BRIDGE_IF# 启动 QEMU(传递 TAP 接口名给 U-Boot)
echo "Starting QEMU with U-Boot..."
sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot -net nic -net tap,ifname=$TAP_IF,script=no,downscript=no -nographic# QEMU 退出后自动清理 TAP 接口
echo "Cleaning up TAP interface: $TAP_IF"
sudo ip link set $TAP_IF down
sudo ip tuntap del dev $TAP_IF mode tap
保存为qemu.sh脚本,该脚本用于启动模拟开发板,其中u-boot第2节的u-boot镜像。该脚本动态创建TAP设备,可以实现启动多个开发板。
7.3 启动过程
启动过程如下图。
- 通过tftp下载uImage
- 通过tftp下载dtb
- 内核启动
- 使用nfs挂载根文件系统
- 成功进入系统
到此本文完毕,由于本人水平有限,难免有误,请各位大佬不吝指正,谢谢。
相关文章:
ubuntu24.04上使用qemu+buildroot+uboot+linux+tftp+nfs模拟搭建vexpress-ca9嵌入式linux开发环境
1 准备工作 1.1 安装依赖工具 sudo apt-get update && sudo apt-get install build-essential git bc flex libncurses5-dev libssl-dev device-tree-compiler1.2 安装arm交叉编译工具链 sudo apt install gcc-arm-linux-gnueabihf安装之后,在终端输入ar…...
Cocos Creater打包安卓App添加隐私弹窗详细步骤+常见问题处理
最终演示效果,包含所有代码内容 + 常见错误问题处理 点击服务协议、隐私政策,跳转到相关网页, 点击同意进入游戏,不同意关闭应用 一,添加Activity,命名为MyLaunchActivity 二,编写MyLaunchActivity.java的内容 package com.cocos.game.launch;import android.os.Bund…...
UI文件上传
1、文件上传:文件上传是自动化中比较麻烦棘手的部分。 有些场景我们需要上传本地文件到项目里。这种比较麻烦,因为需要点开文件上传的窗口后,打开的是windows的文件选择窗口, 而selenium是无法操作这个窗口的。 selenium只能操作…...
2.凸包优化求解
1.减而治之(Decrease and Conquer) 插入排序 典型的减而治之算法就是插入排序方法 插入排序法: 在未排序中选择一个元素,插入到已经排序号的序列中 将凸包也采用减而治之的方法 2.In-Convex-Polygon Test 怎么判断引入的极点存在于多边形里面还是外面࿱…...
从0开发一个unibest+vue3项目,使用vscode编辑器开发,总结vue2升vue3项目开始,小白前期遇到的问题
开头运行可看官网 链接: unibest官网 一:vscode中vue3代码显示报错标红波浪线 去查看扩展商店发现一些插件都弃用了,例如h5的插件以及vue老插件 解决办法:下载Vue - Official插件(注意:横杠两边是要加空格的ÿ…...
jmeter中文乱码问题解决
修改jmeter.properties配置文件 进入JMeter安装目录的bin文件夹,找到jmeter.properties文件。搜索参数sampleresult.default.encodingUTF-8,取消注释(删除行首的#),并将其值改为UTF-8。保存文件并重启JMeter生效…...
额外篇 非递归之美:归并排序与快速排序的创新实现
个人主页:strive-debug 快速排序非递归版本 非递归版本的快速排序是为了解决在空间不够的情况下,利用栈来模拟递归的过程。 递归版本的快速排序是空间换时间,好实现。 实现思路: 1. 创建一个栈,将数组的右边界下标和…...
[文献阅读] EnCodec - High Fidelity Neural Audio Compression
[文献信息]:[2210.13438] High Fidelity Neural Audio Compression facebook团队提出的一个用于高质量音频高效压缩的模型,称为EnCodec。Encodec是VALL-E的重要前置工作,正是Encodec的压缩量化使得VALL-E能够出现,把语音领域带向大…...
JavaSpring 中使用 Redis
创建项目 配置 Redis 服务地址 创建 Controller 类 由于当前只是些简单的测试代码,所以就不进行分层了,只创建一个 Controller 来实现 jedis 通过 jedis 对象里的各种方法来操作 Redis 此处通过 StringRedisTemplate 来操作 Redis 最原始提供的类是 Re…...
B端可视化像企业数据的透视镜,看清关键信息
在数字化时代,数据已成为企业最宝贵的资产之一。然而,数据的价值不仅取决于其数量,更在于企业能否快速、准确地提取关键信息并据此做出决策。B端可视化技术的出现,为企业提供了一种强大的工具,它如同企业的“透视镜”&…...
【愚公系列】《Python网络爬虫从入门到精通》055-Scrapy_Redis分布式爬虫(安装Redis数据库)
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
【MySQL】SQL语句在MySQL中的执行过程?主要存储引擎区别?
MySQL SQL语句执行过程详解 作为面试官,我来详细剖析一条SQL语句在MySQL中的完整执行过程,这是每个后端开发者都应该掌握的核心知识。 一、连接阶段 建立连接 客户端通过TCP/IP协议与MySQL服务器建立连接(默认3306端口)服务器验证用户名、密码和权限…...
致远OA——数据回填表单
文章目录 :apple: 业务需求描述:pineapple: 业务分析和实现 🍎 业务需求描述 测试案例: https://pan.quark.cn/s/3f58972f0a27 官网地址: https://open.seeyoncloud.com/v5devCAP/94/355/359/399/405/406.html 需求描述: 点…...
MongoDB导出和导入数据
安装mongodump工具 参考文章mongodump工具安装及使用详解_mongodump安装-CSDN博客 MongoDB导入导出和备份的命令工具从4.4版本开始不再自动跟随数据库一起安装,而是需要自己手动安装。 官方网站下载链接:Download MongoDB Command Line Database Tools …...
蓝桥杯之递归二
1.数的划分 题目描述 将整数 nn 分成 kk 份,且每份不能为空,任意两份不能相同(不考虑顺序)。 例如:n7,k3n7,k3,下面三种分法被认为是相同的。 1,1,5;1,5,…...
【大疆dji】ESDK开发环境搭建(软件准备篇)
接上一篇【大疆dji】ESDK开发环境搭建(硬件准备篇) 1. 编译环境 ESDK 提供 x86_64/aarch64 基于 Linux 平台 Ubuntu 发行版操作系统构建的静态库,运行 demo 先正确安装所需的依赖包。arm32位就不支持了。建议使用编译安装的方式,…...
Android TTY设备调用流程和简单分析
Linux TTY系统中ioctl的调用流程详解:从应用层到MSM GENI Serial驱动 本文档详细分析Linux系统中从用户空间应用程序发起TTY ioctl请求到特定驱动(例如msm_geni_serial_ioctl)的完整调用流程,包括32位应用与64位内核之间的兼容性问题分析。 1. 总体调用路径概览 以下是完…...
数字孪生赋能管理系统,降本增效立竿见影
1. 数字孪生基础概念及其在管理系统中的应用前景 数字孪生是一种集成多学科、多物理量、多尺度、多概率的仿真过程,在虚拟空间中完成映射,从而反映相对应的实体装备的全生命周期过程。其核心在于将现实世界中的物理对象或系统与其数字化模型相结合&…...
Java学习手册:Web 应用架构概述
一、Web 应用架构的演变 在互联网发展的初期阶段,Web 应用普遍采用客户端 / 服务器(C/S)架构模式。客户端应用程序与服务器端应用程序直接建立连接,进行数据交互和业务处理。然而,这种架构存在诸多局限性。由于客户端…...
企业网站安装 SSL安装的必要性
能够带来安全的加密和快速的访问体验,防止中间人的流量劫持,保障用户隐私信息的安全,帮助用户识别钓鱼网站,提升网站在搜索引擎的排名。 能够防止黑客盗走客户银行卡账号的机密信息,保证信息的机密性,防止…...
【CF】Day38——Codeforces Round 965 (Div. 2) B
B. Minimize Equal Sum Subarrays 题目: 思路: 直觉题 我们可以这样构造,将整个数列左移一位即可,为什么呢? 因为这样我们能尽可能地保证数列的数字尽可能多的同时 且 有一个数不同 这里介绍一个rorate函数…...
leetcode 300. Longest Increasing Subsequence
目录 题目描述 第一步,明确并理解dp数组及下标的含义 第二步,分析明确并理解递推公式 第三步,理解dp数组如何初始化 第四步,理解遍历顺序 代码 题目描述 这是动态规划解决子序列问题的例子。 第一步,明确并理解…...
解密大模型背后的秘密:训练、优化与挑战
解密大模型背后的秘密:训练、优化与挑战 在当今的人工智能领域,大模型(Large Language Models, LLMs)已经成为了一个不可忽视的存在。从自然语言处理到图像生成,再到推荐系统,大模型以其强大的泛化能力和创…...
第33讲|遥感大模型在地学分类中的初探与实战
目录 🧠 一、什么是“遥感大模型”? 📚 二、遥感大模型在地学分类中的优势 📍三、案例:使用 Segment Anything Model (SAM) 进行遥感地物分割 📦 1. 安装与依赖配置(PyTorch) 🖼 2. 读取遥感图像(可用 Sentinel-2 伪彩色图) 🔧 3. SAM 模型载入 💡 …...
LeetCode 438 找到字符串中所有字母异位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "…...
【25软考网工笔记】第二章(6)脉冲编码调制PCM、通信和交换方式
目录 一、脉冲编码调制PCM 1. 脉冲编码调制的数字化过程 1)采样 2)量化 3)编码 2. PCM计算 3. 应用案例 1)例题1 2)例题1 3)例题3 知识小结 二、通信和交换方式 1.数据通信方式分类 1&#x…...
JSON学习笔记
文章目录 1. JSON是什么2. JSON的特点与结构3. JSON的使用4. JSON文件读取 1. JSON是什么 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和…...
高阶指南:动态定价下eBay利润率控制的4维财务模型
在eBay平台上,动态定价(Dynamic Pricing)早已不是新鲜概念。随着市场供需的瞬时波动、竞争产品的变化,以及跨境电商红海局势的加剧,卖家若想在残酷的价格战中保住利润、稳住运营基本盘,仅靠经验主义已经远远…...
【NLP 66、实践 ⑰ 基于Agent + Prompt Engineering文章阅读】
你用什么擦干我的眼泪 莎士比亚全集 工业纸巾 还是你同样泛红的眼睛 —— 4.19 一、⭐【核心函数】定义大模型调用函数 call_large_model prompt:用户传入的提示词(如 “请分析这篇作文的主题”),指导模型执行任务 client&…...
Keil MDK中禁用半主机(No Semihosting)
在 ARM 编译器(如 Keil MDK) 中禁用半主机(Semihosting)并实现标准库的基本功能,需要以下步骤: 1. 禁用半主机 #pragma import(__use_no_semihosting) // 禁用半主机模式作用:防止标准库函数&…...
QML中的3D功能--纹理应用
Qt 3D 提供了强大的纹理支持,可以实现各种复杂的材质效果。以下是 Qt 3D 纹理开发的全面技术方案。 一、纹理处理的流程图 纹理处理关键步骤说明: 资源准备阶段 支持格式:PNG/JPG/KTX/DDS等 尺寸要求:建议2的幂次方(非强制) 纹理加载路径 qml Texture2D {source: "…...
LeetCode[459]重复的子字符串(KMP解法)
思路: 最近迷上了KMP算法,所以这道题也是来搞一下KMP算法,总所周知KMP是需要维护一个前缀表,KMP算法不是比较一个字符串包不包含另一个字符串的吗,这个重复字符串的题也能用?猫爷:毋庸置疑&…...
数据驱动未来:大数据在智能网联汽车中的深度应用
数据驱动未来:大数据在智能网联汽车中的深度应用 引言 随着智能网联汽车(Intelligent Connected Vehicles,ICV)的快速发展,数据已成为其核心驱动力。从实时交通数据到车辆传感器信息,大数据的深度应用正在让智能汽车更安全、更高效、更智能化。那么,大数据如何赋能智能…...
基于MCP的RAG系统实战:用Cursor+GroundX构建复杂文档问答引擎
在AI与文档处理的融合趋势下,基于MCP协议的RAG(Retrieval-Augmented Generation)系统为复杂文档的智能问答提供了全新解决方案。本文将详细解析如何通过Cursor编辑器(MCP客户端)与GroundX(MCP服务器)的组合,构建一个可处理科研文献、企业知识库的端到端问答系统,并提供…...
DSA数据结构与算法 4
第2章 排序技术 2.1 排序简介 排序是将数据按照特定顺序(升序或降序)排列的过程,它不仅是计算机科学中的基础操作,也是日常生活中不可或缺的工具。举个例子,想象一个图书馆里的书籍,如果这些书籍没有按照作…...
23种设计模式全解析及其在自动驾驶开发中的应用
一、创建型模式(5种) 目标:解耦对象创建过程,提升系统灵活性 模式名称核心思想典型场景自动驾驶应用示例工厂方法子类决定实例化对象类型日志系统、数据库连接器创建激光雷达/摄像头等传感器实例抽象工厂创建相关对象家族GUI组件…...
基于WiFi的智能教室数据监测系统的设计与实现
标题:基于WiFi的智能教室数据监测系统的设计与实现 内容:1.摘要 随着教育信息化的发展,对教室环境及设备数据监测的智能化需求日益增长。本文的目的是设计并实现一种基于WiFi的智能教室数据监测系统。方法上,采用WiFi模块实现数据的无线传输,…...
Linux操作系统--环境变量
目录 基本概念: 常见环境变量: 查看环境变量的方法: 测试PATH 测试HOME 和环境变量相关的命令 环境变量的组织方式:编辑 通过代码如何获取环境变量 通过系统调用获取或设置环境变量 环境变量通常具有全局属性 基本概念…...
备份jenkins
jenkins用熟了很爽,jenkins用熟了很香,jenkins用熟了可以起飞…… 但~你们是否有过这种经历? 庚子年四月初一 路人甲小手一抖,不小心把配置删了,然后只能重新配置,再然后发现鬼记得太古时代都做了哪些配置…...
纯FPGA实现AD9361控制的思路和实现 UART实现AXI_MASTER
这里用一个串口接收PC机传过来的读写寄存器的控制指令,对地址地址的AXI_sLAVE进行读写后返回其结果。 串口收发器用的代码还是经典的FPGA4FUN上的。fpga4fun.com - Serial interface (RS-232) 我做了极小修改,直接贴出来代码: // RS-232 RX…...
计算机网络期中复习笔记(自用)
复习大纲 –第一章 概述 计算机网络的组成 网络边缘:主机和网络应用程序(又称为“端系统”) 端系统中运行的程序之间的通信方式可划分为两大类: 客户/服务器方式(C/S方式) 对等方式(P2P方式…...
MFC文件-屏幕录像
下载本文件 本文件将获取屏幕图像数据的所有代码整合到两个文件中(ScreenRecorder.h和ScreenRecorder.cpp),使获取屏幕图像数据变得简单。输出IYUV视频流。还可以获取系统播放的声音,输出PCM音频流。由于使用了MFC类,本…...
JAVA的泛型
为什么引入泛型 有两个作用: 适用于多种数据类型执行相同的代码(代码复用)泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)消除强制类型转换兼容性与类型擦除更灵活…...
【UniApp】Vue2 scss 预编译器默认已由 node-sass 更换为 dart-sass
从 HBuilderX 4.56 ,vue2 项目也将默认使用 dart-sass 预编译器。 vue2开发者sass预处理注意: sass的预处理器,早年使用node-sass,也就是vue2最初默认的编译器。 sass官方推出了dart-sass来替代。node-sass已经停维很久了。 另…...
【sylar-webserver】8 HOOK模块
文章目录 知识点HOOK实现方式非侵入式hook侵入式hook ⭐⭐⭐ 覆盖系统调用接口获取被全局符号介入机制覆盖的系统调用接口 具体实现 在写之前模块的时候,我一直在困惑 协程是如何高效工作的,毕竟协程阻塞线程也就阻塞了。 HOOK模块解开了我的困惑。&…...
【今日三题】判断是不是平衡二叉树(递归) / 最大子矩阵(二维前缀和) / 小葱的01串(滑动窗口)
⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 判断是不是平衡二叉树(递归)最大子矩阵(二维前缀和)小葱的01串(滑动窗口) 判断是不是平衡二叉树(递归) 判断是不是平衡二叉…...
交易系统的构建与实战法则
Ⅰ 交易哲学:理解市场本质 时间的艺术:鳄鱼法则的启示80%的交易时间应用于观察和等待日均有效交易机会不超过3次(以A股为例)杰西利弗莫尔的棉花合约案例(1907年等待11周)波动率与交易频率的黄金分割比例Ⅱ 形态识别系统:双轨交易模型 A. 趋势引擎 三级趋势验证体系: 均…...
C++高并发内存池ConcurrenMemoPool
一、介绍高并发内存池 本项目的原型是Google的开源项目tcmalloc,即线程缓存的malloc,相较于系统的内存分配函数malloc,free,本项目能达到高效的多线程内存管理 旨在学习其核心框架,借鉴其实现方式来模拟实现出一个我们…...
ubuntu下gcc/g++安装及不同版本切换
1. 查看当前gcc版本 $ gcc --version# 查看当前系统中已安装版本 $ ls /usr/bin/gcc*2. 安装新版本gcc $ sudo apt-get update# 这里以版本12为依据(也可以通过源码方式安装,请自行Google!) $ sudo apt-get install -y gcc-12 g…...
React-在使用map循环数组渲染列表时须指定唯一且稳定值的key
在渲染列表的时候,我们须给组件或者元素分配一个唯一值的key, key是一个特殊的属性,不会最终加在元素上面,也无法通过props.key来获取,仅在react内部使用。react中的key本质是服务于diff算法, 它的默认值是null, 在diff算法过程中…...