在微型计算机中内存是按什么编制,微机内存按什么编址

本文详细介绍了内存管理中的线性地址与物理地址的概念,以及32位CPU的寻址能力。线性地址通过CPU的内存管理单元(MMU)转换为物理地址,涉及到分页机制。在32位x86处理器中,虚拟地址经过段选择子、全局/局部描述符表计算得到线性地址,再根据分页机制转换为物理地址。开启分页时,通过页目录和页表项完成这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

满意答案

02ae427d08e371d7e90d5b995e828d6d.png

scgydf

2016.01.28

02ae427d08e371d7e90d5b995e828d6d.png

采纳率:41%    等级:7

已帮助:459人

按照字节编址,每个内存单元的地址,不称为物理地址而是线性地址,线性地址通过CPU内存管理单元(MMU)来进行转换 32位cpu地址线拥有32根,寻址能力达到4GB,而P4处理器的地址线则拥有35根,可以寻址更大的空间。但是实际内存达不到CPU的寻址空间大小,此时CPU的MMU就需要对线性地址进行向物理地址的转化,此时线性地址就和物理地址不一样了。 决定一个内存单元的物理地址时需要根据当前的内存管理方式进行计算,首先根据虚拟地址计算得到线性地址,然后根据分页机制是否打开,如果没有使用分页机制,线性地址就是物理地址,如果打开分页机制则根据页目录和页表项来计算得物理地址。 按照x86 32位处理器,虚拟地址就是程序中所使用的逻辑地址,虚拟地址计算如下: 首先通过查段选择子寄存器(16位模式下成为段基址寄存器,比如读取数据用DS寄存器)中选择子的第2位,0则从全局描述符表(GDT,Global Descriptor Table)1则从局部描述符表(LDT Local Descriptor Table)。全局描述符从GDTR寄存器找到描述符表的物理基地址(后称简称为GDTBA,GDT Base Address),然后GDTBA + DS & 0xFFF8得到的地址就是该选择子指向的描述符,然后根据描述符中记录的段基址 + 偏移(可以是指令中的地址码,也可是si,di中的数值)就得到了线性地址(Linear Address),而局部则有些不同,因为LDTR中放的不是局部描述符表的物理基地址,而是在全局描述符表的一个描述符选择子。首先会计算LDT的物理基地址,方法同上,然后再计算描述符地址,最后计算成Linear Address.如果没打开分页,这个就可以是物理地址了。如果打开分页机制,还要做Linear Address 到物理地址的转化(Physical Address)。 线性地址是32位,高十位是页目录项索引,中间十位是页表项索引,最后12位是页内偏移,当然这是在选用4KB小页的情况,大页是4MB,则后22位都是页内偏移。页目录物理基地址存放在CR3中,共有1024项,因此用线性地址高10位作索引,找到相应的页目录项。在小页模式中,该项保存的是页表的高20位地址,因为页表只有4KB,所以低12位不需要。通过线性地址中间十位作页表项索引和页表基址进行计算得到页表项,该项中保存的物理页面的基址,基址加上线性地址低12位页内偏移,就得到了物理地址。在大页模式中,就省去了查页表这一步骤。

03分享举报

<think>嗯,用户问的是如果内存按照2字节编址,常量"Hello"占用了多少内存。这个问题看起来是关于计算机内存分配和编址方式的理解。首先,我需要回忆一下字符在内存中的存储方式。 首先,"Hello"这个字符串由5个英文字母组成,每个字母在ASCII编码下占用1个字节。所以正常情况下,比如按1字节编址的话,应该是5个字节。但是题目里提到的是按2字节编址,这可能会影响实际占用的内存空间。 接下来,我需要弄清楚内存编址的概念。编址单位决定了每个地址对应的内存块大小。比如,如果是2字节编址,那么每个地址指向的是2个字节的内存块。这时候,存储数据时需要考虑对齐的问题。如果数据的大小超过编址单位,可能需要多个地址单元来存储,而不足的部分可能会填充以达到对齐要求。 但这里的情况是每个字符1字节,而编址是2字节。那么每个字符存放在哪里呢?可能需要每个字符占据一个地址单元的一半?不过通常来说,内存编址的单位决定了最小的可寻址单元,所以如果编址是2字节,那么每次访问内存只能以2字节为单位进行操作。这种情况下,存储单字节的数据可能会导致每个字节占用一个地址单元,但实际可能每个地址单元可以存放两个字节的数据? 或者,另一种可能性是,每个地址对应2个字节,因此即使数据只有1字节,也需要占用整个地址单元,剩下的1字节可能被浪费。比如,存放'H'这个字符需要1字节,但占据一个2字节的地址单元,这样总共有5个字符就需要5个地址单元,每个地址单元2字节,总共10字节,但实际有效数据是5字节,剩下的5字节是填充的。不过这可能不太对,因为通常内存编址的单位是指地址总线的寻址能力,比如每个地址指向一个字节,但这里的题目说按2字节编址,可能意味着每个地址对应2字节的内存空间。 不过可能更准确的是,编址单位是2字节的话,每个地址对应的内存块是2字节。因此,每个字符是1字节,那么需要将两个字符打包到一个地址单元中。例如,"H"和"e"放在第一个地址单元,占2字节;"l"和"l"放在第二个地址单元,占2字节;"o"单独放在第三个地址单元,但这里剩下的1字节可能被填充或者占用整个地址单元,所以第三个地址单元虽然只用了1字节,但实际还是占用了2字节的空间。所以总共有3个地址单元,每个2字节,总共6字节。但原数据是5字节,所以实际占用6字节,其中最后一个地址单元有1字节未被使用。 不过可能不同的系统处理方式不同,比如是否允许非对齐访问,或者是否需要填充。例如,如果每个字符必须对齐到其地址单元的话,那么每个字符可能需要单独占据一个地址单元,导致每个字符占用2字节,总共5*2=10字节。但这种情况可能不太常见,因为通常字符的存放是连续的,允许在一个地址单元内存放多个字符,只要它们的总大小不超过编址单位的大小。 这时候可能需要明确编址方式对数据存储的影响。例如,在按字节编址的情况下,每个字符占用1字节,地址连续。而在按2字节编址的情况下,每个地址单元包含2字节,所以每个字符可能存放在地址单元的高位或低位,但整体存储时,连续的字符会依次存放在连续的地址单元中,每个地址单元存放两个字符。 比如,"Hello"的5个字符会被分成三个地址单元: - 地址0: H (第1字节)和 e (第2字节) - 地址1: l (第3字节)和 l (第4字节) - 地址2: o (第5字节) 和第6字节(可能填充为0或任意值) 这样总共有3个地址单元,每个2字节,总占用6字节。这种情况下,实际存储占用了6字节,其中最后一个地址单元有一个字节未被使用,但可能被填充或者保留。所以答案可能是6字节。 但需要确认是否正确。例如,在按2字节编址的情况下,每个地址单元是2字节,那么每个字符即使只有1字节,也需要存放在这些地址单元中的某个位置。存储字符串时,通常会连续存放,所以每个地址单元可以存储两个字符,直到最后一个字符可能需要一个单独的地址单元,如果字符数是奇数的话。因此,5个字符的话,需要3个地址单元,即3×2=6字节。 所以,正确的答案应该是6字节。但需要确保这个逻辑正确,可能还需要考虑字符串的结束符,比如C语言中的'\0',但用户的问题里并没有提到是否是C字符串,所以可能不需要考虑。问题中的常量"Hello"只是5个字符,没有结束符。因此,总占用6字节。</think>假设内存按2字节编址,字符串常量"Hello"的内存占用计算过程如下: 1. **字符数量分析** 字符串"Hello"包含5个ASCII字符:H、e、l、l、o。 2. **单字符存储需求** 每个ASCII字符占用1字节。 3. **编址方式影响** 由于内存按2字节编址,每个地址单元对应2字节的物理存储空间。 存储时需要将字符按顺序填充到地址单元中,具体规则如下: - 每个地址单元可存放2个字符 - 若字符数量为奇数,最后一个地址单元中未使用的1字节仍需保留(物理占用) 4. **计算总占用空间** 5个字符需要分配地址单元: ``` [H|e][l|l][o|空] → 共3个地址单元 ``` 每个地址单元2字节 → 总占用内存:3 × 2 = **6字节** **最终答案** 在2字节编址内存中,常量"Hello"占用 **6字节** 存储空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值