+ -
当前位置:首页 → 问答吧 → 内存管理的两个问题

内存管理的两个问题

时间:2006-06-20

来源:互联网

1、在ULK中关于线性区的扩展提到了可以对堆栈进行扩展,linux的栈大小不是固定大小么?不可能大于8K,如何进行扩展呢?
2、用户进程可以访问vmalloc分配的内存么?如果可以,时如何使用和分配的?
谢谢

作者: Ruzi   发布时间: 2006-06-20

第一个问题,哪一章哪一节?

作者: zhllg   发布时间: 2006-06-21

第一个问题:内核栈是固定的,用户栈可以增长

作者: hendric   发布时间: 2006-06-21

ULK中文版P270页最后一段说得
楼上:用户栈如何扩展呢?2.4和2.6的内核中如果栈定义成8K的话,栈和进程描述符共用一个8k地址空间,如果进行扩展的话,如何对这8k进行处理?
谢谢^_^
初学入门,还请多多关照。

作者: Ruzi   发布时间: 2006-06-22

8k的是进程的内核栈,编译内核时定下来的,定了就不会再变了,不能扩展。

作者: zhllg   发布时间: 2006-06-22

引用:
作者: Ruzi
ULK中文版P270页最后一段说得
楼上:用户栈如何扩展呢?2.4和2.6的内核中如果栈定义成8K的话,栈和进程描述符共用一个8k地址空间,如果进行扩展的话,如何对这8k进行处理?
谢谢^_^
初学入门,还请多多关照。
8K是内核栈和PCB公用的,内核栈大约是一个页多一点。
用户栈的扩展,linux内核源码情景分析里说的很好,比BBS上打字好得多。

作者: hendric   发布时间: 2006-06-24

内核栈底端在2.6内核里只是thread_info,
task_struct才相当于PCB

作者: zhllg   发布时间: 2006-06-24

也在看Linux内核,也在看内存管理。太庞大了,头绪还没有理清。你们说的PCB是什么?

还有由于只给每个进程分配了8K的内核栈,这样岂不是很危险吗? 一个恶意程序故意定义大于8K的局部变量是不是就可以让内核栈溢出从而破坏内核的数据结构呢?

作者: ifree   发布时间: 2006-06-25

pcb是process control block
一些经典os教科书上都有定义
内核栈只是内核在用,恶意代码自然是不能进入内核的,呵呵
应用程序定义的局部变量在用户栈里
实际上我现在用的是4k内核栈
fedora和redhat的内核现在也都是4k内核栈
lkml上曾经还有人提议将4k作为default
4k的好处在于可减少内存碎片

作者: zhllg   发布时间: 2006-06-28

谢谢zhllg回答。

这样说的意思是内核堆栈是系统调用的代码使用的。用户态代码陷入内核时会发生一次堆栈的切换。那么怎么传递参数的?
你说4K的好处可以减少内存碎片,可是Linux使用伙伴系统分配的内存,这个算法以2^k分配内存的。我觉得不会引起内存碎片。

作者: ifree   发布时间: 2006-06-29

>>是系统调用的代码使用的
其实不一定分的这么细,可以笼统的称为内核代码使用的。要细分的话,如果使用8k kernel stack,那么中断服务例程使用current的kernel stack;如果使用4k kernel stack,那么中断服务例程使用专用的interrupt kernel stack。

>>那么怎么传递参数的?
系统调用的参数是放在寄存器里的, eax, ebx, ecx,……

>>我觉得不会引起内存碎片。
碎片是相对的。如果运行时间很长了,难免会出现一些散布在内存里的单独的页。如果你要分配两页给一个新的进程作为内核堆栈,那么这些单独的页就是碎片了,是不能被直接利用的。

作者: zhllg   发布时间: 2006-06-29

引用:
作者: ifree
谢谢zhllg回答。

这样说的意思是内核堆栈是系统调用的代码使用的。用户态代码陷入内核时会发生一次堆栈的切换。那么怎么传递参数的?
你说4K的好处可以减少内存碎片,可是Linux使用伙伴系统分配的内存,这个算法以2^k分配内存的。我觉得不会引起内存碎片。
传说中的callgate是自动拷贝参数的

作者: hendric   发布时间: 2006-07-01

引用:
作者: hendric
传说中的callgate是自动拷贝参数的
这两天看书的收获是:
Linux在x86体系结构上没有使用call gate,系统调用使用的是中断门,int 0x80。进程切换时从tss段中取出内核堆栈的指针ss:esp,貌似没有通过内存传递参数。所以我相信楼上zhllg所说,是通过eax、ebx等寄存器传递参数的。

作者: ifree   发布时间: 2006-07-01

引用:
作者: ifree
这两天看书的收获是:
Linux在x86体系结构上没有使用call gate,系统调用使用的是中断门,int 0x80。进程切换时从tss段中取出内核堆栈的指针ss:esp,貌似没有通过内存传递参数。所以我相信楼上zhllg所说,是通过eax、ebx等寄存器传递参数的。
呵呵我只是提示说硬件有这么一种自动拷贝参数的机制,并没有说Linux使用他。事实上Linux很多复杂特性都没有用。算了我不诡辩了,潜水一会。

作者: hendric   发布时间: 2006-07-02

热门下载

更多