- 论坛徽章:
- 59
|
回复 1# gqbfree
没看内核代码,能回答的回答吧
有几个问题不懂,请大家帮忙解答。查了很多资料,但前篇一律,中间很多疑点只能靠自己理解,怕有误:
(1)内核线性映射是896M,而且对应的物理地址已经确定,是0-896M。 那么用户进程空间分配地址的时候是不是优先考虑大于896M的物理地址页面?
>>Windows 98将内核Map到所有进程中,但这不表示所有的OS都会这样做,内核并不从用户程序更加特别(从CPU的角度看),CPU甚至不会知道当前运行的是用户代码或是内核代码(当然,一般来说,内核可以执行特权指令,而用户代码不可以,不过,如果OS的设计者喜欢的话...)。
(2)有没有大侠帮忙把一个进程可能有的vm_area_struct结构对应的段列举一下,比如堆栈对应一个vm_area_struct(是不是只对应一个?)堆对应一个,代码段对应一个,还有mmap啥的 等等。还有malloc时,是否有新的vm_area_struct生成呢?还是扩展堆对应的vm结构?
>>没看过内核,无法回答,从系统设计的角度看,这种结构应当只有一个。
(3)发生缺页异常时,如果需要从磁盘上把相应的内容读进内存,那么如何定位需要读入哪些内容?我知道 vm_area_struct结构里有对应文件的句柄和offsize,需要把整个都读进来吗?还是只读一个页面?如何确定读多少?
>>一般的OS都会有预读功能,所以会一般也会读入相邻的页面,读交换页是通过文件系统进行的,如果把整个分页文件都读进入,内存足不足够不用说,分页的意义也没有了。
(4)能不能提供以下情形: 只有preem_disable能实现,而信号量无法实现的情形。(premm_disable主要用在哪里)
>>PV信号量、Spin_lock、或是Preem_disable的任何一种互斥方式,都可单独实现所有功能(区别仅是代价和实现难度)。
(5)帮忙确认一下我自己理解的观点是否正确:
1. 用户空间 切 内核空间,压当前的用户空间的ss,sp入内核栈,然后取值TSS中的ss0/sp0赋给SS,ESP,完成切换; 然后把返回值cs/eip和其它一些现场寄存器压入内核栈(即pt_regs)。(很多资料都写先赋值SS,SP,然后压用户空间的ss,sp入内核栈, 我疑问此时的ss/sp从哪里来啊,还有pt_regs是不是只是用来存储用户空间时寄存器内容的?有没有情况是对内核现场存储?)
>>当前的SS,SP没有入内核栈的必要的,不过,非要这样做也可以
>>用户态的ss/sp本来就有的...据说Linux不使用X86CPU的TSS,如何还有TSS,不懂中,什么时候看代码去吧
>>内核现场没有存储的价值,因为内核不会从“上次的执行点”开始执行,如果非要说有(可能被其它内核部件中断),那么无论被中断多少次,现场保存在当前的用户进程的内核线程中...(就像是80x86是单程序环境中一样),当然,前提是内核态代码不应当被Swtch中断(这样也未必不可,只是系统变得更复杂了)。 |
|