- 以4G大小的物理内存为例,其可以存储4G(4,294,967,296)个字节(每个字节8bit(位)),每个字节在内存中可以看做是按照数组样式向下排列,因此要想对所有字节进行寻址,那么就需要对每个字节进行编址,类似于数组的下标,通过下标来对内存的每个字节进行访问,这就是寻址。
- 由于2^32=4,294,967,296,所以想要寻址4G的内存,就需要一个32位的二进制数来对内存就行寻址,通常用16进制数来表示地址,1位十六进制数需要4位二进制数表示,因此32位的二进制数就可以转化为8位的十六进制来表示,也即下图的0x00000000、0x00000001。
- 再来看4k对齐,内存进行分页机制时,会找到每一个4k地址的边界处,进行分页操作,一页的大小是4k,页表中的页表项存储的是每一页物理内存的起始地址,占4个字节,共32位,如下图所示。
但是实际使用中32位的物理页基址的低12位全为0,所以会将其挪作他用,作为地址使用时再与上0xfffff000即可。那为什么物理页基址的低12位会为0呢?我们再来看下图。
看明白了吗,如果我们继续往下对内存进行编址,在第4096个字节处,正好是4k的页面大小,其对应的地址是0x00000FFF,在此处进行4k分页,第4097个字节作为下一个4k页的起始处,其地址恰为0x00001000,低12位正好为0,是不是很奇妙,这样再往下分4k的页面到第8192个字节,其地址是0x00001FFF,第8193个字节对应的地址正好是0x00002000。这样只要是4k页面的分界处,其32位地址的低12总是0,以此类推下去。因此在进行内存分页时,系统会自动检测4k页面的边界处,进行分页,实现边界对齐。
详细解决方案
linux0.12内核---关于内存寻址与4k边界对齐
热度:88 发布时间:2024-02-28 06:53:22.0
相关解决方案
- linux0.11内核代码有段内嵌汇编理解不能,
- Linux0.11源码研读(1)(一点废话)
- linux0.11运行环境2021.10.10(ubuntu)
- Linux0.11 实验四 进程运行轨迹跟踪与统计
- linux0.11 sleep_on函数说明
- linux0.11_系统调用
- linux0.11内核完全剖析 - ramdisk.c
- linux0.11内核完全剖析 - hd.c
- linux0.11内核完全剖析 - 块设备驱动程序
- linux0.11内核完全剖析 - vsprintf.c
- linux0.11内核完全剖析 - sys.c
- linux0.11内核完全剖析- fork.c
- linux0.11内核完全剖析- exit.c
- linux0.11内核完全剖析- sched.c
- linux0.12内核---内存分页与线性地址到物理内存的转换
- linux0.12内核---关于内存寻址与4k边界对齐