Linux内存管理实验Word文件下载.docx

上传人:b****1 文档编号:4972325 上传时间:2023-05-04 格式:DOCX 页数:12 大小:157.67KB
下载 相关 举报
Linux内存管理实验Word文件下载.docx_第1页
第1页 / 共12页
Linux内存管理实验Word文件下载.docx_第2页
第2页 / 共12页
Linux内存管理实验Word文件下载.docx_第3页
第3页 / 共12页
Linux内存管理实验Word文件下载.docx_第4页
第4页 / 共12页
Linux内存管理实验Word文件下载.docx_第5页
第5页 / 共12页
Linux内存管理实验Word文件下载.docx_第6页
第6页 / 共12页
Linux内存管理实验Word文件下载.docx_第7页
第7页 / 共12页
Linux内存管理实验Word文件下载.docx_第8页
第8页 / 共12页
Linux内存管理实验Word文件下载.docx_第9页
第9页 / 共12页
Linux内存管理实验Word文件下载.docx_第10页
第10页 / 共12页
Linux内存管理实验Word文件下载.docx_第11页
第11页 / 共12页
Linux内存管理实验Word文件下载.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Linux内存管理实验Word文件下载.docx

《Linux内存管理实验Word文件下载.docx》由会员分享,可在线阅读,更多相关《Linux内存管理实验Word文件下载.docx(12页珍藏版)》请在冰点文库上搜索。

Linux内存管理实验Word文件下载.docx

每间隔指定时间执行一次free命令;

-t:

显示内存总和列;

-V:

显示版本信息;

(1)free-k:

解释:

total:

内存总量:

3355508(k)used:

已经使用的内存量:

490664(k)free:

空闲的内存量:

2864844(k)

shared:

当前已经废弃不用,总量是0(k)

buffers:

25164(k)

BufferCache内存量:

263480(k)

cached:

PageCache内存量:

21436(k)

(2)free–m-s5:

以M为单位,5秒显示以下内存信息

1

以上为每隔5秒显示内存信息,由以上图可知:

两次内存使用情况没有变化。

(3)free-o:

由以上可知BufferCache这一列没有显示出来。

(4)free-t:

如上所示,内存总和是3355508(k),内存已使用为491408(k),内存空闲为2864100(k)。

(5)free-V:

显示版本信息

版本号为3.2.7

2(swapon–s:

显示交换区的使用状况

交换区名为:

/dev/sda3,类型为partition,大小为425712,已使用为0,优先级为-1。

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

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

vmstat[-V][-n][delay[count]]

其中,,V表示打印出版本信息;

n表示在周期性循环输出时,输出的头部信息仅显示一次;

delay是两次输出之间的延迟时间;

count是指按照这个时间间隔统计的次数。

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

下面给出了各个参数的不同含义:

procs:

r-->

在运行队列中等待的进程数

b-->

在等待io的进程数

w-->

可以进入运行队列但被替换的进程

memoy

swap-->

现时可用的交换内存(k表示)

free-->

空闲的内存(k表示)

2

buff-->

被用来做为缓存的内存数,单位:

KB

cache-->

被用来做为文件读写缓存的内存数,单位:

swap

si-->

从磁盘交换到内存的交换页数量,单位:

KB/秒

so-->

从内存交换到磁盘的交换页数量,单位:

IO

bi-->

磁盘块入

bo-->

磁盘块出

System

in-->

每秒的中断数,包括时钟中断cs-->

每秒的环境(上下文)切换次数CPU

按CPU的总使用百分比来显示us-->

用户进程使用的时间

sy-->

系统进程使用的时间

id-->

cpu空闲的时间

pages

re-->

回收的页面

mf-->

非严重错误的页面

pi-->

进入页面数(k表示)

-->

出页面数(k表示)po

fr-->

空余的页面数(k表示)de-->

提前读入的页面中的未命中数sr-->

通过时钟算法扫描的页面disk显示每秒的磁盘操作。

s表示scsi盘,0表示盘号

fault显示每秒的中断数

设备中断

系统中断

cy-->

cpu交换

实验二

1.搭建linux实验平台,并在搭建好的平台中用vi编辑器编写一个简单C程序:

1./*test.c*/

2.

3.#include<

stdio.h>

4.

5.intglobal_data=4;

6.

7.intglobal_data_2;

8.

9.intmain(intargc,char**argv)

10.

3

11.{

12.

13.intlocal_data=3;

14.

15.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-otesttest.c

A.查看ELF的头。

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

从ELF的头开始吧:

$readelf-htest

实验结果:

可执行文件是可以在Intelx8632bit的体系的机器上运行的(从“machine”和“class”字段)。

4

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

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

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

这个程序还有28个节区(section)和7个段(segment)

什么是节区(section),Section是在目标文件中的一个区,它包括一些信息(这些信息对连接过程有用):

程序的代码、程序的数据(变量、数组、字符串),可重定向的信息和其它。

所以,在每一个区,几种信息组合在一起,这里有一个明显地含义:

代码区只有代码,数据区只是初始化的或是没有初始化的数据,等等。

节区头部分列表(SectionHeaderTable,SHT)精确地告诉我们:

ELF目标文件中有什么section。

至少从“Numberofsectionheaders”字段中知道“test”目标文件有28个section.

如果section是一个二进制表示的,linux内核不能用一种方式读懂它,linux内核准备几个VMA(VirtualMemoryArea),它们包括虚拟地址连续的页面帧。

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

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

那内核是如何知道哪个section去往哪个segment呢,这是ProgramHeaderTable(PHT)的工作。

B.查看SectionHeaderTable(SHT)

让我们看一个Section在程序中的存在形式:

$readelf-Stest

5

编译器把可执行代码保存到.text节区中。

那.text节区被标记为可执行('

X'

在flag字段)。

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

$objdump-d-j.texttest

-d选项告诉objdump分解机器代码。

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

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

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

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

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

以下是用objdump查看.data节区:

6

$objdump-d-j.datatest

C.查看programHeaderTable(PHT)

段(segment)是一个OS“看懂”我们程序的方法。

让我们看看我们程序是如何变成段的吧:

$readelf-ltest

实验结果解释:

映射很直观。

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

.text节区就映射到此段。

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

W就是可读的含义。

可以使用/proc/<

pid>

/maps文件也可以得看到它。

<

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

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

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

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

7

在另一个控制台中:

$gdbtest

(gdb)bmain

Breakpoint1at0x8048376

(gdb)r

Breakpoint1,0x08048376inmain()

在此保持(hold)住,打开另一个控制台,找到test的PID。

如果你想图省事的话,就这样:

$cat/proc/`pgreptest`/maps

回到gdb,输入:

(gdb)q

8

于是,最后,我们看到了12个段(实际上是VMA)。

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

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

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

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

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

而VMA则显示开始于0x08049000。

有这么几个因素我们必须了解:

1.尽管VMA开始于不同的地址,与之关联的节区仍然被映射到精确的虚拟地址上了。

2.内核分配内存是以4KB的页为基本单位的,所以每一页的地址都是4KB的整数倍。

如0x1000,0x2000等。

对于VMA的9号,这个页的地址是0x08049000。

或从技术角度讲,这个段的地址必须与页面的大小对齐。

最后,哪一个VMA是栈呢,VMA11就是。

一般地,内核动态地分配几个页面,并映射到用户空间可能的最高的虚拟地址,这就是栈的区域了。

简单地讲,每一个进程的地址空间被分成两部分(前提是32位的CPU):

用户空间和内核空间。

用户空间在0x00000000-0xc0000000,所以内核空间只能在0xc0000000以上了。

于是,分配给栈的地址是在0xc0000000边界附近的。

结束地址是固定的,开始地址可以根据保存内容的多少而变化。

9

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2