Linux内存管理实验

合集下载

(完整word版)Linux操作系统实验报告 存储管理试验

(完整word版)Linux操作系统实验报告 存储管理试验
(2)利用随机函数动态生成进程访问页面的序列号。
(3)实现FIFO页面淘汰算法。
(4)实现页故障率反馈模型。
2、实验目的与要求
①(1)用C语言是实现模拟Linux系统中连续内存分配用到的伙伴对算法。
(2)通过链表的形式输出在内存申请和释放过程中内存状态的对比图。
②(1)了解工作集模型的原理及其特点。
printmem();
}
int power(int x,int y){
int k=0,tmp=1;
for(;k<y;k++){
tmp=tmp*x;
}
return tmp;
}
int root(int x,int y){
int result=y,count=0;
while(result!=1){
result=result/x;
merge(tempId,merger);
}else {
return 0;
}
return 1;
}else {
second=second->next;
isFirst++;
}
}
return 1;
}
int freeb(int size){
block * first=(struct block *)malloc(sizeof(struct block));
if((second->start==nextStart || second->start==preStart) && second->loc==0){
merger->size=(first->size)+(second->size);

实现内存分配实验报告(3篇)

实现内存分配实验报告(3篇)

第1篇一、实验目的1. 理解操作系统内存分配的基本原理和常用算法。

2. 掌握动态分区分配方式中的数据结构和分配算法。

3. 通过编写程序,实现内存分配和回收功能。

二、实验环境1. 操作系统:Linux2. 编程语言:C语言3. 开发工具:GCC编译器三、实验原理1. 内存分配的基本原理操作系统内存分配是指操作系统根据程序运行需要,将物理内存分配给程序使用的过程。

内存分配算法主要包括以下几种:(1)首次适应算法(First Fit):从内存空间首部开始查找,找到第一个满足条件的空闲区域进行分配。

(2)最佳适应算法(Best Fit):在所有满足条件的空闲区域中,选择最小的空闲区域进行分配。

(3)最坏适应算法(Worst Fit):在所有满足条件的空闲区域中,选择最大的空闲区域进行分配。

2. 动态分区分配方式动态分区分配方式是指操作系统在程序运行过程中,根据需要动态地分配和回收内存空间。

动态分区分配方式包括以下几种:(1)固定分区分配:将内存划分为若干个固定大小的分区,程序运行时按需分配分区。

(2)可变分区分配:根据程序大小动态分配分区,分区大小可变。

(3)分页分配:将内存划分为若干个固定大小的页,程序运行时按需分配页。

四、实验内容1. 实现首次适应算法(1)创建空闲分区链表,记录空闲分区信息,包括分区起始地址、分区大小等。

(2)编写分配函数,实现首次适应算法,根据程序大小查找空闲分区,分配内存。

(3)编写回收函数,回收程序所占用的内存空间,更新空闲分区链表。

2. 实现最佳适应算法(1)创建空闲分区链表,记录空闲分区信息。

(2)编写分配函数,实现最佳适应算法,根据程序大小查找最佳空闲分区,分配内存。

(3)编写回收函数,回收程序所占用的内存空间,更新空闲分区链表。

3. 实验结果分析(1)通过实验,验证首次适应算法和最佳适应算法的正确性。

(2)对比两种算法在内存分配效率、外部碎片等方面的差异。

五、实验步骤1. 创建一个动态内存分配模拟程序,包括空闲分区链表、分配函数和回收函数。

内存管理实验报告

内存管理实验报告

内存管理实验报告实验名称:内存管理实验目的:掌握内存管理的相关概念和算法加深对内存管理的理解实验原理:内存管理是操作系统中的一个重要模块,负责分配和回收系统的内存资源。

内存管理的目的是高效地利用系统内存,提高系统的性能和稳定性。

实验过程:1.实验环境准备本实验使用C语言编程,要求安装GCC编译器和Linux操作系统。

2.实验内容实验主要包括以下几个部分:a.基本内存管理创建一个进程结构体,并为其分配一定大小的内存空间。

可以通过C语言中的指针操作来模拟内存管理的过程。

b.连续分配内存算法实现两种连续分配内存的算法:首次适应算法和最佳适应算法。

首次适应算法是从低地址开始寻找满足要求的空闲块,最佳适应算法是从所有空闲块中选择最小的满足要求的块。

c.非连续分配内存算法实现分页和分段两种非连续分配内存的算法。

分页是将进程的虚拟地址空间划分为固定大小的页面,然后将页面映射到物理内存中。

分段是将进程的地址空间划分为若干个段,每个段可以是可变大小的。

3.实验结果分析使用实验中的算法和方法,可以实现对系统内存的高效管理。

通过比较不同算法的性能指标,我们可以选择合适的算法来满足系统的需求。

具体而言,连续分配内存算法中,首次适应算法适用于内存中有大量小碎片的情况,可以快速找到满足要求的空闲块。

最佳适应算法适用于内存中碎片较少的情况,可以保证最小的内存浪费。

非连续分配内存算法中,分页算法适用于对内存空间的快速分配和回收,但会带来一定的页表管理开销。

分段算法适用于对进程的地址空间进行分段管理,可以灵活地控制不同段的权限和大小。

实验中还可以通过性能测试和实际应用场景的模拟来评估算法的性能和适用性。

实验总结:本实验主要介绍了内存管理的相关概念和算法,通过编写相应的代码实现了基本内存管理和连续分配、非连续分配内存的算法。

通过实际的实验操作,加深了对内存管理的理解。

在实验过程中,我们发现不同算法适用于不同情况下的内存管理。

连续分配算法可以根据实际情况选择首次适应算法或最佳适应算法。

linux操作系统实验报告

linux操作系统实验报告

linux操作系统实验报告第一篇:linux操作系统实验报告Linux实验报告一一、实验步骤及内容1.虚拟机软件的安装(1)先准备虚拟机安装包。

(2)更改安装路径:“D: VMwareVMware Workstationvmware.exe”(3)输入序列号:ctrl+v,在安装过程中不能进行复制剪切操作。

(4)不能重新启动,才能继续安装汉化版D: vmwarevmware workstation2.新建一个虚拟机并进行配置(1)单击新建虚拟机虚拟机的类型选择:典型安装选择客户端操作系统:linux虚拟机的名字及位置根据需要网络类型选择:,桥接。

指定的磁盘容量删除软驱:双击floppy—remove虚拟内存设置:双击memory—1024MB设置linux的安装文件:选择安装镜像文件—指定第一个安装文件—就可以啦!之后会提示安装第二个安装文件就进行选择第二个中间鼠标切换用CTRL+ALT。

3.安装LINUX操作系统(1)要确定鼠标是否在虚拟机的激活状态下:敲回车不需要检测安装文件选择skip进入linux的安装前的配置选项:选择安装的语言—中文简体键盘:--默认鼠标:--默认安装类型:--workstation磁盘分区:--自动分区引导程序:默认网络配置:默认防火墙:无防火墙支持的语言:中文时区:亚洲-上海密码:root123456安装的软件包:全部。

二.在已有虚拟机软件的基础上安装LINUX的技巧。

(1)新建虚拟机—典型安装—linux ,red hat linux---给虚拟机命名,并且指定安装位置d:red hat linux---桥接---10G。

(2)在刚才建立的虚拟机上安装linux系统.(3)配置要安装的linux系统的安装文件iso镜像文件(4)选择配置好linux镜像文件刚才建立的虚拟机,启动虚拟机,开始安装。

三.实验总结充分了解linux系统的安装,学会新建虚拟机,在虚拟机上安装linux系统.和一些简单的技巧并对此门课程有了一定的兴趣。

操作系统实验四存储管理实验(1)

操作系统实验四存储管理实验(1)

操作系统课程实验年级2012 级专业计算机科学与技术(应用型)姓名学号指导教师日期实验四、存储管理实验一、关键问题1、实验目的理解内存分配和回收原理。

2、实验环境Ubuntu 8.0或者以上,Eclipse集成开发环境3、实验内容3.1 在控制台内观察Linux内存分配情况3.2存储管理模拟实验要求:写一动态分区管理程序,使其内存分配采用最佳适应分配算法。

老师所给的例子为内存分配算法是最先适应分配算法的系统模拟动态分区管理方案,而问题的关键就是如何把最先适应分配算法改为最佳适应分配算法。

二、设计修改思路struct freearea* min1=NULL;//定义了一个符合条件的最小空白块链表首先我们在分配内存函数中需要定义一个记录符合条件的最小空白块的链表结构指针,对当前空闲分区链进行遍历,找到符合条件的最小空白块并记录。

系统为作业分配内存时,根据指针freep查找空闲分区链。

当找到一块可以满足请求中最小的空闲分区时便分配。

当空间被分配后剩余的空间大于规定的碎片,则形成一个较小的空闲分区留在空闲链中。

三、实现修改的关键代码//有两个链:空白块链及作业链.空白块链描述空白块,链首指针freep,初始为一大块空白块.//作业链按从高址到低址的顺序链接,链首指针jobp//为作业jn分配jl大小内存,起始地址为javoid ffallocation(int jl,char jn[10],int* ja){struct mat* jp=NULL;//作业链当前节点struct mat* jp2=NULL;//新的作业节点struct mat* jp1=NULL;//struct freearea* fp=NULL;//当前空白块struct freearea* min1=NULL;//定义了一个符合条件的最小空白块链表int flag=0;int i;*ja=-1;if (totalfree<jl) //剩余空间大小不能满足作业要求return;fp=freep;while (fp!=NULL){if (fp->freesize>jl){ min1=fp;flag=1;break;}fp=fp->next;}if(freep->next!=NULL&&flag==0) {*ja=0;return;}fp=min1->next;while (fp!=NULL){if (fp->freesize>jl&&fp->freesize<min1->freesize)min1=fp;fp=fp->next;//当前空白块大小不满足要求}jobnumber++;totalfree=totalfree-jl;jp2=calloc(1,sizeof(struct mat));//在节点上登记为该作业分配的内存空间// for (i=0;i<10;i++) (jp2->jobname)[i]=' ';i=-1;while(jn[++i])(jp2->jobname)[i]=jn[i];(jp2->jobname)[i]='\0';jp2->joblength=jl;jp2->jobaddress=min1->freeaddress;//登记该作业的起始地址(块的最低地址)*ja=jp2->jobaddress;//将节点jp2插入作业链jobp,按高址到低址的顺序。

Linux内存管理分析与研究

Linux内存管理分析与研究

Linux内存管理分析与研究随着计算机技术的不断发展,操作系统在计算机系统中扮演着越来越重要的角色。

作为开源操作系统领域的佼佼者,Linux被广泛用于各种应用场景,包括服务器、桌面、嵌入式系统等。

内存管理是操作系统核心功能之一,对于系统性能和稳定性具有重要影响。

本文将对Linux内存管理进行深入分析,并探讨其存在的问题与解决方案。

Linux内存管理采用分页和分段技术,将物理内存划分为大小不同的页框或段框,以便更有效地利用和管理内存资源。

Linux通过将内存分为内核空间和用户空间,实现了内存的隔离和保护,同时允许用户进程使用不同的内存空间。

Linux内存管理存在的一个主要问题是内存分配不均。

由于内存分配是基于页框或段框的,当某些进程需要更多内存时,操作系统会从空闲的内存页框中分配内存。

然而,在实际情况中,由于页框大小固定,当需要分配大量内存时,可能会造成内存分配不均的情况。

另一个问题是浪费空间。

Linux为了提高内存利用率,采用了一种称为内存分页的技术。

然而,在某些情况下,当进程不再需要使用内存时,操作系统并不会立即将内存页框回收,而是保留在内存中以备将来使用,这可能会导致内存空间的浪费。

针对内存分配不均的问题,可以采取交换技术。

交换技术是一种将进程使用的内存部分移至磁盘上,以腾出更多内存供其他进程使用的方法。

在Linux中,可以使用瑞士文件系统(Swiss File System,SFS)作为交换设备,将不常用的内存页框交换到磁盘上,以便在需要时重新加载。

为了解决内存浪费问题,可以优化内存分配算法。

Linux中使用的内存分配算法是基于伙伴系统的,该算法会跟踪每个内存块的空闲状态。

当需要分配内存时,伙伴系统会选择一个适当大小的空闲块,并将其划分为所需的内存大小。

为了避免内存浪费,可以采取以下措施:增加空闲内存块的大小,以便更好地适应大内存需求;引入动态内存分配机制,使操作系统能够在需要时分配和回收内存;定期清理不再使用的内存块,以便及时回收内存空间。

实验8Linux的内存管理

实验8Linux的内存管理

内存管理的概念
内存管理的定义
内存管理是指操作系统对计算机内存 资源的分配、回收、保护和扩充等一 系列操作,以确保系统高效、稳定地 运行。
内存管理的目标
提高内存利用率,减少内存碎片,实 现多任务环境下的内存共享和保护, 以及提供虚拟内存等。
Linux内存管理的特点
分段和分页机制
Linux采用分段和分页机制来管理内存,将物理内 存划分为大小相等的页框,同时将进程地址空间 划分为多个段,每个段对应一个页表项,实现地 址空间的隔离和权限控制。

03 通过实验操作和观察,加深对Linux内存管理的 理解和认识。
实验环境
操作系统
Linux(建议使用Ubuntu或CentOS等常见发行版 )
开发工具
GCC编译器、GDB调试器、Valgrind内存检测工 具等。
实验材料
一台配置有Linux操作系统的计算机,具备基本的 编程和调试能力。
02
Linux内存管理概述
VS
共享内存的实现方式
在Linux中,共享内存可以通过shmget() 、shmat()和shmdt()等系统调用来实现 。首先,使用shmget()函数创建一个共 享内存段;然后,使用shmat()函数将共 享内存段连接到当前进程的地址空间;最 后,使用shmdt()函数将共享内存段从当 前进程的地址空间中分离。
06
内存优化与性能提升
内存泄漏问题及其解决方案
内存泄漏定义
内存泄漏是指程序在申请内存后,未能正确释放,导致系统内存逐 渐耗尽的现象。
检测工具
使用Valgrind等内存检测工具,可以检测程序中的内存泄漏问题。
解决方案
及时释放不再使用的内存,避免不必要的内存申请,采用智能指针等 RAII技术来管理内存。

操作系统实验-存储管理

操作系统实验-存储管理

操作系统实验-存储管理操作系统实验-存储管理1、引言1.1 概述在操作系统中,存储管理是一个关键的任务。

它负责将程序和数据加载到内存中,管理内存的分配和回收,并确保不同进程之间的内存互不干扰。

本实验旨在深入了解并实践存储管理的相关概念和算法。

1.2 目的本实验的目的是让学生通过实际操作,了解存储管理的基本原理和常用算法,包括分页、分段和虚拟内存等。

通过实验,学生将学会如何实现内存分配和回收,以及处理内存碎片等问题。

1.3 实验环境- 操作系统:Windows、Linux、MacOS等- 编程语言:C、C++等2、实验步骤2.1 实验准备- 安装相应的开发环境和工具- 创建一个空白的项目文件夹,用于存放实验代码和相关文件2.2 实验一、分页存储管理- 理解分页存储管理的概念和原理- 实现一个简单的分页存储管理系统- 设计测试用例,验证分页存储管理的正确性和有效性2.3 实验二、分段存储管理- 理解分段存储管理的概念和原理- 实现一个简单的分段存储管理系统- 设计测试用例,验证分段存储管理的正确性和有效性2.4 实验三、虚拟存储管理- 理解虚拟存储管理的概念和原理- 实现一个简单的虚拟存储管理系统- 设计测试用例,验证虚拟存储管理的正确性和有效性3、实验结果分析3.1 分页存储管理结果分析- 分析分页存储管理系统的性能优缺点- 比较不同页面大小对系统性能的影响3.2 分段存储管理结果分析- 分析分段存储管理系统的性能优缺点- 比较不同段大小对系统性能的影响3.3 虚拟存储管理结果分析- 分析虚拟存储管理系统的性能优缺点- 比较不同页面置换算法对系统性能的影响4、总结与展望4.1 实验总结- 总结本次实验的收获和体会- 分析实验中遇到的问题和解决方法4.2 实验展望- 探讨存储管理领域的未来发展方向- 提出对本实验的改进意见和建议附件:无法律名词及注释:- 存储管理:操作系统中负责管理内存的任务,包括内存分配、回收和管理等功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1《unix 操作系统教程》课程实验报告实验名称 Linux 内存管理实验实验序号 5 姓 名系院专业班 级学 号 实验日期 2012.11.28 指导教师成 绩一、实验目的1. 通过在Linux 环境下对内存管理的基本操作,感性认识Linux 如何对内存进行管理。

2. 利用readelf 和objdump 观测 linux 下的内存地址映射过程以及进程的虚拟地址空间。

二、实验内容与要求(1)按照实验内容完成实验操作步骤,学习内存管理中的一些常用命令 (2)理解linux 中逻辑地址、线性地址的概念。

(3)提交实验报告。

三、实验设备地点: 实验实训中心A4-2 设备:计算机一台 linux 操作系统2四、实验步骤与测试实验一free 命令显示显示内存的使用情况(使用的和空闲的),包括物理内存、交换区内存、内核缓冲区内存。

不包括共享内存。

free 命令默认选项为-k 语法:free [-bkmotV] [-s <间隔秒数>]选项介绍: -b: 以Byte 为单位显示内存使用情况; -k: 以KB 为单位显示内存使用情况; -m: 以MB 为单位显示内存使用情况; -o: 不显示缓冲区调节列;-s<间隔秒数>: 每间隔指定时间执行一次free 命令; -t: 显示内存总和列;-V: 显示版本信息;(1)free -k: 以KB 为单位显示内存使用情况;解释:total: 内存总量: 3355508(k) used: 已经使用的内存量: 490664(k) free: 空闲的内存量: 2864844(k)shared: 当前已经废弃不用,总量是0(k) buffers: 25164(k)Buffer Cache 内存量: 263480(k)cached: Page Cache 内存量: 21436(k)(2)free –m -s 5:以M 为单位,5秒显示以下内存信息解释:以上为每隔5秒显示内存信息,由以上图可知:两次内存使用情况没有变化。

(3)free -o: 不显示缓冲区调节列;解释:由以上可知Buffer Cache 这一列没有显示出来。

(4)free -t: 显示内存总和列;解释:如上所示,内存总和是3355508(k),内存已使用为491408(k),内存空闲为2864100(k)。

(5)free -V: 显示版本信息解释:版本号为3.2.72.swapon –s:显示交换区的使用状况解释:交换区名为:/dev/sda3,类型为partition,大小为425712,已使用为0,优先级为-1。

3. vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。

它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。

解释:vmstat [-V] [-n] [delay [count]]其中,-V表示打印出版本信息;-n表示在周期性循环输出时,输出的头部信息仅显示一次;delay是两次输出之间的延迟时间;count是指按照这个时间间隔统计的次数。

对于vmstat输出各字段的含义,可运行man vmstat查看。

下面给出了各个参数的不同含义:procs:r-->在运行队列中等待的进程数b-->在等待io的进程数w-->可以进入运行队列但被替换的进程memoyswap-->现时可用的交换内存(k表示)free-->空闲的内存(k表示)buff-->被用来做为缓存的内存数,单位:KBcache-->被用来做为文件读写缓存的内存数,单位:KBswapsi-->从磁盘交换到内存的交换页数量,单位:KB/秒so-->从内存交换到磁盘的交换页数量,单位:KB/秒IObi-->磁盘块入34bo-->磁盘块出 Systemin-->每秒的中断数,包括时钟中断 cs-->每秒的环境(上下文)切换次数 CPU按 CPU 的总使用百分比来显示 us-->用户进程使用的时间 sy-->系统进程使用的时间 id-->cpu 空闲的时间 pagesre-->回收的页面mf-->非严重错误的页面 pi-->进入页面数(k 表示) po-->出页面数(k 表示) fr-->空余的页面数(k 表示)de-->提前读入的页面中的未命中数 sr-->通过时钟算法扫描的页面 disk 显示每秒的磁盘操作。

s 表示scsi 盘,0表示盘号 fault 显示每秒的中断数 in-->设备中断 sy-->系统中断 cy-->cpu 交换实验二1.搭建linux 实验平台,并在搭建好的平台中用vi 编辑器编写一个简单C 程序:1. /*test.c */2.3. #include <stdio.h>4.5. int global_data = 4;6.7. int global_data_2; 8.9. int main(int argc, char **argv) 10. 11. { 12.13. int local_data = 3; 14.515. printf("HelloWorldn"); 16.17. printf("global_data= %dn", global_data); 18.19. printf("global_data_2= %dn", global_data_2); 20.21. printf("local_data= %dn", local_data); 22.23. return (0); 24. 25. }2. 编译: $gcc -o test test.cA.查看ELF 的头。

刚生成的二进制就是我们要查看的目标。

从ELF 的头开始吧: $readelf -h test 实验结果:可执行文件是可以在Intel x86 32 bit 的体系的机器上运行的(从“machine”和“class”字段)。

当执行时,程序将从虚地址0x080482c0(看“Entry point address”)开始运行。

这个地址不是指向我们常见的main()函数地址的,但是它指向是一个名为__start 的函数。

__start 函数是被linker 创建的,它的目标是初始你的程序。

6这个程序还有28个节区(section)和7个段(segment)什么是节区(section)? Section 是在目标文件中的一个区,它包括一些信息(这些信息对连接过程有用):程序的代码、程序的数据(变量、数组、字符串),可重定向的信息和其它。

所以,在每一个区,几种信息组合在一起,这里有一个明显地含义:代码区只有代码,数据区只是初始化的或是没有初始化的数据,等等。

节区头部分列表(Section Header Table,SHT )精确地告诉我们:ELF 目标文件中有什么section 。

至少从“Number of section headers”字段中知道“test”目标文件有28个section.如果section 是一个二进制表示的,linux 内核不能用一种方式读懂它,linux 内核准备几个VMA (Virtual Memory Area ),它们包括虚拟地址连续的页面帧。

在VMA 的内部,一个或多个section 被映射其中。

在这个例子中每一个VMA 都代表一个ELF 的段(segment)。

那内核是如何知道哪个section 去往哪个segment 呢?这是Program Header Table(PHT)的工作。

B.查看Section Header Table(SHT)让我们看一个Section 在程序中的存在形式: $ readelf -S test 实验结果:7编译器把可执行代码保存到.text 节区中。

那.text 节区被标记为可执行('X'在flag 字段)。

在这个节区,你可以看到我们main()函数的机器代码。

$ objdump -d -j.text test 实验结果:-d 选项告诉objdump 分解机器代码。

-j 告诉objdump 只关心那个特定的节区(在本例中,是.text )。

以下是执行命令后的部分内容。

.data 节区保存所有的初始化的变量,这些变量不在栈中。

“Initialized”是指这些变量被赋于初始值,如”global_data”。

那”local_data”呢?“local_data”的值不在此节区中,它们生活在进程的栈里。

以下是用objdump 查看.data 节区:8$ objdump -d -j.data test 实验结果:C.查看 program Header Table(PHT)段(segment)是一个OS“看懂”我们程序的方法。

让我们看看我们程序是如何变成段的吧: $readelf -l test 实验结果:实验结果解释:映射很直观。

例如段号2,这里有15个节区被映射到其中。

.text 节区就映射到此段。

它的标志是R,E 其含义分别是可读,可执行。

W 就是可读的含义。

可以使用/proc/<pid>/maps 文件也可以得看到它。

<pid>是一个我们想要查看的进程的ID 。

, test 进程运行的太快了,在进入/proc 这前,它就结束了。

可以使用gdb 来解决此问题。

也可以在return 之前调用 sleep()来搞定这个问题。

9在另一个控制台中: $ gdb test (gdb) b mainBreakpoint 1 at 0x8048376 (gdb) rBreakpoint 1, 0x08048376 in main ()在此保持(hold)住,打开另一个控制台,找到test 的PID 。

如果你想图省事的话,就这样: $ cat /proc/`pgrep test`/maps 实验结果:回到gdb ,输入: (gdb) q10于是,最后,我们看到了12个段(实际上是VMA )。

重点关注第一个字段和最后一字段。

第一字段显示了VMA 的地址范围,最后一个字段显示了背后的文件。

你在看到VMA 的第8行与之前PHT 的第2行的类似点了吗?不同之处是SHT 说它自己于0x080484fc 结束,但在8号段中我们看到它的结束地址是0x08049000。

在VMA9号与段3号之间也有同样的现象。

SHT 显示3号段开始于0x080494fc 。

相关文档
最新文档