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

嵌入式系统 第七讲 ARM-Linux内核

• 7.1 ARM-Linux内核简介

内核:是一个操作系统的核心。是基于硬件的第一层软件扩充, 提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统, 决定着系统的性能和稳定性。现代操作系统设计中,为减少系 统本身的开销,往往将一些与硬件紧密相关的(如中断处理程 序、设备驱动程序等)、基本的、公共的、运行频率较高的模 块(如时钟管理进程调度等)以及关键性数据结构独立开来, 使之常驻内存,并对他们进行保护。通常把这一部分称之为操 作系统的内核。

Linux内核:Linux内核的主要模块(或组件)分以下几个部分: 存储管理、CPU和进程管理、文件系统、设备管理和驱动、网 络通信,以及系统的初始化(引导)、系统调用等。

ARM-Linux内核:基于ARM处理器的Linux内核。

• 7.1.1 ARM-Linux内核和普通Linux内核的区别(背)

– 相对于ARM Linux,我们说的普通Linux指的是x86 Linux,它们 都是Linux系统,但是由于ARM和x86是不同的CPU架构,它们的 指令集不同,所以软件编译环境不同软件代码一般不能互用, 一般需要进行兼容性移植

x86是经典的CISC指令集指令集复杂功能多串行执行,但 是也意味着执行效率低下,但性价比突出,所以称为民用终端 的主流处理器内置指令集。Intel和AMD的家用处理器都是x86指 令集。以x86为代表的CISC,理论并发线程1-2条。

ARM是Advanced RISC Machine 的缩写。它的指令集比RISC还要 精简。通常使用ARM架构处理器的机型,多为嵌入式或者便携 机。主频通常不高,现在高通公司的ARM架构处理器有1.0GHz 的,已经算相当高了。另外,ARM 7沿用冯·诺依曼结构;而从 ARM 9以后,就都采用了哈佛结构。ARM的并发线程,理论上 有4条左右处理效率较X86高不少

• 7.1.2 ARM-Linux的版本控制

– Linux的版本号

        • 主版本号:序号的第1位

        • 次版本号:序号的第2位

        • 修订号:序号的第3位

        • 稳定版:序号的第2位(次版本号)为偶数

        • 测试版:序号的第2位(次版本号)为奇数

– 查看Linux系统的版本号(Ubuntu)

• linux@linux-pc:~$ cat /etc/issue
– Ubuntu 18.04.4 LTS \n • linux@linux-pc:~$ cat /etc/os-release
– NAME="Ubuntu"
– VERSION="18.04.4 LTS (Bionic Beaver)"
– ID=ubuntu
– ID_LIKE=debian
– PRETTY_NAME="Ubuntu 18.04.4 LTS"
– VERSION_ID="18.04"
– HOME_URL="https://www.ubuntu.com/"
– SUPPORT_URL="https://help.ubuntu.com/"
– BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
– PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
– VERSION_CODENAME=bionic
– UBUNTU_CODENA

 – 查看Linux内核的版本号(Ubuntu)

• linux@linux-pc:~$ cat /proc/version
– Linux version 5.4.0-139-generic (buildd@lcy02-amd64-036) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #156~18.04.1-Ubuntu SMP Wed Jan 25 15:56:22 UTC 2023• linux@linux-pc:~$ uname-a
– Linux linux-pc 5.4.0-139-generic #156~18.04.1-Ubuntu SMP Wed Jan 25 15:56:22 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux• linux@linux-pc:~$ uname-r
– 5.4.0-139-gen

 • 7.1.3 ARM-Linux的代码结构

– 位于Ubuntu的/home/linux/workdir/fs3399/system/kernel/目录下

 1.android:Android系统的配置

2.arch :包含和硬件体系结构相关的代码,每种平台(处理器)占一个相应的目录,如i386、 arm、arm64、powerpc、mips等

3.block:块设备驱动程序

4.certs:存储认证和签名相关代码

5.crypto:常用加密散列算法(如AES、SHA 等),还有一些压缩CRC 校验算法

6.Documentation:内核各部分的通用解释和注释(文档)

7.drivers :设备驱动程序,每个不同的驱动占用一个子目录,如char、block、net、mtd、i2c 等

8. firmware:固件,包含了让计算机读取和理解从设备发来的信号的代码

9. fs:所支持的各种文件系统,如EXT、FAT、NTFS、JFFS2 等

10. include:头文件与系统相关头文件放置在include/linux子目录下

11. init:内核初始化代码,著名的start_kernel() 就位于init/main.c文件中

12. ipc:进程间通信的代码

13. kernel :内核最核心的部分,包括进程调度、定时器等,而和平台(处理器)相关的一部分 代码放在arch/*/kernel 目录下

14. lib:库文件代码

15. mm:内存管理代码,和平台(处理器)相关的一部分代码放在arch/*/mm 目录下

16. net:网络相关代码,实现各种常见的网络协议

17. samples:一些内核编程的范例 文 件 夹

18. scripts:用于配置内核的脚本文件

19. security:Linux安全模型的代码

20. sound:ALSA、OSS 音频设备的驱动核心代码和常用设备驱动

21. tools:这个文件夹中包含了和内核交互的工具

22. usr:实现用于打包和压缩的cpio等

23. virt:此文件夹包含了虚拟化代码,它允许用户一次运行多个操作系统

23. Kbuild:这是一个设置一些内核设定脚本

24. Kconfig:内核配置选项文件

25. Makefile:这个脚本是编译内核的主要文件,这个文件将编译参数编译所需的文件和必要的 信息传给编译器

26. System.map:该文件可以帮助我们理解内核编译,它记录了所有代码的运行地址

27. vmlinux:是可引导的压缩的Linux内核

28. vmlinux.o:是vmlinux的目标文件

 

 

• 7.2 ARM-Linux内存管理

• 7.2.1 影响内存管理的两个方面

– Linux内核对内存的管理(Linux操作系统的内存管理)

        • 内存管理是操作系统必不可少也是非常重要的一部分,包括:

                ① 地址映射

                ② 内存空间的分配

                ③ 地址访问的限制(即保护机制

                ④ I/O地址的映射(I/O编址与内存编址相同)

– ARM体系结构对内存的管理(MMU)

        • MMU(存储器管理单元)的主要作用有两个方面:

                ① 地址映射

                ② 对地址访问进行保护和限制

        • MMU可以做在CPU芯片中,也可以作为一个协处理器(用协处理器实现)

• 7.2.2 ARM-Linux的存储机制

– 基于x86体系结构的Linux内核的存储空间

• 32位地址形成4GB虚拟地址空间,被分为两部分:

        ① 内核空间(系统空间):位于高端的1GB,属于Linux操作系统

        ② 用户空间:位于低端的3GB,属于应用程序

 – ARM-Linux内核的存储空间 

• 32位地址形成4GB的虚拟地址空间,也被分为两部分,但是内核空间(系统空 间)和用户空间的具体划分,可以因CPU芯片和开发板(实验箱)而有所不同

• 另外,ARM将I/O也放在内存地址空间中

• 7.2.3 虚拟内存

虚拟内存(虚拟存储器):是计算机系统内存管理的一种技术, 它使得应用程序认为它拥有连续的可用的内存(一个连续完整的 地址空间),而实际上,它通常是被分隔成多个物理内存碎片, 还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换

– Linux虚拟内存的实现需要6种机制的支持

        ① 地址映射机制

        ② 请求页机制

        ③ 内存分配回收机制         

        ④ 缓存和刷新机制

        ⑤ 交换机制

        ⑥ 内存共享机制

• 7.3 ARM-Linux进程管理和调度

• 进程:也称为任务,是一个动态的执行过程,是处于执行期的程序,进程是系统资源 分配的最小单位

• 狭义定义:进程是正在运行的程序的实例。

• 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。 它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元, 也是基本的执行单元

• 进程的概念主要有两点:

        ① 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据 区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程 执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量

        ② 进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统 执行之),它才能成为一个活动的实体,我们称其为进程。

• 7.3.1 进程的表示和生命周期

– 进程描述符:用task_struct{}数据结构表示

– 进程的状态(重要):

        ① TASK_RUNNING:可执行状态,进程要么正在执行,要么准备 执行

        ② TASK_INTERRUPTIBLE:可中断睡眠状态

        ③ TASK_UNINTERRUPTIBLE:不可中断的睡眠状态

        ④ TASK_STOPPED:暂停状态,进程停止执行

        ⑤ TASK_TRACED:跟踪状态,进程被追踪

        ⑥ EXIT_ZOMBIE:僵尸状态的进程,表示进程被终止

        ⑦ EXIT_DEAD:进程的最终状态,进程死亡

        ⑧ TASK_DEAD:死亡

        ⑨ TASK_WAKEKILL:唤醒并杀死的进程

        ⑩ TASK_WAKING:唤醒进程

– 进程标识符:PID,Process ID(进程ID)

• 7.3.3 Linux进程的调度

– Linux进程的创建:

        • 通过fork函数创建进程

        • 创建用户空间进程:vfork()、fork()

        • 创建内核空间进程:copy_process()、kernel_thread()、do_fork()、 sys_vfork()、sys_fork()、sys_clone()

– Linux进程的执行

        • 通过exec函数执行进程

        • exec函数族:execl() 、execlp()、execle()、execv()、execvp()、execve()

– Linux进程的销毁

        • 通过do_exit函数结束进程

• 7.3.2 Linux进程的创建、执行和销毁(重要)

– Linux是一个多进程系统。多进程就是指计算机同时执行多个进程,即同 时运行多个程序。对于多进程系统,就存在多个进程如何进行调度的问 题,包括进程调度时机进程调度依据

– 进程调度时机

① 主动调度:随时可以进行。

② 被动调度:发生在系统调用返回的夕、中断异常处理返回、用户态处理软中 断返回

③ 抢占式内核:处于内核态的进程也可能被调度出去

– 进程调度依据

        • 在所有处于可运行状态的进程中,如何选择最值得运行的进程投入运行,以下4项 是选择的依据:

        ① policy:进程的调度策略。

        ② priority:进程的静态优先级。

        ③ counter:进程剩余的时间片(进程的动态优先级)。

        ④ rt_priority:用于实时进程间的选择

– 进程调度函数:schedule()函数

        ① 主动调度:主动调用schedule()函数。

        ② 被动调度:被动调用schedule()函数。

• 7.4 ARM-Linux模块机制

• Linux是单内核的,单内核最大的优点是效率高,因为所有的内容都集中在一起, 单内核也有可扩展性差、可维护性差的缺点。

– 单内核,是个很大的进程。它的内部又能够被分为若干模块(或是层次或其他)。但是在运行的时候,它是个单独的二 进制大映象。其模块间的通讯是通过直接调用其他模块中的函数实现的,而不是消息传递。单内核结构的例子:传统的 UNIX内核----例如伯克利大学发行的版本,Linux内核。

微内核结构由一个非常简单的硬件抽象层和一组比较关键的原语或系统调用组成,这些原语仅仅包括了建立一个系统必 需的几个部分,如线程管理地址空间进程间通信等。微内核的例子:AIX,BeOS,L4微内核系列,.Mach中用于GNU Hurd和Mac OS X,Minix,MorphOS,QNX,RadiOS,VSTa,鸿蒙OS。

混合内核它很像微内核结构,只不过它的的组件更多的在核心态中运行,以获得更快的执行速度。混合内核实质上是微 内核,只不过它让一些微核结构运行在用户空间的代码运行在内核空间,这样让内核的运行效率更高些。混合内核的例 子: BeOS 内核 ,DragonFly BSD,ReactOS内核,Windows NT、Windows 2000、Windows XP、Windows Server 2003以 及Windows Vista等基于NT技术的操作系统。

外内核系统,也被称为纵向结构操作系统,是一种比较极端的设计方法。 外内核这种内核不提供任何硬件抽象操作,但 是允许为内核增加额外的运行库,通过这些运行库应用程序可以直接地或者接近直接地对硬件进行操作。外核设计还停 留在研究阶段,没有任何一个商业系统采用了这种设计。几种概念上的操作系统正在被开发,如剑桥大学的Nemesis, 格拉斯哥大学的Citrix系统和瑞士计算机科学院的一套系统。麻省理工学院也在进行着这类研究。

模块机制的引入就是为了弥补这一缺点(可扩展性差、可维护性差)。

• 模块(内核模块,动态可加载内核模块,Loadable Kernel Module,LKM)是Linux 内核向外部提供的一个插口

• 7.4.1 Linux模块概述

– Linux内核支持动态可加载模块(Loadable Kernel Module,LKM), 模块是内核的一部分,模块通常是设备驱动程序,但是并没有编 译到内核里面去。

– 与模块相关的命令:

insmod:加载模块

rmmod:卸载模块

lsmod:列出已经安装的模块

depmod:产生模块依赖的映射文件

⑤ modprob:根据depmod命令所产生的相依关系,决定要载入哪些 模块

• 7.4.2 模块代码结构

– module_test实验驱动程序(模块)的代码结构:

• 头文件

#include <linux/kernel.h>
#include <linux/module.h>

 • 模块宏声明

MODULE_LICENSE("GPL");
MODULE_ALIAS("hqyj:module");
MODULE_AUTHOR("HQYJ <yanfa@hqyj.com>");
MODULE_DESCRIPTION("A sample Hello World module");

 • 模块初始化函数

static int __init hello_init(void){printk("hello init\n");return 0;}

 • 模块退出函数

static void __exit hello_exit(void){printk("hello exit\n");}

 • 入口、出口函数设置

module_init(hello_init);
module_exit(hello_exit);

• 7.4.3 模块的加载

– 模块加载的两种方式:

手工加载模块:通过insmod命令将模块加载到内核:

– insmodmodule_test.ko:加载module_test.ko模块

② 根据需要加载模块到内核:当内核发现需要某个模块时,内核守 护进程(kerneld)加载该模块到内核。

• 7.4.4 模块的卸载

– 使用rmmod命令卸载模块:

• rmmod module_test:卸载module_test.ko模块

– 但是当内核在使用模块时,该模块是不能被卸载的。

• 7.4.5 版本依赖

模块代码一定要在连接到不同内核版本之前重新编译, 因为模块是结合到某个特殊内核版本的数据结构和数 据原型上,不同的内核版本的接口可能差别很大。

模块依赖于内核的版

• 7.5 ARM-Linux系统启动和初始化

• 7.5.1 使用Boot Loader将内核映像载入

– Boot Loader将Linux的内核加载到内存(SDRAM)后,将跳到函数 start_kernel()进入初始化过程。

– start_kernel()函数:位于 /home/linux/workdir/fs3399/system/kernel/init/main.c中。

• 7.5.2 内核引导第一部分:内核数据结构初 始化

– start_kernel()函数中调用了一系列初始化函数,以完成内核 (Kernel)本省的设置。

– start_kernel()函数最后启动init过程,创建第一个内核线程,调用 init()函数

• 7.5.3 内核引导第二部分:外设初始化

init()函数作为内核线程,首先锁定内核,然后调用 do_basic_setup()函数,完成外设及其驱动程序的加载和初始化

• 7.5.4 init进程和inittab脚本

init进程是系统所有进程的起点,内核在完成核内引导以后,即在 本线程(进程)空间内加载init程序,它的进程号是1

– init程序需要读取Ubuntu的inittab脚本文件作为其行为指针

• 7.5.5 rc启动脚本

– Linux系统运行后将启动rc脚本S05rc.local)。

– rc启动脚本(S05rc.local)位于实验箱的/etc/rc2.d/目录下。

• 7.5.6 Shell的启动

– Login用户(Ubuntu和实验箱都是linux用户)将启动一个用户指定的Shell,这个指 定的Shell就是/bin/bash

• Shell:俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)

bash:是一个为GNU计划编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)的一个双关语(Bourne again / born again)。 Bourne shell是一个早期的重要shell,由史蒂夫·伯恩在1978年前后编写,并同 Version 7 Unix一起发布。bash则在1987年由布莱恩·福克斯创造。在1990年,Chet Ramey成为了主要的维护者。

相关文章:

嵌入式系统 第七讲 ARM-Linux内核

• 7.1 ARM-Linux内核简介 • 内核&#xff1a;是一个操作系统的核心。是基于硬件的第一层软件扩充&#xff0c; 提供操作系统的最基本的功能&#xff0c;是操作系统工作的基础&#xff0c;它负责管理系统的进程、内存、设备驱动程序、文件和网络系统&#xff0c; 决定着系统的…...

音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件

一、错误的命令 通过FFmpeg命令可以将mp4文件转换为ps文件&#xff0c;PS文件中包含PS流数据。 由于PS流/PS文件对应的FFInputFormat结构为&#xff1a; const FFInputFormat ff_mpegps_demuxer {.p.name "mpeg",.p.long_name NULL_IF_CONFIG_SMALL…...

Embedding

Embedding 在机器学习中&#xff0c;Embedding 主要是指将离散的高维数据&#xff08;如文字、图片、音频&#xff09;映射到低纬度的连续向量空间。这个过程会生成由实数构成的向量&#xff0c;用于捕捉原始数据的潜在关系和结构。 Text Embedding工作原理 词向量化&#x…...

Android Studio学习笔记

01-课程前面的话 02-Android 发展历程 03-Android 开发机器配置要求 04-Android Studio与SDK下载安装 05-创建工程与创建模拟器...

Git的使用流程(详细教程)

目录 01.Git是什么&#xff1f; 1.1 Git简介 1.2 SVN与Git的最主要的区别 1.3 GIt主要特点 02.Git是干什么的&#xff1f; 2.1.Git概念汇总 2.2 工作区/暂存区/仓库 2.3 Git使用流程 03.Git的安装配置 3.1 Git的配置文件 3.2 配置-初始化用户 3.3 Git可视化…...

Keil中的gcc

文章目录 一、IDE背后的命令1.1 IDE是什么1.2 IDE的背后是命令1.3 有两套主要的编译器 二、准备工作2.1 arm-linux-gcc和gcc是类似的2.2 Code::Blocks2.2.1 设置windows环境变量2.2.2 命令行示例 三、gcc编译过程详解3.1 程序编译4步骤3.2 gcc的使用方法3.2.1 gcc使用示例3.2.2…...

bilibili 哔哩哔哩小游戏SDK接入

小游戏的文档 简介 bilibili小游戏bilibili小游戏具有便捷、轻量、免安装的特点。游戏包由云端托管&#xff0c;在哔哩哔哩APP内投放和运行&#xff0c;体验流畅&#xff0c;安全可靠。https://miniapp.bilibili.com/small-game-doc/guide/intro/ 没想过接入这个sdk比ios还难…...

springboot523基于Spring Boot的大学校园生活信息平台的设计与实现(论文+源码)_kaic

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本大学校园生活信息平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…...

【YOLO算法改进】ALSS-YOLO:无人机热红外图像|野生动物小目标检测

目录 论文信息 论文创新点 1.自适应轻量通道分割和洗牌&#xff08;ALSS&#xff09;模块 2.轻量坐标注意力&#xff08;LCA&#xff09;模块 3.单通道聚焦模块 4.FineSIOU损失函数 摘要 架构设计 轻量高效网络架构 - ALSS模块 LCA模块 单通道聚焦模块 损失函数优…...

XML解析

一&#xff0c;XML概述 1.什么是XML XML即为可扩展的标记语言&#xff08;eXtensible Markup Language&#xff09; XML是一套定义语义标记的规则&#xff0c;这些标记将文档分成许多部件并对这些部件加以标识 2.XML和HTML不同之处 XML主要用于说明文档的主题&#xff0c;而…...

PlasmidFinder:质粒复制子的鉴定和分型

质粒&#xff08;Plasmid&#xff09;是一种细菌染色体外的线性或环状DNA分子&#xff0c;也是一种重要的遗传元素&#xff0c;它们具有自主复制能力&#xff0c;可以在细菌之间传播&#xff0c;并携带多种重要的基因(如耐药基因与毒力基因等)功能。根据质粒传播的特性&#xf…...

PTA数据结构作业一

6-1 链表的插入算法 本题要求实现一个插入函数&#xff0c;实现在链表llist中的元素x之后插入一个元素y的操作。 函数接口定义&#xff1a; int InsertPost_link(LinkList llist, DataType x, DataType y); 其中 llist是操作的链表&#xff0c;x是待插入元素y的前驱节点元素…...

2024年总结【第五年了】

2024年总结 北国绕院扫雪&#xff0c;南方围炉烹茶&#xff0c;且饮一杯无? 执笔温暖不曾起舞日子里的点点滴滴&#xff0c;誊写一段回忆&#xff0c;还以光阴一段副本。 那么你要听一支新故事吗&#xff1f;第五年总结的片碎。 衣单天寒&#xff0c;走趟流星孤骑&#xf…...

java实现一个kmp算法

1、什么是KMP算法 Kmp 算法是由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt提出的&#xff0c;改进字符串匹配的算法&#xff1b; Kmp 算法的核心是利用匹配失败的信息&#xff0c;尽量减少模式串与主串的匹配次数&#xff0c;以达到 快速匹配的目的&#xff1b; Kmp 算法的时…...

强化学习方法分类详解

强化学习方法分类详解 引言 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种通过智能体与环境互动来学习如何做出最佳决策的方法。根据不同的优化中心、策略特性、环境模型、奖励函数、动作空间类型以及行为策略和目标策略的一致性&#xff0c;RL可以分为…...

雅思真题短语(二十八)

真题短语收录在合辑。 541法律官员 work as a solicitor 542前卫 a radical and expensive scheme 543反对者们 objectors 544破坏 demolishing buildings 545蒸汽机车 steam locomotives 546冷凝 steam could be condensed 547烟雾 smoke and fumes 548通风井 ventilation sh…...

在Linux系统中使用字符图案和VNC运行Qt Widgets程序

大部分服务器并没有GUI&#xff0c;运行的是基础的Linux系统&#xff0c;甚至是容器。如果我们需要在这些系统中运行带有GUI功能的Qt程序&#xff0c;一般情况下就会报错&#xff0c;比如&#xff1a; $ ./collidingmice qt.qpa.xcb: could not connect to display qt.qpa.plu…...

Python基于EasyOCR进行路灯控制箱图像文本识别项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着城市化进程的加快&#xff0c;智能城市建设成为了现代社会发展的重要方向。路灯作为城市基础设…...

Github 2024-12-28 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-12-28统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10TypeScript项目1Python项目1egui: 一个简单、快速且高度可移植的 Rust GUI 库 创建周期:1903 天开发语言:Rust协议类型:Apache Li…...

提升生产力工具

VSCODE插件 干货&#xff1a;用好这13款VSCode插件&#xff0c;工作效率提升10倍 - 程序员柠檬 - 博客园 Sourcetrail Sourcetrail 是一个开源且免费的源码阅读工具&#xff0c;以其强大的代码导航、可视化及跨平台支持特性&#xff0c;成为开发者理解复杂代码库的得力助手。…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...