LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1134|回复: 13

内存管理的两个问题

[复制链接]
发表于 2006-6-20 19:06:02 | 显示全部楼层 |阅读模式
1、在ULK中关于线性区的扩展提到了可以对堆栈进行扩展,linux的栈大小不是固定大小么?不可能大于8K,如何进行扩展呢?
2、用户进程可以访问vmalloc分配的内存么?如果可以,时如何使用和分配的?
谢谢
发表于 2006-6-20 21:57:16 | 显示全部楼层
第一个问题,哪一章哪一节?
回复 支持 反对

使用道具 举报

发表于 2006-6-20 22:07:46 | 显示全部楼层
第一个问题:内核栈是固定的,用户栈可以增长
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-21 20:07:42 | 显示全部楼层
ULK中文版P270页最后一段说得
楼上:用户栈如何扩展呢?2.4和2.6的内核中如果栈定义成8K的话,栈和进程描述符共用一个8k地址空间,如果进行扩展的话,如何对这8k进行处理?
谢谢^_^
初学入门,还请多多关照。
回复 支持 反对

使用道具 举报

发表于 2006-6-22 00:46:53 | 显示全部楼层
8k的是进程的内核栈,编译内核时定下来的,定了就不会再变了,不能扩展。
回复 支持 反对

使用道具 举报

发表于 2006-6-24 01:48:33 | 显示全部楼层
Post by Ruzi
ULK中文版P270页最后一段说得
楼上:用户栈如何扩展呢?2.4和2.6的内核中如果栈定义成8K的话,栈和进程描述符共用一个8k地址空间,如果进行扩展的话,如何对这8k进行处理?
谢谢^_^
初学入门,还请多多关照。

8K是内核栈和PCB公用的,内核栈大约是一个页多一点。
用户栈的扩展,linux内核源码情景分析里说的很好,比BBS上打字好得多。
回复 支持 反对

使用道具 举报

发表于 2006-6-24 19:27:59 | 显示全部楼层
内核栈底端在2.6内核里只是thread_info,
task_struct才相当于PCB
回复 支持 反对

使用道具 举报

发表于 2006-6-24 21:36:32 | 显示全部楼层
也在看Linux内核,也在看内存管理。太庞大了,头绪还没有理清。你们说的PCB是什么?

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

使用道具 举报

发表于 2006-6-28 09:59:37 | 显示全部楼层
pcb是process control block
一些经典os教科书上都有定义
内核栈只是内核在用,恶意代码自然是不能进入内核的,呵呵
应用程序定义的局部变量在用户栈里
实际上我现在用的是4k内核栈
fedora和redhat的内核现在也都是4k内核栈
lkml上曾经还有人提议将4k作为default
4k的好处在于可减少内存碎片
回复 支持 反对

使用道具 举报

发表于 2006-6-29 11:47:47 | 显示全部楼层
谢谢zhllg回答。

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表