大家好,欢迎来到IT知识分享网。
目录
逻辑地址空间管理 — 段式(segmentation)
逻辑地址空间管理根据内存分区的大小、是否固定、对程序员是否透明可分为 段式存储管理(segmentation) 和 页式存储管理(paging)。段式存储管理的内存分区较大,分区大小可动态增长,程序员负责段的分配及回收。
1. 段地址空间
2.逻辑地址结构
内存块在段式存储管理中需要确定所在的段、段内的位置,再转换为物理地址,所以段的逻辑地址由 段号(segment) 和 段内偏移量(offset) 组成的二元组 (s, offset)。
2. 硬件支持
段表 存储在物理内存中,表示段地址空间与物理地址空间的映射关系,段表由操作系统控制更新。段表项对应进程的一个段,段表项目包括段号、段长、段基址。
3. 物理地址生成
- CPU从程序P中获取逻辑地址,前10位为段号,后10位为段内偏移
- 操作系统软件根据段号查询段表并保存段长到界地址寄存器(段长度寄存器),硬件MMU比较段内偏移是否超过段长,超过则发出越界异常给操作系统,否则继续执行
- 操作系统根据段号保存段基址到基地址寄存器(段基址寄存器),硬件MMU将段内偏移与段基址相加得到物理地址。
例:
在一个段式存储管理系统中,其段表及逻辑地址表如下,求逻辑地址所对应的物理地址。
表 1 段 表 表1 \quad段表 表1段表
段号 | 段基址 | 段长 |
---|---|---|
0 | 210 | 500 |
1 | 2350 | 20 |
2 | 100 | 90 |
3 | 1350 | 590 |
4 | 1938 | 95 |
表 2 逻 辑 地 址 表2 \quad 逻辑地址 表2逻辑地址
段号 | 段内偏移 |
---|---|
0 | 430 |
1 | 10 |
2 | 500 |
3 | 400 |
4 | 112 |
5 | 32 |
答:
- 第0段的段长为500,段内偏移为430,逻辑地址(0,430)合法,段基址为210,所以物理地址为430+210=640。
- 第1段的段长为20,段内偏移为10,逻辑地址(1,10)合法,段基址为2350,所以物理地址2350+10=2360。
- 第2段的段长为90,段内偏移为500,发生越界异常,逻辑地址(2,500)非法。
- 第3段的段长为590,段内偏移为400,逻辑地址(3,400)合法,段基址为1350,所以物理地址为1350+400=1750。
- 第4段的段长为95,段内偏移为112,发生越界异常,逻辑地址(4,112)非法。
- 段表内没有第5段,逻辑地址(5,32)非法。
逻辑地址生成
1. 栈(stack)
栈(stack) :编译器自动分配回收。运行函数 f u n c ( ) func() func() 时,编译器自动在栈内存放整型变量 x x x;当从函数返回时,编译器自动回收整型变量 x x x。
void func() {
int x; // declares an integer on the stack }
2. 堆(heap)
堆(heap):程序员通过函数 malloc()/free() 分配回收。
(1) 头文件及函数原型
#include <stdlib.h> void *malloc(unsigned int size); void free(void *ptr);
m a l l o c ( ) malloc() malloc() 分配成功则返回指向被分配内存的指针,否则返回空指针NULL;而 f r e e ( ) free() free()不返回任何值
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/139211.html