关于内存分页越学越不懂了
大家好,现在在学习内存管理这块,感觉刚开始有点明白,后来越学越糊涂了,主要就是感觉学的东西挺多,挺杂,但是串联不起来。 我知道应该是,逻辑地址---线性地址----物理地址,这样的顺序,现在有几个问题请教一下:1. 平时区分的用户态和内核态的地址指的是在上边哪个地址空间?
2. 当某个程序开始执行时,操作系统如何知道该把他放到内存里的哪个位置?与这个目标程序中的.text等有什么关系,我知道好像目标文件中有一个标明地址的段,好像用readelf或objdump可以查看,我当时查看到了,现在有点忘了。。。。
3. 段描述表、页目录、页表都是在物理内存中对吗?
4. 书上说,内存中的各进程的代码段和数据段都是放在一起的,那每个进程的数据都是分散在物理内存中的,可以这样理解吗?
5. 书上说,CPU将进程的逻辑地址经过分段后形成了线性地址,32位是4G空间,可以认为每个进程都相当于独占这个4G空间,这句话怎么理解比较好?
以上的问题可能问的有点不太明白,但是关于内存这块,我看了三遍,还是不太懂,请大家帮我解答一下呗,谢谢了。 1. 平时区分的用户态和内核态的地址指的是在上边哪个地址空间?
--- 线性地址空间
2. 当某个程序开始执行时,操作系统如何知道该把他放到内存里的哪个位置?与这个目标程序中的.text等有什么关系,我知道好像目标文件中有一个标明地址的段,好像用readelf或objdump可以查看,我当时查看到了,现在有点忘了。。。。
--- 物理内存是随机分配的,虚拟(线性)地址空间的分布跟ELF文件格式有关,线性地址跟物理地址间通过页表映射。
3. 段描述表、页目录、页表都是在物理内存中对吗?
---对的
4. 书上说,内存中的各进程的代码段和数据段都是放在一起的,那每个进程的数据都是分散在物理内存中的,可以这样理解吗?
---没大看明白~~
5. 书上说,CPU将进程的逻辑地址经过分段后形成了线性地址,32位是4G空间,可以认为每个进程都相当于独占这个4G空间,这句话怎么理解比较好?
---线性地址32位,2的32次方,最大寻址空间就是4G,每个进程的线性地址空间都是独立的。不知哪里不能理解?呵呵 1 2 3 同二楼
4. 书上说,内存中的各进程的代码段和数据段都是放在一起的,那每个进程的数据都是分散在物理内存中的,可以这样理解吗?
每个进程的数据指的是什么
5. 书上说,CPU将进程的逻辑地址经过分段后形成了线性地址,32位是4G空间,可以认为每个进程都相当于独占这个4G空间,这句话怎么理解比较好?
这句话意思是逻辑地址经过段映射之后形成列线性地址,在4G空间中,前3G是进程独占的,3G-4G是所有进程共享的
回复 1# mousexqshe
回复 2# humjb_1983
那就是说进程只能访问自己的0---3G的线性地址空间,这个地址是用户态地址,而3G------4G的地址空间是内核态地址,并且每个进程共享这个地址空间对吗?
就是说不同的进程间的线性地址和逻辑地址可以是相同的,因为他们在不同的段中,我们程序中用到的*p是逻辑地址,其实是在该段的偏移量,可以这样理解吗?
谢谢
回复 3# super皮波
那就是说进程只能访问自己的0---3G的线性地址空间,这个地址是用户态地址,而3G------4G的地址空间是内核态地址,并且每个进程共享这个地址空间对吗?
就是说不同的进程间的线性地址和逻辑地址可以是相同的,因为他们在不同的段中,我们程序中用到的*p是逻辑地址,其实是在该段的偏移量,可以这样理解吗?
谢谢
回复 5# mousexqshe
参考Intel Architecture Software Developer's Manual Volume 3A 关于段地址和虚拟地址的转换,虚拟地址和物理地址的转换 回复 4# mousexqshe
不同的进程的线性地址和逻辑地址可以完全相同,当然段也相同了!进程间是相互隔离的,x86上是通过分页部件实现的,受kernel管理。
LZ还是个学生吧?没有其他意思,纯问问。 mousexqshe 发表于 2014-07-03 19:42 static/image/common/back.gif
回复 2# humjb_1983
那就是说进程只能访问自己的0---3G的线性地址空间,这个地址是用户态地址,而3G--- ...
1、这样理解更好:每个进程都有属于自己的独立的线性地址空间:0-4G,其中0-3G是用户态,3G-4G是内核态,不能说3G-4G进程就不能访问了,因为内核态其实也是在进程上下文中(中断除外)。内核态地址空间3G-4G是所有进程共享的。
2、Linux中并没有实际使用分段,每个段基址都是一样的0,所以可以理解为:线性地址=逻辑地址中的偏移量,但线性地址和逻辑地址概念还是不同的。。
页:
[1]