我正在实现一个程序,尽可能经常在用户空间运行。所以我试图调用进入和离开内核空间的函数尽可能少。例如,我使用了一些可读写的DMA API,但绕过了内核。如何判断一个函数是否进入内核
我不知道如何判断一个函数是否需要输入内核空间。例如,我想调用getenv()
来获取主机设置的环境变量,但担心它可能会传递我的程序并进入内核空间。我无法从手册中找到这些信息。这里是getenv()
的手册页。
我正在实现一个程序,尽可能经常在用户空间运行。所以我试图调用进入和离开内核空间的函数尽可能少。例如,我使用了一些可读写的DMA API,但绕过了内核。如何判断一个函数是否进入内核
我不知道如何判断一个函数是否需要输入内核空间。例如,我想调用getenv()
来获取主机设置的环境变量,但担心它可能会传递我的程序并进入内核空间。我无法从手册中找到这些信息。这里是getenv()
的手册页。
你是否通过strace运行你的程序?这会让你知道你在哪里进行系统调用,它将进入内核空间
谢谢。我只是从你身上知道strace。那么,没有文件说明哪些进入了内核,哪些没有进入内核?我们需要运行它。这是否意味着一个函数是否进入内核空间是一种动态行为? – 2014-10-31 15:42:27
你试过了“man strace”:)如果你没有访问它,这里是联机版的manpage:http://linux.die.net/man/1/strace – 2014-10-31 15:54:27
strace产生了很多输出,如果你不习惯它,看起来很吓人,并且没有很多好的教程。看看这个http://www.ibm.com/developerworks/cn/library/au-unix-strace.html – 2014-10-31 15:58:07
我认为大多数IO函数都会导致你的程序进入内核? 也许你应该检查你使用的系统API
我不知道去哪儿检查。例如,这是''getenv()''http://man7.org/linux/man-pages/man3/getenv.3.html页面,我不知道它是否进入内核空间。 – 2014-10-31 15:25:17
'getenv()'返回的信息不存储在内核空间中,所以它不会转换到内核。但是,我不知道有一个简单的方法可以从手册页等方面做出决定。 – 2014-10-31 15:33:06
@JonathanLeffler谢谢。这是否意味着一个函数是否进入内核空间是一种动态行为? – 2014-10-31 15:43:00
可能或多或少 - 至少在某种意义上,例如getchar()通常不会进入内核空间(当数据仍然要在缓冲区中读取时),但有时会进入内核(当缓冲区中没有数据时)。所以,这是动态行为。其他函数(例如'getpid()')将始终进入内核。这取决于功能。 – 2014-10-31 15:45:25