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

Linux内核配置与构建原理

Kconfig文件

Kconfig是Linux内核中用于配置功能的脚本语言系统,由众多内核源码树中每个目录下的Kconfig文件组成。它定义Linux相关的配置选项层次结构和依赖关系。

menuconfig工具,会抓取Kconfig中的信息,为用户输出友好的交互式菜单选项配置界面。用户在此界面选择需要编译的模块(如Y/N/M),配置结果会保存在.config文件中。

驱动开发:添加新驱动时需在对应目录创建Kconfig条目,并修改上级目录的Kconfig和Makefile以包含新配置。

menuconfig 工具

menuconfig 是 Linux 内核配置的核心工具之一,是基于Kconfig生成的交互式配置工具,提供用户友好的配置菜单界面,简化了内核编译和模块选择的过程。以下是其关键信息:

  1. 基本定义与功能

    Menuconfig 是 make menuconfig 的缩写,基于 ncurses 库实现文本菜单界面。

    用户可通过层级菜单选择或取消内核功能、驱动、文件系统等配置项,无需直接编辑复杂的 .config 文件。

    相较于命令行交互式配置(如 make config)需要逐项回答提问,Menuconfig 提供了更直观的导航和批量操作能力,降低了配置难度。

  2. 核心用途

    内核功能定制:启用/禁用特定功能(如网络协议、硬件驱动、调试工具)。

    模块管理:选择将功能编译为内置模块(Y)、动态加载模块(M)或完全排除(N),优化内核体积。

    硬件适配:为不同硬件平台(如 ARM、X86)配置对应的驱动和优化选项。

    参数调整:设置内核运行参数(如网络栈缓存大小、文件系统行为)。

总结来说,Menuconfig 通过交互式菜单和智能导航设计,将复杂的内核配置转化为可视化的操作流程,是 Linux 系统开发和优化的必备工具。

.config文件

.config文件是配置结果的存储文件,位于内核根目录的.config是用户配置的最终产物,以键值对形式记录所有选项的状态。

.config文件中的配置项被用来: 指导编译系统(make)决定哪些代码需要编译进内核、作为模块或排除。 若不存在,make会使用默认配置(如arch/arm/configs/xxx_defconfig)生成初始文件。

注意事项:直接修改.config可能导致依赖冲突,推荐通过menuconfig调整配置。

Makefile文件

make命令

make命令是编译系统的入口,根据.config和Makefile执行构建操作。make过程会、或者可以做到:

  • 解析.config中的配置项,结合各目录的Makefile决定编译哪些文件。

  • 通过条件编译语句(如obj-$(CONFIG_XXX) += file.o)控制代码的编译方式(内核内置、模块或忽略)。

  • 支持多种编译目标(如make zImage生成内核镜像,make modules编译模块)。

Makefile文件

Makefile 是 自动化构建脚本,定义了软件项目的编译规则、依赖关系和执行顺序。通过 make 命令调用,它能够自动完成代码编译、链接、安装等任务,是 Linux 和嵌入式开发的核心构建工具。

Makefile 的核心作用

  1. 自动化编译 根据源文件(.c.h)的修改时间自动重新编译依赖的文件,避免重复劳动。

  2. 跨平台与交叉编译支持 通过定义变量(如 CCCFLAGS)适配不同编译器(GCC、ARM GCC)和架构(x86、ARM)。

  3. 依赖管理 明确文件间的依赖关系(如 main.o 依赖 main.cutils.h),确保正确编译顺序。

  4. 简化复杂构建流程 将多步骤构建(如清理、安装、生成配置文件)封装为简单命令(如 make cleanmake install)。

  5. 集成其他工具 调用 ldobjcopystrip 等工具生成可执行文件、库文件或烧录镜像。

四者的协作流程

配置阶段:用户通过make menuconfig启动界面,基于Kconfig文件生成菜单树,调整后保存到.config。

编译阶段:make读取.config,根据Makefile中的规则和条件语句编译对应代码。 依赖闭环:Kconfig中的依赖关系确保.config的合法性,而make通过Makefile将配置转化为编译行为

比喻的描述其关系:

Kconfig:定义配置逻辑的“设计图”。-厨师提供的菜品单。 menuconfig:用户交互的“操作界面”。-点餐员。 .config:存储用户选择的“配置文件”。-点餐员根据客人选择的菜品记录下来的点餐单。 Makefile:定义了软件项目的编译规则、依赖关系和执行顺序。-当次做菜的方法和过程。(1.做哪些菜品?读取.config里的配置项,动态调整编译规则。2.每个菜品应该如何烹饪的食材、方法和先后顺序) make:执行编译的“构建引擎”。-给厨师下命令做菜,并输出客户点的菜品。

其他细节


细节1:内核 Makefile 如何动态调整编译规则(基于 .config

一、核心机制:kbuild 系统与配置融合

1. 配置转换为宏定义

当执行 make defconfigmake menuconfig 生成 .config 后,内核会通过脚本(如 scripts/kconfig/confdefconfig)自动生成 autoconf.h 文件。该文件将 .config 中的配置项转换为 C 语言宏定义:

#define CONFIG_GPIO_SUPPORT 1  // 如果配置为 y
#define CONFIG_GPIO_INTERRUPTS m // 如果配置为 m
  • y:表示功能被编译到内核镜像中(直接链接)。

  • m:表示功能被编译为可加载模块(.ko 文件)。

  • n:功能被禁用,不参与编译。

2. Makefile 中的条件编译

内核的 Makefile(尤其是顶层 Makefile 和各子目录的 Makefile)通过以下方式动态调整编译规则:

  • 基于配置启用/禁用源文件

    # 如果 CONFIG_GPIO_SUPPORT 为 y,则将 gpio.o 编译到内核中
    obj-y += gpio.o
    # 如果 CONFIG_GPIO_INTERRUPTS 为 m,则将 gpio_interrupts.o 编译为模块
    obj-m += gpio_interrupts.o

  • 通过 $(CONFIG_XXX) 变量引用配置状态

    ifeq ($(CONFIG_GPIO_SUPPORT), y)CFLAGS += -DENABLE_GPIO
    endif
二、内核 Makefile 的动态规则生成
1. obj-$(CONFIG_XXX) 语法

内核 Makefile 使用 obj-$(CONFIG_XXX) 的语法动态控制目标文件的编译方式:

  • obj-y:将文件编译到内核镜像中(当 CONFIG_XXX=y 时生效)。

  • obj-m:将文件编译为模块(当 CONFIG_XXX=m 时生效)。

  • obj-n:明确禁止编译(即使配置为 y 也不编译)。

示例drivers/gpio/Makefile):

obj-y += gpio_core.o   # 总是被编译到内核中,当CONFIG_XXX=y时。
obj-m += gpio_module.o # 仅在 CONFIG_GPIO_SUPPORT=m 时编译为模块
obj-n += deprecated.o  # 显示地禁用旧代码
2. 依赖关系的传递

如果某个配置项依赖于其他配置(如 CONFIG_USB_CORE=yCONFIG_USB_HUB=y 的前提),内核的 Kconfig 会通过 depends on 规则强制关联。对应的 Makefile 会自动忽略无效配置(例如未启用 USB 核心的情况下无法编译 USB HUB)。

三、.config 如何影响编译流程
  1. 生成 autoconf.h

    内核构建时会执行以下步骤:

    make -C /path/to/kernel M=$PWD

    其中,scripts/kconfig/ 目录下的脚本会扫描 .config 并生成 autoconf.h,该文件会被包含到内核源码中(通过 #include <linux/autoconf.h>),从而在 C 代码中可用。

  2. 动态链接对象文件

    • 对于 obj-y 的文件:Makefile 会将这些目标文件直接链接到内核映像(vmlinux)。

    • 对于 obj-m 的文件:Makefile 会将这些文件打包为模块(.ko),并在 modules_install 阶段安装到 /lib/modules/$(KERNEL_VERSION)/kernel/ 目录下。

  3. 条件编译与裁剪

    • 如果 CONFIG_GPIO_SUPPORT=n,内核会跳过所有依赖 GPIO 的代码和模块。

    • 通过 $(CONFIG_XXX) 宏定义,C 代码可以直接判断功能是否启用:

      #ifdef CONFIG_GPIO_SUPPORT// 启用 GPIO 功能的代码
      #endif
四、交互场景示例:启用 GPIO 中断支持
1. 配置阶段
make menuconfig   # 打开配置界面
# 导航到 Device Drivers → GPIO Support → 启用 GPIO_INTERRUPTS=m

此时,.config 中新增:

CONFIG_GPIO_SUPPORT=y
CONFIG_GPIO_INTERRUPTS=m
2. 生成配置头文件

运行 makemake prepare,内核会自动生成 autoconf.h,其中包含:

#define CONFIG_GPIO_SUPPORT 1
#define CONFIG_GPIO_INTERRUPTS 1  // 因为 m 被视为 "enabled for module"
3. 动态调整 Makefile
  • drivers/gpio/Makefile 中:

    obj-m += gpio_interrupts.o  # 因为 CONFIG_GPIO_INTERRUPTS=m 有效
  • 如果 CONFIG_GPIO_SUPPORT=n,则 obj-m += gpio_interrupts.o 会被忽略。

4. 编译结果
  • 内核镜像:包含 gpio_core.o(因为 obj-y)。

  • 模块文件:生成 gpio_interrupts.ko(因为 obj-m)。

五、关键实现细节
  1. kbuild 的核心语法 内核 Makefile 使用特殊的 ​kbuild​ 语法,例如:

    ccflags-y:为目标文件添加编译器选项。

    ccflags-y += -I$(PWD)/include

    ldflags-y:为目标文件添加链接器选项。

    ldflags-y += -T $(PWD)/ linker_script.ld
  2. 配置冲突处理 如果 .config 中存在矛盾配置(例如同时设置 CONFIG_USB=yCONFIG_USB=n),内核的 make 命令会报错并终止构建。

  3. 交叉编译适配 在交叉编译环境中,.config 中需显式指定架构和交叉工具链:

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig
六、总结

内核的 Makefile 通过与 .config 的深度集成,实现了以下功能:

  1. 按需编译:仅启用必要的功能和硬件支持,减少代码量和内存占用。

  2. 模块化支持:通过 obj-m 动态管理可加载模块的编译。

  3. 跨平台兼容:结合交叉编译工具链和架构特定的配置规则。

理解这一机制对嵌入式开发者至关重要,它直接关系到内核定制的灵活性和最终二进制包的优化效果。

细节2:内核构建脚本的核心解析

内核的动态编译规则调整依赖于一系列脚本和工具链的协作,以下是与 .config 配置和 Makefile 生成密切相关的关键脚本及其作用:


一、配置管理与转换脚本
1. confdefconfig
  • 作用:生成默认配置文件(.config)或合并新旧配置。

  • 来源scripts/kconfig/confdefconfig

  • 关键逻辑:

    • defconfigarch/xxx/defconfig 生成初始配置。

    • 通过 olddefconfig 工具将当前 .config 与新内核默认配置对比,保留用户自定义选项。

    • 处理配置冲突(如 yn 同时存在时报错)。

2. kconfig 解析工具
  • 作用:解析 Kconfig 文件并生成配置依赖关系图。

  • 来源scripts/kconfig/parser.c(内核内置的 C 程序)。

  • 输出:

    • 生成 .config 的依赖关系(用于 make menuconfig 的自动折叠菜单)。

    • 生成 symbol_definessymbol_values(辅助配置头文件生成)。


二、配置头文件生成脚本
1. genconfig
  • 作用:将 .config 转换为 autoconf.hversion.h

  • 来源scripts/kconfig/genconfig

  • 关键逻辑:

    • 遍历 .config 中的每个配置项,生成对应的宏定义(如 #define CONFIG_GPIO_SUPPORT 1)。

    • 处理三态配置(m 会生成 CONFIG_GPIO_INTERRUPTS=1,但表示模块化)。

2. check-headers
  • 作用:验证生成的 autoconf.h 是否与内核源码兼容。

  • 来源scripts/kconfig/check-headers

  • 关键逻辑:

    • 检查头文件中是否存在重复定义或冲突的宏。

    • 确保所有依赖项已正确启用(如缺少 CONFIG_USB_CORE 时报错)。


三、Makefile 生成与动态规则处理
1. kbuild 核心脚本
  • 作用:处理 Makefile 的通用规则和依赖关系。

  • 来源scripts/kbuild/Makefile

  • 关键逻辑:

    • 自动包含子目录的 Makefile(通过 include $(SUBDIRS))。

    • 处理 obj-y/obj-m/obj-n 规则,生成编译目标列表。

    • 根据 $(CC)$(CFLAGS) 自动设置编译器和参数。

2. modules.mk
  • 作用:管理内核模块的编译和安装规则。

  • 来源scripts/kbuild/modules.mk

  • 关键逻辑:

    • 定义模块安装路径(/lib/modules/$(KERNEL_VERSION)/kernel/)。

    • 生成模块依赖文件(.modinfo)和符号表(.symvers)。

3. .dependauto-deps
  • 作用:自动生成源文件的依赖关系(类似 GCC 的 -MMD)。

  • 来源scripts/kbuild/dependscripts/kbuild/auto-deps

  • 关键逻辑:

    • 通过 makedepend 工具扫描源文件中的头文件引用。

    • 生成 .d 文件(如 main.o.d),并在 Makefile 中通过 -include $(DEPS) 引入。


四、交叉编译支持脚本
1. cross-compile-check.sh
  • 作用:验证交叉编译环境是否合法。

  • 来源scripts/cross-compile-check.sh

  • 关键逻辑:

    • 检查是否存在 $(CC)$(LD) 变量。

    • 确保交叉工具链支持目标架构(如 armaarch64)。

2. fixup-cross-compile
  • 作用:修复交叉编译时的路径和符号问题。

  • 来源scripts/fixup-cross-compile

  • 关键逻辑:

    • 修改编译器路径以匹配交叉工具链(如 arm-linux-gnueabi-gcc)。

    • 设置 sysroot 和头文件搜索路径(如 --sysroot=/path/to/arm-toolchain)。


五、配置冲突检测与修复
1. check-configuration
  • 作用:检测 .config 中的逻辑矛盾。

  • 来源scripts/kconfig/check-configuration

  • 关键逻辑:

    • 验证 depends onselect 关系的合法性。

    • 检查三态配置是否与布尔配置冲突(如 tristate 配置不能为 n 如果存在依赖项)。

2. silentoldconfig
  • 作用:静默合并新旧配置差异。

  • 来源scripts/kconfig/silentoldconfig

  • 关键逻辑:

    • 将新内核的默认配置与用户旧配置逐项对比。

    • 仅提示用户修改冲突项,其余项自动继承默认值。


六、实战调试脚本
1. make dconfig
  • 作用:基于 .config 生成交互式配置界面。

  • 来源scripts/kconfig/dconfig

  • 关键逻辑:

    • 读取 autoconf.hKconfig 生成动态菜单。

    • 支持在线搜索和配置回滚。

2. make traceconfig
  • 作用:跟踪配置项的依赖关系。

  • 来源scripts/kconfig/traceconfig

  • 关键逻辑:

    • 生成配置项的依赖树(如 CONFIG_GPIO_SUPPORT → CONFIG_ARM)。

    • 输出所有被激活的配置项及其路径。


七、总结:脚本协作流程
  1. 配置阶段

    • 用户通过 make menuconfig 修改 Kconfig,生成 .config

    • confdefconfigsilentoldconfig 处理配置冲突和默认值合并。

  2. 预处理阶段

    • genconfig 生成 autoconf.h,将配置转换为宏定义。

    • kbuild 脚本解析 obj-$(CONFIG_XXX) 规则,生成动态编译目标。

  3. 构建阶段

    • depend 自动生成源文件依赖关系。

    • modules.mk 处理模块编译和安装。

    • 交叉编译脚本(如 cross-compile-check.sh)确保工具链合法。

  4. 验证阶段

    • check-configurationcheck-headers 检测配置合法性。

    • make dconfigmake traceconfig 提供调试支持。


关键脚本与内核构建的关联图

make menuconfig → Kconfig 解析 → .config 生成  ↓  
make defconfig → confdefconfig → 默认配置合并  ↓  
make prepare → genconfig → autoconf.h 生成  ↓  
make all → kbuild/Makefile → obj-$(CONFIG_XXX) 规则应用  ↓  
make modules → modules.mk → 模块编译与安装  ↓  
make clean → depend 清理 .d 文件  

通过以上脚本的协作,内核能够实现 配置驱动开发(Configuration-Driven Development),极大简化了嵌入式设备的定制化过程。

相关文章:

Linux内核配置与构建原理

Kconfig文件 Kconfig是Linux内核中用于配置功能的脚本语言系统&#xff0c;由众多内核源码树中每个目录下的Kconfig文件组成。它定义Linux相关的配置选项层次结构和依赖关系。 menuconfig工具&#xff0c;会抓取Kconfig中的信息&#xff0c;为用户输出友好的交互式菜单选项配…...

大语言模型微调的基本概念介绍

大型语言模型&#xff08;LLMs&#xff09;正在以惊人的速度发展&#xff0c;LLM微调的潜力更是如此。大型语言模型的生命周期有几个关键步骤&#xff0c;今天我们将要介绍这个周期中最丰富、最耗时的一部分——LLM微调过程。 大语言模型的生命周期 在深入了解大型语言模型&a…...

实例分割 | yolov11训练自己的数据集

前言 因工作要求使用的都是yolov5系列的模型&#xff0c;今天学习一下最先进的yolov11&#xff0c;记录一下环境配置及训练过程。 1.项目下载及环境安装 源码位置&#xff1a;yolov11 可以看到&#xff0c;这里要求python版本大于等于3.8&#xff0c;我这里安装python3.10.…...

vue3:四嵌套路由的实现

一、前言 1、嵌套路由的含义 嵌套路由的核心思想是&#xff1a;在某个路由的组件内部&#xff0c;可以定义子路由&#xff0c;这些子路由会渲染在父路由组件的特定位置&#xff08;通常是 <router-view> 标签所在的位置&#xff09;。通过嵌套路由&#xff0c;你可以实…...

AIGC和搜索引擎的异同

AIGC&#xff08;生成式人工智能&#xff09;与搜索引擎的核心差异体现在信息处理方式和输出形态上&#xff0c;我们可以从以下维度对比&#xff1a; 一、工作原理的本质差异 信息检索机制 搜索引擎&#xff1a;基于关键词匹配&#xff08;如"中暑怎么办"→返回相关…...

ES批量查询

在 Elasticsearch 中&#xff0c;multi_search&#xff08;也称为 msearch&#xff09;是一种允许你在单个请求中执行多个搜索操作的 API。它可以显著减少网络开销&#xff0c;尤其是在需要执行多个查询时。multi_search 会将多个查询打包成一个请求发送给 Elasticsearch&#…...

Vue2学习

一、Vue3 基础 监视属性 天气案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>天气案例</…...

PySide(PyQT)重新定义contextMenuEvent()实现鼠标右键弹出菜单

在 PySide中&#xff0c;contextMenuEvent() 是 QWidget 类&#xff08;以及继承自它的所有子类&#xff09;的一个事件处理方法&#xff0c;主要用于处理上下文菜单事件&#xff0c;也就是当用户在控件上右键点击时触发的事件。 • 通过重新定义contextMenuEvent()来实现自定…...

Storm实时流式计算系统(全解)——下

storm编程案例-网站访问来源实时统计-需求 storm编程-网站访问来源实时统计-代码实现 根据以上条件可以只写一个类&#xff0c;我们只需要写2个方法和一个main&#xff08;&#xff09;&#xff0c;一个读取/发射&#xff08;spout&#xff09;。 一个拿到数据统计后发到redis…...

配置Nginx日志url encode问题

文章目录 配置Nginx日志url encode问题方法1-lua方法2-set-misc-nginx-module 配置Nginx日志url encode问题 问题描述&#xff1a; 当自定义日志输出格式&#xff0c;需要输出http请求中url参数时&#xff0c;如果参数中包含中文&#xff0c;是会进行url encode的&#xff0c…...

JAVA SE 包装类和泛型

文章目录 &#x1f4d5;1. 包装类✏️1.1 基本数据类型和对应的包装类✏️1.2 装箱和拆箱✏️1.3 自动装箱和自动拆箱 &#x1f4d5;2. 泛型✏️2.1 泛型的语法✏️2.2 泛型类的使用✏️2.3 裸类型(Raw Type)✏️2.4 擦除机制✏️2.5 泛型的上界✏️2.6 泛型方法✏️2.7 通配符…...

基于Linux系统的物联网智能终端

背景 产品研发和项目研发有什么区别&#xff1f;一个令人发指的问题&#xff0c;刚开始工作时项目开发居多&#xff0c;认为项目开发和产品开发区别不大&#xff0c;待后来随着自身能力的提升&#xff0c;逐步感到要开发一个好产品还是比较难的&#xff0c;我认为项目开发的目的…...

从零开始开发纯血鸿蒙应用之语音朗读

从零开始开发纯血鸿蒙应用 〇、前言一、API 选型1、基本情况2、认识TextToSpeechEngine 二、功能集成实践1、改造右上角菜单2、实现语音播报功能2.1、语音引擎的获取和关闭2.2、设置待播报文本2.3、speak 目标文本2.4、设置语音回调 三、总结 〇、前言 中华汉字洋洋洒洒何其多…...

物联网小范围高精度GPS使用

在园区内实现小范围高精度GPS&#xff08;全球定位系统&#xff09;定位&#xff0c;通常需要结合多种技术来弥补传统GPS在精度和覆盖范围上的不足。以下是实现小范围高精度GPS定位的解决方案&#xff0c;包括技术选择、系统设计和应用场景。 一、技术选择 在园区内实现高精度…...

一次有趣的前后端跨越排查

进行前后端代码联调的时候&#xff0c;使用axios调用后端请求&#xff0c;因为都是本地进行联调&#xff0c;所以没有考虑跨域的问题&#xff0c;写了一个get的请求接口&#xff0c;请求后端时&#xff0c;突然跳出下面的问题&#xff1a; 错误的信息一看很像就是跨域的问题&…...

大语言模型(LLM)如何赋能时间序列分析?

引言 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;在文本生成、推理和跨模态任务中展现了惊人能力。与此同时&#xff0c;时间序列分析作为工业、金融、物联网等领域的核心技术&#xff0c;长期依赖传统统计模型&#xff08;如ARIMA&#xff09;或深度学习模型&a…...

Kubernetes (K8S) 核心原理深度剖析:从架构设计到运行机制

Kubernetes(K8S)作为容器编排领域的“操作系统”,其设计和实现原理是开发者进阶的必修课。本文将从架构设计、核心组件协作、关键机制实现三个维度,结合源码逻辑与实战场景,分享 K8S 的底层运行原理。 一、Kubernetes 架构设计 1. 声明式 API 与控制器模式 K8S 的核心设…...

Excel 豆知识 - XLOOKUP 为啥会出 #N/A 错误

XLOOKUP有的时候会出 #VALUE! 这个错误。 因为这个XLOOUP有个参数叫 找不到时的返回值&#xff0c;那么为啥还会返回 #VALUE! 呢&#xff1f; 可能还有别的原因&#xff0c;但是主要原因应该就是 检索范围 和 返回范围 不同。 比如这里检索范围在 B列&#xff0c;是 4-21&…...

【深度学习】Hopfield网络:模拟联想记忆

Hopfield网络是一种经典的循环神经网络&#xff0c;由物理学家John Hopfield在1982年提出。它的核心功能是模拟联想记忆&#xff0c;类似于人类大脑通过部分信息回忆完整记忆的能力。以下是通俗易懂的解释&#xff1a; 1. 核心思想 想象你看到一张模糊的老照片&#xff0c;虽然…...

Python可视化大框架的研究与应用

## 摘要 随着数据科学和人工智能的快速发展&#xff0c;数据可视化成为了数据分析中不可或缺的一部分。Python作为一种功能强大且易于学习的编程语言&#xff0c;提供了多种可视化工具和库。本文旨在探讨Python可视化的主要框架&#xff0c;分析其特点、应用场景以及未来发展趋…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用

阻止除自定义标签之外的所有标签 先输入一些标签测试&#xff0c;说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时&#xff08;如通过点击或键盘导航&…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中&#xff0c;往往存在多个不同的IP网段&#xff0c;数据在不同的IP网段之间交互是需要借助三层设备的&#xff0c;这些设备具备路由能力&#xff0c;能够实现数据的跨网段转发。 路由是数据通信网络中最基…...