LinuxSir.cn,穿越时空的Linuxsir!

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

新手请教有关address_space和基树等问题。

[复制链接]
发表于 2005-5-25 10:18:57 | 显示全部楼层 |阅读模式
小弟刚开始接触内核,看了《Linux内核设计与实现》这本书,有些问题不太懂,还望高手赐教!

1.从系统调用read()到address_space_operation中的readpage()是如何调用的?路径是不是syscall read()==>struct file->dentry->inode->i_mapping->a_ops->readpage()?
readpage()中有两个参数是如何得到的?
readpage()中的find_get_page()中又有两个参数,又是从何得到?

2.address_space中有一个叫基树的东东,他保存的系统中所有的页缓存?还是本进程的?还是某个用户的?

另外:
syscall:malloc(),mmap();还有内核中的函数:dp_mmap(),kmalloc()取得空间都从slab层中取得吗?内核可以单独从物理内存中取得小于一页的内存吗?

非常感谢!
发表于 2010-12-29 15:35:02 | 显示全部楼层
kmalloc()本质是从array_cache中去取,当array_cache中没有,就调用cache_alloc_refill()重新填充之, cache_alloc_refill()会去搜索slab的L3链表,如果L3链表也找不到,那么就调用cache_grow(),它会调用slab与伙伴系统的接口kmem_getpages()去分配页框,然后为页框设置一个slab(其实就是重新开辟一个cache)。

如果内核不能从物理内存中取得小于1页的内存,那slab的存在是不是就损失了很大意义呢?slab的一个意义就是解决内碎片问题的呀。

do_mmap()的过程很复杂,这个是VMA部分的内容,再去看看吧。
回复 支持 反对

使用道具 举报

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

本版积分规则

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