2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > linux进程地址空间内核 菜鸟求问linux进程地址空间问题

linux进程地址空间内核 菜鸟求问linux进程地址空间问题

时间:2024-03-14 01:12:38

相关推荐

linux进程地址空间内核 菜鸟求问linux进程地址空间问题

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管理器来负责分配堆上的空间?

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。