24 个回复
greenarmor
格林阿毛
2011-07-09
分配地址空间和映射物理内存用的,
比如你malloc一块内存,实际上是在vm管理的区域分配,
和实际物理内存没关系
【 在 injoy (injoy) 的大作中提到: 】
: linux用mm_struct中的struct vm_area_struct* mmap队列来管理线性区。但是这个线性区的具体作用体现在哪里?是每次执行一条指令,都会检查此条指令的地址是否位于进程的线性区中吗?此外,那个find_vma()函数,它是根据给定的地址返回此地址位于的线性区。但是这个的实�
: 请各位达人指教,不胜感激!
injoy
injoy
2011-07-09
那这里的分配内存和slab有什么关系吗?
【 在 greenarmor (格林阿毛) 的大作中提到: 】
: 分配地址空间和映射物理内存用的,
: 比如你malloc一块内存,实际上是在vm管理的区域分配,
: 和实际物理内存没关系
codingmylife
没有昵称
2011-07-12
1)vm_area_struct 是描述用户态进程的;管理其不同的段:如数据段, 代码段, 栈,堆 和 映射段(mmap)
2)严格来说是应该检查是否在对应的代码段。
3)找出对应包含线性地址的vma。查看代码find_vma调用处 就知道了。
【 在 injoy (injoy) 的大作中提到: 】
: linux用mm_struct中的struct vm_area_struct* mmap队列来管理线性区。但是这个线性区的具体作用体现在哪里?是每次执行一条指令,都会检查此条指令的地址是否位于进程的线性区中吗?此外,那个find_vma()函数,它是根据给定的地址返回此地址位于的线性区。但是这个的实际作用(体现在实际运用中)又是什么?
: 请各位达人指教,不胜感激!
stronge
enjoy life
2011-07-12
每条指令都检查? 这个怎么解释
【 在 codingmylife (syman) 的大作中提到: 】
: 标 题: Re: 菜鸟求问linux进程地址空间问题
: 发信站: 水木社区 (Tue Jul 12 12:47:36 2011), 转信
: 1)vm_area_struct 是描述用户态进程的;管理其不同的段:如数据段, 代码段, 栈,堆 和 映射段(mmap)
: 2)严格来说是应该检查是否在对应的代码段。
: 3)找出对应包含线性地址的vma。查看代码find_vma调用处 就知道了。
: 【 在 injoy (injoy) 的大作中提到: 】
: : linux用mm_struct中的struct vm_area_struct* mmap队列来管理线性区。但是这个线性区的具体作用体现在哪里?是每次执行一条指令,都会检查此条指令的地址是否位于进程的线性区中吗?此外,那个find_vma()函数,它是根据给定的地址返回此地址位于的线性区。但是这个的实际作用(体现在实际运用中)又是什么?
: : 请各位达人指教,不胜感激!
: --
codingmylife
没有昵称
2011-07-14
抱歉,我原先的回答不是很确定。
1)我原先认为 应该像 对指令中的地址做合法性检查 对 EIP(x86)的值做检查。但是现在没有还看到相关代码。 但是细想似乎不需要,只要保证第一条指令内核指令是合法的
和 之后指令中 出现在跳转指令中的地址 做检查 即可保证eip 不是乱指。
2)可能看scheduler的代码会有一些启示。
BTW, 我和同事讨论了这个问题;目前也没有答案。有答案在上来冒泡吧。
【 在 stronge (enjoy life) 的大作中提到: 】
: 每条指令都检查? 这个怎么解释
stronge
enjoy life
2011-07-14
我也不太确定,所以上面问了你一下
我的理解是这样的
kernel会通过GDT和pagetable的权限来检测,从而达到每条指令都被检测
【 在 codingmylife (syman) 的大作中提到: 】
: 标 题: Re: 菜鸟求问linux进程地址空间问题
: 发信站: 水木社区 (Thu Jul 14 13:15:28 2011), 转信
: 抱歉,我原先的回答不是很确定。
: 1)我原先认为 应该像 对指令中的地址做合法性检查 对 EIP(x86)的值做检查。但是现在没有还看到相关代码。 但是细想似乎不需要,只要保证第一条指令内核指令是合法的
: 和 之后指令中 出现在跳转指令中的地址 做检查 即可保证eip 不是乱指。
: 2)可能看scheduler的代码会有一些启示。
: BTW, 我和同事讨论了这个问题;目前也没有答案。有答案在上来冒泡吧。
: 【 在 stronge (enjoy life) 的大作中提到: 】
: : 每条指令都检查? 这个怎么解释
: --
stage
stage
2011-07-15
我觉得是通过内存管理来实现的吧,检查指令的线性地址是否在进程的页目录/页表中存
在,并检查内存页的权限,如果存在,就是合法的地址,否则是不合法的
【 在 stronge (enjoy life) 的大作中提到: 】
: 我也不太确定,所以上面问了你一下
: 我的理解是这样的
: kernel会通过GDT和pagetable的权限来检测,从而达到每条指令都被检测
stronge
enjoy life
2011-07-15
内存管理不会每个指令都做的
这样想好了
内存管理的指令也需要检查,那由谁来检查?
【 在 stage (stage) 的大作中提到: 】
: 标 题: Re: 菜鸟求问linux进程地址空间问题
: 发信站: 水木社区 (Fri Jul 15 17:49:11 2011), 转信
: 我觉得是通过内存管理来实现的吧,检查指令的线性地址是否在进程的页目录/页表中存
: 在,并检查内存页的权限,如果存在,就是合法的地址,否则是不合法的
: 【 在 stronge (enjoy life) 的大作中提到: 】
: : 我也不太确定,所以上面问了你一下
: : 我的理解是这样的
: : kernel会通过GDT和pagetable的权限来检测,从而达到每条指令都被检测
: --
: 一旦持有,我就死捂
codingmylife
没有昵称
2011-07-15
需要, MMU做的检查。就那x86(有MMU, 32bit)的说吧,EIP中的地址是下一条指令的地址。在保护模式下,取指令的过程是要通过MMU的,期间的对页表目录项 及 页面项(假设是3级映射)的后12bit中一下bit位做检查;常见的就是用户程序的page fault。
【 在 stronge (enjoy life) 的大作中提到: 】
: 内存管理不会每个指令都做的
: 这样想好了
: 内存管理的指令也需要检查,那由谁来检查?
injoy
injoy
2011-07-15
每条指令都做检查不是很低效吗?
我猜测是每页做检查吧。当指令位于新的一页,才会发生page fault,才会把把相应的页加载进内存,更新TLB。
【 在 codingmylife (syman) 的大作中提到: 】
: 需要, MMU做的检查。就那x86(有MMU, 32bit)的说吧,EIP中的地址是下一条指令的地址。在保护模式下,取指令的过程是要通过MMU的,期间的对页表目录项 及 页面项(假设是3级映射)的后12bit中一下bit位做检查;常见的就是用户程序的page fault。
codingmylife
没有昵称
2011-07-15
是低效, 但是CPU有TLB和指令cache啊。
【 在 injoy (injoy) 的大作中提到: 】
: 每条指令都做检查不是很低效吗?
: 我猜测是每页做检查吧。当指令位于新的一页,才会发生page fault,才会把把相应的页加载进内存,更新TLB。
injoy
injoy
2011-07-15
那这里的越界以及权限检查和进程的线性区有什么关系吗?
线性区是以页为单位分配的,但是如果某个进程只需要malloc一个很小的数组。那线性区又会发生什么变化?
【 在 codingmylife (syman) 的大作中提到: 】
: 是低效, 但是CPU有TLB和指令cache啊。
codingmylife
没有昵称
2011-07-15
不清楚你说的线性区指的啥?
至于malloc:
malloc/new 申请的一段线性地址空间。 malloc会做cache。仅当cache不够用时才
会sys_brk扩展 进程的堆vm area。够用
【 在 injoy (injoy) 的大作中提到: 】
: 那这里的越界以及权限检查和进程的线性区有什么关系吗?
: 线性区是以页为单位分配的,但是如果某个进程只需要malloc一个很小的数组。那线性区又会发生什么变化?
injoy
injoy
2011-07-15
ulk的中文翻译,线性区就是指进程的address space,也就是通过vm_area_struct实现的那一连串地址空间。
每个进程的address space都不一样,那是不是每个进程都有一个slab管理器来负责分配堆上的空间?
【 在 codingmylife (syman) 的大作中提到: 】
: 不清楚你说的线性区指的啥?
: 至于malloc:
: malloc/new 申请的一段线性地址空间。 malloc会做cache。仅当cache不够用时才
: ...................
stage
stage
2011-07-15
应该是page fault时才检查,不是每个指令都检查,如果指令所在的页存在,指令应该就
是正确的。
【 在 stronge (enjoy life) 的大作中提到: 】
: 内存管理不会每个指令都做的
: 这样想好了
: 内存管理的指令也需要检查,那由谁来检查?
greenarmor
格林阿毛
2011-07-15
slab和进程没关系,是内核自己用的,进程能看到的所有地址都是线性地址
【 在 injoy (injoy) 的大作中提到: 】
: ulk的中文翻译,线性区就是指进程的address space,也就是通过vm_area_struct实现的那一连串地址空间。
: 每个进程的address space都不一样,那是不是每个进程都有一个slab管理器来负责分配堆上的空间?
greenarmor
格林阿毛
2011-07-15
re
线性地址访问先通过mmu,mmu失败引发page fault时才交给内核处理
【 在 stage (stage) 的大作中提到: 】
: 应该是page fault时才检查,不是每个指令都检查,如果指令所在的页存在,指令应该就
: 是正确的。
stronge
enjoy life
2011-07-16
每条指令都检查的
检查工作由硬件完成(分别在tlb,mmu当中完成)
当然没有通过检查是有page fault,page fault不是用来检查的,而是用来修复错误的
如果修复不了要么进程退出,要么内核崩溃
【 在 stage (stage) 的大作中提到: 】
: 标 题: Re: 菜鸟求问linux进程地址空间问题
: 发信站: 水木社区 (Fri Jul 15 22:06:07 2011), 转信
: 应该是page fault时才检查,不是每个指令都检查,如果指令所在的页存在,指令应该就
: 是正确的。
: 【 在 stronge (enjoy life) 的大作中提到: 】
: : 内存管理不会每个指令都做的
: : 这样想好了
: : 内存管理的指令也需要检查,那由谁来检查?
: --
: 一旦持有,我就死捂
codingmylife
没有昵称
2011-07-16
线性地址空间 通常都是在一起啊。 对应有 物理地址空间/虚拟地址空间。
进程不同的 是物理地址空间。
如有网友说的那样, slab allocator 是内核用于 分配 内核数据结构如dcache/inode。有如下调用关系:
libc: malloc --》 sys_brk --》 alloc_page(HIGHMEM)
slab: kmem_cache_create() [slab的allocator 接口,函数名可能随内核版本不同而变化] --》 alloc_page(KERNEL).
同时更正我前面的一个错误: C++ 的new operator是要对应的物理页 也同时被分配。因为RAII的缘故。
【 在 injoy (injoy) 的大作中提到: 】
: ulk的中文翻译,线性区就是指进程的address space,也就是通过vm_area_struct实现的那一连串地址空间。
: 每个进程的address space都不一样,那是不是每个进程都有一个slab管理器来负责分配堆上的空间?