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

Linux0.11内存管理:相关代码

ch13_2 源码分析

boot/head.s

页表初始化:

  • 目标:初始化分页机制,将线性地址空间映射到物理内存(前 16MB),为保护模式下的内存管理做准备。
  • 核心流程
    • 分配页目录表和页表的物理内存空间(通过 .org 指令指定地址)。
    • 初始化1个页目录 + 4个页表
    • 设置页目录项,指向4个页表(属性:Present+User/RW):
    • 反向填充页表项,把四个页表的页表项:一共4k个页表项填满,对应的是16M的物理内存,4k个物理页面。
    • 通过 CR3 指向页目录表的基地址(物理地址0)和 CR0 寄存器的PG位启用分页机制。
.org 0x1000				; 告诉汇编器,将接下来的代码或数据从内存地址 0x1000 开始放置。
pg0:
.org 0x2000
pg1:
.org 0x3000
pg2:
.org 0x4000
pg3:
.org 0x5000
.align 2
setup_paging:; 初始化1个页目录 + 4个页表movl $1024*5,%ecx		; 初始化5页(1页目录+4页表)xorl %eax,%eax			; 异或自身,置零eax(填充值)xorl %edi,%edi			; 置零edi(页目录起始地址)cld						; 清除方向标志(DF=0),确保地址递增,edi += 4;rep stosl				; 循环将 EAX 的值写入 EDI 指向的内存。; ECX = 循环填充次数 每次写入edi += 4(因 DF=0)。; 设置页目录项,指向4个页表(属性:Present+User/RW)movl $pg0+7,pg_dir		; 页表项(0x1007)包括高二十位的页框地址(0x1去掉后12位)+ 12位属性(7)movl $pg1+7,pg_dir+4	; 0x7表示Present(存在位)、R/W(可写)、U/S(用户可访问)。movl $pg2+7,pg_dir+8	movl $pg3+7,pg_dir+12	; 反向填充页表项,映射16MB物理内存; 仅需设置 pg3+4092 作为初始地址,结合循环即可覆盖 pg3 → pg2 → pg1 → pg0 的全部 4k 个页表项。; eax 值变化:0xFFF0070xFFE007...0x000007  4k次操作; 初始	pg3+4092	pg3 的第10230xFFF000~0xFFFFFF (4KB); 终止	pg0+0		pg0 的第00x000000~0x000FFFmovl $pg3+4092,%edi		; edi = 0x4FFF(pg3 的最后一个4字节项)  movl $0xfff007,%eax		; eax = 0xFFF007(物理地址的高20+ 属性0x7) std						;(DF=1),edi -= 4
1:	stosl					; 写入4k个页表项:将eax值写入[edi],同时 edi-= 4 subl $0x1000,%eaxjge 1bcld						; 清除方向标志(DF=0; 设置PG位启用分页xorl %eax,%eax		movl %eax,%cr3			; cr3指向页目录(物理地址0)movl %cr0,%eaxorl $0x80000000,%eaxmovl %eax,%cr0			; 设置CR0的PG位(分页使能)ret						; 返回并刷新预取队列
page.s

核心功能总结

  1. 保存用户态上下文:保护寄存器,确保处理程序不破坏用户进程的运行状态。
  2. 切换到内核特权级:通过设置段寄存器访问内核数据结构。
  3. 提取关键信息
    • CR2 寄存器:获取触发页错误的线性地址。
    • 错误码:分析错误类型(缺页或写保护)。
  4. 分支处理
    • 缺页(P=0):调用 do_no_page 分配或加载页面。
    • 写保护(P=1):调用 do_wp_page 处理写时复制(COW)。
  5. 恢复现场并返回:清理栈空间,恢复寄存器,通过 iret 返回到用户程序。
/**  linux/mm/page.s**  (C) 1991  Linus Torvalds*/
/** page.s contains the low-level page-exception code.* the real work is done in mm.c*/
.globl page_fault
; 处理器触发页错误(如访问未映射或受保护的地址)时跳转到 page_fault。
page_fault:; 在页错误发生时:;	1. 栈顶是错误码(由 CPU 自动压入);	2. 交换 EAX 和栈顶的值后,EAX = 错误码,栈顶存储原 EAX 的值xchgl %eax,(%esp);寄存器保护:;	保存EAX、ECX、EDX、DS、ES、FS 以确保处理程序不会破坏用户进程的上下文。pushl %ecxpushl %edxpush %dspush %espush %fs;内核模式设置:;	将 DS/ES/FS 设置为 0x10(内核数据段),确保后续内存操作在内核特权级进行。;	该指令将立即数 0x10(二进制 00000000 00010000)加载到 %edx 寄存器:;		Index: 00000000 0010(高 13 位,即 0x10 >> 3 = 2,对应 GDT 的第 2 项)。;		TI: 0(使用 GDT)。;		RPL: 00(内核特权级)movl $0x10,%edxmov %dx,%dsmov %dx,%esmov %dx,%fs;CR2 寄存器存储触发页错误的线性地址,压栈后作为 do_no_page 或 do_wp_page 的参数。movl %cr2,%edxpushl %edx;错误码最低位(P 位)决定异常类型:;P=0 → 缺页异常,调用 do_no_page() 分配或加载页面。;P=1 → 写保护异常,调用 do_wp_page() 处理写时复制(COW)。pushl %eax			testl $1,%eax			;检查 %eax 的最低位(等价于 eax & 1)jne 1f					;如果 %eax 的最低位=1(ZF=0 零标志位为非),跳转到标签 1:;否则继续执行call do_no_pagejmp 2f
1:	call do_wp_page;恢复现场:
;	按逆序恢复之前保存的寄存器和段寄存器。
;	压栈的反顺序:
2:	addl $8,%esp		 ;跳过栈顶的 8 字节数据(相当于清理 2 个 pushl 操作压入的未弹出数据)。pop %fs				;跳过错误码和 CR2 参数(已传递给 C 函数),使栈指针指向 FS 保存的位置。pop %espop %dspopl %edxpopl %ecxpopl %eax;中断返回:iret 恢复 CS、EIP、EFLAGS,返回到触发页错误的指令继续执行。iret

为什么设置 DS/ES/FS=0x10(内核数据段)?

  • 确保后续内存操作在内核特权级进行
    • 虽然 CPU 在异常处理中自动切换到内核态(CPL=0),但段寄存器(如 DS)的段选择子可能仍指向用户态描述符(例如用户数据段是 0x17,TI=0、Index=3、RPL=3)。
  • DS/ES/FS 设置为 0x10(内核数据段),该指令将立即数 0x10(二进制 00000000 00010000)加载到 %edx 寄存器:
    • Index: 00000000 0010(高 13 位,即 0x10 >> 3 = 2,对应 GDT 的第 2 项)。
    • TI: 0(使用 GDT)。
    • RPL: 00(内核特权级)

下面给出流程示意图:

                       +-----------------------+|  CPU 触发页错误         || 硬件自动执行以下操作:    || 1. 压入错误码到栈       || 2. 跳转到 page_fault    |+-----------+------------+v+------------+-------------+| page_fault 处理程序开始     |+------------+-------------+|+----------+------------+| 交换 eax 和栈顶值       || (xchgl %eax, (%esp))  |+----------+------------+|+----------+------------+    保存用户进程的寄存器上下文| 压入 ecx, edx, ds, es, fs |+----------+------------+|+----------+------------+| 设置内核数据段 (DS/ES/FS=0x10) |+----------+------------+    确保内核内存访问安全|+----------+------------+| 读取 CR2 → edx,压入栈   |+----------+------------+|+----------+------------+    压入错误码 (eax) 到栈| 测试错误码最低位(P位)    | +----------+------------+|+-------------------------+-------------------------+| P=0(缺页异常)           | P=1(写保护异常)        |v                         v
+------------------+       +------------------+
| 调用 do_no_page() |       | 调用 do_wp_page() |
+------------------+       +------------------+|                         |+-------------------------+|+----------v------------+| 清理栈空间(addl $8, %esp)|+----------+------------+    跳过错误码和 CR2|+----------+------------+| 逆序恢复寄存器(fs, es, ds, edx...|+----------+------------+|+----------v------------+| iret 返回到用户态       |    恢复用户程序执行+-----------------------+
memory.c

这个是主要文件:分成一段一段的去看


invalidate()宏:刷新TLB

// 刷新快表TLB
#define invalidate() \
__asm__("movl %%eax,%%cr3"::"a" (0))

首先要看懂GNU 内联汇编(GNU Inline Assembly) 的语法,在C语言中嵌入汇编指令。

GNU 内联汇编的基本格式

__asm__ [volatile] ("汇编指令模板"        // 必选:汇编指令字符串: 输出操作数约束      // 可选:指定输出操作数及其约束: 输入操作数约束      // 可选:指定输入操作数及其约束: 破坏的寄存器列表    // 可选:声明被指令修改的寄存器
);
  • __asm__ 是关键字,也可写作 asm,表示开始内联汇编。

  • volatile 是可选关键字,用于禁止编译器优化该汇编指令(内核中常用)。

  • 四个部分用 : 分隔,即使某部分无内容,对应的 : 也不能省略。

  • 基本操作数约束(单个字符)

    约束符含义适用操作数类型
    a使用 CPU 的 EAX/AX/AL 寄存器传递操作数整数(int、long 等)
    b使用 EBX/BX/BL 寄存器传递操作数整数
    c使用 ECX/CX/CL 寄存器传递操作数整数
    d使用 EDX/DX/DL 寄存器传递操作数整数
    S使用 ESI 寄存器传递操作数整数
    D使用 EDI 寄存器传递操作数整数
    r使用 任意通用寄存器(EAX/EBX/ECX/EDX/ESI/EDI 等)传递操作数整数
    qr 的别名,等价于 r整数
    g使用 任意寄存器、内存或立即数传递操作数(编译器自动选择)整数、内存变量、立即数
    m使用 内存地址传递操作数(操作数在内存中)内存变量(如数组、结构体成员)
    o使用 内存地址传递操作数,且地址是 可优化的(编译器可能选择更优寻址方式)内存变量
    V使用 内存地址传递操作数,且地址是 不可优化的(强制使用给定寻址方式)内存变量
    i操作数是 立即数,且可作为指令的操作码部分(如移位指令的移位次数)立即数(常量表达式)
    F操作数是 浮点常数(如浮点数立即数)浮点数常量
    f使用 浮点寄存器传递操作数浮点数变量
    t使用 第一个寄存器(通常是 EAX)传递操作数整数
    u使用 第二个寄存器(通常是 EDX)传递操作数整数
    w允许使用 字长寄存器(如 AX、BX 等 16 位寄存器)16 位整数
    x通用约束符,等价于 g整数、内存、立即数

那么这个代码可以看成,把CR3寄存器设置成0

mov eax, 0       ;0 存入 eax
mov cr3, eax     ; 将 eax 的值写入 cr3

为什么设置 CR3 为 0?

为了刷新TLB:只要是写入CR3,不i管值变不变都会刷新。

  • CR3 寄存器在head.s里面就被设置成0了,始终指向页目录基址 0,再置零不改变他的值。
  • 此处调用 invalidate() 的目的并非修改CR3的值,而是通过 写入 CR3 寄存器(即使值不变)触发 CPU 的 TLB 刷新机制

x86 架构规定:当向 CR3 写入数据时,无论值是否变化,CPU 都会 清空 TLB 缓存,迫使后续虚拟地址转换时重新查询页目录和页表,确保使用最新的地址映射关系。


相关文章:

Linux0.11内存管理:相关代码

ch13_2 源码分析 boot/head.s 页表初始化: 目标:初始化分页机制,将线性地址空间映射到物理内存(前 16MB),为保护模式下的内存管理做准备。核心流程 分配页目录表和页表的物理内存空间(通过 .…...

ShaderToy学习笔记 03.多个形状和旋转

1. 正方形和旋转 1.1. 正方形 要绘制一个正方形,我们需要定义一个点到正方形边界的距离函数。对于中心在原点的正方形,其数学表达式为: 对于一个点 p(x,y) 到正方形边界的距离函数可以表示为: d max(|x|, |y|) - r 其中: |x| 和 |y| 分…...

Arduino+ESP01S烧录

这种办法不使用与ThonnyMircopython 前言 这里我们使用烧录器烧录,淘宝十几块钱一个的东西,ESP01S做一个WIFI继电器还是蛮有用的,就是烧录起来不太方便,传统的办法接线麻烦,需多次上电,也可能因为电源问题…...

什么是Lua模块?你会如何使用NGINX的Lua模块来定制请求处理流程?

大家好,我是锋哥。今天分享关于【什么是Lua模块?你会如何使用NGINX的Lua模块来定制请求处理流程?】面试题。希望对大家有帮助; 什么是Lua模块?你会如何使用NGINX的Lua模块来定制请求处理流程? 1000道 互联…...

小白自学python第三天

学习python第三天 一、函数 1、函数介绍 函数就是组织好的,可重复使用的,用以实现特定功能的代码块。 现在我们现在需要统计多个字符串长度并且不考虑使用内置函数,你会怎么做?我们先用一种原始人办法看看吧: str…...

【CF】Day44——Codeforces Round 908 (Div. 2) C + Codeforces Round 1020 (Div. 3) DE

C. Anonymous Informant 题目: 思路: 比这场的D难,虽然也不是很难 一个很容易想到的就是由当前状态推出初始状态,那么怎么推呢? 一个性质就是如果对于某一个 x 它可以执行左移操作的话,那么它一定会到数组…...

深入理解HashMap:Hash冲突的解决机制

引言 HashMap 是 Java 集合框架中最常用的数据结构之一,它通过键值对的形式存储数据,并利用哈希算法实现高效的插入、删除和查询操作。然而,在实际使用中,由于哈希函数的有限性和哈希桶数量的限制,不可避免地会出现 哈…...

Datawhale AI春训营二期---使用AI实现老人的点餐效果(关于task2的相关思考)

文章目录 1.多次测试的结果2.分数是如何提高的3.关于上分点拨4.关于task2的收获 1.多次测试的结果 第一次和第二次的,都是使用的baseline: 第三次的: 2.分数是如何提高的 之前的几次都是通过这个baseline进行运行的,然后今天是了解了一下这…...

摩尔投票法详细介绍

原理 摩尔投票法(Boyer-Moore Voting Algorithm)是一种用于在存在多数元素的数组中,高效找出出现次数超过数组长度一半的元素的算法。其核心思想是通过元素抵消策略,逐步缩小候选范围,最终确定多数元素。 核心假设&a…...

DP之书架

现按一定顺序给出所有要放置于书架上的书,共有 n 本,第 i 本书有一个长度 hi​。 书架有若干层,层与层之间的宽度不一定相等,但是一层的宽度不能小于其上所摆放的任何一本书的长度。同时,每层上的书的长度之和不能超过…...

Python Cookbook-6.11 缓存环的实现

任务 你想定义一个固定尺寸的缓存,当它被填满时,新加入的元素会覆盖第一个(最老的)元素。这种数据结构在存储日志和历史信息时非常有用。 解决方案 当缓存填满时,本节解决方案及时地修改了缓存对象,使其从未填满的缓存类变成了…...

计算机网络基本概念

层次名称主要功能第七层应用层直接面向用户,提供应用服务(如浏览网页、发邮件)第六层表示层处理数据格式、加密解密、压缩解压第五层会话层建立、管理、终止会话(连接)第四层传输层提供端到端的数据传输(如…...

Eigen线性代数求解器(分解类)

1. 核心分解类概览 Eigen 提供多种矩阵分解方法,适用于不同矩阵类型(稠密/稀疏、正定/非正定等): 分解类适用矩阵类型分解形式典型应用场景PartialPivLU方阵(可逆)APLUAPLU通用线性方程组求解FullPivLU任…...

【Android】四大组件之Service

目录 一、什么是Service 二、启停 Service 三、绑定 Service 四、前台服务 五、远程服务扩展 六、服务保活 七、服务启动方法混用 你可以把Service想象成一个“后台默默打工的工人”。它没有UI界面,默默地在后台干活,比如播放音乐、下载文件、处理…...

VO包装类和实体类分别是什么?区别是什么?

VO包装类和实体类 1. 实体类(Entity Class)是什么?2. VO包装类(Value Object Class)是什么?3. VO包装类和实体类的区别4. 实际应用中的区别5. 举例5.1. 实体类(Entity Class)的定义与…...

如何创建一个C#项目(基于VS2022版)

一.先找到要保存项目的位置,新建一个文件夹 二.打开VisualStudio,选择创建新项目 三.选择模版: 选择操作语言和操作系统 这个是跨平台的 初学在windows系统上,可选择其他,下面这个是不带窗体模版 也可根据需要选择带窗体模版 点击下一步 填写项目名称,选择项目保存位置,填写解…...

RabbitMQ 四种交换机(Direct、Topic、Fanout、Headers)详解

本文是博主在梳理 RabbitMQ 知识的过程中,将所遇到和可能会遇到的基础知识记录下来,用作梳理 RabbitMQ 的整体架构和功能的线索文章,通过查找对应的知识能够快速的了解对应的知识而解决相应的问题。 文章目录 一、直连交换机(Dire…...

聚合分销系统开发:短剧小说外卖网盘电商cpscpa系统

聚合分销系统是一种整合了多种分销项目和功能的综合性平台,其核心在于通过CPS(按销售付费)和CPA(按行为付费)两种模式,为推广者提供多样化的赚钱机会。以下是聚合分销系统的主要项目和功能: 一…...

【Flume 】Windows安装步骤、配置环境

🛠 Flume 是什么? Apache Flume 是一个高效、可靠、可扩展的数据收集系统,通常用于收集日志、流数据,比如收集数据到 HDFS、Kafka 等。 虽然 Flume 本身是为 Linux 服务器设计的,但 在 Windows 本地也是能跑起来的&a…...

【信息系统项目管理师】高分论文:论质量管理和进度管理(智慧旅游平台建设项目)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划质量管理2、质量保证3、质量控制论文 2019年3月,我作为项目经理,参加了某市智慧旅游平台建设项目,负责项目的全面管理, 该项目以打造一流的国内外生态旅游城市为目标,旨在大数据云平台建设的基…...

一致性哈希详解:优雅地扩展分布式系统

引言 对于哈希算法,相信大家一定不会陌生。它经常被用在负载均衡、分库分表等场景中。例如,在进行分库分表时,我们可能初步根据业务分析,确定 128 张表足以满足当前的数据量需求。此时,当需要插入或查询一条记录时&am…...

pytest 技术总结

目录 一 pytest的安装: 二 pytest有三种启动方式: 三 用例规则: 四 配置框架: 一 pytest的安装: pip install pytest # 安装 pip install pytest -U # 升级到最新版 二 pytest有三种启动方式: 1…...

数据库MySQL学习——day5(总结与复习实践)

文章目录 1、复习总结1.1. 数据库基础1.2. 表操作1.3. 数据操作1.4. 更新与删除 2、实践任务:创建学生管理系统数据库2.1. 数据库设计2.2. 创建表的SQL语句2.3. 插入示例数据2.4. 查询与数据操作示例 3、调试与练习4、 今日小结 1、复习总结 1.1. 数据库基础 数据…...

unity bug

发现一个奇怪的bug,就是某些unity版本打包apk时候不允许StreamingAssets里面有中文文件或者中文路径。比如下图这面这俩都是不行的。 解决方案:中文改为英文即可。 一般报错信息如下: > Configure project :launcher WARNING:The option s…...

苹果计划2026年底前实现美版iPhone“印度造”,以减轻关税及地缘政治风险

基于 6 个来源 据多家媒体报道,苹果公司计划在2026年底前,实现在印度组装销往美国的大部分或全部iPhone手机,以减轻关税和地缘政治紧张局势带来的风险。这一目标意味着苹果需将印度的iPhone产量增加一倍以上,凸显其供应链多元化战…...

新增Webhook通知功能,文档目录树展示性能优化,zyplayer-doc 2.5.1 发布啦!

zyplayer-doc是一款适合企业和个人使用的WIKI知识库管理工具,支持在线编辑富文本、Markdown、表格、Office文档、API接口、思维导图、Drawio以及任意的文本文件,支持基于知识库的AI问答,专为私有化部署而设计,最大程度上保证企业或…...

【量化交易笔记】17.多因子的线性回归模型策略

前言 上一篇介绍了 因子的评价和分析方法,让我知道如何判断该因子的作用,以及对最终结果的影响,其最大的问题,他只能评价和分析单因子,而对多个因子,不能直接加以评价。我们自然会想到,如果是多…...

五年经验Java开发如何破局创业

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息文章目录 五年经验Java开发如何破局创业一、创业方向筛选与优劣势分析**方向1:技术教育/在线课程开发****方向2:企业级技术服务外包****方向3:技…...

定制一款国密浏览器(11):SM2算法的椭圆曲线参数定义

在国密算法中,SM2 算法是最复杂的,不仅是算法本身比较复杂,其应用场景也复杂。不管 SM2 算法本身有多复杂,作为开发者,我们需要知道的是 SM2 算法是建立在椭圆曲线算法(ECC)之上。关于 SM2 算法和椭圆曲线算法之间的关系,参考我之前的一篇文章: 解读国密非对称加密算…...

RAG技术与应用---0426

大语言模型>3.10 课程中会用到python 工具箱: faiss,modelscope,langchain,langchain_community,PyPDF2 1)大模型应用开发的三种模式 提示词没多少工作量,微调又花费时间费用,RAG是很多公司招聘用来对LLM进行应用…...

STM32的开发环境介绍

目录 STM32软件环境 Keil软件在线安装 其他软件环境安装 STM32开发的几种方式 STM32寄存器版本和库函数版本 标准外设库的作用: STM32软件环境 STM32 的集成开发环境(IDE):编辑编译软件 常见的环境: (1)KEIL&a…...

【生成式AI】从原理到实践的创造性革命

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现(文生图) 三、性能对比测试方法论量化数据对比结果分析 四、最佳实践推荐方…...

Win下Pycharm运行/调试配置脚本形参执行替换Linux下终端执行,进行调试需要注意的

Linux下终端执行 python demo/image_demo.py demo/demo.jpg rtmdet_tiny_8xb32-300e_coco.py --weights rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth --device cpuWin下Pycharm运行/调试配置脚本形参执行 主要改红色两处 如果工作目录正确,脚本形参…...

Pytorch(无CPU搭建)+Jupyter

2024年最新最简洁深度学习环境配置:AnacondaPyTorch(CPU、GPU)VScodePycahrm_哔哩哔哩_bilibili 跟 PyCharm說再見, [VSCode] PythonJupyter 超牛逼的功能 ! 5分鐘大幅提升編碼效率~ 數據分析、AI大神必備_哔哩哔哩_bilibili...

类的高级特性与语法细节

static 静态关键字 Java中的static关键字用于修饰类的成员(属性或方法),表示“静态”的含义,即属于类本身,而非某个对象。静态成员在内存中只有一份,在类加载时初始化,生命周期贯穿程序运行始终…...

基于 RAG 的 Text2SQL 全过程的 Python 实现详解,结合 LangChain 框架实现自然语言到 SQL 的转换

什么是RAG 一、核心流程:三阶段协同 RAG的核心流程分为检索(Retrieval)、增强(Augmentation)、生成(Generation)三个阶段,形成“检索→知识整合→生成”的闭环。 1. 检索&#xff…...

使用 OpenCV 进行视觉图片调整的几种常见方法

以下是使用 OpenCV 进行视觉图片调整的几种常见方法: 调整图片大小 指定目标尺寸:使用cv2.resize()函数,通过设定目标图像的宽度和高度来调整图片大小。例如,将图片调整为 200x200 像素: import cv2 image cv2.imre…...

【特殊场景应对9】视频简历的适用场景与风险分析

写在最前 作为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offe…...

Dify 1.3.0 为 LLM 节点引入了结构化输出支持

Dify 1.3.0 为 LLM 节点引入了结构化输出支持 0. 引言1. 使用方法 0. 引言 Dify 1.3.0 开始,在 LLM 节点支持结构化输出:Dify 已经为 LLM 节点引入了结构化输出支持。这意味着您的语言模型现在可以返回整齐组织且易于处理的数据。后端实现由 Nov1c444 在…...

【Linux网络】HTTP协议全解析 - 从请求响应到方法与Header

📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...

JSP实现用户登录注册系统(三天内自动登录)

JSP实现用户登录注册系统 引言 在Web开发中,用户认证是最基础且核心的功能之一。本文基于JSP技术,实现了一个包含注册、登录、自动登录(3天内)、退出等功能的用户系统,并在过程中解决了Cookie字符错误、错误信息回显…...

大数据模型现状分析

大数据模型现状分析 一、引言 在当今数字化时代,数据以前所未有的速度增长,大数据已成为推动各行业发展的核心动力。大数据模型作为挖掘数据价值的关键工具,正受到广泛关注与深入研究。通过对海量、多样且高速产生的数据进行处理和分析&…...

代码随想录算法训练营第二十八天

LeetCode题目: 509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯2444. 统计定界子数组的数目(每日一题) 其他: 今日总结 往期打卡 动态规划解题步骤: 确定递推公式确定遍历顺序记忆化搜索(确定dp数组以及下标的含义与初始化值)递推优化与空间优化 509. 斐波那契数 跳转: 5…...

HTML与安全性:XSS、防御与最佳实践

HTML 与安全性:XSS、防御与最佳实践 前言 现代 Web 应用程序无处不在,而 HTML 作为其基础结构,承载着巨大的安全责任。跨站脚本攻击(XSS)仍然是 OWASP Top 10 安全威胁之一,对用户数据和网站完整性构成严…...

三维重建(二十)——思路整理与第一步的进行

文章目录 一、整体思路二、细分三、之前存在问题四、任务安排五、第一步——找到内参并选定一种5.1 train的RTK5.2 test的RTK5.3 各选择一个5.3.1 train-185.3.2 test-193一、整体思路 这部分主要是宏观的讲一下整体框架。 从gshell里面提取核心参数,放入py3d,渲染出图片,…...

判断 ONNX 模型是否支持 GPU

🔍 判断 ONNX 模型是否支持 GPU 的几个关键点: ✅ 1. 检查模型支持的 Execution Provider 可以通过下面的代码打印出来当前模型使用了什么设备: 需要安装好:onnxruntime-gpu import onnxruntime as ort session ort.InferenceSe…...

CANFD技术在实时运动控制系统中的应用:协议解析、性能测试与未来发展趋势

摘要: 本文深入探讨了CANFD技术在实时运动控制系统中的应用。通过对传统CAN协议与CANFD协议的对比分析,详细阐述了CANFD在提升数据传输效率、增强系统实时性与稳定性方面的优势。文章结合具体测试案例,对CANFD总线的性能指标进行了全面评估&a…...

Java基础 4.26

1.访问修饰符细节 package com.logic.modifier;public class A {public int n1 100;protected int n2 200;int n3 300;private int n4 400;public void m1() {//在同一个类中 可以访问public protected 默认 private 修饰属性和方法System.out.println(n1 " " …...

山东大学离散数学第九章习题解析

参考教材:离散数学教程,徐秋亮 / 栾俊峰 / 卢雷 / 王慧 / 赵合计 编著,山东大学计算机科学与技术学院 注:该解析为个人所写,涵盖了 2022-2023-2 学期赵合计老师所布置的所有课本习题;由于学识、认识及经验…...

5G融合消息PaaS项目深度解析 - Java架构师面试实战

5G融合消息PaaS项目深度解析 - Java架构师面试实战 场景:互联网大厂Java求职者面试,面试官针对5G融合消息PaaS项目进行提问。 第一轮提问 面试官:马架构,请简要介绍5G融合消息PaaS平台的核心功能和应用场景。 马架构&#xff…...