有关页缓存中的问题

我不想是个菜鸟 2017-09-11 11:12:22
页缓存中的页也是一个page,对应的struct page中也会有virtual这个成员,其是指向了这个page的虚拟地址,但是一个页缓存中的page可能会同时被多个进程访问,因此,单一的virtual成员无法表示在多个进程中的虚拟地址。

这方面的代码我暂时不知道去哪里找,因此个人猜测是:

对于一个进程需要去访问一个页面的时候,其首先会去页缓存里面寻找对应的缓存页是否存在,如若存在的话,会在物理内存里申请一个page,并把页缓存中命中的pagecopy到刚刚申请的page中。其后的各种操作只是对自己创建的page进行操作。

各位大神,我的理解有问题吗????

真心求解。
...全文
1565 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
充电宝111 2018-01-05
  • 打赏
  • 举报
回复
引用 4 楼 yangerkuncpp 的回复:
[quote=引用 1 楼 loneking2001 的回复:] 每个进程都有自己独立的内存空间,虚拟地址和页的映射肯定是不一样的。 每个线程都有自己的一份变量的拷贝,只有在需要时才会在这些拷贝之间进行同步。
重新整理一下。 假设,进程A和进程B同时open一个一个文件a.txt。那么进程A和B都会创建一个file结构体与之对应。同时这个a.txt也会在内存中构建对应的inode和dentry。接下来,如若进程A需要read a.txt中的一个页面,因此,内核会从底层文件系统中读取一个页面,并放到inode所指向的address_space的基数树中(页缓存),这个时候的page的virtual指针是不是会指向这个页面在进程A的虚拟内存中的虚拟地址呢? 如果B此时也去读取这个页面的话,那么这个page的virtual该怎么指定呢?[/quote] /* * On machines where all RAM is mapped into kernel address space, * we can simply calculate the virtual address. On machines with * highmem some memory is mapped into kernel virtual memory * dynamically, so we need a place to store that address. * Note that this field could be 16 bits on x86 ... ;) * * Architectures with slow multiplication can define * WANT_PAGE_VIRTUAL in asm/page.h */ #if defined(WANT_PAGE_VIRTUAL) void *virtual; /* Kernel virtual address (NULL if not kmapped, ie. highmem) */ #endif /* WANT_PAGE_VIRTUAL */ 可以看一下人家写的注释,这个virtual不是什么系统上都会用得到的,应该是把RAM全部map到kernel space的时候才有用 还有你说的这种写文件场景,A进程打开a.txt,读一个页面到缓存,B进程也打开a.txt同样也读一个不通的页面到缓存,也就是说这两个缓存是两个不通的page结构,跟virtual字段没有关系
  • 打赏
  • 举报
回复
引用 8 楼 herome0000的回复:
virtual保存的是内核空间的虚拟地址,内核是宏内核,不会存在你说的用户空间多进程共享的问题。
之前刚刚看内核,很多地方不懂。多谢指导。
  • 打赏
  • 举报
回复
引用 7 楼 Heaven_Redsky的回复:
* On machines where all RAM is mapped into kernel address space, * we can simply calculate the virtual address. On machines with * highmem some memory is mapped into kernel virtual memory * dynamically, so we need a place to store that address. * Note that this field could be 16 bits on x86 ... ;) 字面理解,virtual是当highmem被映射到内核虚地址的时候用来记录该page在对应的内核虚拟地址。而LZ所说的不用的任务,只是用户空间的事,内核通过vm_area_struct来为管理每一个用户空间的虚拟地址与物理地址映射,跟这个virtual没什么直接关系。 个人理解。
那如果page被用在用户空间,这个virtual是空吗?
Heaven_Redsky 2017-09-26
  • 打赏
  • 举报
回复
* On machines where all RAM is mapped into kernel address space, * we can simply calculate the virtual address. On machines with * highmem some memory is mapped into kernel virtual memory * dynamically, so we need a place to store that address. * Note that this field could be 16 bits on x86 ... ;) 字面理解,virtual是当highmem被映射到内核虚地址的时候用来记录该page在对应的内核虚拟地址。而LZ所说的不用的任务,只是用户空间的事,内核通过vm_area_struct来为管理每一个用户空间的虚拟地址与物理地址映射,跟这个virtual没什么直接关系。 个人理解。
herome0000 2017-09-26
  • 打赏
  • 举报
回复
virtual保存的是内核空间的虚拟地址,内核是宏内核,不会存在你说的用户空间多进程共享的问题。
KimenWu 2017-09-16
  • 打赏
  • 举报
回复
用户空间虚拟地址和内核空间不一回事。用户空间不能直接访问内核空间,需要mmap之后才才可以,映射之后,系统用vm_area_struct来管理,这里面有用户空间地址和虚拟地址的对应关系。说白了,他们最终翻译成的物理地址是一样的。就想当于你一个人,在不同的场合有不同的称呼
  • 打赏
  • 举报
回复
引用 2 楼 Jeff_showmethemoney 的回复:
不甚明白。struct page结构是用于管理物理页的,当然可以把也缓存看成一个物理页。但一个物理页它只会被映射到虚拟地址上去吧,即使是多个进程共享该页面,是不是这几个进程也是拥有相同的虚拟地址的?
肯定不会啊。
  • 打赏
  • 举报
回复
引用 1 楼 loneking2001 的回复:
每个进程都有自己独立的内存空间,虚拟地址和页的映射肯定是不一样的。 每个线程都有自己的一份变量的拷贝,只有在需要时才会在这些拷贝之间进行同步。
重新整理一下。 假设,进程A和进程B同时open一个一个文件a.txt。那么进程A和B都会创建一个file结构体与之对应。同时这个a.txt也会在内存中构建对应的inode和dentry。接下来,如若进程A需要read a.txt中的一个页面,因此,内核会从底层文件系统中读取一个页面,并放到inode所指向的address_space的基数树中(页缓存),这个时候的page的virtual指针是不是会指向这个页面在进程A的虚拟内存中的虚拟地址呢? 如果B此时也去读取这个页面的话,那么这个page的virtual该怎么指定呢?
  • 打赏
  • 举报
回复
这是一个测试!
Hello Worm 2017-09-12
  • 打赏
  • 举报
回复
不甚明白。struct page结构是用于管理物理页的,当然可以把也缓存看成一个物理页。但一个物理页它只会被映射到虚拟地址上去吧,即使是多个进程共享该页面,是不是这几个进程也是拥有相同的虚拟地址的?
rayw0ng 2017-09-11
  • 打赏
  • 举报
回复
每个进程都有自己独立的内存空间,虚拟地址和页的映射肯定是不一样的。 每个线程都有自己的一份变量的拷贝,只有在需要时才会在这些拷贝之间进行同步。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧