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