鸿蒙轻内核A核源码分析系列四(2) 虚拟内存

本文我们来熟悉下OpenHarmony鸿蒙轻内核提供的虚拟内存(Virtual memory)管理模块。

本文中所涉及的源码,以OpenHarmony LiteOS-A内核为例,均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_a 获取。如果涉及开发板,则默认以hispark_taurus为例。

我们首先了解了虚拟内存管理的结构体、相关宏定义,接着会分析内核虚拟地址空间和用户进程虚拟地址空间如何初始化,然后分析虚拟内存区间常用操作包含查找、申请和释放等,最后分析动态内存堆的申请、释放接口的源代码,并简单介绍下内存区间预留接口源代码。

1、 虚拟内存管理相关的结构体

在文件kernel/base/include/los_vm_map.h中定义了进程地址空间结构体LosVmSpace,进程地址区间结构体LosVmMapRegion和进程地址区间范围结构体LosVmMapRange。每个用户态进程会创建自己的进程空间,内核态会创建2个进程空间,分别g_kVmSpaceg_vMallocSpace。从进程空间申请的虚拟内存块使用进程区间LosVmMapRegion来表示。每个进程空间维护一个红黑树来链接各个进程区间。

1.1 虚拟内存地址空间结构体LosVmSpace

typedef struct VmSpace {LOS_DL_LIST         node;           /**< 地址空间双向链表 */LosRbTree           regionRbTree;   /**< 地址区间的红黑树根节点 */LosMux              regionMux;      /**< 地址区间的红黑树的互斥锁 */VADDR_T             base;           /**< 地址空间开始地址 */UINT32              size;           /**< 地址空间大小 */VADDR_T             heapBase;       /**< 地址空间的堆开始地址heapBase */VADDR_T             heapNow;        /**< 地址空间的堆开始地址heapNow */LosVmMapRegion      *heap;          /**< 地址空间的地址区间 */VADDR_T             mapBase;        /**< 地址空间的映射区开始地址 */UINT32              mapSize;        /**< 地址空间的映射区大小 */LosArchMmu          archMmu;        /**< 地址空间的MMU结构体 */
#ifdef LOSCFG_DRIVERS_TZDRIVERVADDR_T             codeStart;      /**< 用户进程代码区开始地址 */VADDR_T             codeEnd;        /**< 用户进程代码区结束地址 */
#endif
} LosVmSpace;

1.2 虚拟内存地址区间LosVmMapRegion

typedef struct VmMapRange {VADDR_T             base;           /**< 虚拟内存地址区间开始地址 */UINT32              size;           /**< 虚拟内存地址区间大小 */
} LosVmMapRange;
......
struct VmMapRegion;
typedef struct VmMapRegion LosVmMapRegion;
......
struct VmMapRegion {LosRbNode           rbNode;         /**<  地址区间红黑树节点 */LosVmSpace          *space;         /**<  地址区间所在的地址空间 */LOS_DL_LIST         node;           /**<  地址区间双向链表 */LosVmMapRange       range;          /**<  地址区间地址范围 */VM_OFFSET_T         pgOff;          /**<  地址区间页偏移 */UINT32              regionFlags;    /**<  地址区间标记: cow, user_wired */UINT32              shmid;          /**<  共享地址区间编号 */UINT8               forkFlags;      /**<  地址区间fork标记: COPY, ZERO, */UINT8               regionType;     /**<  地址区间类型: ANON, FILE, DEV */union {struct VmRegionFile {unsigned int fileMagic;struct file *file;const LosVmFileOps *vmFOps;} rf;struct VmRegionAnon {LOS_DL_LIST  node;          /**< 地址区间类型的双向链表 */} ra;struct VmRegionDev {LOS_DL_LIST  node;          /**< 地址区间类型的双向链表 */const LosVmFileOps *vmFOps;} rd;} unTypeData;
};

2、 虚拟内存相关的宏定义

文件kernel/base/include/los_vm_common.hkernel/base/include/los_vm_zone.h定义了虚拟内存相关的宏。对于32位系统,虚拟进程空间大小为4GiB,OpenHarmony鸿蒙轻内核当前支持32位系统。⑴和⑵定义了用户进程虚拟地址空间的开始地址和大小,⑶是用户虚拟进程空间的结束地址,接着定义的是用户虚拟进程空间的堆区、映射区的开始地址和大小。

/* user address space, defaults to below kernel space with a 16MB guard gap on either side */#ifndef USER_ASPACE_BASE
⑴  #define USER_ASPACE_BASE            ((vaddr_t)0x01000000UL)#endif#ifndef USER_ASPACE_SIZE
⑵  #define USER_ASPACE_SIZE            ((vaddr_t)KERNEL_ASPACE_BASE - USER_ASPACE_BASE - 0x01000000UL)#endif⑶  #define USER_ASPACE_TOP_MAX         ((vaddr_t)(USER_ASPACE_BASE + USER_ASPACE_SIZE))#define USER_HEAP_BASE              ((vaddr_t)(USER_ASPACE_TOP_MAX >> 2))#define USER_MAP_BASE               ((vaddr_t)(USER_ASPACE_TOP_MAX >> 1))#define USER_MAP_SIZE               ((vaddr_t)(USER_ASPACE_SIZE >> 3))

内核虚拟进程空间的宏定义如下,⑴处定义内核进程地址空间开始地址和大小,⑵处定义内核非缓存虚拟地址空间开始地址和大小,⑶处定义虚拟动态分配地址空间开始地址和大小,⑷处定义外设开始地址和大小,⑸处定义外设缓存区开始地址和大小,⑹处定义外设非缓存区开始地址和大小。

    #ifdef LOSCFG_KERNEL_MMU#ifdef LOSCFG_TEE_ENABLE#define KERNEL_VADDR_BASE       0x41000000#else#define KERNEL_VADDR_BASE       0x40000000#endif#else#define KERNEL_VADDR_BASE       DDR_MEM_ADDR#endif#define KERNEL_VADDR_SIZE       DDR_MEM_SIZE#define SYS_MEM_BASE            DDR_MEM_ADDR#define SYS_MEM_END             (SYS_MEM_BASE + SYS_MEM_SIZE_DEFAULT)#define _U32_C(X)  X##U#define U32_C(X)   _U32_C(X)#define KERNEL_VMM_BASE         U32_C(KERNEL_VADDR_BASE)#define KERNEL_VMM_SIZE         U32_C(KERNEL_VADDR_SIZE)⑴  #define KERNEL_ASPACE_BASE      KERNEL_VMM_BASE#define KERNEL_ASPACE_SIZE      KERNEL_VMM_SIZE/* Uncached vmm aspace */
⑵  #define UNCACHED_VMM_BASE       (KERNEL_VMM_BASE + KERNEL_VMM_SIZE)#define UNCACHED_VMM_SIZE       DDR_MEM_SIZE⑶  #define VMALLOC_START           (UNCACHED_VMM_BASE + UNCACHED_VMM_SIZE)#define VMALLOC_SIZE            0x08000000#ifdef LOSCFG_KERNEL_MMU
⑷  #define PERIPH_DEVICE_BASE      (VMALLOC_START + VMALLOC_SIZE)#define PERIPH_DEVICE_SIZE      U32_C(PERIPH_PMM_SIZE)
⑸  #define PERIPH_CACHED_BASE      (PERIPH_DEVICE_BASE + PERIPH_DEVICE_SIZE)#define PERIPH_CACHED_SIZE      U32_C(PERIPH_PMM_SIZE)
⑹  #define PERIPH_UNCACHED_BASE    (PERIPH_CACHED_BASE + PERIPH_CACHED_SIZE)#define PERIPH_UNCACHED_SIZE    U32_C(PERIPH_PMM_SIZE)#else#define PERIPH_DEVICE_BASE      PERIPH_PMM_BASE#define PERIPH_DEVICE_SIZE      U32_C(PERIPH_PMM_SIZE)#define PERIPH_CACHED_BASE      PERIPH_PMM_BASE#define PERIPH_CACHED_SIZE      U32_C(PERIPH_PMM_SIZE)#define PERIPH_UNCACHED_BASE    PERIPH_PMM_BASE#define PERIPH_UNCACHED_SIZE    U32_C(PERIPH_PMM_SIZE)#endif

虚拟地址空间分布示意图如下:

3、进程地址空间初始化

虚拟进程空间分用户虚拟进程空间和内核虚拟进程空间,每个用户进程都会创建属于自己的进程空间。内核会初始化2个进程空间。下文详细介绍。

3.1 内核虚拟地址空间初始化

3.1.1 函数OsKSpaceInit

函数OsKSpaceInit()初始化内核进程虚拟地址空间,⑴处的函数初始化虚拟空间链表互斥锁g_vmSpaceListMux,在操作内核进程空间时需要持有该互斥锁。⑵处开始的函数2个函数OsKernVmSpaceInitOsVMallocSpaceInit分别初始化内核进程虚拟空间g_kVmSpace和内核动态分配进程空间g_vMallocSpace。传入的第2个参数由函数OsGFirstTableGet()获取,即g_firstPageTable,这是内核的2个进程空间使用的一级页表基地址,大小为0x4000字节,后文在设置转化表基地址MMU virtTtb时会使用。下文会详细分析这2个函数。

VOID OsKSpaceInit(VOID)
{
⑴  OsVmMapInit();
⑵  OsKernVmSpaceInit(&g_kVmSpace, OsGFirstTableGet());OsVMallocSpaceInit(&g_vMallocSpace, OsGFirstTableGet());
}

3.1.2 函数OsKernVmSpaceInit

函数OsKernVmSpaceInit()初始化内核进程虚拟地址空间,⑴处设置地址空间的开始地址和大小,⑵处设置地址空间映射区的开始地址和大小,对于内核虚拟地址空间g_kVmSpace,这2个开始地址和大小是一样的。⑶处调用通用的地址空间初始化函数,后文分析此函数。

BOOL OsKernVmSpaceInit(LosVmSpace *vmSpace, VADDR_T *virtTtb)
{
⑴  vmSpace->base = KERNEL_ASPACE_BASE;vmSpace->size = KERNEL_ASPACE_SIZE;
⑵  vmSpace->mapBase = KERNEL_VMM_BASE;vmSpace->mapSize = KERNEL_VMM_SIZE;
#ifdef LOSCFG_DRIVERS_TZDRIVERvmSpace->codeStart = 0;vmSpace->codeEnd = 0;
#endif
⑶   return OsVmSpaceInitCommon(vmSpace, virtTtb);
}

3.1.3 函数OsVMallocSpaceInit

函数OsVMallocSpaceInit()初始化内核堆虚拟空间,设置的虚拟地址空间和映射区地址空间的开始地址和大小也是一样的,代码和函数OsKernVmSpaceInit()类似,不再赘述。

BOOL OsVMallocSpaceInit(LosVmSpace *vmSpace, VADDR_T *virtTtb)
{vmSpace->base = VMALLOC_START;vmSpace->size = VMALLOC_SIZE;vmSpace->mapBase = VMALLOC_START;vmSpace->mapSize = VMALLOC_SIZE;
#ifdef LOSCFG_DRIVERS_TZDRIVERvmSpace->codeStart = 0;vmSpace->codeEnd = 0;
#endifreturn OsVmSpaceInitCommon(vmSpace, virtTtb);
}

3.2 用户进程虚拟地址空间初始化

3.2.1 函数OsCreateUserVmSpace

在创建进程时,会调用函数OsCreateUserVmSpace()创建用户进程的虚拟地址空间。⑴为虚拟地址空间结构体申请内存。⑵申请一个内存页,并调用memset_s()初始化为0,这个内存页虚拟地址会作为页表转换基地址TTB(translation table base,ttb),虚实映射的页表会保存在这个内存区域。在虚实映射章节,会讲述为什么申请4KiB大小内存。⑶处调用函数OsUserVmSpaceInit初始化用户进程虚拟地址空间。⑷处获取虚拟地址对应的物理页结构体地址。如果初始化失败,则释放申请的内存。⑸处把物理页加入虚拟空间中的MMU的页表链表中,这个链表维护该进程空间映射的内存页。

LosVmSpace *OsCreateUserVmSpace(VOID)
{BOOL retVal = FALSE;⑴   LosVmSpace *space = LOS_MemAlloc(m_aucSysMem0, sizeof(LosVmSpace));if (space == NULL) {return NULL;}⑵  VADDR_T *ttb = LOS_PhysPagesAllocContiguous(1);if (ttb == NULL) {(VOID)LOS_MemFree(m_aucSysMem0, space);return NULL;}(VOID)memset_s(ttb, PAGE_SIZE, 0, PAGE_SIZE);
⑶  retVal = OsUserVmSpaceInit(space, ttb);
⑷  LosVmPage *vmPage = OsVmVaddrToPage(ttb);if ((retVal == FALSE) || (vmPage == NULL)) {(VOID)LOS_MemFree(m_aucSysMem0, space);LOS_PhysPagesFreeContiguous(ttb, 1);return NULL;}
⑸   LOS_ListAdd(&space->archMmu.ptList, &(vmPage->node));return space;
}

3.2.2 函数OsUserVmSpaceInit

函数OsUserVmSpaceInit初始化用户进程虚拟地址空间,⑴处设置虚拟地址空间的开始地址和大小。⑵处设置虚拟空间的映射区的开始地址和大小,开始地址在虚拟空间开始地址的1/2处,大小为用户虚拟空间大小的1/8。⑶处设置虚拟空间的堆区,开始地址为虚拟空间开始地址的1/4处。

BOOL OsUserVmSpaceInit(LosVmSpace *vmSpace, VADDR_T *virtTtb)
{
⑴  vmSpace->base = USER_ASPACE_BASE;vmSpace->size = USER_ASPACE_SIZE;
⑵  vmSpace->mapBase = USER_MAP_BASE;vmSpace->mapSize = USER_MAP_SIZE;
⑶  vmSpace->heapBase = USER_HEAP_BASE;vmSpace->heapNow = USER_HEAP_BASE;vmSpace->heap = NULL;
#ifdef LOSCFG_DRIVERS_TZDRIVERvmSpace->codeStart = 0;vmSpace->codeEnd = 0;
#endifreturn OsVmSpaceInitCommon(vmSpace, virtTtb);
}

3.3 虚拟地址空间初始化的通用函数

3.3.1 函数OsVmSpaceInitCommon

函数OsVmSpaceInitCommon用于进程虚拟地址空间的通用部分的初始化,⑴处初始化地址空间的红黑树根节点。⑵处初始化地址空间的地址区间操作互斥锁。⑶处把新创建的地址空间挂在虚拟地址空间双向链表g_vmSpaceList上。⑷处继续调用函数OsArchMmuInit()完成地址空间MMU部分的初始化。

STATIC BOOL OsVmSpaceInitCommon(LosVmSpace *vmSpace, VADDR_T *virtTtb)
{
⑴  LOS_RbInitTree(&vmSpace->regionRbTree, OsRegionRbCmpKeyFn, OsRegionRbFreeFn, OsRegionRbGetKeyFn);⑵  status_t retval = LOS_MuxInit(&vmSpace->regionMux, NULL);if (retval != LOS_OK) {VM_ERR("Create mutex for vm space failed, status: %d", retval);return FALSE;}(VOID)LOS_MuxAcquire(&g_vmSpaceListMux);
⑶  LOS_ListAdd(&g_vmSpaceList, &vmSpace->node);(VOID)LOS_MuxRelease(&g_vmSpaceListMux);⑷   return OsArchMmuInit(&vmSpace->archMmu, virtTtb);
}

3.3.2 函数OsArchMmuInit

函数OsArchMmuInit()用于初始化虚拟地址空间的MMU,MMU在后续系列会详细分析,此处快速了解一下即可。⑴处获取地址空间编号,如果获取失败则返回FALSE。⑵初始化MMU互斥锁,如果初始化失败则返回FALSE。⑶处初始化内存页双向链表。⑷处设置MMU的TTB虚拟地址。⑸处设置MMU的TTB物理地址,TTB虚拟地址基于内核虚拟地址空间开始地址的偏移(UINTPTR)virtTtb - KERNEL_ASPACE_BASE加上物理地址就等于TTB物理地址。

BOOL OsArchMmuInit(LosArchMmu *archMmu, VADDR_T *virtTtb)
{
#ifdef LOSCFG_KERNEL_VM
⑴   if (OsAllocAsid(&archMmu->asid) != LOS_OK) {VM_ERR("alloc arch mmu asid failed");return FALSE;}
#endif⑵   status_t retval = LOS_MuxInit(&archMmu->mtx, NULL);if (retval != LOS_OK) {VM_ERR("Create mutex for arch mmu failed, status: %d", retval);return FALSE;}⑶  LOS_ListInit(&archMmu->ptList);
⑷  archMmu->virtTtb = virtTtb;
⑸  archMmu->physTtb = (VADDR_T)(UINTPTR)virtTtb - KERNEL_ASPACE_BASE + SYS_MEM_BASE;return TRUE;
}

4、虚拟地址区间常用操作

虚拟地址区间操作分为查找、申请、释放等操作。

4.1 函数LOS_RegionFind

⑴处的函数LOS_RegionFind用于在进程虚拟地址空间内查找并返回指定虚拟地址对应的虚拟地址区间,两个传入参数分别是虚拟地址空间和虚拟内存地址。该函数有个兄弟函数LOS_RegionRangeFind(),见⑶处代码,可以用于在进程空间内查找并返回指定地址范围对应的虚拟地址区间,三个传入参数分别指定指定进程空间、虚拟内存开始地址和地址长度(长度单位字节)。这2个函数都调用函数OsFindRegion()实现地址区间的查找,⑵处的第3个参数为1的原因是地址区间是左闭右开区间,区间的结束地址会减1。下文会分析该函数的代码。

⑴   LosVmMapRegion *LOS_RegionFind(LosVmSpace *vmSpace, VADDR_T addr){LosVmMapRegion *region = NULL;(VOID)LOS_MuxAcquire(&vmSpace->regionMux);
⑵      region = OsFindRegion(&vmSpace->regionRbTree, addr, 1);(VOID)LOS_MuxRelease(&vmSpace->regionMux);return region;}
⑶  LosVmMapRegion *LOS_RegionRangeFind(LosVmSpace *vmSpace, VADDR_T addr, size_t len){LosVmMapRegion *region = NULL;(VOID)LOS_MuxAcquire(&vmSpace->regionMux);region = OsFindRegion(&vmSpace->regionRbTree, addr, len);(VOID)LOS_MuxRelease(&vmSpace->regionMux);return region;}

如果大家想更加深入的学习 OpenHarmony 开发的内容,不妨可以参考以下相关学习文档进行学习,助你快速提升自己:

OpenHarmony 开发环境搭建:https://qr18.cn/CgxrRy

《OpenHarmony源码解析》:https://qr18.cn/CgxrRy

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……

系统架构分析:https://qr18.cn/CgxrRy

  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

OpenHarmony 设备开发学习手册:https://qr18.cn/CgxrRy

在这里插入图片描述

OpenHarmony面试题(内含参考答案):https://qr18.cn/CgxrRy

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:https://qr21.cn/FV7h05

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/347326.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发文件管理:【@ohos.environment (目录环境能力)】

目录环境能力 该模块提供环境目录能力&#xff0c;获取内存存储根目录、公共文件根目录的JS接口。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。本模块接口为系统接口&#xff0c;三方应用不支…

SLT简介【简单介绍SLT】

SLT简介 在c的学习当中STL的学习是一个很重要的一环&#xff0c;但是STL又是一个庞大的章节&#xff0c;因此这里我们先简单介绍一下STL&#xff0c;有助于后面我们对STL的学习&#xff0c;这里就是做一个简单的介绍&#xff0c;并无干货。 1.什么是STL STL(standard templa…

【Emacs Verilog mode保姆级的使用指南】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Python | Leetcode Python题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; class Solution:def postorderTraversal(self, root: TreeNode) -> List[int]:def addPath(node: TreeNode):count 0while node:count 1res.append(node.val)node node.righti, j len(res) - count, len(res) - 1while i < j:res…

微软如何打造数字零售力航母系列科普13 - Prime Focus Technologies在NAB 2024上推出CLEAR®对话人工智能联合试点

Prime Focus Technologies在NAB 2024上推出CLEAR对话人工智能联合试点 彻底改变您与内容的互动方式&#xff0c;从内容的创建到分发 洛杉矶&#xff0c;2024年4月9日/PRNewswire/-媒体和娱乐&#xff08;M&E&#xff09;行业人工智能技术解决方案的先驱Prime Focus Techn…

【docker】compose 使用 .env 文件

在 Docker Compose 中&#xff0c;你可以使用 .env 文件来定义环境变量&#xff0c;这些变量可以在 docker-compose.yml 文件中被引用。这允许你轻松地管理配置&#xff0c;而不需要硬编码值到你的 Compose 文件中。 以下是如何在 Docker Compose 中使用 .env 文件的步骤&…

Qt C++ TCP服务端响应多客户端通讯

本示例使用的设备&#xff1a;WIFI无线4G网络RFID云读卡器远程网络开关物流网阅读器TTS语音-淘宝网 (taobao.com) #include "mainwindow.h" #include "ui_mainwindow.h" #include "QMessageBox" #include <QDebug> #include <exceptio…

qemu创建kvm虚拟机-x86模拟arm

1、虚拟机环境 虚拟机ubuntu22.042、下载需要的依赖 apt install openssh-server net-tools vim -yapt install qemu qemu-kvm qemu-system-arm bridge-utils uml-utilities qemu-efi-aarch64 cloud-image-utils -y#查看版本 qemu-img -V(1) 下载uefi固件 cd /optwget https…

[大模型]LLaMA3-8B-Instruct Lora 微调

本节我们简要介绍如何基于 transformers、peft 等框架&#xff0c;对 LLaMA3-8B-Instruct 模型进行 Lora 微调。Lora 是一种高效微调方法&#xff0c;深入了解其原理可参见博客&#xff1a;知乎|深入浅出 Lora。 这个教程会在同目录下给大家提供一个 nodebook 文件&#xff0c…

服务器如何远程桌面连接不上,服务器远程桌面连接不上解决办法

服务器远程桌面连接不上&#xff0c;是IT运维中常见的挑战之一。针对这一问题&#xff0c;专业的解决方法通常涉及以下几个方面的排查与操作&#xff1a; 首先&#xff0c;我们需要检查网络连接是否正常。远程桌面连接依赖于稳定的网络连接&#xff0c;因此&#xff0c;确认服务…

【云原生】创建harbor私有仓库及使用aliyun个人仓库

1.安装docker #删除已有dockersystemctl stop docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine #安装docker yum install -y docker-ce-20.10.1…

企业级开源项目,云缓存解决方案:CacheCloud

CacheCloud&#xff1a;简化缓存管理&#xff0c;释放数据潜力- 精选真开源&#xff0c;释放新价值。 概览 CacheCloud是由搜狐视频团队开发的一款开源的Redis缓存云平台&#xff0c;支持Redis多种架构(Standalone、Sentinel、Cluster)高效管理、有效降低大规模redis运维成本&…

8.transformers量化

Transformers 核心设计Auto Classes Transformers Auto Classes 设计:统一接口、自动检索 AutoClasses 旨在通过全局统一的接口 from_pretrained() ,实现基于名称(路径)自动检索预训练权重(模 型)、配置文件、词汇表等所有与模型相关的抽象。 灵活扩展的配置AutoConfig…

webshell三巨头 综合分析(蚁剑,冰蝎,哥斯拉)

考点: 蚁剑,冰蝎,哥斯拉流量解密 存在3个shell 过滤器 http.request.full_uri contains "shell1.php" or http.response_for.uri contains "shell1.php" POST请求存在明文传输 ant 一般蚁剑执行命令 用垃圾字符在最开头填充 去掉垃圾字符直到可以正常bas…

Bankless:为什么 AI 需要 Crypto 的技术?

原文标题&#xff1a;《Why AI Needs Crypto’s Values》 撰文&#xff1a;Arjun Chand&#xff0c;Bankless 编译&#xff1a;Chris&#xff0c;Techub News 原文来自香港Web3媒体&#xff1a;Techub News 人工智能革命的梦想一直是一把双刃剑。 释放人工智能的潜力可以解…

世优科技AI数字人多模态交互系统“世优波塔”正式发布

2024年6月6日&#xff0c;世优科技“波塔发布会”在北京举办&#xff0c;本次发布会上&#xff0c;世优科技以全新的“波塔”产品诠释了更高效、更智能、更全面的AI数字人产品及软硬件全场景解决方案&#xff0c;实现了世优品牌、产品和价值的全面跃迁。来自行业协会、数字产业…

AIGC简介

目录 1.概述 2.诞生背景 3.作用 4.优缺点 4.1.优点 4.2.缺点 5.应用场景 5.1.十个应用场景 5.2.社交媒体内容 6.如何使用 7.未来展望 8.总结 1.概述 AIGC 是“人工智能生成内容”&#xff08;Artificial Intelligence Generated Content&#xff09;的缩写&#x…

【计算机网络】P3 计算机网络协议、接口、服务的概念、区别以及计算机网络提供的三种服务方式

目录 协议什么是协议协议是水平存活的协议的组成 接口服务服务是什么服务原语 协议与服务的区别计算机网络提供的服务的三种方式面向连接服务与无连接服务可靠服务与不可靠服务有应答服务与无应答服务 协议 什么是协议 协议&#xff0c;就是规则的集合。 在计算机网络中&…

33 _ 跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性?

通过上篇文章的介绍&#xff0c;我们知道了同源策略可以隔离各个站点之间的DOM交互、页面数据和网络通信&#xff0c;虽然严格的同源策略会带来更多的安全&#xff0c;但是也束缚了Web。这就需要在安全和自由之间找到一个平衡点&#xff0c;所以我们默认页面中可以引用任意第三…

ARM32开发--PWM高级定时器

目录 文章目录 前言 目标 学习内容 需求 高级定时器通道互补输出 开发流程 通道配置 打开互补保护电路 完整代码 练习题 总结 前言 在嵌入式软件开发中&#xff0c;PWM&#xff08;脉冲宽度调制&#xff09;技术被广泛应用于控制各种电子设备的亮度、速度等参数。…