Linux系统安全:Linux内存管理的探究(一) – 作者:夏宇不打伞2020

程序的地址空间

程序地址空间布局

对于Linux中每一个进程来说,它可以访问的地址空间都是0-4G。其中0-3G是用户空间,3-4G是内核空间。虽然0-4G的地址空间对用户程序来说是可见的,但是通常只有0-3G的地址空间对其来说是可用的,3-4G的内核地址空间是不能被其直接访问的。下图是进程地址空间示意图:

Linux内核地址空间

那么,进程如何才能访问到3-4G地址空间的数据楠,系统提供了一个机制——系统调用。

系统调用

1. 简介

系统调用就是内核提供用户空间来访问内核空间数据的接口。这些接口就是一系列函数。下图为系统调用示意图:

系统调用示意图

对于C语言来说,其提供的函数有些是在系统层,有些是在用户层的系统调用,有些是在用户层的库函数。

比如malloc就是库函数,在用户空间可以使用,mmap是在用户层的系统调用,其可以在用户层调用,但调用后会陷入内核,使用内核空间的资源。有些是在内核层,如kmalloc,是在用户层不能调用的函数。下图展示了C语言内存管理函数间的层次关系:

Linux系统中函数分层示意图系统调用函数可以使用内核地址空间(内核资源),但是它也有坏处,就是会从用户态切换到内核态会额外消耗资源,如果频繁的调用系统函数,会大大降低程序运行的效率。

2. 验证

在Linux操作系统中,可以使用man命令来查看一个函数属于哪个层。

man malloc

man mallocmalloc(3):其中3代表的就是C库函数。

man mmap

man mmap mmap(2)代表的是系统调用函数。

man kmalloc

man kmalloc因为Linux内核没有直接提供内核函数手册,所以该命令没有显示相关信息,但是我们可以创建。

来源:freebuf.com 2020-07-14 12:23:57 by: 夏宇不打伞2020

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论