简单科普:Linux的用户态和内核态
Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件–控制计算机的硬件资源,并提供上层应用程序运行的环境。
用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的接口:即系统调用。
一般来说系统调用经过:用户调用syscall->glibc库->内核执行,返回值->glibc库->syscall->用户。
除非内核提供接口,否则用户态无法访问到内核资源。
Strace常用来跟踪进程在用户态执行的系统调用流程,单不会跟踪到内核里面发生的事情(顺便提一句,内核里面用ftrace)。
输出含义
以strace ls为例:
$ strace ls
execve("/bin/ls", ["ls"], [/* 26 vars */]) = 0
brk(NULL) = 0x1ad4000
access("/etc/ld.so.nohwcap", FOK) = -1 ENOENT (No such file or directory) mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f397bd49000 access("/etc/ld.so.preload", ROK) = 0
每一行都是一条系统调用,包含调用函数,函数参数,函数返回值,但不会显示内核的系统调用和流程。
参数
说明:随着系统的不同和工具包的升级,不同环境命令支持情况也不相同,个人最好养成查看命令帮助使用command –help的习惯。
-c 统计每一系统调用的所执行的时间,次数和出错的次数等.
-d 输出strace关于标准错误的调试信息.
-f 跟踪由fork调用所产生的子进程.
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.
-h 输出简要的帮助信息.
-i 输出系统调用的入口指针.
<