程序的地址空间
程序地址空间布局
对于Linux中每一个进程来说,它可以访问的地址空间都是0-4G。其中0-3G是用户空间,3-4G是内核空间。虽然0-4G的地址空间对用户程序来说是可见的,但是通常只有0-3G的地址空间对其来说是可用的,3-4G的内核地址空间是不能被其直接访问的。下图是进程地址空间示意图:
那么,进程如何才能访问到3-4G地址空间的数据楠,系统提供了一个机制——系统调用。
系统调用
1. 简介
系统调用就是内核提供用户空间来访问内核空间数据的接口。这些接口就是一系列函数。下图为系统调用示意图:
对于C语言来说,其提供的函数有些是在系统层,有些是在用户层的系统调用,有些是在用户层的库函数。
比如malloc就是库函数,在用户空间可以使用,mmap是在用户层的系统调用,其可以在用户层调用,但调用后会陷入内核,使用内核空间的资源。有些是在内核层,如kmalloc,是在用户层不能调用的函数。下图展示了C语言内存管理函数间的层次关系:
系统调用函数可以使用内核地址空间(内核资源),但是它也有坏处,就是会从用户态切换到内核态会额外消耗资源,如果频繁的调用系统函数,会大大降低程序运行的效率。
2. 验证
在Linux操作系统中,可以使用man命令来查看一个函数属于哪个层。
man malloc
malloc(3):其中3代表的就是C库函数。
man mmap
mmap(2)代表的是系统调用函数。
man kmalloc
因为Linux内核没有直接提供内核函数手册,所以该命令没有显示相关信息,但是我们可以创建。
来源:freebuf.com 2020-07-14 12:23:57 by: 夏宇不打伞2020
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧
请登录后发表评论
注册