Linux进程内存布局

基于深度学习的野生菌菇检测识别分类系统(YOLOv8 + UI界面 + 数据集) 随着深度学习技术的迅猛发展,计算机视觉领域的应用得到了广泛的关注。野生菌菇的检测与识别是一个复杂而又有趣的问题,涉及到物体检测、图像分类以及自然语言处理等技术。本文将介绍如何基于YOLOv8模型,结合自定义UI界面与数据集,构建一个高效且精确的野生菌菇检测识别分类系统。首先,我们将介绍YOLOv8的原理与特点,然后详细描述如何构建和训练野生菌菇识别模型,并介绍如何为该系统设计UI界面,最终形成一个完整的系统。本文内容包括代码实现、模型训练及数据集准备等,旨在为有类似需求的开发者提供参考和帮助。目录摘要目录。 阅读详情

下图是一张32位x86架构上运行的Linux中进程标准的内存段布局, 通过该图从上至下的简要分析Linux中进程的内存分布情况和各自的大致用途:

memLayout

内核空间和用户空间:

对于32位X86架构上运行的Linux而言, 其虚拟地址空间的寻址范围从0 ~ 4G,内核将这块空间划分为两个部分,将最高的1G字节0xC0000000 ~ 0xFFFFFFFF称为“内核空间”, 顾名思义是提供给内核使用;而将较低3G字节0x00000000 ~ 0xBFFFFFFF称为“用户空间”,即提供给各个运行的进程使用。

理论上,每个进程都是可以访问全部能寻址的4G虚拟内存空间的,但是系统为了防止内核空间被用户进程有意或无意的破坏,所以采用了分级保护措施: 将内核定为0级,将用户进程定为3级, 这样用户进程便无法直接访问内核的虚拟内存空间,仅能通过系统调用来进入内核态,从而来访问被限定的部分内核空间地址。同时,由于访问权限的机制,不同的进程间也都拥有独立的用户空间。这样非对称的访问机制使得Linux系统运行更加的安全稳定。

PS: 每个进程都运行在一个属于自己的内存沙盒里, 这个沙盒即虚拟地址空间,这些虚拟地址再通过页表(page table)来映射到物理内存上, 页表由操作系统维护并被CPU所引用。所以用户空间地址的映射是动态变化的;而内核空间则是持续存在的,在每个进程中都映射到相同的物理内存中,这样便于寻址以应对随时出现的中断和系统调用。

另外,用户进程也是无法访问0x00000000 ~ 0x08048000这一段虚拟内存地址的,在这段地址上有诸多例如C库,动态加载器如ld.so和VDSO等的映射地址。 如果用户进程访问到该区间会返回段错误。

用户空间内存布局
栈

用户空间中最顶部的段叫做栈,他被用于存放函数参数和动态局部变量。调用一个方法或函数会将一个新的栈帧(stack frame)压入到栈中,这个栈帧会在函数返回时被清理掉。在运行过程中,进程通过函数的调用和返回使得控制权在各个函数间转移,在新函数调用时,原函数的栈帧状态保持不变,并为新的函数开辟其所需的帧空间;当调用函数返回时,该函数的运行空间随着栈帧被弹出而清空,这次进程回到原函数的栈帧环境中继续执行。进程中的每一个线程都有属于自己的栈。

通过不断向栈中压入数据,超出其容量就会耗尽栈所对应的内存区域,这将触发一个页故障(page fault),而被Linux的expand_stack()处理,它会调用acct_stack_growth()来检查是否还有合适的地方用于栈的增长。如果栈的大小低于RLIMIT_STACK(通常为8MB),那么一般情况下栈会被加长,程序继续执行,感觉不到发生了什么事情。这是一种将栈扩展到所需大小的常规机制。然而,如果达到了最大栈空间的大小,就会栈溢出(stack overflow),程序收到一个段错误(segmentation fault)。

注: 动态栈增长是唯一一种访问未映射内存区域而被允许的情形,其他任何对未映射内存区域的访问都会触发页错误,从而导致段错误。一些被映射的区域是只读的,因此企图写这些区域也会导致段错误。

mmap

在栈段的低一段便是mmap端,mmap是一种高效便捷的文件I/O方式,内核将文件内容映射在此段内存中,常见情形便是加载动态链接库。另外,在Linux中,如果你通过malloc申请一块大于MMAP_THRESHOLD(通常默认为128KB, 可用mallopt()修改)大小的堆空间时, glibc会返回一块匿名的mmap内存块而非一块堆内存。

堆

在mmap段下面便是堆段了,堆段同栈段一样,都是为进程运行提供动态的内存分配,但是其和栈的区别在于堆上内存的生命期和执行分配的函数的生命期不一致,堆上分配的内存只有在对应进程通过系统调用主动释放或进程结束后才会释放。所以,内存泄露这个经典的问题便由此产生。
另外, 由于堆内存的反复申请和释放,也不可避免的会造成堆段碎片化。这种情况可以使用“对象池”的设计手段来避免。

fragHeap

堆段再往下便是BSS段和DATA段这两个静态内存区域,这两段都是用来存储静态局部或静态全局变量,其在编译期间便决定了虚拟内存的消耗。区别是DATA段存放的是已经初始化的变量,其映射自程序镜像中包含对应静态变量的文件;而BSS段则存放的是未初始化的变量,他不映射自任何一个执行文件。根据C语言标准规定,未初始化的静态成员变量的初始值必须为0,所以内核在加载二进制文件后执行程序前会将BSS段清0。

BSS和DATA段下是代码段(TEXT),这段中存有程序的指令代码。Text段是通过只读的方式加载到内存中的,他在多个进程中是可以被安全共享的。

2025届程序技术类笔试题 希尔排序在直接插入排序的基础上进行了改进,它通过比较相距一定间隔的元素来进行,各轮比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一轮排序为止。某人逆着水流的方向向岸边划船,每次行进前进x米后需要休息一下,休息期间船会自行倒退y米,每次休息后再次行进,前进距离缩短1/5,若起始距离岸边为m米,问:能否到达岸上,需要行进多少次才能上岸。直接插入排序的原理是将第i个元素插入前面i-1个已排好序的记录中,将比第i个元素大的记录依次向后移动一个位置,将第i个元素插入空位。第二轮相邻比较,后移2次。 阅读详情

相关推荐

【第六届起重机创意大赛国一作品——资料分享】

文章目录前言一、比赛内容分析二、确定方案与作品模型1.方案简图2.作品模型三、电控部分控制思路单片机选择与资源分配拓展板的设计接线与走线代码分享总结

qq_19308801的博客 7781

----[x86实模式] 内存地址空间分布 CPU合成内存地址的方式 程序中段的加载 启动区格式要求----

2015.03.25-26 读《汇编语言》—王爽、《x86汇编语言:由实模式到保护模式》— 李忠、《30天自制操作系统》—川合秀实 整理笔记。 1 实模式 在实模式下,处理器的内存寻址方式和8086处理器相同。 2 计算机开机过程 任何一台使用Intel 系列CPU的PC机只要一开机,CPU就工作在实模式下。CPU从地址FFFF0H处开始执行指令,这是一条跳转指

记一忘三二 8518

6层高速PCB设计实战:BGA布局与阻抗匹配关键解析

本文深入解析6层高速PCB设计中BGA布局与阻抗匹配的关键技术。通过实战经验分享,详细介绍了六层PCB层叠结构的选择与优化、BGA器件布局技巧、阻抗匹配的实战经验以及高速布线技巧,帮助工程师提升PCB设计水平,确保信号完整性和电源完整性。

weixin_28481133的博客 368

IA-32保护模式下的内存寻址方式(一):分段

1、简介: 在基于Intel 80x86微处理器的平台上,内存寻址是内存管理最重要的一部分内容。而关于内存地址在实际的软件及硬件实现上,也出现了不同的表示方式:逻辑地址(logical address)、线性地址/虚拟地址(linear address/virtual address)以及物理地址(physical address)。其中: ①逻辑地址为“16位段地址:偏移地址”的表示方...

Apollon_krj的博客 4073

手机抽奖页面代码html,html5大转盘抽奖支持手机转盘抽奖代码

特效描述:html5 大转盘抽奖 支持手机 转盘抽奖代码。html5转盘,html5抽奖,手机转盘,手机抽奖,手机转盘抽奖,可配置奖品抽奖。代码结构1. 引入CSS2. 引入JS3. HTML代码大转盘活动var turnplate={restaraunts:[],//大转盘奖品名称colors:[],//大转盘奖品区块对应背景颜色outsideRadius:192,//大转盘外圆的半径textR...

weixin_39628551的博客 1866

CTF实战:手把手教你用Python破解转轮机加密(附完整脚本)

本文详细介绍了如何使用Python逆向破解转轮机加密,特别针对CTF比赛中的Crypto类题目。通过解析转轮机加密原理、实战Python脚本编写及调试技巧,帮助参赛者快速掌握破解方法,提升在攻防世界等CTF比赛中的解题效率。

silver的专栏 1116

80x86存储器组织结构

概括:本文介绍80x86存储器组成的基本原理,会隐藏一些硬件细节。一、基本组成1.1、计算机系统由CPU,memory,I/O组成,如下图,时钟驱动CPU处理(读、写、运算)memory里的程序或者数据,以及控制I/O。1.2、当然现的计算机系统不会如此简单,因为memory有很

技术点滴记录 3337

SqlSugar避坑指南:C#操作MySQL时你可能会忽略的5个细节

本文分享了使用C#和SqlSugar框架操作MySQL数据库时的实战避坑指南。针对连接配置、实体映射、查询性能、事务处理等关键环节,深入剖析了5个容易被忽略但至关重要的细节,帮助开发者提升项目稳定性和执行效率,避免常见陷阱。

delta的博客 276

进程内存分布(详解)

由编译器自动分配释放,速度较快用来存储函数调用时的临时信息的结构,存放为运行时函数分配的局部变量函数参数返回数据返回地址等。这些局部变量等空间都会被释放程序运行过程中函数调用时参数的传递也在栈上进行,如递归调用栈当栈过多的时候,就是导致栈溢出(比如大量的递归调用或者大量的内存分配)栈是向低地址扩展的数据结构,是一块连续的内存的区域,空间有限。

番茄的博客 5522

⭐️VMwareWorkstation17.0虚拟机搭建WindowsXP虚拟机(完整安装步骤详细图文教程)

Windows XP是微软公司研发的计算机操作系统,于2001年10月25日正式发布。其名字中“XP”的意思来自英文中的“体验”(Experience)。Windows XP使用了Luna图形用户界面和双列开始菜单,提升了系统的安全性和工作性能,提供了WiFi支持,简化了软件的安装和运行,并增加了远程桌面功能。

Python老吕的博客 1万+

AI快速变现之路,AI视频创作

初期投入$3000(工具订阅+样片制作),重点攻克跨境电商和本地生活服务市场。关注2025年AIGC视频工具的API降价趋势(如Pika企业版折扣可达50%),建议与云服务商签订长期合作协议。

qq_29896351的博客 1981

进程的内存空间布局

进程的内存布局在结构上是有规律的,对于 linux 系统上的进程,其内存空间一般可以粗略地分为以下几大段,从高内存到低内存排列:1、内核态内存空间,其大小一般比较固定(可以编译时调整),但 32 位系统和 64 位系统的值不一样。2、用户态的栈,大小不固定,可以用ulimit -s 进行调整,默认一般为 8M,从高地址向低地址增长。3、mmap区域(内存映射段),既可以从高地址到低地址延伸(所谓 ...

cztqwan的博客 5533

基于simulink构建一个完整的航空航天器姿态控制与导航仿真模型

航空航天器的姿态控制与导航系统是确保飞行器稳定运行和精确执行任务的核心技术。其目标是通过传感器获取飞行器的状态信息,并利用控制器调整飞行器的姿态,使其按照预定轨迹飞行。基于MATLAB/Simulink平台进行航空航天器姿态控制与导航系统的建模与仿真,可以帮助研究者验证算法性能并优化系统的动态响应。本项目旨在构建一个完整的航空航天器姿态控制与导航仿真模型,包括飞行器动力学建模、传感器模块设计、控制器实现以及导航算法仿真,并通过仿真分析其性能。

xiaoheshang_123的博客 272

Linux 进程与内存布局详解

1.正在运行的程序,其运行过程中需要消耗内存和CPU。gcc应用程序 可执行程序 内存硬盘 硬盘 cpu程序和进程有什么区别?程序:静态的数据集合,存储在硬盘空间程序运行起来可以产生进程;一个程序可以产生多个进程进程:是一个程序动态执行的过程,需要消耗内存和CPU,进程具备动态生命周期,从产生到调度再到消亡。

m0_66592645的博客 1196

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Linux下进程的内存布局

目录 目录 进程空间内存布局 栈 堆 非初始化数据段 初始化数据段 文本段也称代码段 Linux下内存布局分布图 Linux C/C++语言的分配方式的 3 种方式 进程空间内存布局 在深入理解Linux下多进程编程之前,我们首先要了解Linux下进程在运行时的内存布局。Linux 进程内存管理的对象都是虚拟 内存,每个进程先天就有 0-4G 的各自互不...

Tian Jincheng's Blog 888

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Linux下的进程内存布局 / c程序内存布局

文章目录进程空间内存布局内存布局编程代码 进程空间内存布局 不管学习c语言还是学习linux下的编程,我们都要了解并学习。每个进程先天就有0-4G的各自互不干涉的虚拟内存空间,0-3G是用户空间执行用户自己的代码,高1GB的空间是内核空间执行linux系统调用。这里存放着整个内核的代码和所有的内核模块,用户所看到和接触的都是该虚拟地址,并不是实际的物理地址。linux下一个进程在内存里有三部分的数...

makunIT的博客 818

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Linux进程内存布局概述

32位进程经典内存布局 Linux内核 2.6.7 以前的默认进程内存布局形式,mmap区域与栈区域相对增长, 堆只有 1GB 的虚拟地址空间可以使用,继续增长就会进入 mmap 映射区域. 对于 64 位系统,提供了巨大的虚拟地址空间,这种布局就非常合适. 32位进程默认内存布局 栈至顶向下扩展,并且栈是有界的。堆至底向上扩展,mmap 映射区域至顶向下扩展,mmap 映射区域和堆相对扩展,直至耗尽虚拟地址空间中的剩余区域,这种结构便于 C 运行时库使用 mmap 映射区域和堆进行内存分配。这种布局形式

fa1c4的blog 1756

linux下进程的内存布局

Linux下一个进程在内存里有三部分的数据,就是”代码段”、”堆栈段”和”数据段”。这三个部分是构成一个完整的执行序列的必要的部分。”代码段”,顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用相同的代码段。”堆栈段”存放的就是子程 序的返回地址、子程序的参数以及程序的局部变量和malloc()动态申请内存的地址。而数据段则存放程序的全局变量,静态变量及...

ayaya的博客 380

Linux进程内存的布局和管理

UNIX系统编程

superficial11的博客 315

Linux下进程内存的布局

Linux下进程内存的布局

游鸿的专栏 353

linux整个内存布局,关于Linux进程内存布局的问题

我正在谈论Intel 32位平台。 Linux内核版本2.6.31-14。关于Linux进程内存布局的问题#include #include int init_global_var = 10; /* Initialized global variable */int global_var; /* Uninitialized global variable */static int ini...

weixin_33955394的博客 159

Unix/Linux进程在内存中的布局

Unix/Linux进程在内存中的布局 对于Linux操作系统之上的程序而言,其运行的进程所使用的内存地址都是虚拟地址,是MMU经过映射后的地址,我们这里所谈及的内存也是虚拟内存,而不是物理内存。 如何得到进程在内存中的布局: 我们将编写好的程序经过GCC编译得到一个可执行的文件,然后将其运行起来,通过查看进程的命令得到进程ID: ps -aux 在得到进程ID之后,我们通过pmap

water_3700348的博客 749

linux进程内存布局

在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中。这个沙盘就是虚拟地址空间(virtual address space),在32位模式下它总是一个4GB的内存地址块。这些虚拟地址通过页表(page table)映射到物理内存,页表由操作系统维护并被处理器引用。每一个进程拥有一套属于它自己的页表,但是还有一个隐情。只要虚拟地址被使能,那么它就会作用于这台机器上运行的所有软件,包括内核

tedious的专栏 3066

探索Linux:进程(内存布局、栈)

本篇文件记录自己在从书籍中了解到的进程相关知识 进程与程序 进程是程序执行的一个实例, 可以用一个程序来创建多个进程实例。进程就类似于人类, 被产生后最终消亡, 而且只有一个父亲。 从内核角度看, 进程的目的就是担当分配的系统资源(CPU时间、内存等)的实体。且其由用户内存空间和一系列内核数据结构组成,其中用户内存空间包含了程序代码及代码所使用的变量, 而内核数据结构则用于维护进程状态的信息。 进程内存布局 每个进程所分配的内存由很多部分组成, 通常称之为“段”。 如下所示: 文本段 包含了进程运行的程

There is an octopus in the fish pond 376

linux进程地址空间 进程内存布局,程序的内存布局

虚拟地址空间内存管理是操作系统的核心;它对于编程和系统管理都是至关重要的。多任务操作系统中的每个进程都在自己的内存沙箱中运行。这个沙箱是虚拟地址空间,在32位模式下,它总是一个4GB内存地址块。这些虚拟地址由页表映射到物理内存,页表由操作系统内核维护并由处理器查询。每个进程都有自己的一组页表。一旦虚拟地址被启用,它们将应用于机器中运行的所有软件,包括内核本身。因此,虚拟地址空间的一部分必须保留给内...

weixin_35683330的博客 334
上一篇: 分支预测浅谈
D1ngo
博客等级 码龄12年 3粉丝 9原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值