文档库 最新最全的文档下载
当前位置:文档库 › linux 内存相关操作函数

linux 内存相关操作函数

linux 内存相关操作函数
linux 内存相关操作函数

Linux内核中内存相关的操作函数

1、kmalloc()/kfree()

static __always_inline void *kmalloc(size_t size, gfp_t flags)

内核空间申请指定大小的内存区域,返回内核空间虚拟地址。在函数实现中,如果申请的内存空间较大的话,会从buddy系统申请若干内存页面,如果申请的内存空间大小较小的话,会从slab系统中申请内存空间。

gfp_t flags 的选项较多。参考内核文件gfp.h.

在函数kmalloc()实现中,如果申请的空间较小,会根据申请空间的大小从slab中获取;如果申请的空间较大,如超过一个页面,会直接从buddy系统中获取。

2、vmalloc()/vfree()

void *vmalloc(unsigned long size)

函数作用:从高端(如果存在,优先从高端)申请内存页面,并把申请的内存页面映射到内核的动态映射空间。vmalloc()函数的功能和alloc_pages(_GFP_HIGHMEM)+kmap() 的功能相似,只所以说是相似而不是相同,原因在于用vmalloc()申请的物理内存页面映射到内核的动态映射区(见下图),并且,用vmalloc()申请的页面的物理地址可能是不连续的。而alloc_pages(_GFP_HIGHMEM)+kmap()申请的页面的物理地址是连续的,被映射到内核的KMAP区。

vmalloc分配的地址则限于vmalloc_start与vmalloc_end之间。每一块vmalloc分配的内核虚拟内存都对应一个vm_struct结构体(可别和vm_area_struct搞混,那可是进程虚拟内存区域的结构),不同的内核虚拟地址被4k大小的空闲区间隔,以防止越界--见下图)。与进程虚拟地址的特性一样,这些虚拟地址与物理内存没有简单的位移关系,必须通过内核页表才可转换为物理地址或物理页。它们有可能尚未被映射,在发生缺页时才真正分配物理页面。

如果内存紧张,连续区域无法满足,调用vmalloc分配是必须的,因为它可以将物理不连续的空间组合后分配,所以更能满足分配要求。vmalloc可以映射高端页框,也可以映射底端页框。vmalloc的作用只是为了提供逻辑上连续的地址…

注意:在申请页面时,如果注明_GFP_HIGHMEM,即从高端申请。则实际是优先从高端内存申请,顺序为(分配顺序是HIGH, NORMAL, DMA )。

3、alloc_pages()/free_pages()

内核空间申请指定个数的内存页,内存页数必须是2^order个页。

alloc_pages(gfp_mask, order) 中,gfp_mask 是flag标志,其中可以为_ _GFP_DMA、_GFP_HIGHMEM 分别对应DMA和高端内存。

注:该函数基于buddy系统申请内存,申请的内存空间大小为2^order个内存页面。

参见《linux内核之内存管理。doc》

通过函数alloc_pages()申请的内存,需要使用kmap()函数分配内核的虚拟地址。

4、__get_free_pages()/__free_pages()

unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)

作用相当于alloc_pages(NORMAL)+kmap(),但不能申请高端内存页面。

__get_free_page()只申请一个页面。

5、kmap()/kunmap()

返回指定页面对应内核空间的虚拟地址。

#include

void *kmap(struct page *page);

void kunmap(struct page *page);

kmap 为系统中的任何页返回一个内核虚拟地址。

对于低端内存页,它只返回页的逻辑地址;

对于高端内存页,kmap在"内核永久映射空间"中创建一个特殊的映射。这样的映射数目是有限,因此最好不要持有过长的时间。

使用kmap 创建的映射应当使用kunmap 来释放;

kmap 调用维护一个计数器,因此若2个或多个函数都在同一个页上调用kmap也是允许的。

通常情况下,"内核永久映射空间"是4M 大小,因此仅仅需要一个页表即可,内核通过来pkmap_page_table 寻找这个页表。

注意:不用时及时释放。

kmalloc()和vmalloc()相比,kmalloc()总是从ZONE_NORMAL(下图中的直接映射区)申请内存。kmalloc()分配的内存空间通常用于linux内核的系统数据结构和链表。因内核需要经常

访问其数据结构和链表,使用固定映射的ZONE_NORMAL空间的内存有利于提高效率。

使用vmalloc()可以申请非连续的物理内存页,并组成虚拟连续内存空间。vmalloc()优先从高端内存(下图中的动态映射区)申请。内核在分配那些不经常使用的内存时,都用高端内存空间(如果有),所谓不经常使用是相对来说的,比如内核的一些数据结构就属于经常使用的,而用户的一些数据就属于不经常使用的。

alloc_pages(_GFP_HIGHMEM)+kmap() 方式申请的内存使用内核永久映射空间(下图中的KMAP区),空间较小(通常4M线性空间),不用时需要及时释放。另外,可以指定alloc_pages()从直接映射区申请内存,需要使用_GFP_NORMAL属性指定。

__get_free_pages()/__free_pages() 不能申请高端内存页面,操作区域和kmalloc()相同(下图中的动态映射区)。

6、virt_to_page()

其作用是由内核空间的虚拟地址得到页结构。见下面的宏定义。

#define virt_to_pfn(kaddr) (__pa(kaddr) 》PAGE_SHIFT)

#define pfn_to_virt(pfn) __va((pfn) 《PAGE_SHIFT)

#define virt_to_page(addr) pfn_to_page(virt_to_pfn(addr))

#define page_to_virt(page) pfn_to_virt(page_to_pfn(page))

#define __pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET))

#define __page_to_pfn(page) ((unsigned long)((page) - mem_map) + \

ARCH_PFN_OFFSET)

7、物理地址和虚拟地址之间转换

#ifdef CONFIG_BOOKE

#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + VIRT_PHYS_OFFSET))

#define __pa(x) ((unsigned long)(x) - VIRT_PHYS_OFFSET)

#else

#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + PAGE_OFFSET - MEMORY_START))

#define __pa(x) ((unsigned long)(x) - PAGE_OFFSET + MEMORY_START)

#endif

8、ioremap()/iounmap()

ioremap()的作用是把device寄存器和内存的物理地址区域映射到内核虚拟区域,返回值为内核的虚拟地址。

注明:在内核中操作内存空间时使用的都是内核虚拟地址,必须把device的空间映射到内核虚拟空间。

#include

void *ioremap(unsigned long phys_addr, unsigned long size);

void *ioremap_nocache(unsigned long phys_addr, unsigned long size); 映射非cache的io 内存区域

void iounmap(void * addr);

为了增加可移植性,最好使用下面的接口函数读写io内存区域,

unsigned int ioread8(void *addr);

unsigned int ioread16(void *addr);

unsigned int ioread32(void *addr);

void iowrite8(u8 value, void *addr);

void iowrite16(u16 value, void *addr);

void iowrite32(u32 value, void *addr);

如果你必须读和写一系列值到一个给定的I/O 内存地址,你可以使用这些函数的重复版本:

void ioread8_rep(void *addr, void *buf, unsigned long count);

void ioread16_rep(void *addr, void *buf, unsigned long count);

void ioread32_rep(void *addr, void *buf, unsigned long count);

void iowrite8_rep(void *addr, const void *buf, unsigned long count);

void iowrite16_rep(void *addr, const void *buf, unsigned long count);

void iowrite32_rep(void *addr, const void *buf, unsigned long count);

这些函数读或写count 值从给定的buf 到给定的addr. 注意count 表达为在被写入的数据大小; ioread32_rep 读取count 32-位值从buf 开始。

9、request_mem_region()

本函数的作用是:外设的io端口映射到io memory region中。在本函数实现中会检查输入到本函数的参数所描述的空间(下面成为本io空间)是否和io memory region中已存在的空间冲突等,并设置本io空间的parent字段等(把本io空间插入到io 空间树种)。

注明:io memory region 空间中是以树形结构组织的,默认的根为iomem_resource描述的io空间,其name为"PCI mem".

request_mem_region(start,n,name) 输入的参数依次是设备的物理地址,字节长度,设备名字。函数返回类型如下

struct resource {

resource_size_t start;

resource_size_t end;

const char *name;

unsigned long flags;

struct resource *parent, *sibling, *child;

};

10、SetPageReserved()

随着linux的长时间运行,空闲页面会越来越少,为了防止linux内核进入请求页面的僵局中,Linux内核采用页面回收算法(PFRA)从用户进程和内核高速缓存中回收内存页框,并根据需要把要回收页框的内容交换到磁盘上的交换区。调用该函数可以使页面不被交换。

#define SetPageReserved(page) set_bit(PG_reserved, &(page)->flags)

PG_reserved 的标志说明如下。

* PG_reserved is set for special pages, which can never be swapped out. Some

* of them might not even exist (eg empty_bad_page)…

11、do_mmap()/do_ummap()

内核使用do_mmap()函数为进程创建一个新的线性地址区间。但是说该函数创建了一个新VMA并不非常准确,因为如果创建的地址区间和一个已经存在的地址区间相邻,并且它们具有相同的访问权限的话,那么两个区间将合并为一个。如果不能合并,那么就确实需要创建一个新的VMA了。但无论哪种情况,do_mmap()函数都会将一个地址区间加入到进程的地址空间中--无论是扩展已存在的内存区域还是创建一个新的区域。

同样,释放一个内存区域应使用函数do_ummap(),它会销毁对应的内存区域。

12、get_user_pages()

作用是在内核空间获取用户空间内存的page 描述,之后可以通过函数kmap() 获取page 对应到内核的虚拟地址。

int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,

unsigned long start, int len, int write, int force,

struct page **pages, struct vm_area_struct **vmas)

参数说明

参数tsk:指示用户空间对应进程的task_struct数据结构。只是为了记录错误信息用,该参数可以为空。

参数mm:从该mm struct中获取start 指示的若干页面。

参数start:参数mm空间的起始地址,即用户空间的虚拟地址。

参数len:需要映射的页数。

参数write:可以写标志。

参数force:强制可以写标志。

参数pages:输出的页数据结构。

参数vmas:对应的需要存储区,(没有看明白对应的代码)

返回值:数返回实际获取的页数,貌似对每个实际获取的页都是给页计数值增1,如果实际获取的页不等于请求的页,要放弃操作则必须对已获取的页计数值减1.

13、copy_from_user()和copy_to_user()

主要应用于设备驱动中读写函数中,通过系统调用触发,在当前进程上下文内核态运行(即当前进程通过系统调用触发)。

copy_from_user的目的是防止用户程序欺骗内核,将一个非法的地址传进去,如果没有它,这一非法地址就检测不到,内和就会访问这个地址指向的数据。因为在内核中访问任何地址都没有保护,如果不幸访问一个错误的内存地址会搞死内核或发生更严重的问题

copy_from_user调用了access_ok,所以才有"自己判断功能"

access_ok(),可以检查访问的空间是否合法。

注意:中断代码时不能用copy_from_user,因为其调用了might_sleep()函数,会导致睡眠。

unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)

通常用在设备读函数或ioctl 中获取参数的函数中:其中"to"是用户空间的buffer地址,在本函数中将内核buffer"from"除的n个字节拷贝到用户空间的"to"buffer.

unsigned long copy_from_user(void *to, const void __user *from, unsigned long n)

通常用在设备写函数或ioctl中设置参数的函数中:"to"是内核空间的buffer指针,要写入的buffer;"from"是用户空间的指针,数据源buffer.

14、get_user(x, ptr)

本函数的作用是获取用户空间指定地址的数值并保存到内核变量x中,ptr为用户空间的地址。用法举例如下。

get_user(val, (int __user *)arg)

注明:函数用户进程上下文内核态,即通常在系统调用函数中使用该函数。

15、put_user(x, ptr)

本函数的作用是将内核空间的变量x的数值保存到用户空间指定地址处,prt为用户空

间地址。用法举例如下。

put_user(val, (int __user *)arg)

注明:函数用户进程上下文内核态,即通常在系统调用函数中使用该函数。

实验4 文件和目录操作

《Linux操作系统》课程实验报告 班级:姓名:实验地点:日期: 实验4 文件和目录操作 一、实验目的 1、理解Linux文件系统的结构和目录组织方式; 2、掌握Linux常用目录和文件命令的使用。 二、实验内容与要求 以root用户身份登录Linux 1、Linux目录管理命令 (1)用pwd显示当前工作目录路径; (2)用cd命令先转到/home目录,再转到根目录; (3)用ls命令列出根目录下的所有文件和目录; (4)在/home目录下建立如下图所示的目录结构: (5)将目录temp4删除。 2、文件管理命令 (1)用cat命令在st目录下建立两个文件file1和file2,文件内容如下所示。然后用cat 命令将文件file1和file2的内容合并起来放到文件file3中。 file1文件内容: I love Linux 1 I love Linux 2 I love Linux 3 I love Linux 4 I love Linux 5 file2文件内容: I love Linux 6 I love Linux 7

I love Linux 8 I love Linux 9 I love Linux 10 (2)用touch命令更新文件file3的修改日期和时间(更新为你的生日) (3)cp命令 ①文件复制:将st目录下的file1、file2、file3复制到temp1目录下(可考虑使用通配符) ②目录复制:将temp1目录复制到temp2目录下(即temp1作为temp2的子目录) (4)mv命令 ①重命名:将st目录下的文件file3重命名为myfile ②文件移动:将st目录下的文件myfile移至temp2/temp1目录下 (5)rm命令 将temp2目录下的所有文件和子目录删除 3、显示文件内容命令 练习用cat命令显示文件file2的内容 三、实验环境 VMware+RHEL5 四、实验步骤及结果 步骤1:打开vmware,启动rhel5,以root用户登录系统。 步骤2:右键单击rhel5的桌面,在弹出的菜单中选择“打开终端”命令,打开伪终端窗口。步骤3:在命令提示符下输入pwd命令显示当前工作目录路径 步骤4:用cd /home命令先转到/home目录,再用cd /命令转到根目录; 步骤5:用ls-a命令列出根目录下的所有文件和目录; 步骤6:在/h ome目录下建立如下图所示的目录结构: 五、实验总结

linux内核之内存管理

Linux内核之内存管理 作者:harvey wang 邮箱:harvey.perfect@https://www.wendangku.net/doc/0312990837.html, 新浪博客地址:https://www.wendangku.net/doc/0312990837.html,/harveyperfect,有关于减肥和学习英语相关的博文,欢迎交流 把linux内存管理分为下面四个层面 (一)硬件辅助的虚实地址转换 (二)内核管理的内存相关 (三)单个进程的内存管理 (四)malloc软件 (一)处理器硬件辅助的虚实地址转换(以x86为例) 在x86中虚实地址转换分为段式转换和页转换。段转换过程是由逻辑地址(或称为虚拟地址)转换为线性地址;页转换过程则是将线性地址转换为物理地址。段转换示意图如下 X86支持两种段,gdt和ldt(全局描述段表和局部描述符段表),在linux中只使用了4个全局描述符表,内核空间和用户空间分别两个gdt,分别对应各自的代码段和数据段。也可以认为在linux中变相地disable了x86的段式转换功能。 页转换示意图如下

在linux中x86 的cr3寄存器(页表基地址寄存器)保存在进程的上下文中,在进程切换时会保存或回复该寄存器的内容,这样每个进程都有自己的转换页表,从而保证了每个进程有自己的虚拟空间。 (二)内核管理的内存相关 从几个概念展开内存管理:node、zone、buddy、slab 1、Node SGI Altix3000系统的两个结点 如上图,NUMA系统的结点通常是由一组CPU(如,SGI Altix 3000是2个Itanium2 CPU)和本地内存组成。由于每个结点都有自己的本地内存,因此全系统的内存在物理上是分布的,每个结点访问本地内存和访问其它结点的远地内存的延迟是不同的,为了优化对NUMA 系统的支持,引进了Node 来将NUMA 物理内存进行划分为不同的Node。而操作系统也必须能感知硬件的拓扑结构,优化系统的访存。

实验 Linux文件和目录操作

实验Linux文件和目录操作(1) 一、实验内容 练习Linux文件和目录操作命令。 二、实验目的 掌握文件与目录管理命令 掌握文件内容查阅命令 三、实验题目 1. 文件与目录管理 (1) 查看CentOS根目录下有哪些内容? (2) 进入/tmp目录,以自己的学号建一个目录,并进入该目录。 (3) 显示目前所在的目录。 (4) 在当前目录下,建立权限为741的目录test1,查看是否创建成功。 (5) 在目录test1下建立目录test2/teat3/test4。 (6) 进入test2,删除目录test3/test4。 (7) 将root用户家目录下的.bashrc复制到/tmp下,并更名为bashrc (8) 重复步骤6,要求在覆盖前询问是否覆盖。 (9) 复制目录/etc/下的内容到/tmp下。 (10) 在当前目录下建立文件aaa。 (11)查看该文件的权限、大小及时间 (12) 强制删除该文件。 (13) 将/tmp下的bashrc移到/tmp/test1/test2中。 (14) 将/test1目录及其下面包含的所有文件删除。 2. 文件内容查阅、权限与文件查找 (1) 使用cat命令加行号显示文件/etc/issue的内容。 (2) 反向显示/etc/issue中的内容。 (3) 用nl列出/etc/issue中的内容。 (4) 使用more命令查看文件/etc/man.config (5) 使用less命令前后翻看文件/etc/man.config中的内容 (6) 使用head命令查看文件/etc/man.config前20行 (7) 使用less命令查看文件/etc/man.config后5行 (8) 查看文件/etc/man.config前20行中后5行的内容 (9) 将/usr/bin/passwd中的内容使用ASCII方式输出 (10) 进入/tmp目录,将/root/.bashrc复制成bashrc,复制完全的属性,检查其日期 (11) 修改文件bashrc的时间为当前时间

linux内存管理子系统 笔记

4-4 linux内存管理子系统 4-4-1 linux内存管理(参考课件) 物理地址:cpu地址总线上寻址物理内存的地址信号,是地址变换的最终结果 逻辑地址:程序代码经过编译后,出现在汇编程序中的地址(程序设计时使用的地址) 线性地址:又名虚拟地址,32位cpu架构下4G地址空间 CPU要将一个逻辑地址转换为物理地址,需要两步: 1、首先CPU利用段式内存管理单元,将逻辑地址转换成线性地址; 2、再利用页式内存管理单元,把线性地址最终转换为物理地址 相关公式: 逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器)(通用的) 16位CPU:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器) 线性地址=段寄存器的值×16+逻辑地址的偏移部分 物理地址=线性地址(没有页式管理) 32位CPU:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器) 线性地址=段寄存器的值+逻辑地址的偏移部分 物理地址<——>线性地址(mapping转换) ARM32位:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器) 逻辑地址=段内偏移量(段基地址为0) 线性地址=逻辑地址=段内偏移量(32位不用乘以32) 物理地址<——>线性地址(mapping转换) ************************!!以下都是x86模式下!!********************************* 一、段式管理 1.1、16位CPU:(没有页式管理) 1.1.1、段式管理的由来: 16位CPU内部有20位地址总线,可寻址2的20次方即1M的内存空间,但16位CPU 只有16位的寄存器,因此只能访问2的16次方即64K。因此就采用了内存分段的管理模式,在CPU内部加入了段寄存器,这样1M被分成若干个逻辑段,每个逻辑段的要求如下: 1、逻辑段的起始地址(段地址)必须是16的整数倍,即最后4个二进制位须全是0 (因此不必保存)。 2、逻辑段的最大容量为64K。 1.1.2、物理地址的形成方式: 段地址:将段寄存器中的数值左移4位补4个0(乘以16),得到实际的段地址。 段偏移:在段偏移寄存器中。 1)逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器) 2)由逻辑地址得到物理地址的公式为:(因为没有页式管理,所以这一步就得到了物理地址)物理地址PA=段寄存器的值×16+逻辑地址的偏移部分(注意!!)(段与段可能会重叠)

Linux目录整理 完整版

UNIX命令大全详解-完整版 command方式: 任何输入都会作为编辑命令,而不会出现在屏幕上,若输入错误则有“岬”的声音;任何输入都引起立即反映 insert方式: 任何输入的数据都置于编辑寄存器。在command方式下输入(I,a,A等),可进入insert方式,insert方式下按ESC,可跳回command方式。 escape方式: 以“:”或者“/”为前导的指令,出现在屏幕的最下一行,任何输入都被当成特别指令。 进入vi(在系统提示符下面输入以下指令): vi 进入vi而不读入任何文件 vi filename 进入vi并读入指定名称的文件(新、旧文件均可)。 vi +n filename 进入vi并且由文件的第几行开始。 vi +filename 进入vi并且由文件的最后一行开始。 vi + /word filename 进入vi并且由文件的word这个字开始。 vi filename(s) 进入vi并且将各指定文件列入名单内,第一个文件先读入。 vedit 进入vi并且在输入方式时会在状态行显示“INSERT MODE"。 编辑数个文件(利用vi filename(s))进入vi后) :args 显示编辑名单中的各个文件名 :n 读入编辑名单中的下一个文件:rew 读入编辑名单中的第一个文件 :e# 读入编辑名单内的前一个文件 :e file 读入另一个文件进vi(此文件可不在编辑名单内),若原文件经修改还没有存档,则应先以: w 存档。 :e! file 强迫读入另一个文件进入vi,原文件不作存档动作。 存储及退出vi :w filename 存入指定文件,但未退出vi(若未指定文件名则为当前工作的文件名)。 :wq 或者 :x或者zz 存文件,并且退出vi. :q 不作任何修改并退出vi。 :q! 放弃任何修改并退出vi。 :!command 暂时退出vi并执行shell指令,执行完毕后再回到vi。 :sh 暂时退出vi到系统下,结束时按Ctrl + d则回到vi。 加数据指令 i 在关标位置开始插入字符,结束时候按ESC键。 I 在光标所在行的最前面开始加字,结束时按ESC键。 a 在光标位置后开始加字,结束时按ESC 键。 A 在光标所在行的最后面开始加字,结束时按ESC键。 o 在光标下加一空白行并开始加字,结束时按ESC键。

《深入理解LINUX内存管理》学习笔记.

引子 为什么要写这个笔记: 1,这本书的中文版翻译了太垃圾,没法阅读。阅读英文原版,可以很好的理解作者的思路。作此笔记备忘 2,一直以来学习LINUX kernel的知识缺乏系统化,借对这本书的学习,系统化的学习一下LINUX kernel。 3,自己一直在做一个too small,too simple的单进程,特权模式,64bit保护模式的称不上OS的OS,已经做完了bootloader, 构思kernel的实现的时候,困惑在内存管理的实现上,阅读这本书,希望能有利于自己的OS的编写。 4,克服惰性,多读书,希望一天能阅读5页,争取半年内阅读完这本原版700多页的巨著。 不足: 我不可能完全理解LINUX 内存管理的精髓,肯定有很多地方理解错误。希望大家能够指正,以便提高,谢谢。 学习方法: 可能您第一次阅读的时候很多地方都不理解,不用担心。那您可能需要阅读一些文件系统的知识。 或者阅读全部笔记后,再回头阅读,有些地方您就理解了。 言归正传: 一、概要 可用工具 CodeViz: 生成代码调用关系图的工具,这个工具我现在还没有去使用,有兴趣的可以自己试试去建立调用关系图。 http://www.csn.ul.ie/~mel/projects/codeviz/ Linux cross reference (LXR): 以web的方式阅读和查找LINUX内核源代码的工具。这个工具安装相当麻烦,我建议直接到它的官方网站直接读代码。 http://lxr.linux.no/linux+v2.6.24/ 模块 LINUX内存管理代码模块主要分为4个部分: 1.Out of memory 代码在mm/oom_kill.c 貌似用于杀进程的时候对内存的操作 2.虚拟内存的分配代码在mm/vmalloc.c

Linux 的目录树

Linux 的目录树 第1章命令行操作 熟悉在命令行界面下工作对使用和管理Linux操作系统具有很大的意义,本章介绍在RedFlagServer4.1系统中进行shell操作的知识。 1.1基础知识 以下关于Linuxshell及文件和目录的知识是学习本章的基础。 1.1.1文件命名 Linux下文件名的最大长度可以是256个字符,通常由字母、数字、―.‖(点号)、―_‖(下划线)和―-‖(减号)组成。文件名中不能含有―/‖符号,因为―/‖在Linux目录树中表示根目录或路径中的分隔符(如同DOS中的―\‖)。 Linux系统中支持文件名中的通配符,具体如下: 星号(*):匹配零个或多个字符; 问号(?):匹配任何一个字符; [ab1A-F]:匹配任何一个列举在集合中的字符。本例中,该集合是a、b、1或任何一个从A到F的大写字符; 1.1.2路径 操作系统查找文件所经过的路径称为路径名。使用当前目录下的文件时可以直接引用文件名;如果要使用其他目录下的文件,就必须指明该文件在哪个目录之中。 按查找文件的起点不同可以分为两种路径:绝对路径和相对路径。从根目录开始的路径称为绝对路径,从当前所在目录开始的路径称为相对路径,相对路径是随着用户工作目录的变化而改变的。 与DOS相同,每个目录下都有代表当前目录的―.‖文件和代表当前目录父目录的―..‖文件,相对路径名一般就是从―..‖开始的。 在Linux目录树中,表示根目录或是路径中的分隔符是―/‖。 1.1.3文件类型 RedFlagServer4.1系统支持以下文件类型:普通文件、目录文件、设备文件以及符号链接文件。 普通文件:包括文本文件、数据文件、可执行的二进制程序等。 目录文件:简称目录,Linux中把目录看成是一种特殊的文件,利用它构成文件系统的分层树型结构。每个目录文件中至少包括两个文件,―..‖表示上一级目录,―.‖表示该目录本身。 设备文件:设备文件是一种特别文件,Linux系统利用它们来标识各个设备驱动器,核心使用它们与硬件设备通信。有两类特别设备文件:字符设备和块设备。 符号链接:一种特殊文件,它们存放的数据是文件系统中通向某个文件的路径。当使用符号链接文件时,系统自动地访问所保存的这个路径。 1.1.4目录结构 通过对系统目录组织结构的了解,可以在进行文件操作和系统管理时方便地知道所要的东西在什么地方。 RedFlagServer4.1的文件系统采用分层的树形目录结构。即:在一个根目录(通常用―/‖表示),含有多个下级子目录或文件;子目录中又可含有更下级的子目录或者文件的信息,这样一层一层地延伸下去,构成一棵倒置的树。树中的―根‖与―杈‖代表的是目录或称为文件夹,而―叶子‖则是一个个的文件。 下面列出了主要的系统目录及其简单描述: /bin:存放普通用户可以使用的命令文件。目录/usr/bin也可用来贮存用户命令。 /sbin:一般存放非普通用户使用的命令(有时普通用户也可能会用到)。目录/usr/sbin中也包括了许多系统命令。 /etc:系统的配置文件。 /root:系统管理员(root或超级用户)的主目录。 /usr:包括与系统用户直接相关的文件和目录,一些主要的应用程序也保存在该目录下。 /home:用户主目录的位置,保存了用户文件(用户自己的配置文件,文档,数据等)。 /dev:设备文件。在Linux中设备以文件形式表现,从而可以按照操作文件的方式简便地对设备进行操作。 /mnt:文件系统挂载点。一般用于安装移动介质﹑其它文件系统(如DOS)的分区、网络共享文件系统或任何可安装文件系统。 /lib:包含许多由/bin和/sbin中的程序使用的共享库文件。目录/usr/lib/中含有更多用于用户程序的库文件。 /boot:包括内核和其它系统启动时使用的文件。

Linux操作题整理

五、实验题(共5题,每题2分,共10分) 写出下列操作命令: 1、查看/etc/boot路径下的所有内容。 Ls –al /etc/boot/* 2、查看文件/etc/hosts的内容。 Cat /etc/hosts 3、增加一个组账号group1,并指定组账号ID分别为10100。Groupadd –g 10100 group1 4、增加一个用户账号user1(UID为2045,并属于组group1)。Useradd –u 2045 –g group1 user1 5、搜索路径/etc下所有以h开头的文件及目录,拷贝到/software 中。 Cp –r /etc/h* /software 1.按顺序写出下面操作步骤中所用到的命令。

1) 创建新目录my目录 2) 进入my目录 3) 把一个文本文件复制到my目录下同时命名为,该文本文件绝对路径为/user/book/ 4) 把/user/book/移动到my目录下,文件名不变 5) 删除目录my,没有任何提示 答: 1) $mkdir my 2) $cd my 3) $cp /user/book/ 4) $mv /user/book/ 5) $rm -rf my 下安装软件方式有两种:一是安装rpm格式的智能软件包,二是下载源码编译安装,要求安装以下两个软件:和安装,写出所用到的命令 2) 安装,写出解压解包以及标准安装方式所需步骤和命令。

答:(教材82、84、87页) 1) rpm -ivh 参数含义:i表示安装,v表示在安装过程中显示详细的安装信息,h表示显示水平进度条。 2) 源码编译安装方式: ①释放TAR包 使用命令如下:tar zxvf 查看并阅读包内附带的软件安装说明 ③进行编译准备 使用命令如下:./configure ④进行编译 执行make命令 ⑤进行软件安装 执行make install命令 ⑥清楚临时文件 执行make clean命令

实验二 linux文件目录操作

一、实验步骤 1.练习cd、ls、pwd命令。 1.1输入mesg ,显示is y,表示可以给别人写信息,输入mesg n 后,关闭网络通讯,无法传递信息。 1.2 Pwd显示当前工作目录的绝对路径。 1.3 Cd/变换目录至根目录 1.4显示当前目录/ 1.5 cd/home变换目录至home 1.6 cd 2011013305变换目录至2011013305 1.7 cd..变换目录至当前目录的前两个目录 1.8 ls –l 显示指定目录下所有工作文件 1.9 2.显示文本文件命令。 2.1cd命令,将当前目录改到用户主目录。 2.2cp /var/xg11x/xg11x.txt ./,将/var/xg11x/xg11x.txt目录下文件 复制到当前目录文件中,显示cp:cannot stat …/var/xg11x/xg11x.txt? :no such file or directory。 2.3cp /var/xg11x/he* ./,将/var/xg11x/he*目录下文件复制到当前 目录文件中。 2.4cp /var/xg11x/last ./,将/var/xg11x/last目录下文件复制到当前 目录文件中。 2.5cat hello.c 在屏幕上显示文件hello.c的内容。

内容显示为: main(){ printf(“hi.”); } 2.6cat hello.c hello.cb 在屏幕上同时显示hello.c 和hello.cb的 内容。 内容显示为: main(){ printf(“hi.”); } Cat: hello.cb: no such file or directory 2.7cat he*在屏幕上显示he*的内容。 内容显示为: main(){ printf(“hi.”); } 2.8more xg11x.txt 显示xg11x.txt下的内容,并以一页一页的形 式显示。 内容显示为:no such file or directory 2.9more xg* 显示xg*下的内容,xg113 ,next file:xg11x.text 3.匹配文本文件命令。

Linux目录和文件操作命令练习题

实验一:目录和文件操作命令 一、 root身份登录redhat,在/test目录下创建如下子树

二、完成以下操作: 1、将/test目录设置为所有人可读、可写、可执行;

2、新建用户user1,user2,user3,user4,并分别设置密码; 3、新建组workg1,workg2;

4、将user1、user2归属到workg1组中,将user3、user4归属到workg2组中; 5、查看四个用户信息(利用/etc/passwd文件); 6、打开tty1,user1登录,在/test/owner/music下新建一文件:mymusic01.mp3,并将文件权限设置为除了本人,其他人都不能读、写、执行;

7、接上题,继续在/test/public/pubfile下新建一文件:user1file.txt,并将权限设置为所有人可读,可写,不可执行; 8、继续在/test/team/tefile下新建一文件:monday.txt,并将权限设置为自己、组员可读可写,其他人不可读不可写,所有人不可执行; 9、打开tty2,以user2身份登录,查看/test目录信息;

10、接上题,查看/test/owner/music/mynusic01.mp3,显示命令执行结果; 11、接上题,查看/test/public/pubfile/user1file.txt,显示命令执行结果; 12、接上题,查看/test/team/tefile/monday.txt, 显示命令执行结果; 13、打开tty3,以user3身份登录; 14、接上题,查看/test/owner/music/mynusic01.mp3,显示命令执

Linux内存管理实验

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: 显示内存总和列;

Linux操作系统内存管理

Linux操作系统内存管理 摘要: Linux支持虚拟内存, 就是使用磁盘作为RAM的扩展,使可用内存相应地有效扩大。核心把当前不用的内存块存到硬盘,腾出内存给其他目的。当原来的内容又要使用时,再读回内存。这对用户全透明:运行于Linux的程序只看到大量的可用内存而不甘心哪部分在磁盘上。当然,读写硬盘比真的内存慢(慢千倍),所以程序运行较慢。用做虚拟内存的这部分硬盘叫对换空间。 Linux可以使用文件系统中的普通文件或单独的分区作为对换空间。对换分区更快,但对换文件更易于改变大小(无须对硬盘重分区)。如果知道要多少对换空间,应该用对换分区;如果不能确认,可以先用对换文件,用一段时间后再根据所需空间建立对换分区。 Linux允许同时使用多个对换分区和/或对换文件。即如果偶尔需要更多的对换空间,可以随时建立一个额外的对换文件。 Linux是一个遵循POSIX(Portable Operating System Interface)标准的操作系统,它继承了UNIX系统优秀的设计思想,拥有简练、容错强、高效而且稳定的内核。此外Linux还具备其他操作系统所不能比拟的优点。①:完全免费; ②:内核源代码完全公开。 Linux内核拥有一个功能完备的内存管理子系统,它增加了对NUMA(非均匀存储结构)体系结构的支持并且使用了基于区(ZONE)的物理内存管理方法,从而保持了物理上连续分布、而逻辑上统一的内存模式和传统的共享内存编程模型,使得系统的性能得以极大的扩展。这样Linux不仅能够满足传统的桌面应用,而且还能满足高端服务器市场的需要。目前,Linux不仅在Internet服务器上表现出色,而且还可以胜任大型数据库系统的服务器。 关键字:虚拟内存,物理内存管理,虚拟内存管理 一、Linux存储管理的基本框架 Linux内核采用虚拟页式存储管理,采用三次映射机制实现从线性地址到物理地址的映射。其中PGD为页面目录,PMD为中间目录,PT为页面表。具体的映射过程为: ⑴从CR3寄存器中找到PGD基地址; ⑵以线性地址的最高位段为下标,在PGD中找到指向PMD的指针;

Linux常用文件系统操作命令

常用文件系统操作命令 一、Linux命令操作基础 1.文件通配符 Linux的命令中可以使用通配符来同时引用多个文件以方便操作。可以使用的通配符主要有“*”和“?”两种,结合使用“[]”、“-”和“!”字符可以扩充需要匹配的文件范围。(1)通配符“*” 通配符“*”代表任意长度(包括零个)的任何字符。但通配符“*”不能与“.”开头的文件名匹配。 (2)通配符“?” 通配符“?”代表任何单个字符。 (3)字符组通配符“[]”、“-”和“!” 用一对方括号“[]”括起来的字符串列表表示匹配字符串列表中的任意一个字符。其中的字符串列表可以由直接给出的若干个字符组成,也可以由起始字符、连接符“-”和终止字符组成。 例:myfile[abc] 表示myfile后面紧跟着a、b或c。 myfile[a-z] 表示myfile后面紧跟着一个小写字母。 Myfile[!a-e]表示myfile后面紧跟这一个不在a-e之间的字符。 Myfile[*?] 方括号中的星号和问号代表一个字符,不是通配符。 2.自动补全 所谓自动补全,是指用户在输入命令或文件名时不需要输入完整的名字,只需要输入前面几个字母,系统会自动补全该命令或文件名。若有不止一个,则显示出所有与输入字母相匹配的命令或文件名,以供用户选择。利用【tab】键可实现自动补全功能。 (1)自动补全命令 用户在输入Linux的命令时,只需要输入命令名的前几个字母,然后按【tab】键,如果系统只找到一个与输入相匹配的命令名,则自动补全;如果没有匹配的内容或有多个相匹配的名字,系统将发出警鸣声,再按【tab】键将列出所有相匹配的命令。 (2)自动补全文件或目录名 除了可以自动补全命令名外,还可以用相同的方法自动补全命令行中的文件或目录名。 3.命令历史 Linux系统中的灭个用户在自己的主目录下都有一个名为.bash_history的隐藏文件,它用来保存曾执行过的命令,这样当用户下次需要再次执行已执行过的命令时,不用再次输入,而可以直接调用。Bash默认最多保存1000个命令的历史记录。 调用历史命令的方法: (1)上下方向键 在命令行方式下按上方向键,命令提示符后将出现最近一次执行过的命令,再使用上下方向键,可以在已执行过的各条命令之间进行切换。直接按【enter】键就可以再次执行显示的命令,也可以对显示的命令行进行编辑修改。 (2)history和“!”命令 运用history命令可以查看命令的历史记录。 格式:history [数字] 如果不使用数字参数,则将查看所有命令的历史记录;如果使用数字参数,则将查看最近执行过指定个数的命令。显示的每条命令前面均有一个编号,反映其在历史记录列表中的序号。可以用“!”命令再次调用已执行过的历史记录,其格式为:

实验3 Linux文件与目录管理(1)

实验3 Linux文件与目录管理 一、实验内容 练习Linux文件和目录操作命令。 二、实验目的 掌握文件与目录管理命令 掌握文件内容查阅命令 三、实验题目 1. 文件与目录管理 (1) 查看CentOS根目录下有哪些内容? (2) 进入/tmp目录,以自己的学号建一个目录,并进入该目录。 (3) 显示目前所在的目录。 (4) 在当前目录下,建立权限为741的目录test1,查看是否创建成功。 (5) 在目录test1下建立目录test2/teat3/test4。 (6) 进入test2,删除目录test3/test4。 (7) 将root用户家目录下的.bashrc复制到/tmp下,并更名为bashrc (8) 重复步骤6,要求在覆盖前询问是否覆盖。 (9) 复制目录/etc/下的内容到/tmp下。 (10) 在当前目录下建立文件aaa。 (11)查看该文件的权限、大小及时间 (12) 强制删除该文件。 (13) 将/tmp下的bashrc移到/tmp/test1/test2中。 (14) 将/test1目录及其下面包含的所有文件删除。 2. 文件内容查阅、权限与文件查找 (1) 使用cat命令加行号显示文件/etc/issue的内容。 (2) 反向显示/etc/issue中的内容。 (3) 用nl列出/etc/issue中的内容。 (4) 使用more命令查看文件/etc/man.config (5) 使用less命令前后翻看文件/etc/man.config中的内容 (6) 使用head命令查看文件/etc/man.config前20行 (7) 使用less命令查看文件/etc/man.config后5行 (8) 查看文件/etc/man.config前20行中后5行的内容 (9) 将/usr/bin/passwd中的内容使用ASCII方式输出 (10) 进入/tmp目录,将/root/.bashrc复制成bashrc,复制完全的属性,检查其日期 (11) 修改文件bashrc的时间为当前时间 四、实验指导

Linux的目录与路径

Linux的目录与路径 在Linux系统中采用目录树的结构来管理系统的资源,要想在Linux系统中遨游,路径的概念理解必不可少,在Linux系统中有两个路径的概念,一个是相对路径,一个是绝对路径。当我们使用Linux命令时,也需要找到路径才可以执行。 ㈠相对路径与绝对路径 相对路径:相对于目前路径的文件名写法,例如./home/hu/file1或../hu/file1,它的开头不是由“/”开始。 绝对路径:由根目录“/”开始写起的文件名或目录,例如/home/hu/file1。 这两种的路径分别使用在不同的场合,当我们设计的程序用不同的用户时,这些用户有可能把程序安装在不同的目录中,因此,使用相对路径就派上用场。而我们在写shell脚本时使用绝对路径可以减少不必要的麻烦。 ㈡目录的相关操作命令 在介绍Linux操作目录的命令之前先说明一下,在Linux系统中存在一些比较特殊的目录,如下所示: “.”代表这一层目录的意思,也可以这样表示“./”。 “..”代表上一层目录的意思,也可以这样表示“../”。 “-”代表前一个工作目录的意思,例如,你在这个/home/hu目录下工作,随后又切换到这个/home/test目录下工作,此时你的前一个工作目录就是/home/hu,可以使用“-”来代替/home/hu目录。 “~”代表目前正在工作的用户的家目录。 “~account”代表account这个用户的家目录的意思,在这里“account”代表帐号。 在所有的目录下都会要“.”和“..”这两个目录,他们分别代表这一层目录与上一层目录的意思。 ㈢对目录进行操作的命令 ⑴cd:切换目录; ⑵pwd:显示当前工作目录; ⑶mkdir:建立一个新目录; ⑷rmdir:删除一个空目录。

LINUX系统基本的内存管理知识讲解

内存是Linux内核所管理的最重要的资源之一。内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量。虚拟内存就是为了克服这个矛盾而采用的策略。系统的虚拟内存通过在各个进程之间共享内存而使系统看起来有多于实际内存的内存容量。Linux支持虚拟内存, 就是使用磁盘作为RAM的扩展,使可用内存相应地有效扩大。核心把当前不用的内存块存到硬盘,腾出内存给其他目的。当原来的内容又要使用时,再读回内存。 一、内存使用情况监测 (1)实时监控内存使用情况 在命令行使用Free命令可以监控内存使用情况 代码如下: #free total used free shared buffers cached Mem: 256024 192284 63740 0 10676 101004 -/+ buffers/cache: 80604 175420 Swap: 522072 0 522072 上面给出了一个256兆的RAM和512兆交换空间的系统情况。第三行输出(Mem:)显示物理内存。total列不显示核心使用的物理内存(通常大约1MB)。used列显示被使用的内存总额(第二行不计缓冲)。 free列显示全部没使用的内存。Shared列显示多个进程共享的内存总额。Buffers列显示磁盘缓存的当前大小。第五行(Swap:)对对换空间,显示的信息类似上面。如果这行为全0,那么没使用对换空间。在缺省的状态下,free命令以千字节(也就是1024字节为单位)来显示内存使用情况。可以使用—h参数以字节为单位显示内存使用情况,或者可以使用—m参数以兆字节为单位显示内存使用情况。还可以通过—s 参数使用命令来不间断地监视内存使用情况: #free –b –s2 这个命令将会在终端窗口中连续不断地报告内存的使用情况,每2秒钟更新一次。 (2)组合watch與 free命令用来实时监控内存使用情况: 代码如下: #watch -n 2 -d free

Linux:环境变量及目录的基本操作

1、理解环境变量的概念,特别是PA TH环境变量的作用,请自行查阅相关资料 答:Linux 是一个多用户的操作系统。每个用户登录后,都会有一个专用的运行环境。 通常每个默认的环境都是相同的,这个默认的环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制,其方法就是修改相应的环境变量。环境变量和shell 紧密相关的,用户登录系统后就会启动一个shell。对于Linux来说一搬是bash这个shell 程序,但是也可以重新设定或者切换到其他的shell。 PATH的值就是一系列的目录,当您运行一个程序时,Linux在这些目录下进行搜索。 2、学习export、echo的使用, export 功能说明:设置或显示环境变量。 语法:export [-fnp][变量名称]=[变量设置值] 补充说明:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该此登陆操作。 参数: -f 代表[变量名称]中为函数名称。 -n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。 -p 列出所有的shell赋予程序的环境变量。 echo echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。 该命令的一般格式为:echo [ -n ] 字符串 其中选项n表示输出文字后不换行;字符串能加引号,也能不加引号。用echo命令输出加引号的字符串时,将字符串原样输出;用echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各字符串之间用一个空格分割。 功能说明:显示文字。 语法:echo [-ne][字符串]或echo [--help][--version] 补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号。 参数:-n 不要在最后自动换行 -e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般 文字输出: \a 发出警告声; \b 删除前一个字符; \c 最后不加上换行符号; \f 换行但光标仍旧停留在原来的位置; \n 换行且光标移至行首; \r 光标移至行首,但不换行; \t 插入tab; \v 与\f相同; \\ 插入\字符; \nnn 插入nnn(八进制)所代表的ASCII字符; –help 显示帮助 –version 显示版本信息

Linux系统实验2文件与目录操作

Linux系统实验2--文件和目录操作 一、实验目地 1、学会在Linux系统下如何使用命令对文件和目录进行操作; 2、掌握工作目录、用户主目录与路径; 3、掌握硬链接与软链接的区别及使用; 4、学会以下操作:显示工作目录、切换目录、创建目录、删除 目录、复制文件以及移动文件、创建链接文件等; 二、预备知识 查找并学习以下命令及其常用参数的使用方法! 1、pwd:显示工作目录路径; 2、cd: 更改工作目录路径; 3、ls: 列出字母和文件信息; 4、touch:创建空文件、更改文件或目录时间; 5、mkdir:创建目录; 6、rmdir:删除空目录; 7、cp:复制文件和目录; 8、mv:移动或更名现有文件和目录; 9、rm:删除文件或目录; 10、wc:统计文件字节数、字数或行数; 11、ln:创建链接文件(含硬链接与软连接);

三、实验内容 以下实验内容请特别注意:蓝色文字部分务必使用你的真实信息代替! 1、使用命令切换到/etc目录,并显示当前工作目录路径; 2、使用命令显示/root目录下所有文件目录的详细信息,包括隐 藏文件; 3、使用命令在你的用户目录下创建空文件??????.txt(?表示你的 学号中的数字),并将该文件的时间记录更改为8月8日8点 8分;使用vi编辑器在该文件中输入:My name is XXX. (X 为你名字汉语拼音字母);使用命令显示该文件的内容; 4、在你的用户目录下创建一个空目录,目录名为你的学号,并 将/etc/ntp.conf文件复制到该目录中; 5、统计文件/etc/ntp.conf的行数、字符数和单词数; 6、使用命令在/root目录下创建一个文件xxx(x为你名字汉语拼 音字母),使用命令创建/root/xxx文件的硬链接文件/root/你的 学号_b和软链接文件/root/你的学号_c; 7、使用命令列出/root目录下的详细信息(所显示的内容会包括 隐藏文件和第6步所做的工作结果); 8、使用命令列出你的用户目录下的详细信息(所显示的内容会 包括隐藏文件、目录以及第1~5所做的工作结果)。 四、实验报告

linux内存管理实验报告

操作系统实验报告 院别:XXXXXX 班级:XXXXXX 学号:XXXXXX 姓名:稻草人

实验题目:内存管理实验 一、实验目的 1、通过本次试验体会操作系统中内存的分配模式; 2、掌握内存分配的方法(FF,BF,WF); 3、学会进程的建立,当一个进程被终止时内存是如何处理被 释放块,并当内存不满足进程申请时是如何使用内存紧 凑; 4、掌握内存回收过程及实现方法; 5、学会进行内存的申请释放和管理; 二、实验内容 附源代码: /*宏定义*/ #include #include #include #define PROCESS_NAME_LEN 32 /*进程名称的最大长度*/ #define MIN_SLICE 10 /*最小碎片的大小*/ #define DEFAULT_MEM_SIZE 1024 /*默认内存的大小*/ #define DEFAULT_MEM_START 0 /*默认内存的起始位置*/ /* 内存分配算法 */ #define MA_FF 1 #define MA_BF 2 #define MA_WF 3 int mem_size=DEFAULT_MEM_SIZE; /*内存大小*/ int ma_algorithm = MA_FF; /*当前分配算法*/ int flag = 0; /*设置内存大小标志*/ static int pid = 0; /*初始pid*/ int algorithm;

/*描述每一个空闲块的数据结构*/ struct free_block_type{ int size; int start_addr; struct free_block_type *next; }; /*指向内存中空闲块链表的首指针*/ struct free_block_type *free_block; /*每个进程分配到的内存块的描述*/ struct allocated_block{ int pid; int size; int start_addr; char process_name[PROCESS_NAME_LEN]; struct allocated_block *next; }; /*进程分配内存块链表的首指针*/ struct allocated_block *allocated_block_head = NULL; struct allocated_block *find_process(int id) { struct allocated_block *p; p=allocated_block_head; while(p!=NULL) { if (p->pid==id) return p; } return NULL; } void swap(int *p,int *q) { int temp; temp = *p; *p = *q; *q = temp; return;

相关文档