系统调用:sys_fork

本文详细阐述了Linux系统中fork系统调用的实现机制,包括创建子进程的过程、内存分配、文件系统复制、信号处理、内存管理等关键步骤。深入探讨了fork调用的内部流程,以及如何在创建新进程的同时确保资源的有效共享和隔离。
fork 简介:

fork系统调用的功能是为当前进程创建一子进程,该子进程事实上是父进程的一个拷贝,只不过它的pid号和其它少数参数不同而已。fork系统调用是进程管理中一个重要的系统调用,也是shell命令解释程序常用的一个系统调用。如果调用成功,fork系统调用对父进程返回新生成的子进程的进程标识号pid,对子进程返回0;否则,将出错原因存入error变量,并向父进程返回-1。产生的出错原因有两种:

EAGAIN 表示fork难以为子进程的PCB的数据项分配足够的内存空间,如拷贝父进程的页表时申请内存失败。

ENOMEM 表示fork为自己的存在申请内存空间失败,甚至可能连存放进程控制块的内存都不够。

2)fork 功能的实现

查看“include/asm-i386/unistd.h”,fork系统调用的对应函数是不带参数的,该系统调用的设置应使用的宏应为:

static inline _syscall0(int,fork)

这样,在调用fork时,系统将调用宏指令_syscall0,进而,调用0x80号中断,寄存器eax中的值为__NR_fork,这是fork传给int $0x80的唯一的参数。

调用中断“int $0x80”以后,在汇编过程“system_call”中,将通过eax中的值__NR_fork(即2)与4的乘积作为相对于系统调用表(sys_call_table)偏移,找到入口:

.long SYMBOL_NAME(sys_fork)

于是,系统流程转向函数sys_fork()。(“arch/i386/kernel/process.c”):

asmlinkage int sys_fork(struct pt_regs regs)

{

              return do_fork(SIGCHLD, regs.esp, &regs);

}

SIGCHLD是在定义的一个宏,它告诉do_fork()函数应创建一子进程。前面提到过,调用宏过程“SAVE_ALL”将现有通用寄存器保存,提供了一种传递参数的方式,这里,sys_fork()将所保存的寄存器组结构“struct pt_regs”类型的regs作为参数传递给do_fork(),并且传递了其中的栈寄存器项:regs.esp

于是,系统流程进入了文件“linux/kernel/fork.c”中定义的函数体do_fork()。用户进程由do_fork()函数创建,它也是fork系统调用的执行者。do_fork()在task数组中找到空闲位置,继承父进程现有资源,初始化进程时钟、信号、时间等数据。下面一节介绍该函数的大概流程。

do_fork()函数的大概流程

do_fork()函数一开始就“作最坏的打算”,将可能返回的值error初始值置为-ENOMEM,它告诉系统,内存已被用完。然后,才进入主流程。

首先,do_fork()函数调用kmalloc为进程申请内存空间,GFP_KERNEL表示允许内存一时申请不到时转入睡眠,这儿不作考虑,如果申请内存失败的话,将返回NULL。这时,do_fork()函数转入bad_fork执行,这儿,do_fork()函数直接返回出错信息,告诉系统,内存已被用完。

然后,do_fork()函数调用alloc_kernel_stack()宏,为进程申请堆栈页面,同样,如果申请失败,执行语句:

goto bad_fork_free_p;

这儿,有必要看一下标号bad_fork_free_p后的程序段:

bad_fork_free_p:

              kfree(p);

bad_fork:

                     return error;

可以看到,随着对进程初始化工作的逐渐深入,一旦出现错误,需要做的回复工作也逐渐增多,因此,在do_fork()函数的回复部分,与出错的次序出现了一个有趣而且巧妙的对称。

然后,执行语句:

       error = -EAGAIN;

表示“ENOMEM”的危险已经过去,现在还存在“EAGAIN”的危险。

紧接着下面的语句是:

*p = *current;

它将当前进程的内容赋给新产生的进程,这时,子进程完全继承了父进程的内容,并且与之完全共享,这当然是不合理的,接下去的工作是使子进程拥有自己的特征。

首先要改变进程的所属的全局执行域结构中的use_count值,表示本域的进程数增了1,同样,也要改变进程所属的全局执行文件格式中的use_count值。

下面,设置与新进程相关的参数:

1.p->did_exec = 0,表示进程未被执行过;

2.p->swappable = 0,表示由于是新建进程,暂时拒绝被调用出内存;

3.p->kernel_stack_page = new_stack;为核心栈分配的一个物理页置入kernel_stack_page数据项;

4.设置进程状态为TASK_UNINTERRUPTIBLE,表示本进程将被置于等待队列中,由于资源未分配好,因此置为不可中断,使其待资源有效时唤醒,不可由其它进程通过信号唤醒;

5.    p->flags &= ~(PF_PTRACED|PF_TRACESYS|PF_SUPERPRIV);

              p->flags |= PF_FORKNOEXEC;

这两条语句表示,拒绝新建进程具有超级用户特权或被跟踪,同时使PF_FORKNOEXEC置位,表示新建进程还没执行;

6.“p->pid = get_pid(clone_flags);”语句中,get_pid()函数先判断调用它的do_fork()是否进行clone系统调用,这儿显然不是(关于clone系统调用,在2.4节有简单介绍),那么返回一不大于0x8000的进程标志号,它还进行了与组标识号及区标识号进行区别的判断;

7.由于新产生的进程的状态还是为TASK_UNINTERRUPTIBLE,因此不将其放入就绪队列,将next_run,prev_run项均置为NULL。将指向原始父进程、父进程指针项赋值为当前进程Current;

8.为新进程的后续进程初始化等待队列;

9.“p->signal = 0;”表示新建进程尚未收到任何信号;

10.初始化时间数据成员:

       init_timer(&p->real_timer);

              p->real_timer.data = (unsigned long) p;

这两条语句初始化进程的定时数据结构timer_list类型的real_timer。

              p->it_real_value = p->it_virt_value = p->it_prof_value = 0;

              p->it_real_incr = p->it_virt_incr = p->it_prof_incr = 0;

以上两条语句初始化用于进程计时的数据项,将其均置为0,其中it_real_value, it_real_incr与系统计时变量jiffies保持一致,它表示真实时间; it_virt_value, it_virt_incr用于虚拟软件及时,它仅在进程运行时有效,因此,该数据项用于进程内计时,当时间到时,发送信号  ,具体代码见于文件“/kernel/sched.c”内的do_it_virt()函数体:

        if (it_virt <= ticks) {

                     it_virt = ticks + p->it_virt_incr;

                     send_sig(SIGVTALRM, p, 1);       /*向进程发送信号SIGVTALRM*/

it_prof_value, it_prof_incr也用于虚拟的的软件定时,但还包括操作系统为进程运作而运行的时间,前者为时间值,后者为时间增量。它在时间到时发信号SIGPROF,这种计时工具可用来对用户使用系统的时间计时,以便进行清算等。

对进程计时用于控制进程运行时间,它可由另一系统调用setitimer来实现,它的其中一项参数就是指定设置的计时类型,即ITIMER_REAL ,ITIMER_VIRTUAL 以及ITIMER_PROF。

       p->utime = p->stime = 0;

              p->cutime = p->cstime = 0;

              …………………….

       p->start_time = jiffies;

该三条语句表示分别将进程用户态时间总和、进程核心态时间总和、子进程用户态时间总和、子进程核心态时间总和置为0,将建立该进程的系统时间置为jiffies,设置当前进程的建立时间。

11.“SET_LINKS(p);”语句将新进程与初始进程相关联,“task[nr] = p;”将其放入当前所有进程数组,“nr_tasks++;”表示当前进程增加了一个。

以上11步工作将新生成的进程的参数全部设置完毕,现为其分配应有的内存,用来保存与新进程相关的文件系统,内存页面,信号处理程序等工作,这儿,有必要再来看一下fork系统调用的处理函数:

asmlinkage int sys_fork(struct pt_regs regs)

{

              return do_fork(SIGCHLD, regs.esp, &regs);

}

其中SIGCHLD的宏定义值为17,再来看“sched.h”中定义的“克隆”标志:

#define CSIGNAL              0x000000ff             /* 在进程终止时须发的信息 */

#define CLONE_VM       0x00000100           /* 子进程共享父进程虚拟内存 */

#define CLONE_FS       0x00000200           /* 子进程共享父进程文件系统信息 */

#define CLONE_FILES       0x00000400           /* 子进程共享父进程打开文件 */

#define CLONE_SIGHAND       0x00000800    /* 子进程共享父进程信号操纵函数 */

#define CLONE_PID       0x00001000           /* 子进程共享父进程的进程号*/

可知,fork()系统调用的clone_flags中,只有CSIGNAL非零,因此,子进程必须有自己的一套虚拟操作结构。

回到do_fork()函数,转入内存申请工作,以第一项申请为例:

       if (copy_files(clone_flags, p))

              goto bad_fork_cleanup;

即如果申请失败,返回的非零值使流程转向bad_fork_cleanup标记处,申请过程在函数体copy_files()中进行。在此函数体内,观察语句:

       oldf = current->files;

       if (clone_flags & CLONE_FILES) {

              oldf->count++;

              return 0;

       }

因为CLONE_FILES没有置位,因此不能在此直接返回,于是只能为新进程分配有关文件信息的结构所占用的内存:

       newf = kmalloc(sizeof(*newf), GFP_KERNEL);

       tsk->files = newf;

如果申请失败,返回-1,那么,正如前面所述, fork为自己的数据项申请内存空间失败,这时,返回EAGAIN。

接下去是拷贝父进程打开文件的结构指针,在进程控制块task_struct中,定义了一files_struct数据项    files,其结构如下所示:

struct files_struct {

              int count;

       fd_set close_on_exec;

              fd_set open_fds;

       struct file * fd[NR_OPEN];

};

其中,count 表示共享该文件组的进程数目,因此,设置初始值为零,每当进程结束时,会将该数据项减一;fd数据项是一指向本进程所打开文件的指针,它是一“NR_OPEN”的数组,“NR_OPEN”在“limit.h”中宏定义为256,这样,一进程最多可打开256个文件。

申请完file_struct 节点以后,执行代码:

     if (copy_fs(clone_flags, p))

            goto bad_fork_cleanup_files;

同样,转入函数体copy_fs(),该函数拷贝父进程的在VFS中的位置。在Linux系统中,进程本身也是一种文件,fs_struct结构的root指向根目录结点,pwd指向当前进程工作目录结点。count表示文件的引用次数,初始值设为1,umask表示文件的缺省创建模式,继承父进程的方式。

这里顺便简单介绍一下inode 结构,在Linux的EXT2文件系统里面,inode是基本的文件(或目录,但Linux系统中,两者等价)描述块,一般来说,它包含了此文件的一些关键信息:所在设备、类型、大小、时间属性、在设备上的位置、用户属性等等。

接下去do_fork()执行copy_sighand()函数,该函数将父进程的与信号处理有关的结构拷贝到新产生进程。

最后执行copy_mm()函数,该函数为新进程开辟新的页面,然后将父进程的所有mm_struct结构类型的数据项“mm”拷贝到子进程,修改一些特征参数,如count值,将def_flags初始设为0,即不对任何标志位置位(def_flags标志位保存mm_struct结构所指的虚存的信息,如锁定(VM_LOCKED)等)。

如下语句为新进程分配页表:

            if (new_page_tables(tsk)) {

                   tsk->mm = NULL;

                   exit_mmap(mm);

                   goto free_mm;

            }

如分配页表失败,转到free_mm处释放先前为mm所申请的存储空间后,返回出错信息。若成功,转到函数dup_mmap()为新进程分配虚存链(vm_area_struct结构)的存储空间,并调用“build_mmap_avl(mm);”为之建立AVL树结构。vm_area_struct结构保存进程所有开辟的虚拟空间的信息,并通过语句:“flush_tlb_mm(current->mm)”通报系统,从current->mm开始的存储结构已被改变,需要重新设置快表。

       在进程间资源共享上,Linux采用一种“写时拷贝”的策略,即共享双方中的一方试图改变共享资源时,把资源拷贝给另一方。这儿所说的资源特指存储空间。

fork的返回工作——返回到system_call

这一节主要还是在do_fork()函数中工作,但是由于还得牵涉到返回entry.S中进行系统调用返回的处理工作,所以单独列出一节。

关键的一步是:

       copy_thread(nr, clone_flags, usp, p, regs);

该函数在文件“/arch/i386/kernel/process.c”中定义,或许该函数仅仅是设置进程的TSS(Task State Segment),但是其中的下述语句值得注意:

       childregs = ((struct pt_regs *) (p->kernel_stack_page + PAGE_SIZE)) - 1;

       p->tss.esp = (unsigned long) childregs;

这两条语句使子进程的保存状态的堆栈段指向新开辟的堆栈。

p->tss.eip = (unsigned long) ret_from_sys_call;

              *childregs = *regs;

       childregs->eax = 0;

       eip得到ret_from_sys_call的入口地址,使得子进程被唤醒后,从ret_from_sys_call开始执行。将eax置零,表示子进程成功创建,返回0。

最后执行:

1.“p->swappable = 1;”,注意到do_fork()在开始时将其置零,现置位。

2.“p->exit_signal = clone_flags & CSIGNAL;”将父进程传入的信号SIGCHLD放入exit_signal,用来被强行终止时发送(注意CSIGNAL低八位为ff,见2.3节)

3.“p->counter = (current->counter >>= 1);”:该语句将子进程的时间片定为父进程的一半,体现了一种差别。4.“wake_up_process(p);”唤醒新进程放入就绪队列,等待调度,返回。


syscalls:sys_enter_getresuid [Tracepoint event] syscalls:sys_enter_getrlimit [Tracepoint event] syscalls:sys_enter_getrusage [Tracepoint event] syscalls:sys_enter_getsid [Tracepoint event] syscalls:sys_enter_getsockname [Tracepoint event] syscalls:sys_enter_getsockopt [Tracepoint event] syscalls:sys_enter_gettid [Tracepoint event] syscalls:sys_enter_gettimeofday [Tracepoint event] syscalls:sys_enter_getuid [Tracepoint event] syscalls:sys_enter_getxattr [Tracepoint event] syscalls:sys_enter_init_module [Tracepoint event] syscalls:sys_enter_inotify_add_watch [Tracepoint event] syscalls:sys_enter_inotify_init [Tracepoint event] syscalls:sys_enter_inotify_init1 [Tracepoint event] syscalls:sys_enter_inotify_rm_watch [Tracepoint event] syscalls:sys_enter_io_cancel [Tracepoint event] syscalls:sys_enter_io_destroy [Tracepoint event] syscalls:sys_enter_io_getevents [Tracepoint event] syscalls:sys_enter_io_pgetevents [Tracepoint event] syscalls:sys_enter_io_setup [Tracepoint event] syscalls:sys_enter_io_submit [Tracepoint event] syscalls:sys_enter_ioctl [Tracepoint event] syscalls:sys_enter_ioperm [Tracepoint event] syscalls:sys_enter_iopl [Tracepoint event] syscalls:sys_enter_ioprio_get [Tracepoint event] syscalls:sys_enter_ioprio_set [Tracepoint event] syscalls:sys_enter_kcmp [Tracepoint event] syscalls:sys_enter_kexec_file_load [Tracepoint event] syscalls:sys_enter_kexec_load [Tracepoint event] syscalls:sys_enter_keyctl [Tracepoint event] syscalls:sys_enter_kill [Tracepoint event] syscalls:sys_enter_lchown [Tracepoint event] syscalls:sys_enter_lgetxattr [Tracepoint event] syscalls:sys_enter_link [Tracepoint event] syscalls:sys_enter_linkat [Tracepoint event] syscalls:sys_enter_listen [Tracepoint event] syscalls:sys_enter_listxattr [Tracepoint event] syscalls:sys_enter_llistxattr [Tracepoint event] syscalls:sys_enter_lookup_dcookie [Tracepoint event] syscalls:sys_enter_lremovexattr [Tracepoint event] syscalls:sys_enter_lseek [Tracepoint event] syscalls:sys_enter_lsetxattr [Tracepoint event] syscalls:sys_enter_madvise [Tracepoint event] syscalls:sys_enter_mbind [Tracepoint event] syscalls:sys_enter_membarrier [Tracepoint event] syscalls:sys_enter_memfd_create [Tracepoint event] syscalls:sys_enter_migrate_pages [Tracepoint event] syscalls:sys_enter_mincore [Tracepoint event] syscalls:sys_enter_mkdir [Tracepoint event] syscalls:sys_enter_mkdirat [Tracepoint event] syscalls:sys_enter_mknod [Tracepoint event] syscalls:sys_enter_mknodat [Tracepoint event] syscalls:sys_enter_mlock [Tracepoint event] syscalls:sys_enter_mlock2 [Tracepoint event] syscalls:sys_enter_mlockall [Tracepoint event] syscalls:sys_enter_mmap [Tracepoint event] syscalls:sys_enter_modify_ldt [Tracepoint event] syscalls:sys_enter_mount [Tracepoint event] syscalls:sys_enter_move_pages [Tracepoint event] syscalls:sys_enter_mprotect [Tracepoint event] syscalls:sys_enter_mq_getsetattr [Tracepoint event] syscalls:sys_enter_mq_notify [Tracepoint event] syscalls:sys_enter_mq_open [Tracepoint event] syscalls:sys_enter_mq_timedreceive [Tracepoint event] syscalls:sys_enter_mq_timedsend [Tracepoint event] syscalls:sys_enter_mq_unlink [Tracepoint event] syscalls:sys_enter_mremap [Tracepoint event] syscalls:sys_enter_msgctl [Tracepoint event] syscalls:sys_enter_msgget [Tracepoint event] syscalls:sys_enter_msgrcv [Tracepoint event] syscalls:sys_enter_msgsnd [Tracepoint event] syscalls:sys_enter_msync [Tracepoint event] syscalls:sys_enter_munlock [Tracepoint event] syscalls:sys_enter_munlockall [Tracepoint event] syscalls:sys_enter_munmap [Tracepoint event] syscalls:sys_enter_name_to_handle_at [Tracepoint event] syscalls:sys_enter_nanosleep [Tracepoint event] syscalls:sys_enter_newfstat [Tracepoint event] syscalls:sys_enter_newfstatat [Tracepoint event] syscalls:sys_enter_newlstat [Tracepoint event] syscalls:sys_enter_newstat [Tracepoint event] syscalls:sys_enter_newuname [Tracepoint event] syscalls:sys_enter_open [Tracepoint event] syscalls:sys_enter_open_by_handle_at [Tracepoint event] syscalls:sys_enter_openat [Tracepoint event] syscalls:sys_enter_pause [Tracepoint event] syscalls:sys_enter_perf_event_open [Tracepoint event] syscalls:sys_enter_personality [Tracepoint event] syscalls:sys_enter_pipe [Tracepoint event] syscalls:sys_enter_pipe2 [Tracepoint event] syscalls:sys_enter_pivot_root [Tracepoint event] syscalls:sys_enter_pkey_alloc [Tracepoint event] syscalls:sys_enter_pkey_free [Tracepoint event] syscalls:sys_enter_pkey_mprotect [Tracepoint event] syscalls:sys_enter_poll [Tracepoint event] syscalls:sys_enter_ppoll [Tracepoint event] syscalls:sys_enter_prctl [Tracepoint event] syscalls:sys_enter_pread64 [Tracepoint event] syscalls:sys_enter_preadv [Tracepoint event] syscalls:sys_enter_preadv2 [Tracepoint event] syscalls:sys_enter_prlimit64 [Tracepoint event] syscalls:sys_enter_process_vm_readv [Tracepoint event] syscalls:sys_enter_process_vm_writev [Tracepoint event] syscalls:sys_enter_pselect6 [Tracepoint event] syscalls:sys_enter_ptrace [Tracepoint event] syscalls:sys_enter_pwrite64 [Tracepoint event] syscalls:sys_enter_pwritev [Tracepoint event] syscalls:sys_enter_pwritev2 [Tracepoint event] syscalls:sys_enter_quotactl [Tracepoint event] syscalls:sys_enter_read [Tracepoint event] syscalls:sys_enter_readahead [Tracepoint event] syscalls:sys_enter_readlink [Tracepoint event] syscalls:sys_enter_readlinkat [Tracepoint event] syscalls:sys_enter_readv [Tracepoint event] syscalls:sys_enter_reboot [Tracepoint event] syscalls:sys_enter_recvfrom [Tracepoint event] syscalls:sys_enter_recvmmsg [Tracepoint event] syscalls:sys_enter_recvmsg [Tracepoint event] syscalls:sys_enter_remap_file_pages [Tracepoint event] syscalls:sys_enter_removexattr [Tracepoint event] syscalls:sys_enter_rename [Tracepoint event] syscalls:sys_enter_renameat [Tracepoint event] syscalls:sys_enter_renameat2 [Tracepoint event] syscalls:sys_enter_request_key [Tracepoint event] syscalls:sys_enter_restart_syscall [Tracepoint event] syscalls:sys_enter_rmdir [Tracepoint event] syscalls:sys_enter_rseq [Tracepoint event] syscalls:sys_enter_rt_sigaction [Tracepoint event] syscalls:sys_enter_rt_sigpending [Tracepoint event] syscalls:sys_enter_rt_sigprocmask [Tracepoint event] syscalls:sys_enter_rt_sigqueueinfo [Tracepoint event] syscalls:sys_enter_rt_sigreturn [Tracepoint event] syscalls:sys_enter_rt_sigsuspend [Tracepoint event] syscalls:sys_enter_rt_sigtimedwait [Tracepoint event] syscalls:sys_enter_rt_tgsigqueueinfo [Tracepoint event] syscalls:sys_enter_sched_get_priority_max [Tracepoint event] syscalls:sys_enter_sched_get_priority_min [Tracepoint event] syscalls:sys_enter_sched_getaffinity [Tracepoint event] syscalls:sys_enter_sched_getattr [Tracepoint event] syscalls:sys_enter_sched_getparam [Tracepoint event] syscalls:sys_enter_sched_getscheduler [Tracepoint event] syscalls:sys_enter_sched_rr_get_interval [Tracepoint event] syscalls:sys_enter_sched_setaffinity [Tracepoint event] syscalls:sys_enter_sched_setattr [Tracepoint event] syscalls:sys_enter_sched_setparam [Tracepoint event] syscalls:sys_enter_sched_setscheduler [Tracepoint event] syscalls:sys_enter_sched_yield [Tracepoint event] syscalls:sys_enter_seccomp [Tracepoint event] syscalls:sys_enter_select [Tracepoint event] syscalls:sys_enter_semctl [Tracepoint event] syscalls:sys_enter_semget [Tracepoint event] syscalls:sys_enter_semop [Tracepoint event] syscalls:sys_enter_semtimedop [Tracepoint event] syscalls:sys_enter_sendfile64 [Tracepoint event] syscalls:sys_enter_sendmmsg [Tracepoint event] syscalls:sys_enter_sendmsg [Tracepoint event] syscalls:sys_enter_sendto [Tracepoint event] syscalls:sys_enter_set_mempolicy [Tracepoint event] syscalls:sys_enter_set_robust_list [Tracepoint event] syscalls:sys_enter_set_tid_address [Tracepoint event] syscalls:sys_enter_setdomainname [Tracepoint event] syscalls:sys_enter_setfsgid [Tracepoint event] syscalls:sys_enter_setfsuid [Tracepoint event] syscalls:sys_enter_setgid [Tracepoint event] syscalls:sys_enter_setgroups [Tracepoint event] syscalls:sys_enter_sethostname [Tracepoint event] syscalls:sys_enter_setitimer [Tracepoint event] syscalls:sys_enter_setns [Tracepoint event] syscalls:sys_enter_setpgid [Tracepoint event] syscalls:sys_enter_setpriority [Tracepoint event] syscalls:sys_enter_setregid [Tracepoint event] syscalls:sys_enter_setresgid [Tracepoint event] syscalls:sys_enter_setresuid [Tracepoint event] syscalls:sys_enter_setreuid [Tracepoint event] syscalls:sys_enter_setrlimit [Tracepoint event] syscalls:sys_enter_setsid [Tracepoint event] syscalls:sys_enter_setsockopt [Tracepoint event] syscalls:sys_enter_settimeofday [Tracepoint event] syscalls:sys_enter_setuid [Tracepoint event] syscalls:sys_enter_setxattr [Tracepoint event] syscalls:sys_enter_shmat [Tracepoint event] syscalls:sys_enter_shmctl [Tracepoint event] syscalls:sys_enter_shmdt [Tracepoint event] syscalls:sys_enter_shmget [Tracepoint event] syscalls:sys_enter_shutdown [Tracepoint event] syscalls:sys_enter_sigaltstack [Tracepoint event] syscalls:sys_enter_signalfd [Tracepoint event] syscalls:sys_enter_signalfd4 [Tracepoint event] syscalls:sys_enter_socket [Tracepoint event] syscalls:sys_enter_socketpair [Tracepoint event] syscalls:sys_enter_splice [Tracepoint event] syscalls:sys_enter_statfs [Tracepoint event] syscalls:sys_enter_statx [Tracepoint event] syscalls:sys_enter_swapoff [Tracepoint event] syscalls:sys_enter_swapon [Tracepoint event] syscalls:sys_enter_symlink [Tracepoint event] syscalls:sys_enter_symlinkat [Tracepoint event] syscalls:sys_enter_sync [Tracepoint event] syscalls:sys_enter_sync_file_range [Tracepoint event] syscalls:sys_enter_syncfs [Tracepoint event] syscalls:sys_enter_sysctl [Tracepoint event] syscalls:sys_enter_sysfs [Tracepoint event] syscalls:sys_enter_sysinfo [Tracepoint event] syscalls:sys_enter_syslog [Tracepoint event] syscalls:sys_enter_tee [Tracepoint event] syscalls:sys_enter_tgkill [Tracepoint event] syscalls:sys_enter_time [Tracepoint event] syscalls:sys_enter_timer_create [Tracepoint event] syscalls:sys_enter_timer_delete [Tracepoint event] syscalls:sys_enter_timer_getoverrun [Tracepoint event] syscalls:sys_enter_timer_gettime [Tracepoint event] syscalls:sys_enter_timer_settime [Tracepoint event] syscalls:sys_enter_timerfd_create [Tracepoint event] syscalls:sys_enter_timerfd_gettime [Tracepoint event] syscalls:sys_enter_timerfd_settime [Tracepoint event] syscalls:sys_enter_times [Tracepoint event] syscalls:sys_enter_tkill [Tracepoint event] syscalls:sys_enter_truncate [Tracepoint event] syscalls:sys_enter_umask [Tracepoint event] syscalls:sys_enter_umount [Tracepoint event] syscalls:sys_enter_unlink [Tracepoint event] syscalls:sys_enter_unlinkat [Tracepoint event] syscalls:sys_enter_unshare [Tracepoint event] syscalls:sys_enter_userfaultfd [Tracepoint event] syscalls:sys_enter_ustat [Tracepoint event] syscalls:sys_enter_utime [Tracepoint event] syscalls:sys_enter_utimensat [Tracepoint event] syscalls:sys_enter_utimes [Tracepoint event] syscalls:sys_enter_vfork [Tracepoint event] syscalls:sys_enter_vhangup [Tracepoint event] syscalls:sys_enter_vmsplice [Tracepoint event] syscalls:sys_enter_wait4 [Tracepoint event] syscalls:sys_enter_waitid [Tracepoint event] syscalls:sys_enter_write [Tracepoint event] syscalls:sys_enter_writev [Tracepoint event] syscalls:sys_exit_accept [Tracepoint event] syscalls:sys_exit_accept4 [Tracepoint event] syscalls:sys_exit_access [Tracepoint event] syscalls:sys_exit_acct [Tracepoint event] syscalls:sys_exit_add_key [Tracepoint event] syscalls:sys_exit_adjtimex [Tracepoint event] syscalls:sys_exit_alarm [Tracepoint event] syscalls:sys_exit_arch_prctl [Tracepoint event] syscalls:sys_exit_bind [Tracepoint event] syscalls:sys_exit_bpf [Tracepoint event] syscalls:sys_exit_brk [Tracepoint event] syscalls:sys_exit_capget [Tracepoint event] syscalls:sys_exit_capset [Tracepoint event] syscalls:sys_exit_chdir [Tracepoint event] syscalls:sys_exit_chmod [Tracepoint event] syscalls:sys_exit_chown [Tracepoint event] syscalls:sys_exit_chroot [Tracepoint event] syscalls:sys_exit_clock_adjtime [Tracepoint event] syscalls:sys_exit_clock_getres [Tracepoint event] syscalls:sys_exit_clock_gettime [Tracepoint event] syscalls:sys_exit_clock_nanosleep [Tracepoint event] syscalls:sys_exit_clock_settime [Tracepoint event] syscalls:sys_exit_clone [Tracepoint event] syscalls:sys_exit_close [Tracepoint event] syscalls:sys_exit_connect [Tracepoint event] syscalls:sys_exit_copy_file_range [Tracepoint event] syscalls:sys_exit_creat [Tracepoint event] syscalls:sys_exit_delete_module [Tracepoint event] syscalls:sys_exit_dup [Tracepoint event] syscalls:sys_exit_dup2 [Tracepoint event] syscalls:sys_exit_dup3 [Tracepoint event] syscalls:sys_exit_epoll_create [Tracepoint event] syscalls:sys_exit_epoll_create1 [Tracepoint event] syscalls:sys_exit_epoll_ctl [Tracepoint event] syscalls:sys_exit_epoll_pwait [Tracepoint event] syscalls:sys_exit_epoll_wait [Tracepoint event] syscalls:sys_exit_eventfd [Tracepoint event] syscalls:sys_exit_eventfd2 [Tracepoint event] syscalls:sys_exit_execve [Tracepoint event] syscalls:sys_exit_execveat [Tracepoint event] syscalls:sys_exit_exit [Tracepoint event] syscalls:sys_exit_exit_group [Tracepoint event] syscalls:sys_exit_faccessat [Tracepoint event] syscalls:sys_exit_fadvise64 [Tracepoint event] syscalls:sys_exit_fallocate [Tracepoint event] syscalls:sys_exit_fanotify_init [Tracepoint event] syscalls:sys_exit_fanotify_mark [Tracepoint event] syscalls:sys_exit_fchdir [Tracepoint event] syscalls:sys_exit_fchmod [Tracepoint event] syscalls:sys_exit_fchmodat [Tracepoint event] syscalls:sys_exit_fchown [Tracepoint event] syscalls:sys_exit_fchownat [Tracepoint event] syscalls:sys_exit_fcntl [Tracepoint event] syscalls:sys_exit_fdatasync [Tracepoint event] syscalls:sys_exit_fgetxattr [Tracepoint event] syscalls:sys_exit_finit_module [Tracepoint event] syscalls:sys_exit_flistxattr [Tracepoint event] syscalls:sys_exit_flock [Tracepoint event] syscalls:sys_exit_fork [Tracepoint event] syscalls:sys_exit_fremovexattr [Tracepoint event] syscalls:sys_exit_fsetxattr [Tracepoint event] syscalls:sys_exit_fstatfs [Tracepoint event] syscalls:sys_exit_fsync [Tracepoint event] syscalls:sys_exit_ftruncate [Tracepoint event] syscalls:sys_exit_futex [Tracepoint event] syscalls:sys_exit_futimesat [Tracepoint event] syscalls:sys_exit_get_mempolicy [Tracepoint event] syscalls:sys_exit_get_robust_list [Tracepoint event] syscalls:sys_exit_getcpu [Tracepoint event] syscalls:sys_exit_getcwd [Tracepoint event] syscalls:sys_exit_getdents [Tracepoint event] syscalls:sys_exit_getdents64 [Tracepoint event] syscalls:sys_exit_getegid [Tracepoint event] syscalls:sys_exit_geteuid [Tracepoint event] syscalls:sys_exit_getgid [Tracepoint event] syscalls:sys_exit_getgroups [Tracepoint event] syscalls:sys_exit_getitimer [Tracepoint event] syscalls:sys_exit_getpeername [Tracepoint event] syscalls:sys_exit_getpgid [Tracepoint event] syscalls:sys_exit_getpgrp [Tracepoint event] syscalls:sys_exit_getpid [Tracepoint event] syscalls:sys_exit_getppid [Tracepoint event] syscalls:sys_exit_getpriority [Tracepoint event] syscalls:sys_exit_getrandom [Tracepoint event] syscalls:sys_exit_getresgid [Tracepoint event] syscalls:sys_exit_getresuid [Tracepoint event] syscalls:sys_exit_getrlimit [Tracepoint event] syscalls:sys_exit_getrusage [Tracepoint event] syscalls:sys_exit_getsid [Tracepoint event] syscalls:sys_exit_getsockname [Tracepoint event] syscalls:sys_exit_getsockopt [Tracepoint event] syscalls:sys_exit_gettid [Tracepoint event] syscalls:sys_exit_gettimeofday [Tracepoint event] syscalls:sys_exit_getuid [Tracepoint event] syscalls:sys_exit_getxattr [Tracepoint event] syscalls:sys_exit_init_module [Tracepoint event] syscalls:sys_exit_inotify_add_watch [Tracepoint event] syscalls:sys_exit_inotify_init [Tracepoint event] syscalls:sys_exit_inotify_init1 [Tracepoint event] syscalls:sys_exit_inotify_rm_watch [Tracepoint event] syscalls:sys_exit_io_cancel [Tracepoint event] syscalls:sys_exit_io_destroy [Tracepoint event] syscalls:sys_exit_io_getevents [Tracepoint event] syscalls:sys_exit_io_pgetevents [Tracepoint event] syscalls:sys_exit_io_setup [Tracepoint event] syscalls:sys_exit_io_submit [Tracepoint event] syscalls:sys_exit_ioctl [Tracepoint event] syscalls:sys_exit_ioperm [Tracepoint event] syscalls:sys_exit_iopl [Tracepoint event] syscalls:sys_exit_ioprio_get [Tracepoint event] syscalls:sys_exit_ioprio_set [Tracepoint event] syscalls:sys_exit_kcmp [Tracepoint event] syscalls:sys_exit_kexec_file_load [Tracepoint event] syscalls:sys_exit_kexec_load [Tracepoint event] syscalls:sys_exit_keyctl [Tracepoint event] syscalls:sys_exit_kill [Tracepoint event] syscalls:sys_exit_lchown [Tracepoint event] syscalls:sys_exit_lgetxattr [Tracepoint event] syscalls:sys_exit_link [Tracepoint event] syscalls:sys_exit_linkat [Tracepoint event] syscalls:sys_exit_listen [Tracepoint event] syscalls:sys_exit_listxattr [Tracepoint event] syscalls:sys_exit_llistxattr [Tracepoint event] syscalls:sys_exit_lookup_dcookie [Tracepoint event] syscalls:sys_exit_lremovexattr [Tracepoint event] syscalls:sys_exit_lseek [Tracepoint event] syscalls:sys_exit_lsetxattr [Tracepoint event] syscalls:sys_exit_madvise [Tracepoint event] syscalls:sys_exit_mbind [Tracepoint event] syscalls:sys_exit_membarrier [Tracepoint event] syscalls:sys_exit_memfd_create [Tracepoint event] syscalls:sys_exit_migrate_pages [Tracepoint event] syscalls:sys_exit_mincore [Tracepoint event] syscalls:sys_exit_mkdir [Tracepoint event] syscalls:sys_exit_mkdirat [Tracepoint event] syscalls:sys_exit_mknod [Tracepoint event] syscalls:sys_exit_mknodat [Tracepoint event] syscalls:sys_exit_mlock [Tracepoint event] syscalls:sys_exit_mlock2 [Tracepoint event] syscalls:sys_exit_mlockall [Tracepoint event] syscalls:sys_exit_mmap [Tracepoint event] syscalls:sys_exit_modify_ldt [Tracepoint event] syscalls:sys_exit_mount [Tracepoint event] syscalls:sys_exit_move_pages [Tracepoint event] syscalls:sys_exit_mprotect [Tracepoint event] syscalls:sys_exit_mq_getsetattr [Tracepoint event] syscalls:sys_exit_mq_notify [Tracepoint event] syscalls:sys_exit_mq_open [Tracepoint event] syscalls:sys_exit_mq_timedreceive [Tracepoint event] syscalls:sys_exit_mq_timedsend [Tracepoint event] syscalls:sys_exit_mq_unlink [Tracepoint event] syscalls:sys_exit_mremap [Tracepoint event] syscalls:sys_exit_msgctl [Tracepoint event] syscalls:sys_exit_msgget [Tracepoint event] syscalls:sys_exit_msgrcv [Tracepoint event] syscalls:sys_exit_msgsnd [Tracepoint event] syscalls:sys_exit_msync [Tracepoint event] syscalls:sys_exit_munlock [Tracepoint event] syscalls:sys_exit_munlockall [Tracepoint event] syscalls:sys_exit_munmap [Tracepoint event] syscalls:sys_exit_name_to_handle_at [Tracepoint event] syscalls:sys_exit_nanosleep [Tracepoint event] syscalls:sys_exit_newfstat [Tracepoint event] syscalls:sys_exit_newfstatat [Tracepoint event] syscalls:sys_exit_newlstat [Tracepoint event] syscalls:sys_exit_newstat [Tracepoint event] syscalls:sys_exit_newuname [Tracepoint event] syscalls:sys_exit_open [Tracepoint event] syscalls:sys_exit_open_by_handle_at [Tracepoint event] syscalls:sys_exit_openat [Tracepoint event] syscalls:sys_exit_pause [Tracepoint event] syscalls:sys_exit_perf_event_open [Tracepoint event] syscalls:sys_exit_personality [Tracepoint event] syscalls:sys_exit_pipe [Tracepoint event] syscalls:sys_exit_pipe2 [Tracepoint event] syscalls:sys_exit_pivot_root [Tracepoint event] syscalls:sys_exit_pkey_alloc [Tracepoint event] syscalls:sys_exit_pkey_free [Tracepoint event] syscalls:sys_exit_pkey_mprotect [Tracepoint event] syscalls:sys_exit_poll [Tracepoint event] syscalls:sys_exit_ppoll [Tracepoint event] syscalls:sys_exit_prctl [Tracepoint event] syscalls:sys_exit_pread64 [Tracepoint event] syscalls:sys_exit_preadv [Tracepoint event] syscalls:sys_exit_preadv2 [Tracepoint event] syscalls:sys_exit_prlimit64 [Tracepoint event] syscalls:sys_exit_process_vm_readv [Tracepoint event] syscalls:sys_exit_process_vm_writev [Tracepoint event] syscalls:sys_exit_pselect6 [Tracepoint event] syscalls:sys_exit_ptrace [Tracepoint event] syscalls:sys_exit_pwrite64 [Tracepoint event] syscalls:sys_exit_pwritev [Tracepoint event] syscalls:sys_exit_pwritev2 [Tracepoint event] syscalls:sys_exit_quotactl [Tracepoint event] syscalls:sys_exit_read [Tracepoint event] syscalls:sys_exit_readahead [Tracepoint event] syscalls:sys_exit_readlink [Tracepoint event] syscalls:sys_exit_readlinkat [Tracepoint event] syscalls:sys_exit_readv [Tracepoint event] syscalls:sys_exit_reboot [Tracepoint event] syscalls:sys_exit_recvfrom [Tracepoint event] syscalls:sys_exit_recvmmsg [Tracepoint event] syscalls:sys_exit_recvmsg [Tracepoint event] syscalls:sys_exit_remap_file_pages [Tracepoint event] syscalls:sys_exit_removexattr [Tracepoint event] syscalls:sys_exit_rename [Tracepoint event] syscalls:sys_exit_renameat [Tracepoint event] syscalls:sys_exit_renameat2 [Tracepoint event] syscalls:sys_exit_request_key [Tracepoint event] syscalls:sys_exit_restart_syscall [Tracepoint event] syscalls:sys_exit_rmdir [Tracepoint event] syscalls:sys_exit_rseq [Tracepoint event] syscalls:sys_exit_rt_sigaction [Tracepoint event] syscalls:sys_exit_rt_sigpending [Tracepoint event] syscalls:sys_exit_rt_sigprocmask [Tracepoint event] syscalls:sys_exit_rt_sigqueueinfo [Tracepoint event] syscalls:sys_exit_rt_sigreturn [Tracepoint event] syscalls:sys_exit_rt_sigsuspend [Tracepoint event] syscalls:sys_exit_rt_sigtimedwait [Tracepoint event] syscalls:sys_exit_rt_tgsigqueueinfo [Tracepoint event] syscalls:sys_exit_sched_get_priority_max [Tracepoint event] syscalls:sys_exit_sched_get_priority_min [Tracepoint event] syscalls:sys_exit_sched_getaffinity [Tracepoint event] syscalls:sys_exit_sched_getattr [Tracepoint event] syscalls:sys_exit_sched_getparam [Tracepoint event] syscalls:sys_exit_sched_getscheduler [Tracepoint event] syscalls:sys_exit_sched_rr_get_interval [Tracepoint event] syscalls:sys_exit_sched_setaffinity [Tracepoint event] syscalls:sys_exit_sched_setattr [Tracepoint event] syscalls:sys_exit_sched_setparam [Tracepoint event] syscalls:sys_exit_sched_setscheduler [Tracepoint event] syscalls:sys_exit_sched_yield [Tracepoint event] syscalls:sys_exit_seccomp [Tracepoint event] syscalls:sys_exit_select [Tracepoint event] syscalls:sys_exit_semctl [Tracepoint event] syscalls:sys_exit_semget [Tracepoint event] syscalls:sys_exit_semop [Tracepoint event] syscalls:sys_exit_semtimedop [Tracepoint event] syscalls:sys_exit_sendfile64 [Tracepoint event] syscalls:sys_exit_sendmmsg [Tracepoint event] syscalls:sys_exit_sendmsg [Tracepoint event] syscalls:sys_exit_sendto [Tracepoint event] syscalls:sys_exit_set_mempolicy [Tracepoint event] syscalls:sys_exit_set_robust_list [Tracepoint event] syscalls:sys_exit_set_tid_address [Tracepoint event] syscalls:sys_exit_setdomainname [Tracepoint event] syscalls:sys_exit_setfsgid [Tracepoint event] syscalls:sys_exit_setfsuid [Tracepoint event] syscalls:sys_exit_setgid [Tracepoint event] syscalls:sys_exit_setgroups [Tracepoint event] syscalls:sys_exit_sethostname [Tracepoint event] syscalls:sys_exit_setitimer [Tracepoint event] syscalls:sys_exit_setns [Tracepoint event] syscalls:sys_exit_setpgid [Tracepoint event] syscalls:sys_exit_setpriority [Tracepoint event] syscalls:sys_exit_setregid [Tracepoint event] syscalls:sys_exit_setresgid [Tracepoint event] syscalls:sys_exit_setresuid [Tracepoint event] syscalls:sys_exit_setreuid [Tracepoint event] syscalls:sys_exit_setrlimit [Tracepoint event] syscalls:sys_exit_setsid [Tracepoint event] syscalls:sys_exit_setsockopt [Tracepoint event] syscalls:sys_exit_settimeofday [Tracepoint event] syscalls:sys_exit_setuid [Tracepoint event] syscalls:sys_exit_setxattr [Tracepoint event] syscalls:sys_exit_shmat [Tracepoint event] syscalls:sys_exit_shmctl [Tracepoint event] syscalls:sys_exit_shmdt [Tracepoint event] syscalls:sys_exit_shmget [Tracepoint event] syscalls:sys_exit_shutdown [Tracepoint event] syscalls:sys_exit_sigaltstack [Tracepoint event] syscalls:sys_exit_signalfd [Tracepoint event] syscalls:sys_exit_signalfd4 [Tracepoint event] syscalls:sys_exit_socket [Tracepoint event] syscalls:sys_exit_socketpair [Tracepoint event] syscalls:sys_exit_splice [Tracepoint event] syscalls:sys_exit_statfs [Tracepoint event] syscalls:sys_exit_statx [Tracepoint event] syscalls:sys_exit_swapoff [Tracepoint event] syscalls:sys_exit_swapon [Tracepoint event] syscalls:sys_exit_symlink [Tracepoint event] syscalls:sys_exit_symlinkat [Tracepoint event] syscalls:sys_exit_sync [Tracepoint event] syscalls:sys_exit_sync_file_range [Tracepoint event] syscalls:sys_exit_syncfs [Tracepoint event] syscalls:sys_exit_sysctl [Tracepoint event] syscalls:sys_exit_sysfs [Tracepoint event] syscalls:sys_exit_sysinfo [Tracepoint event] syscalls:sys_exit_syslog [Tracepoint event] syscalls:sys_exit_tee [Tracepoint event] syscalls:sys_exit_tgkill [Tracepoint event] syscalls:sys_exit_time [Tracepoint event] syscalls:sys_exit_timer_create [Tracepoint event] syscalls:sys_exit_timer_delete [Tracepoint event] syscalls:sys_exit_timer_getoverrun [Tracepoint event] syscalls:sys_exit_timer_gettime [Tracepoint event] syscalls:sys_exit_timer_settime [Tracepoint event] syscalls:sys_exit_timerfd_create [Tracepoint event] syscalls:sys_exit_timerfd_gettime [Tracepoint event] syscalls:sys_exit_timerfd_settime [Tracepoint event] syscalls:sys_exit_times [Tracepoint event] syscalls:sys_exit_tkill [Tracepoint event] syscalls:sys_exit_truncate [Tracepoint event] syscalls:sys_exit_umask [Tracepoint event] syscalls:sys_exit_umount [Tracepoint event] syscalls:sys_exit_unlink [Tracepoint event] syscalls:sys_exit_unlinkat [Tracepoint event] syscalls:sys_exit_unshare [Tracepoint event] syscalls:sys_exit_userfaultfd [Tracepoint event] syscalls:sys_exit_ustat [Tracepoint event] syscalls:sys_exit_utime [Tracepoint event] syscalls:sys_exit_utimensat [Tracepoint event] syscalls:sys_exit_utimes [Tracepoint event] syscalls:sys_exit_vfork [Tracepoint event] syscalls:sys_exit_vhangup [Tracepoint event] syscalls:sys_exit_vmsplice [Tracepoint event] syscalls:sys_exit_wait4 [Tracepoint event] syscalls:sys_exit_waitid [Tracepoint event] syscalls:sys_exit_write [Tracepoint event] syscalls:sys_exit_writev [Tracepoint event]
最新发布
11-21
### 解决`perf stat -e syscalls:sys_enter`错误的办法 - **挂载`debugfs`**:`perf`依赖于内核调试文件系统`debugfs`,若未挂载,会出现文件找不到的错误。可使用以下命令挂载`debugfs`: ```bash mount -t debugfs none /sys/kernel/debug ``` - **检查内核配置**:确保内核已启用必要的配置选项,如`CONFIG_PERF_EVENTS`和`CONFIG_DEBUG_FS`。可通过以下命令检查内核配置文件: ```bash zcat /proc/config.gz | grep CONFIG_PERF_EVENTS zcat /proc/config.gz | grep CONFIG_DEBUG_FS ``` 若未启用,需重新编译内核并启用这些选项。 - **检查`perf`版本**:旧版本的`perf`可能不支持`syscalls:sys_enter`事件。可尝试更新`perf`到最新版本。不同发行版更新命令不同,以Ubuntu为例: ```bash sudo apt-get update sudo apt-get install linux-tools-generic ``` - **检查权限**:确保当前用户有足够的权限访问`debugfs`和执行`perf`命令。可尝试以`root`用户身份运行命令: ```bash sudo perf stat -e syscalls:sys_enter ``` - **检查内核兼容性**:确保`perf`版本与内核版本兼容。不兼容可能导致事件无法识别。可通过以下命令查看内核版本: ```bash uname -r ``` 并根据内核版本选择合适的`perf`工具。 - **检查事件名称**:确认事件名称是否正确。不同内核版本,事件名称可能有所不同。可使用以下命令列出所有可用的事件: ```bash perf list ``` ### `syscalls`相关跟踪点事件含义、用途和使用方法 #### 含义 `syscalls`相关跟踪点事件用于跟踪系统调用的进入和退出。例如,`syscalls:sys_enter_*`表示系统调用进入时触发的事件,`syscalls:sys_exit_*`表示系统调用退出时触发的事件。以`syscalls:sys_enter_open`为例,它会在进程调用`open`系统调用进入时触发。 #### 用途 - **性能分析**:通过跟踪系统调用的频率和时间,分析程序或系统的性能瓶颈。例如,若某个程序频繁调用`open`系统调用,可能存在文件操作过于频繁的问题。 - **调试**:监控系统调用的参数和返回值,帮助定位程序的异常行为。 #### 使用方法 使用`perf stat`命令可以统计特定系统调用事件的发生次数。例如,统计`sys_enter_*`相关系统调用事件: ```bash perf stat -e 'syscalls:sys_enter_*' dd if=/dev/zero of=/dev/null bs=512 count=10000k ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值