我在思考Linux内核如何实现系统调用,想知道有没有人可以给我一个关于sbrk/brk的高级视图?
我已经查看了内核代码,但是太多了,我不理解。我希望有人能给我一个摘要。
我在思考Linux内核如何实现系统调用,想知道有没有人可以给我一个关于sbrk/brk的高级视图?
我已经查看了内核代码,但是太多了,我不理解。我希望有人能给我一个摘要。
struct vm_area_struct
)。还有一个表示进程整个地址空间的结构体(再次强调这是在非常高的层面上)(struct mm_struct
)。每个进程(除了一些内核线程)都恰好有一个struct mm_struct
,它又指向该进程可以访问的所有struct vm_area_struct
。
sys_brk
系统调用(在mm/mmap.c
中找到)仅会调整其中一些内存区域。 (sbrk
是brk
的glibc包装器)。它通过比较旧的brk
地址值(在struct mm_struct
中找到)和请求的值来进行调整。mmap
函数族,因为brk
是它的一种特例。brk/sbrk
在略高的级别上工作: 原则上,超出这个标记的任何内存地址都是无效的,如果访问了这些地址,则进程会被杀死。用户空间库在此限制范围内管理内存分配,仅在需要时请求内核增加它。brk
到最大允许值,直到它开始访问所有这些内存地址,它都不会分配实际的RAM页面。从一个超高层次的角度来看,内核分配一个可分页的内存块,修改请求该块的进程的页面表,使得内存映射到进程的虚拟地址空间中,然后返回地址。