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

Linux内核,mmap_pgoff在mmap.c的实现

1. mmap_pgoff的系统调用实现如下

SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,unsigned long, prot, unsigned long, flags,unsigned long, fd, unsigned long, pgoff)
{return ksys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);
}

2. ksys_mmap_pgoff函数

unsigned long ksys_mmap_pgoff(unsigned long addr, unsigned long len,unsigned long prot, unsigned long flags,unsigned long fd, unsigned long pgoff)
{struct file *file = NULL;unsigned long retval;if (!(flags & MAP_ANONYMOUS)) {audit_mmap_fd(fd, flags);file = fget(fd);if (!file)return -EBADF;if (is_file_hugepages(file)) {len = ALIGN(len, huge_page_size(hstate_file(file)));} else if (unlikely(flags & MAP_HUGETLB)) {retval = -EINVAL;goto out_fput;}} else if (flags & MAP_HUGETLB) {struct hstate *hs;hs = hstate_sizelog((flags >> MAP_HUGE_SHIFT) & MAP_HUGE_MASK);if (!hs)return -EINVAL;len = ALIGN(len, huge_page_size(hs));/** VM_NORESERVE is used because the reservations will be* taken when vm_ops->mmap() is called*/file = hugetlb_file_setup(HUGETLB_ANON_FILE, len,VM_NORESERVE,HUGETLB_ANONHUGE_INODE,(flags >> MAP_HUGE_SHIFT) & MAP_HUGE_MASK);if (IS_ERR(file))return PTR_ERR(file);}retval = vm_mmap_pgoff(file, addr, len, prot, flags, pgoff);
out_fput:if (file)fput(file);return retval;
}

vm_mmap_pgoff函数

unsigned long vm_mmap_pgoff(struct file *file, unsigned long addr,unsigned long len, unsigned long prot,unsigned long flag, unsigned long pgoff)
{unsigned long ret;struct mm_struct *mm = current->mm;unsigned long populate;LIST_HEAD(uf);ret = security_mmap_file(file, prot, flag);if (!ret) {if (mmap_write_lock_killable(mm))return -EINTR;ret = do_mmap(file, addr, len, prot, flag, 0, pgoff, &populate,&uf);mmap_write_unlock(mm);userfaultfd_unmap_complete(mm, &uf);if (populate)mm_populate(ret, populate);}return ret;
}

do_mmap函数

/** The caller must write-lock current->mm->mmap_lock.*/
unsigned long do_mmap(struct file *file, unsigned long addr,unsigned long len, unsigned long prot,unsigned long flags, vm_flags_t vm_flags,unsigned long pgoff, unsigned long *populate,struct list_head *uf)
{struct mm_struct *mm = current->mm;int pkey = 0;*populate = 0;if (!len)return -EINVAL;/** Does the application expect PROT_READ to imply PROT_EXEC?** (the exception is when the underlying filesystem is noexec*  mounted, in which case we dont add PROT_EXEC.)*/if ((prot & PROT_READ) && (current->personality & READ_IMPLIES_EXEC))if (!(file && path_noexec(&file->f_path)))prot |= PROT_EXEC;/* force arch specific MAP_FIXED handling in get_unmapped_area */if (flags & MAP_FIXED_NOREPLACE)flags |= MAP_FIXED;if (!(flags & MAP_FIXED))addr = round_hint_to_min(addr);/* Careful about overflows.. */len = PAGE_ALIGN(len);if (!len)return -ENOMEM;/* offset overflow? */if ((pgoff + (len >> PAGE_SHIFT)) < pgoff)return -EOVERFLOW;/* Too many mappings? */if (mm->map_count > sysctl_max_map_count)return -ENOMEM;/* Obtain the address to map to. we verify (or select) it and ensure* that it represents a valid section of the address space.*/addr = get_unmapped_area(file, addr, len, pgoff, flags);if (IS_ERR_VALUE(addr))return addr;if (flags & MAP_FIXED_NOREPLACE) {if (find_vma_intersection(mm, addr, addr + len))return -EEXIST;}if (prot == PROT_EXEC) {pkey = execute_only_pkey(mm);if (pkey < 0)pkey = 0;}/* Do simple checking here so the lower-level routines won't have* to. we assume access permissions have been handled by the open* of the memory object, so we don't do any here.*/vm_flags |= calc_vm_prot_bits(prot, pkey) | calc_vm_flag_bits(flags) |mm->def_flags | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC;if (flags & MAP_LOCKED)if (!can_do_mlock())return -EPERM;if (!mlock_future_ok(mm, vm_flags, len))return -EAGAIN;if (file) {struct inode *inode = file_inode(file);unsigned long flags_mask;if (!file_mmap_ok(file, inode, pgoff, len))return -EOVERFLOW;flags_mask = LEGACY_MAP_MASK | file->f_op->mmap_supported_flags;switch (flags & MAP_TYPE) {case MAP_SHARED:/** Force use of MAP_SHARED_VALIDATE with non-legacy* flags. E.g. MAP_SYNC is dangerous to use with* MAP_SHARED as you don't know which consistency model* you will get. We silently ignore unsupported flags* with MAP_SHARED to preserve backward compatibility.*/flags &= LEGACY_MAP_MASK;fallthrough;case MAP_SHARED_VALIDATE:if (flags & ~flags_mask)return -EOPNOTSUPP;if (prot & PROT_WRITE) {if (!(file->f_mode & FMODE_WRITE))return -EACCES;if (IS_SWAPFILE(file->f_mapping->host))return -ETXTBSY;}/** Make sure we don't allow writing to an append-only* file..*/if (IS_APPEND(inode) && (file->f_mode & FMODE_WRITE))return -EACCES;vm_flags |= VM_SHARED | VM_MAYSHARE;if (!(file->f_mode & FMODE_WRITE))vm_flags &= ~(VM_MAYWRITE | VM_SHARED);fallthrough;case MAP_PRIVATE:if (!(file->f_mode & FMODE_READ))return -EACCES;if (path_noexec(&file->f_path)) {if (vm_flags & VM_EXEC)return -EPERM;vm_flags &= ~VM_MAYEXEC;}if (!file->f_op->mmap)return -ENODEV;if (vm_flags & (VM_GROWSDOWN|VM_GROWSUP))return -EINVAL;break;default:return -EINVAL;}} else {switch (flags & MAP_TYPE) {case MAP_SHARED:if (vm_flags & (VM_GROWSDOWN|VM_GROWSUP))return -EINVAL;/** Ignore pgoff.*/pgoff = 0;vm_flags |= VM_SHARED | VM_MAYSHARE;break;case MAP_PRIVATE:/** Set pgoff according to addr for anon_vma.*/pgoff = addr >> PAGE_SHIFT;break;default:return -EINVAL;}}/** Set 'VM_NORESERVE' if we should not account for the* memory use of this mapping.*/if (flags & MAP_NORESERVE) {/* We honor MAP_NORESERVE if allowed to overcommit */if (sysctl_overcommit_memory != OVERCOMMIT_NEVER)vm_flags |= VM_NORESERVE;/* hugetlb applies strict overcommit unless MAP_NORESERVE */if (file && is_file_hugepages(file))vm_flags |= VM_NORESERVE;}addr = mmap_region(file, addr, len, vm_flags, pgoff, uf);if (!IS_ERR_VALUE(addr) &&((vm_flags & VM_LOCKED) ||(flags & (MAP_POPULATE | MAP_NONBLOCK)) == MAP_POPULATE))*populate = len;return addr;
}

get_unmapped_area函数

do_mmap的函数中的会使用get_unmapped_area获取addr

get_unmapped_area
unsigned long
get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,unsigned long pgoff, unsigned long flags)
{unsigned long (*get_area)(struct file *, unsigned long,unsigned long, unsigned long, unsigned long);unsigned long error = arch_mmap_check(addr, len, flags);if (error)return error;/* Careful about overflows.. */if (len > TASK_SIZE)return -ENOMEM;get_area = current->mm->get_unmapped_area;if (file) {if (file->f_op->get_unmapped_area)get_area = file->f_op->get_unmapped_area;} else if (flags & MAP_SHARED) {/** mmap_region() will call shmem_zero_setup() to create a file,* so use shmem's get_unmapped_area in case it can be huge.* do_mmap() will clear pgoff, so match alignment.*/pgoff = 0;get_area = shmem_get_unmapped_area;}addr = get_area(file, addr, len, pgoff, flags);if (IS_ERR_VALUE(addr))return addr;if (addr > TASK_SIZE - len)return -ENOMEM;if (offset_in_page(addr))return -EINVAL;error = security_mmap_addr(addr);return error ? error : addr;
}

mmap_region函数

get_unmapped_area获取到addr,之后addr传给mmap_region函数

unsigned long mmap_region(struct file *file, unsigned long addr,unsigned long len, vm_flags_t vm_flags, unsigned long pgoff,struct list_head *uf)
{struct mm_struct *mm = current->mm;struct vm_area_struct *vma = NULL;struct vm_area_struct *next, *prev, *merge;pgoff_t pglen = len >> PAGE_SHIFT;unsigned long charged = 0;unsigned long end = addr + len;unsigned long merge_start = addr, merge_end = end;pgoff_t vm_pgoff;int error;VMA_ITERATOR(vmi, mm, addr);/* Check against address space limit. */if (!may_expand_vm(mm, vm_flags, len >> PAGE_SHIFT)) {unsigned long nr_pages;/** MAP_FIXED may remove pages of mappings that intersects with* requested mapping. Account for the pages it would unmap.*/nr_pages = count_vma_pages_range(mm, addr, end);if (!may_expand_vm(mm, vm_flags,(len >> PAGE_SHIFT) - nr_pages))return -ENOMEM;}/* Unmap any existing mapping in the area */if (do_vmi_munmap(&vmi, mm, addr, len, uf, false))return -ENOMEM;/** Private writable mapping: check memory availability*/if (accountable_mapping(file, vm_flags)) {charged = len >> PAGE_SHIFT;if (security_vm_enough_memory_mm(mm, charged))return -ENOMEM;vm_flags |= VM_ACCOUNT;}next = vma_next(&vmi);prev = vma_prev(&vmi);if (vm_flags & VM_SPECIAL) {if (prev)vma_iter_next_range(&vmi);goto cannot_expand;}/* Attempt to expand an old mapping *//* Check next */if (next && next->vm_start == end && !vma_policy(next) &&can_vma_merge_before(next, vm_flags, NULL, file, pgoff+pglen,NULL_VM_UFFD_CTX, NULL)) {merge_end = next->vm_end;vma = next;vm_pgoff = next->vm_pgoff - pglen;}/* Check prev */if (prev && prev->vm_end == addr && !vma_policy(prev) &&(vma ? can_vma_merge_after(prev, vm_flags, vma->anon_vma, file,pgoff, vma->vm_userfaultfd_ctx, NULL) :can_vma_merge_after(prev, vm_flags, NULL, file, pgoff,NULL_VM_UFFD_CTX, NULL))) {merge_start = prev->vm_start;vma = prev;vm_pgoff = prev->vm_pgoff;} else if (prev) {vma_iter_next_range(&vmi);}/* Actually expand, if possible */if (vma &&!vma_expand(&vmi, vma, merge_start, merge_end, vm_pgoff, next)) {khugepaged_enter_vma(vma, vm_flags);goto expanded;}if (vma == prev)vma_iter_set(&vmi, addr);
cannot_expand:/** Determine the object being mapped and call the appropriate* specific mapper. the address has already been validated, but* not unmapped, but the maps are removed from the list.*/vma = vm_area_alloc(mm);if (!vma) {error = -ENOMEM;goto unacct_error;}vma_iter_config(&vmi, addr, end);vma->vm_start = addr;vma->vm_end = end;vm_flags_init(vma, vm_flags);vma->vm_page_prot = vm_get_page_prot(vm_flags);vma->vm_pgoff = pgoff;if (file) {if (vm_flags & VM_SHARED) {error = mapping_map_writable(file->f_mapping);if (error)goto free_vma;}vma->vm_file = get_file(file);error = call_mmap(file, vma);if (error)goto unmap_and_free_vma;/** Expansion is handled above, merging is handled below.* Drivers should not alter the address of the VMA.*/error = -EINVAL;if (WARN_ON((addr != vma->vm_start)))goto close_and_free_vma;vma_iter_config(&vmi, addr, end);/** If vm_flags changed after call_mmap(), we should try merge* vma again as we may succeed this time.*/if (unlikely(vm_flags != vma->vm_flags && prev)) {merge = vma_merge(&vmi, mm, prev, vma->vm_start,vma->vm_end, vma->vm_flags, NULL,vma->vm_file, vma->vm_pgoff, NULL,NULL_VM_UFFD_CTX, NULL);if (merge) {/** ->mmap() can change vma->vm_file and fput* the original file. So fput the vma->vm_file* here or we would add an extra fput for file* and cause general protection fault* ultimately.*/fput(vma->vm_file);vm_area_free(vma);vma = merge;/* Update vm_flags to pick up the change. */vm_flags = vma->vm_flags;goto unmap_writable;}}vm_flags = vma->vm_flags;} else if (vm_flags & VM_SHARED) {error = shmem_zero_setup(vma);if (error)goto free_vma;} else {vma_set_anonymous(vma);}if (map_deny_write_exec(vma, vma->vm_flags)) {error = -EACCES;goto close_and_free_vma;}/* Allow architectures to sanity-check the vm_flags */error = -EINVAL;if (!arch_validate_flags(vma->vm_flags))goto close_and_free_vma;error = -ENOMEM;if (vma_iter_prealloc(&vmi, vma))goto close_and_free_vma;/* Lock the VMA since it is modified after insertion into VMA tree */vma_start_write(vma);vma_iter_store(&vmi, vma);mm->map_count++;if (vma->vm_file) {i_mmap_lock_write(vma->vm_file->f_mapping);if (vma->vm_flags & VM_SHARED)mapping_allow_writable(vma->vm_file->f_mapping);flush_dcache_mmap_lock(vma->vm_file->f_mapping);vma_interval_tree_insert(vma, &vma->vm_file->f_mapping->i_mmap);flush_dcache_mmap_unlock(vma->vm_file->f_mapping);i_mmap_unlock_write(vma->vm_file->f_mapping);}/** vma_merge() calls khugepaged_enter_vma() either, the below* call covers the non-merge case.*/khugepaged_enter_vma(vma, vma->vm_flags);/* Once vma denies write, undo our temporary denial count */
unmap_writable:if (file && vm_flags & VM_SHARED)mapping_unmap_writable(file->f_mapping);file = vma->vm_file;ksm_add_vma(vma);
expanded:perf_event_mmap(vma);vm_stat_account(mm, vm_flags, len >> PAGE_SHIFT);if (vm_flags & VM_LOCKED) {if ((vm_flags & VM_SPECIAL) || vma_is_dax(vma) ||is_vm_hugetlb_page(vma) ||vma == get_gate_vma(current->mm))vm_flags_clear(vma, VM_LOCKED_MASK);elsemm->locked_vm += (len >> PAGE_SHIFT);}if (file)uprobe_mmap(vma);/** New (or expanded) vma always get soft dirty status.* Otherwise user-space soft-dirty page tracker won't* be able to distinguish situation when vma area unmapped,* then new mapped in-place (which must be aimed as* a completely new data area).*/vm_flags_set(vma, VM_SOFTDIRTY);vma_set_page_prot(vma);validate_mm(mm);return addr;close_and_free_vma:if (file && vma->vm_ops && vma->vm_ops->close)vma->vm_ops->close(vma);if (file || vma->vm_file) {
unmap_and_free_vma:fput(vma->vm_file);vma->vm_file = NULL;vma_iter_set(&vmi, vma->vm_end);/* Undo any partial mapping done by a device driver. */unmap_region(mm, &vmi.mas, vma, prev, next, vma->vm_start,vma->vm_end, vma->vm_end, true);}if (file && (vm_flags & VM_SHARED))mapping_unmap_writable(file->f_mapping);
free_vma:vm_area_free(vma);
unacct_error:if (charged)vm_unacct_memory(charged);validate_mm(mm);return error;
}

相关文章:

Linux内核,mmap_pgoff在mmap.c的实现

1. mmap_pgoff的系统调用实现如下 SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,unsigned long, prot, unsigned long, flags,unsigned long, fd, unsigned long, pgoff) {return ksys_mmap_pgoff(addr, len, prot, flags, fd, pgoff); }2. ksys_mma…...

深度揭秘:蓝耘 Maas 平台如何重塑深度学习格局

目录 前言 深度学习&#xff1a;技术基石与发展脉络 蓝耘 Maas 平台&#xff1a;深度学习的强大助推器 1. 高性能算力支撑 2. 丰富的模型支持 3. 便捷的开发体验 4. 完善的安全保障 代码示例&#xff1a;蓝耘 Maas 平台上的深度学习实践 1. 注册与登录 2. 代码实现 …...

深入解析操作系统进程控制:从地址空间到实战应用

引言 想象这样一个场景&#xff1a; 你的游戏本同时运行着《赛博朋克2077》、Chrome浏览器和Discord语音 突然游戏崩溃&#xff0c;但其他应用依然正常运行 此时你打开任务管理器&#xff0c;发现游戏进程已经消失&#xff0c;但内存占用却未完全释放 这背后涉及的关键机制…...

网络空间安全(33)MSF漏洞利用

前言 Metasploit Framework&#xff08;简称MSF&#xff09;是一款功能强大的开源安全漏洞利用和测试工具&#xff0c;广泛应用于渗透测试中。MSF提供了丰富的漏洞利用模块&#xff0c;允许安全研究人员和渗透测试人员利用目标系统中的已知漏洞进行攻击。 一、漏洞利用模块&…...

《Electron 学习之旅:从入门到实践》

前言 Electron 简介 Electron 是由 GitHub 开发的一个开源框架&#xff0c;基于 Chromium 和 Node.js。 它允许开发者使用 Web 技术&#xff08;HTML、CSS、JavaScript&#xff09;构建跨平台的桌面应用程序。 Electron 的优势 跨平台&#xff1a;支持 Windows、macOS 和 Linux…...

通达信软件+条件选股+code

在通达信软件中,你的选股公式需要放在 "公式管理器" 的 "条件选股公式" 分类中。以下是详细操作步骤: 一、打开公式管理器 打开通达信软件,按快捷键 Ctrl + F (或点击顶部菜单栏:"公式" → "公式管理器") 二、创建新公式 选择分…...

【2025】基于springboot+vue的汽车销售试驾平台(源码、万字文档、图文修改、调试答疑)

基于 Spring Boot Vue 的汽车销售试驾平台通过整合前后端技术&#xff0c;实现了汽车销售和试驾预约的信息化和智能化。系统为管理员和用户提供了丰富的功能&#xff0c;提升了客户体验和销售效率&#xff0c;增强了数据分析能力&#xff0c;为汽车销售行业的发展提供了新的途…...

Spring Web MVC入门

一、什么是SpringMVC 首先&#xff0c;MVC是一种架构设计模式&#xff0c;也是一种思想&#xff0c;而SpringMVC是对MVC思想的具体实现&#xff0c;除此之外&#xff0c;SpringMVC还是一个Web框架。 总的来说&#xff0c;SpringMVC就是一个实现MVC模式的Web框架。 而MVC可以…...

5G核心网实训室搭建方案:轻量化部署与虚拟化实践

5G核心网实训室 随着5G技术的广泛应用&#xff0c;行业对于5G核心网人才的需求日益增长。高校、科研机构和企业纷纷建立5G实训室&#xff0c;以促进人才培养、技术创新和行业应用研究。IPLOOK凭借其在5G核心网领域的深厚积累&#xff0c;提供了一套高效、灵活的5G实训室搭建方…...

IMX6ULL学习整理篇——Linux驱动开发的基础2 老框架的一次实战:LED驱动

IMX6ULL学习整理篇——Linux驱动开发的基础2 老框架的一次实战&#xff1a;LED驱动 ​ 在上一篇博客中&#xff0c;我们实现了从0开始搭建的字符设备驱动框架&#xff0c;但是这个框架还是空中楼阁&#xff0c;没有应用&#xff0c;很难说明我们框架的正确性。这里&#xff0c…...

网络空间安全(32)Kali MSF基本介绍

前言 Metasploit Framework&#xff08;简称MSF&#xff09;是一款功能强大的开源安全漏洞检测工具&#xff0c;被广泛应用于渗透测试中。它内置了数千个已知的软件漏洞&#xff0c;并持续更新以应对新兴的安全威胁。MSF不仅限于漏洞利用&#xff0c;还包括信息收集、漏洞探测和…...

零基础上手Python数据分析 (3):Python核心语法快速入门 (下) - 程序流程控制、函数与模块

写在前面 还记得上周我们学习的 Python 基本数据类型、运算符和变量吗? 掌握了这些基础知识,我们已经能够进行一些简单的数据操作了。 但是,在实际的数据分析工作中,仅仅掌握基本语法是远远不够的。 我们需要让程序能够 根据条件做出判断,重复执行某些操作,组织和复用代…...

C++【类和对象】(超详细!!!)

C【类和对象】 1.运算符重载2.赋值运算符重载3.日期类的实现 1.运算符重载 (1).C规定类类型运算符使用时&#xff0c;必须转换成调用运算符重载。 (2).运算符重载是具有特殊名字的函数&#xff0c;名字等于operator加需要使用的运算符&#xff0c;具有返回类型和参数列表及函数…...

Windows-PyQt5安装+PyCharm配置QtDesigner + QtUIC

个人环境 Windows 11 pycharm 2024.2 Anaconda2024.6python 3.9 1)先使用pip命令在线安装 1)pip install PyQt5 2)pip install PyQt5-tools2)配置环境变量 1&#xff1a;安装成功后可以在python的安装目录Lib\site-packahes目录下看到安装包。比如我的路径是E:\anaconda3…...

qq音乐 webpack 补环境

网址&#xff1a; aHR0cHM6Ly95LnFxLmNvbS9uL3J5cXEvcGxheWVy​ 1.接口分析 接口&#xff1a;cgi-bin/musics.fcg​ 参数&#xff1a;sign是加密的 2.代码分析 进入调用栈 先在send位置打上断点&#xff0c;页面刷新 往上一个栈找 ‍ 可以看到上面就有一个关键词sign​是从…...

【蓝桥杯】省赛:神奇闹钟

思路 python做这题很简单&#xff0c;灵活用datetime库即可 code import os import sys# 请在此输入您的代码 import datetimestart datetime.datetime(1970,1,1,0,0,0) for _ in range(int(input())):ls input().split()end datetime.datetime.strptime(ls[0]ls[1],&quo…...

计算机的结构形式

微机的机构形式 台式个人微机 最开始的微机&#xff08;计算机&#xff09;都是台式的&#xff0c;到目前为止仍是个人微机的主要形式。台式机按照电脑机箱的放置形式&#xff0c;分为卧式和立式两种。台式机需要放在桌面上或者留有专门放置机箱位置&#xff0c;他的主机、键…...

C语言【内存函数】详解

目录&#xff1a; 1. memcpy使用和模拟实现 2. memmove使用和模拟实现 3. memset函数的使用 4. memcmp函数的使用 以上函数均包含在一个头文件<string.h>里面 一、memcpy的使用和模拟实现。 memcpy函数介绍&#xff1a; 函数原型&#xff1a; void * memcpy ( void…...

软考网络安全专业

随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显&#xff0c;成为社会各界普遍关注的焦点。在这样的背景下&#xff0c;软考网络安全专业应运而生&#xff0c;为培养高素质的网络安全人才提供了有力支撑。本文将对软考网络安全专业进行深入剖析&#xff0c;探讨其在信…...

Altium Designer——CHIP类元器件PCB封装绘制

文章目录 PCB封装组成元素&#xff1a;焊盘的属性 SS34肖特基二极管SMA(DO-214AC)封装绘制资料&#xff1a;步骤&#xff1a;1.绘制焊盘&#xff1a;用到的快捷键&#xff1a;资料&#xff1a; 2.绘制丝印&#xff1a;用到的快捷键&#xff1a;资料&#xff1a; PCB封装组成元素…...

C++ unordered_map unordered_set 模拟实现

1. 关于unordered_map 和 unordered_set 区别于C的另外两个容器map和set&#xff0c;map和set的底层是红黑树&#xff1b;而unordered_map和unordered_set的底层是哈希 因为unordered_map和unordered_set的底层是哈希&#xff0c;因此他们存储的数据是没有顺序​​unordered​…...

Java使用自定义类加载器实现插件动态加载

虚拟机类加载子系统 Java虚拟机的⼀个重要子系统&#xff0c;主要负责将类的字节码加载到JVM内存的⽅法区&#xff0c;并将其转换为JVM内部的数据结构。 一个类从被加载到虚拟机开始&#xff0c;一直到卸载出内存为止&#xff0c;会经历七个阶段&#xff1a;加载&#xff0c;…...

【初级篇】如何使用DeepSeek和Dify构建高效的企业级智能客服系统

在当今数字化时代,企业面临着日益增长的客户服务需求。使用Dify创建智能客服不仅能够提升客户体验,还能显著提高企业的运营效率。关于DIfy的安装部署,大家可以参考之前的文章: 【入门级篇】Dify安装+DeepSeek模型配置保姆级教程_mindie dify deepseek-CSDN博客 AI智能客服…...

Java开发之数据库应用:记一次医疗系统数据库迁移引发的异常:从MySQL到PostgreSQL的“dual“表陷阱与突围之路

记一次医疗系统数据库迁移引发的异常&#xff1a;从MySQL到PostgreSQL的"dual"表陷阱与突围之路 一、惊魂时刻&#xff1a;数据库切换引发的系统雪崩 某医疗影像系统在进行国产化改造过程中&#xff0c;将原MySQL数据库迁移至PostgreSQL。迁移完成后&#xff0c;系…...

Langchian构建代理

文章目录 概要ReAct 代理 ReAct 使用ReAct基本用法提示词模板内存使用迭代使用返回执行每一步情况限制输出行数设置运行超时时间 不使用代理下LLM如何结合工具案例案例2 概要 单靠语言模型无法采取行动 - 它们只输出文本。 LangChain 的一个重要用例是创建 代理。 代理是使用大…...

Vim软件使用技巧

目录 Demo Vim怎么看一个文件的行号&#xff0c;不用打开文件的前提下&#xff1f;进入文件后怎么跳转到某一行? 不打开文件查看行号&#xff08;查看文件的方法&#xff09; 方法1、使用命令行工具统计行数 方法2、通过vim的 - 参数查看文件信息 进入文件后跳转到指定行…...

SQL与NoSQL的区别

以下是SQL与NoSQL数据库的详细对比&#xff0c;涵盖核心特性、适用场景及技术选型建议&#xff1a; 一、核心区别对比 特性SQL&#xff08;关系型数据库&#xff09;NoSQL&#xff08;非关系型数据库&#xff09;数据模型基于表格&#xff0c;严格预定义模式&#xff08;Schem…...

1191:流感传染--BFS

这里写目录标题 题目 解析代码BFS代码 题目 解析 在同一天对一个病原体进行处理时&#xff0c;如果直接更改数组&#xff0c;将直接影响到后续的遍历 方法一&#xff1a;那么我们可以定义一个数组用来存储坐标&#xff1a;vectoir<pair<int,int>>&#xff0c;遍历…...

gfortran编译器调试功能选项

在使用 gfortran 编译器进行调试时&#xff0c;以下选项可以帮助你更好地定位和解决问题&#xff1a; 1. 生成调试信息 -g&#xff1a;生成调试信息&#xff0c;供调试器&#xff08;如 gdb&#xff09;使用。-ggdb&#xff1a;生成更详细的调试信息&#xff0c;优化 gdb 的使…...

小程序配置

注册小程序账号和安装开发工具 参考文档&#xff1a;注册小程序账号和安装开发工具https://blog.csdn.net/aystl_gss/article/details/127878658 HBuilder新建项目 填写项目名称&#xff0c;选择UNI-APP&#xff0c;修改路径&#xff0c;点击创建 manifest.json 配置 需要分别…...

【Linux】进程(1)进程概念和进程状态

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 目录 前言 一、什么是进程 二、task_struct的内容 三、Linux下进程基本操作 四、父进程和子进程 1. 用fork函数创建子进程 五、进程状态 1. 三种重…...

MySQL(事物下)

目录 一 多版本并发控制&#xff08; MVCC &#xff09;是一种用来解决 读-写冲突 的无锁并发控制 1. 前置知识 示例&#xff1a; 二 Read View 1. 当事物进行快照读(读历史数据)会MySQL会创建一个Read Vidw类对象&#xff0c;用来记录和当前一起并发的事物(活跃的事物)&a…...

Springboot+mybatis实现增删改查效果

我们前面实现了增加效果&#xff0c;现在来写一下修改~我们首先在controller里面写update 接着在service和mapper写方法 最后我们测试一下 没问题~需要注意的是mapper的sql别写错了&#xff01;...

【“以退为进“、“不得已而为之“与“风险对冲“的协同机制】

深度解析&#xff1a;“以退为进”、"不得已而为之"与"风险对冲"的协同机制 一、“以退为进”&#xff1a;空间重构的博弈艺术 1. 三维战略坐标系 权力维度&#xff1a;唐太宗"玄武门之变"后跪哭李渊&#xff0c;通过降维姿态化解道德危机&am…...

AUTOSAR 网络安全 架构

实现AUTOSAR网络安全架构的步骤指南 在当今汽车电子系统中&#xff0c;AUTOSAR&#xff08;AUTomotive Open System ARchitecture&#xff09;正在成为业界标准。结合网络安全要求&#xff0c;我们可以确保汽车在网络通信中保持安全。接下来&#xff0c;我们将讨论如何实现AUT…...

洛谷 P2801 教主的魔法 题解

之前学过 莫队 算法&#xff0c;其运用了分块思想&#xff1b;但是我居然是第一次写纯种的分块题目。 题意 给你一个长度为 n n n 的序列 a a a&#xff08;一开始 ∀ a i ∈ [ 1 , 1000 ] \forall a_i\in[1,1000] ∀ai​∈[1,1000]&#xff09;。要求执行 q q q 次操作&…...

Google最新生图模型Gemini-2.0-Flash-Exp免费用

Google发布新生图模型 Google释放出最新生图模型&#xff0c;在发布说明中提到&#xff1a; 2025年3月12日 在 Gemini-2.0-Flash-Exp 中发布原生图像输出功能 Gemini 2.0 Flash Experimental 模型发布&#xff0c;支持原生图像输出功能。开发者能够使用 Gemini 进行图像输出和…...

windows安装Elasticsearch

下载 下载最新版 https://www.elastic.co/downloads/elasticsearch 下载历史版本 安装 进入bin目录中 成功启动 访问 http://localhost:9200...

vulnhub靶场之stapler靶机

前言 靶机&#xff1a;stapler靶机&#xff0c;IP地址为192.168.10.12 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.6 靶机采用virtualbox&#xff0c;攻击机采用VMware虚拟机&#xff0c;都采用桥接网卡模式 文章涉及的靶机及工具&#xff0c;都可以自行访问官网或…...

2025年AI搜索引擎开源项目全景指南:从核心框架到生态工具

2025年AI搜索引擎开源项目全景指南&#xff1a;从核心框架到生态工具 在人工智能技术迅猛发展的当下&#xff0c;开源项目已成为构建AI搜索引擎的核心驱动力。本文整理9个具有代表性的开源项目&#xff0c;涵盖搜索框架、扩展生态及底层支持技术&#xff0c;助你快速搭建或优化…...

数字孪生像魔镜,映照出无限可能的未来

在当今科技飞速发展的时代&#xff0c;数字孪生作为一项极具潜力的前沿技术&#xff0c;正逐渐崭露头角&#xff0c;成为众多领域关注的焦点。它犹如一面神奇的魔镜&#xff0c;以数字化的方式精准映照出现实世界中的各种实体与系统&#xff0c;为我们开启了一扇通往无限可能未…...

PDF Reader

Acrobat Reader...

C++友元

1.什么是友元&#xff1f; 当我们需要在类的外部访问该类的私有成员和保护成员时&#xff0c;就可以利用友元来实现这一操作 在类中用 friend 关键字对函数或类进行声明 2.非成员函数友元 友元函数不是当前类的成员函数&#xff0c;而是当前类的外部函数&#xff0c;但是他可以…...

吴恩达机器学习笔记复盘(五)均方误差函数

只讲了线性回归的代价函数。 均方误差&#xff08;Mean Squared Error, MSE&#xff09; 均方误差&#xff08;MSE&#xff09;基于最小二乘法&#xff0c;通过计算预测值与真实值之间差值的平方的平均值来衡量模型的误差。 原理 假设我们有一组数据集&#xff0c;其中是第…...

使用 Docker 部署前端项目全攻略

文章目录 1. Docker 基础概念1.1 核心组件1.2 Docker 工作流程 2. 环境准备2.1 安装 Docker2.2 验证安装 3. 项目配置3.1 项目结构3.2 创建 Dockerfile 4. 构建与运行4.1 构建镜像4.2 运行容器4.3 访问应用 5. 使用 Docker Compose5.1 创建 docker-compose.yml5.2 启动服务5.3 …...

珠算与珠心算发展简介

珠算是中华传统优秀文化的科学遗产&#xff0c;它是我国劳动人民的伟大创造&#xff0c;被誉为中国的第五大发明&#xff0c;至今已有 1800 余年的历史。 珠算&#xff0c;是以算盘为工具&#xff0c;用手指拨动算珠进行数值计算的一门计算技术。同时&#xff0c;珠算又是一门科…...

基于SSM + JSP 的水果蔬菜商城

基于ssm的水果蔬菜商城系统前台和后台&#xff08;源码安装视频数据库环境&#xff09;计算机项目程序设计管理系统java小程序网站商城 一.相关技术 Java、Spring、Springboot、MVC、Mybatis、MySQL、SSM框架、Web、HTML、maven、JavaScript、css、vue 二.部署配置 1.IntelliJ …...

基于深度学习的蛀牙智能检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

Linux与深入HTTP序列化和反序列化

深入HTTP序列化和反序列化 本篇介绍 在上一节已经完成了客户端和服务端基本的HTTP通信&#xff0c;但是前面的传递并没有完全体现出HTTP的序列化和反序列化&#xff0c;为了更好得理解其工作流程&#xff0c;在本节会以更加具体的方式分析到HTTP序列化和反序列化 本节会在介绍…...

音视频入门基础:RTP专题(20)——通过FFprobe显示RTP流每个packet的信息

通过FFprobe命令&#xff1a; ffprobe -protocol_whitelist "file,rtp,udp" -of json -show_packets XXX.sdp 可以显示SDP描述的RTP流每个packet&#xff08;数据包&#xff09;的信息&#xff1a; 对于RTP流&#xff0c;上述的“packet”&#xff08;数据包&#…...