嵌入式系统 第七讲 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内核简介 • 内核:是一个操作系统的核心。是基于硬件的第一层软件扩充, 提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统, 决定着系统的…...

音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件
一、错误的命令 通过FFmpeg命令可以将mp4文件转换为ps文件,PS文件中包含PS流数据。 由于PS流/PS文件对应的FFInputFormat结构为: const FFInputFormat ff_mpegps_demuxer {.p.name "mpeg",.p.long_name NULL_IF_CONFIG_SMALL…...

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

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

Git的使用流程(详细教程)
目录 01.Git是什么? 1.1 Git简介 1.2 SVN与Git的最主要的区别 1.3 GIt主要特点 02.Git是干什么的? 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小游戏具有便捷、轻量、免安装的特点。游戏包由云端托管,在哔哩哔哩APP内投放和运行,体验流畅,安全可靠。https://miniapp.bilibili.com/small-game-doc/guide/intro/ 没想过接入这个sdk比ios还难…...

springboot523基于Spring Boot的大学校园生活信息平台的设计与实现(论文+源码)_kaic
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本大学校园生活信息平台就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…...

【YOLO算法改进】ALSS-YOLO:无人机热红外图像|野生动物小目标检测
目录 论文信息 论文创新点 1.自适应轻量通道分割和洗牌(ALSS)模块 2.轻量坐标注意力(LCA)模块 3.单通道聚焦模块 4.FineSIOU损失函数 摘要 架构设计 轻量高效网络架构 - ALSS模块 LCA模块 单通道聚焦模块 损失函数优…...

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

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

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

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

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

强化学习方法分类详解
强化学习方法分类详解 引言 强化学习(Reinforcement Learning, RL)是一种通过智能体与环境互动来学习如何做出最佳决策的方法。根据不同的优化中心、策略特性、环境模型、奖励函数、动作空间类型以及行为策略和目标策略的一致性,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,运行的是基础的Linux系统,甚至是容器。如果我们需要在这些系统中运行带有GUI功能的Qt程序,一般情况下就会报错,比如: $ ./collidingmice qt.qpa.xcb: could not connect to display qt.qpa.plu…...

Python基于EasyOCR进行路灯控制箱图像文本识别项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着城市化进程的加快,智能城市建设成为了现代社会发展的重要方向。路灯作为城市基础设…...

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

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

【蓝桥杯——物联网设计与开发】系列前言
前言 本系列博客是博主为准备2024年第十五届蓝桥杯大赛物联网设计与开发赛道而写,经过4个月学习备战,最终获得全国一等奖。 从第十六届蓝桥杯大赛开始,物联网赛道更换竞赛实训平台。之前的博客,可以借鉴代码思想,但引脚…...

【Java基础】02.Java数据类型
目录 Java 数据类型 3.1 java程序中 “” 号的使用 3.2 java中的数据类型 3.2.1 基本数据类型:数值型 (1)整数类型 (2)浮点(小数)类型 3.2.2 基本数据类型:字符型 3.2.3 基本…...

Python爬虫(一)- Requests 安装与基本使用教程
文章目录 前言一、简介及安装1. 简介2. 安装 Requests2.1 安装2.2 检查安装是否成功 二、使用 Requests 发送 HTTP 请求1. 发送 GET 请求2. 发送 POST 请求3. 发送 PUT 请求4. 发送 DELETE 请求5. 发送 HEAD 请求6. 发送 OPTIONS 请求 三、传递参数1. GET 请求传递 URL 参数1.1…...

线段树保姆级教程
买水果 Description 水果姐今天心情不错,来到了水果街。 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样。 学过oi的水果姐迅速发现了一个赚钱的方法:…...

logback之自定义过滤器
logback有两种过滤器,一种是context中的过滤器叫TurboFilter,是一个全局的过滤器,会影响所有的日志记录。另一种是Appender中的过滤器,只对所在的append有效。两者大同小异,这里我们以Appender的过滤器为例。 &#x…...

如何用CSS3创建圆角矩形并居中显示?
在网页设计中,圆角矩形因其美观和现代感而被广泛使用,居中显示元素也是一个常见的需求。今天,我们将学习如何使用CSS3的border-radius属性来创建圆角矩形,并将其居中显示在页面上。 如果你正在学习CSS,那么这个实例将非…...

Java 开发中的指定外部 Jar 路径详解
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互…...

python爬虫--小白篇【selenium自动爬取文件】
一、问题描述 在学习或工作中需要爬取文件资源时,由于文件数量太多,手动单个下载文件效率低,操作麻烦,采用selenium框架自动爬取文件数据是不二选择。如需要爬取下面网站中包含的全部pdf文件,并将其转为Markdown格式。…...

TI毫米波雷达原始数据解析之Lane数据交换
TI毫米波雷达原始数据解析之Lane数据交换 背景Lane 定义Lane 确认确认LVDS Lane 数量的Matlab 代码数据格式参考 背景 解析使用mmWave Studio 抓取的ADC Data Lane 定义 芯片与DCA100之间的数据使用LVDS接口传输,使用mmWave Studio 配置过程中有一个选项是LVDS L…...

overscroll-behavior-解决H5在ios上过度滚动的默认行为
1. 问题 开发H5的过程中,经常会有android和ios两边系统需要兼容的情况。在ios上一直有个问题是当H5内容触及到页面顶部或底部时,还是可以被人为的往下或往下拉动界面。当然可能有的情况是比较适用的,比如你往下拉动,然后在导航栏…...