zoukankan      html  css  js  c++  java
  • 【一】 sched.h

    第一个数据结构体是 task_struct ,这个数据结构被内核用来表示进程,包含其所有信息。

    定义于文件 include/linux/sched.h 中,先看看其完整定义

      1 struct task_struct {
      2     volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */
      3     void *stack;
      4     atomic_t usage;
      5     unsigned int flags;    /* per process flags, defined below */
      6     unsigned int ptrace;
      7 
      8 #ifdef CONFIG_SMP
      9     struct llist_node wake_entry;
     10     int on_cpu;
     11 #endif
     12     int on_rq;
     13 
     14     int prio, static_prio, normal_prio;
     15     unsigned int rt_priority;
     16     const struct sched_class *sched_class;
     17     struct sched_entity se;
     18     struct sched_rt_entity rt;
     19 #ifdef CONFIG_CGROUP_SCHED
     20     struct task_group *sched_task_group;
     21 #endif
     22 
     23 #ifdef CONFIG_PREEMPT_NOTIFIERS
     24     /* list of struct preempt_notifier: */
     25     struct hlist_head preempt_notifiers;
     26 #endif
     27 
     28     /*
     29      * fpu_counter contains the number of consecutive context switches
     30      * that the FPU is used. If this is over a threshold, the lazy fpu
     31      * saving becomes unlazy to save the trap. This is an unsigned char
     32      * so that after 256 times the counter wraps and the behavior turns
     33      * lazy again; this to deal with bursty apps that only use FPU for
     34      * a short time
     35      */
     36     unsigned char fpu_counter;
     37 #ifdef CONFIG_BLK_DEV_IO_TRACE
     38     unsigned int btrace_seq;
     39 #endif
     40 
     41     unsigned int policy;
     42     int nr_cpus_allowed;
     43     cpumask_t cpus_allowed;
     44 
     45 #ifdef CONFIG_PREEMPT_RCU
     46     int rcu_read_lock_nesting;
     47     char rcu_read_unlock_special;
     48     struct list_head rcu_node_entry;
     49 #endif /* #ifdef CONFIG_PREEMPT_RCU */
     50 #ifdef CONFIG_TREE_PREEMPT_RCU
     51     struct rcu_node *rcu_blocked_node;
     52 #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */
     53 #ifdef CONFIG_RCU_BOOST
     54     struct rt_mutex *rcu_boost_mutex;
     55 #endif /* #ifdef CONFIG_RCU_BOOST */
     56 
     57 #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT)
     58     struct sched_info sched_info;
     59 #endif
     60 
     61     struct list_head tasks;
     62 #ifdef CONFIG_SMP
     63     struct plist_node pushable_tasks;
     64 #endif
     65 
     66     struct mm_struct *mm, *active_mm;
     67 #ifdef CONFIG_COMPAT_BRK
     68     unsigned brk_randomized:1;
     69 #endif
     70 #if defined(SPLIT_RSS_COUNTING)
     71     struct task_rss_stat    rss_stat;
     72 #endif
     73 /* task state */
     74     int exit_state;
     75     int exit_code, exit_signal;
     76     int pdeath_signal;  /*  The signal sent when the parent dies  */
     77     unsigned int jobctl;    /* JOBCTL_*, siglock protected */
     78 
     79     /* Used for emulating ABI behavior of previous Linux versions */
     80     unsigned int personality;
     81 
     82     unsigned did_exec:1;
     83     unsigned in_execve:1;    /* Tell the LSMs that the process is doing an
     84                  * execve */
     85     unsigned in_iowait:1;
     86 
     87     /* Revert to default priority/policy when forking */
     88     unsigned sched_reset_on_fork:1;
     89     unsigned sched_contributes_to_load:1;
     90 
     91     unsigned long atomic_flags; /* Flags needing atomic access. */
     92 
     93     pid_t pid;
     94     pid_t tgid;
     95 
     96 #ifdef CONFIG_CC_STACKPROTECTOR
     97     /* Canary value for the -fstack-protector gcc feature */
     98     unsigned long stack_canary;
     99 #endif
    100     /*
    101      * pointers to (original) parent process, youngest child, younger sibling,
    102      * older sibling, respectively.  (p->father can be replaced with
    103      * p->real_parent->pid)
    104      */
    105     struct task_struct __rcu *real_parent; /* real parent process */
    106     struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */
    107     /*
    108      * children/sibling forms the list of my natural children
    109      */
    110     struct list_head children;    /* list of my children */
    111     struct list_head sibling;    /* linkage in my parent's children list */
    112     struct task_struct *group_leader;    /* threadgroup leader */
    113 
    114 #ifdef CONFIG_MTK_SCHED_CMP_TGS
    115     raw_spinlock_t thread_group_info_lock;
    116     struct thread_group_info_t thread_group_info[NUM_CLUSTER];
    117 #endif
    118 
    119     /*
    120      * ptraced is the list of tasks this task is using ptrace on.
    121      * This includes both natural children and PTRACE_ATTACH targets.
    122      * p->ptrace_entry is p's link on the p->parent->ptraced list.
    123      */
    124     struct list_head ptraced;
    125     struct list_head ptrace_entry;
    126 
    127     /* PID/PID hash table linkage. */
    128     struct pid_link pids[PIDTYPE_MAX];
    129     struct list_head thread_group;
    130     struct list_head thread_node;
    131 
    132     struct completion *vfork_done;        /* for vfork() */
    133     int __user *set_child_tid;        /* CLONE_CHILD_SETTID */
    134     int __user *clear_child_tid;        /* CLONE_CHILD_CLEARTID */
    135 
    136     cputime_t utime, stime, utimescaled, stimescaled;
    137     cputime_t gtime;
    138 #ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
    139     struct cputime prev_cputime;
    140 #endif
    141 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
    142     seqlock_t vtime_seqlock;
    143     unsigned long long vtime_snap;
    144     enum {
    145         VTIME_SLEEPING = 0,
    146         VTIME_USER,
    147         VTIME_SYS,
    148     } vtime_snap_whence;
    149 #endif
    150     unsigned long nvcsw, nivcsw; /* context switch counts */
    151     struct timespec start_time;         /* monotonic time */
    152     struct timespec real_start_time;    /* boot based time */
    153 /* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */
    154     unsigned long min_flt, maj_flt;
    155 /* for thrashing accounting */
    156 #ifdef CONFIG_ZRAM
    157     unsigned long fm_flt, swap_in, swap_out;
    158 #endif
    159 
    160     struct task_cputime cputime_expires;
    161     struct list_head cpu_timers[3];
    162 
    163 /* process credentials */
    164     const struct cred __rcu *real_cred; /* objective and real subjective task
    165                      * credentials (COW) */
    166     const struct cred __rcu *cred;    /* effective (overridable) subjective task
    167                      * credentials (COW) */
    168     char comm[TASK_COMM_LEN]; /* executable name excluding path
    169                      - access with [gs]et_task_comm (which lock
    170                        it with task_lock())
    171                      - initialized normally by setup_new_exec */
    172 /* file system info */
    173     int link_count, total_link_count;
    174 #ifdef CONFIG_SYSVIPC
    175 /* ipc stuff */
    176     struct sysv_sem sysvsem;
    177 #endif
    178 #ifdef CONFIG_DETECT_HUNG_TASK
    179 /* hung task detection */
    180     unsigned long last_switch_count;
    181 #endif
    182 /* CPU-specific state of this task */
    183     struct thread_struct thread;
    184 /* filesystem information */
    185     struct fs_struct *fs;
    186 /* open file information */
    187     struct files_struct *files;
    188 /* namespaces */
    189     struct nsproxy *nsproxy;
    190 /* signal handlers */
    191     struct signal_struct *signal;
    192     struct sighand_struct *sighand;
    193 
    194     sigset_t blocked, real_blocked;
    195     sigset_t saved_sigmask;    /* restored if set_restore_sigmask() was used */
    196     struct sigpending pending;
    197 
    198     unsigned long sas_ss_sp;
    199     size_t sas_ss_size;
    200     int (*notifier)(void *priv);
    201     void *notifier_data;
    202     sigset_t *notifier_mask;
    203     struct callback_head *task_works;
    204 
    205     struct audit_context *audit_context;
    206 #ifdef CONFIG_AUDITSYSCALL
    207     kuid_t loginuid;
    208     unsigned int sessionid;
    209 #endif
    210     struct seccomp seccomp;
    211 
    212 /* Thread group tracking */
    213        u32 parent_exec_id;
    214        u32 self_exec_id;
    215 /* Protection of (de-)allocation: mm, files, fs, tty, keyrings, mems_allowed,
    216  * mempolicy */
    217     spinlock_t alloc_lock;
    218 
    219     /* Protection of the PI data structures: */
    220     raw_spinlock_t pi_lock;
    221 
    222 #ifdef CONFIG_RT_MUTEXES
    223     /* PI waiters blocked on a rt_mutex held by this task */
    224     struct plist_head pi_waiters;
    225     /* Deadlock detection and priority inheritance handling */
    226     struct rt_mutex_waiter *pi_blocked_on;
    227 #endif
    228 
    229 #ifdef CONFIG_DEBUG_MUTEXES
    230     /* mutex deadlock detection */
    231     struct mutex_waiter *blocked_on;
    232 #endif
    233 #ifdef CONFIG_TRACE_IRQFLAGS
    234     unsigned int irq_events;
    235     unsigned long hardirq_enable_ip;
    236     unsigned long hardirq_disable_ip;
    237     unsigned int hardirq_enable_event;
    238     unsigned int hardirq_disable_event;
    239     int hardirqs_enabled;
    240     int hardirq_context;
    241     unsigned long softirq_disable_ip;
    242     unsigned long softirq_enable_ip;
    243     unsigned int softirq_disable_event;
    244     unsigned int softirq_enable_event;
    245     int softirqs_enabled;
    246     int softirq_context;
    247 #endif
    248 #ifdef CONFIG_LOCKDEP
    249 # define MAX_LOCK_DEPTH 48UL
    250     u64 curr_chain_key;
    251     int lockdep_depth;
    252     unsigned int lockdep_recursion;
    253     struct held_lock held_locks[MAX_LOCK_DEPTH];
    254     gfp_t lockdep_reclaim_gfp;
    255 #endif
    256 
    257 /* journalling filesystem info */
    258     void *journal_info;
    259 
    260 /* stacked block device info */
    261     struct bio_list *bio_list;
    262 
    263 #ifdef CONFIG_BLOCK
    264 /* stack plugging */
    265     struct blk_plug *plug;
    266 #endif
    267 
    268 /* VM state */
    269     struct reclaim_state *reclaim_state;
    270 
    271     struct backing_dev_info *backing_dev_info;
    272 
    273     struct io_context *io_context;
    274 
    275     unsigned long ptrace_message;
    276     siginfo_t *last_siginfo; /* For ptrace use.  */
    277     struct task_io_accounting ioac;
    278 #if defined(CONFIG_TASK_XACCT)
    279     u64 acct_rss_mem1;    /* accumulated rss usage */
    280     u64 acct_vm_mem1;    /* accumulated virtual memory usage */
    281     cputime_t acct_timexpd;    /* stime + utime since last update */
    282 #endif
    283 #ifdef CONFIG_CPUSETS
    284     nodemask_t mems_allowed;    /* Protected by alloc_lock */
    285     seqcount_t mems_allowed_seq;    /* Seqence no to catch updates */
    286     int cpuset_mem_spread_rotor;
    287     int cpuset_slab_spread_rotor;
    288 #endif
    289 #ifdef CONFIG_CGROUPS
    290     /* Control Group info protected by css_set_lock */
    291     struct css_set __rcu *cgroups;
    292     /* cg_list protected by css_set_lock and tsk->alloc_lock */
    293     struct list_head cg_list;
    294 #endif
    295 #ifdef CONFIG_FUTEX
    296     struct robust_list_head __user *robust_list;
    297 #ifdef CONFIG_COMPAT
    298     struct compat_robust_list_head __user *compat_robust_list;
    299 #endif
    300     struct list_head pi_state_list;
    301     struct futex_pi_state *pi_state_cache;
    302 #endif
    303 #ifdef CONFIG_PERF_EVENTS
    304     struct perf_event_context *perf_event_ctxp[perf_nr_task_contexts];
    305     struct mutex perf_event_mutex;
    306     struct list_head perf_event_list;
    307 #endif
    308 #ifdef CONFIG_NUMA
    309     struct mempolicy *mempolicy;    /* Protected by alloc_lock */
    310     short il_next;
    311     short pref_node_fork;
    312 #endif
    313 #ifdef CONFIG_NUMA_BALANCING
    314     int numa_scan_seq;
    315     int numa_migrate_seq;
    316     unsigned int numa_scan_period;
    317     u64 node_stamp;            /* migration stamp  */
    318     struct callback_head numa_work;
    319 #endif /* CONFIG_NUMA_BALANCING */
    320 
    321     struct rcu_head rcu;
    322 
    323     /*
    324      * cache last used pipe for splice
    325      */
    326     struct pipe_inode_info *splice_pipe;
    327 
    328     struct page_frag task_frag;
    329 
    330 #ifdef    CONFIG_TASK_DELAY_ACCT
    331     struct task_delay_info *delays;
    332 #endif
    333 #ifdef CONFIG_FAULT_INJECTION
    334     int make_it_fail;
    335 #endif
    336     /*
    337      * when (nr_dirtied >= nr_dirtied_pause), it's time to call
    338      * balance_dirty_pages() for some dirty throttling pause
    339      */
    340     int nr_dirtied;
    341     int nr_dirtied_pause;
    342     unsigned long dirty_paused_when; /* start of a write-and-pause period */
    343 
    344 #ifdef CONFIG_LATENCYTOP
    345     int latency_record_count;
    346     struct latency_record latency_record[LT_SAVECOUNT];
    347 #endif
    348     /*
    349      * time slack values; these are used to round up poll() and
    350      * select() etc timeout values. These are in nanoseconds.
    351      */
    352     unsigned long timer_slack_ns;
    353     unsigned long default_timer_slack_ns;
    354 
    355 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
    356     /* Index of current stored address in ret_stack */
    357     int curr_ret_stack;
    358     /* Stack of return addresses for return function tracing */
    359     struct ftrace_ret_stack    *ret_stack;
    360     /* time stamp for last schedule */
    361     unsigned long long ftrace_timestamp;
    362     /*
    363      * Number of functions that haven't been traced
    364      * because of depth overrun.
    365      */
    366     atomic_t trace_overrun;
    367     /* Pause for the tracing */
    368     atomic_t tracing_graph_pause;
    369 #endif
    370 #ifdef CONFIG_TRACING
    371     /* state flags for use by tracers */
    372     unsigned long trace;
    373     /* bitmask and counter of trace recursion */
    374     unsigned long trace_recursion;
    375 #endif /* CONFIG_TRACING */
    376 #ifdef CONFIG_MEMCG /* memcg uses this to do batch job */
    377     struct memcg_batch_info {
    378         int do_batch;    /* incremented when batch uncharge started */
    379         struct mem_cgroup *memcg; /* target memcg of uncharge */
    380         unsigned long nr_pages;    /* uncharged usage */
    381         unsigned long memsw_nr_pages; /* uncharged mem+swap usage */
    382     } memcg_batch;
    383     unsigned int memcg_kmem_skip_account;
    384     struct memcg_oom_info {
    385         struct mem_cgroup *memcg;
    386         gfp_t gfp_mask;
    387         int order;
    388         unsigned int may_oom:1;
    389     } memcg_oom;
    390 #endif
    391 #ifdef CONFIG_HAVE_HW_BREAKPOINT
    392     atomic_t ptrace_bp_refcnt;
    393 #endif
    394 #ifdef CONFIG_UPROBES
    395     struct uprobe_task *utask;
    396 #endif
    397 #if defined(CONFIG_BCACHE) || defined(CONFIG_BCACHE_MODULE)
    398     unsigned int    sequential_io;
    399     unsigned int    sequential_io_avg;
    400 #endif
    401 };

    下面一个结构一个结构的看

    1.  volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ 

    当前进程的状态,由以下宏定义

     1 /*
     2  * Task state bitmask. NOTE! These bits are also
     3  * encoded in fs/proc/array.c: get_task_state().
     4  *
     5  * We have two separate sets of flags: task->state
     6  * is about runnability, while task->exit_state are
     7  * about the task exiting. Confusing, but this way
     8  * modifying one set can't modify the other one by
     9  * mistake.
    10  */
    11 #define TASK_RUNNING        0
    12 #define TASK_INTERRUPTIBLE    1
    13 #define TASK_UNINTERRUPTIBLE    2
    14 #define __TASK_STOPPED        4
    15 #define __TASK_TRACED        8
    16 /* in tsk->exit_state */
    17 #define EXIT_ZOMBIE        16
    18 #define EXIT_DEAD        32
    19 /* in tsk->state again */
    20 #define TASK_DEAD        64
    21 #define TASK_WAKEKILL        128
    22 #define TASK_WAKING        256
    23 #define TASK_PARKED        512
    24 #define TASK_STATE_MAX        1024

    宏定义还包含了exit state的状态

    还有以下组合宏,以方便使用

     1 /* Convenience macros for the sake of set_task_state */
     2 #define TASK_KILLABLE        (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
     3 #define TASK_STOPPED        (TASK_WAKEKILL | __TASK_STOPPED)
     4 #define TASK_TRACED        (TASK_WAKEKILL | __TASK_TRACED)
     5 
     6 /* Convenience macros for the sake of wake_up */
     7 #define TASK_NORMAL        (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE)
     8 #define TASK_ALL        (TASK_NORMAL | __TASK_STOPPED | __TASK_TRACED)
     9 
    10 /* get_task_state() */
    11 #define TASK_REPORT        (TASK_RUNNING | TASK_INTERRUPTIBLE | 
    12                  TASK_UNINTERRUPTIBLE | __TASK_STOPPED | 
    13                  __TASK_TRACED)

    判断task状态的宏

    1 #define task_is_traced(task)    ((task->state & __TASK_TRACED) != 0)
    2 #define task_is_stopped(task)    ((task->state & __TASK_STOPPED) != 0)
    3 #define task_is_dead(task)    ((task)->exit_state != 0)
    4 #define task_is_stopped_or_traced(task)    
    5             ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0)
    6 #define task_contributes_to_load(task)    
    7                 ((task->state & TASK_UNINTERRUPTIBLE) != 0 && 
    8                  (task->flags & PF_FROZEN) == 0)

    设置task state的宏,分为mb顺序执行版本和读写内存操作乱序执行版本

     1 #define __set_task_state(tsk, state_value)        
     2     do { (tsk)->state = (state_value); } while (0)
     3 #define set_task_state(tsk, state_value)        
     4     set_mb((tsk)->state, (state_value))
     5 
     6 /*
     7  * set_current_state() includes a barrier so that the write of current->state
     8  * is correctly serialised wrt the caller's subsequent test of whether to
     9  * actually sleep:
    10  *
    11  *    set_current_state(TASK_UNINTERRUPTIBLE);
    12  *    if (do_i_need_to_sleep())
    13  *        schedule();
    14  *
    15  * If the caller does not need such serialisation then use __set_current_state()
    16  */
    17 #define __set_current_state(state_value)            
    18     do { current->state = (state_value); } while (0)
    19 #define set_current_state(state_value)        
    20     set_mb(current->state, (state_value))

    task command名长度宏

    1 /* Task command name length */
    2 #define TASK_COMM_LEN 16

    下边这两个不知道干什么用的

    1 #define TASK_STATE_TO_CHAR_STR "RSDTtZXxKWP"
    2 
    3 extern char ___assert_task_state[1 - 2*!!(
    4         sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)];

    2.  void *stack; 

    指明进程stack地址

    3.  atomic_t usage; 

    fork里边用到,但暂时不知道作用

    4.  unsigned int flags; /* per process flags, defined below */ 

    每个进程的flag,定义如下

    /*
     * Per process flags
     */
    #define PF_EXITING    0x00000004    /* getting shut down */
    #define PF_EXITPIDONE    0x00000008    /* pi exit done on shut down */
    #define PF_VCPU        0x00000010    /* I'm a virtual CPU */
    #define PF_WQ_WORKER    0x00000020    /* I'm a workqueue worker */
    #define PF_FORKNOEXEC    0x00000040    /* forked but didn't exec */
    #define PF_MCE_PROCESS  0x00000080      /* process policy on mce errors */
    #define PF_SUPERPRIV    0x00000100    /* used super-user privileges */
    #define PF_DUMPCORE    0x00000200    /* dumped core */
    #define PF_SIGNALED    0x00000400    /* killed by a signal */
    #define PF_MEMALLOC    0x00000800    /* Allocating memory */
    #define PF_NPROC_EXCEEDED 0x00001000    /* set_user noticed that RLIMIT_NPROC was exceeded */
    #define PF_USED_MATH    0x00002000    /* if unset the fpu must be initialized before use */
    #define PF_USED_ASYNC    0x00004000    /* used async_schedule*(), used by module init */
    #define PF_NOFREEZE    0x00008000    /* this thread should not be frozen */
    #define PF_FROZEN    0x00010000    /* frozen for system suspend */
    #define PF_FSTRANS    0x00020000    /* inside a filesystem transaction */
    #define PF_KSWAPD    0x00040000    /* I am kswapd */
    #define PF_MEMALLOC_NOIO 0x00080000    /* Allocating memory without IO involved */
    #define PF_LESS_THROTTLE 0x00100000    /* Throttle me less: I clean memory */
    #define PF_KTHREAD    0x00200000    /* I am a kernel thread */
    #define PF_RANDOMIZE    0x00400000    /* randomize virtual address space */
    #define PF_SWAPWRITE    0x00800000    /* Allowed to write to swap */
    #define PF_SPREAD_PAGE    0x01000000    /* Spread page cache over cpuset */
    #define PF_SPREAD_SLAB    0x02000000    /* Spread some slab caches over cpuset */
    #define PF_NO_SETAFFINITY 0x04000000    /* Userland is not allowed to meddle with cpus_allowed */
    #define PF_MCE_EARLY    0x08000000      /* Early kill for mce process policy */
    #define PF_MEMPOLICY    0x10000000    /* Non-default NUMA mempolicy */
    #define PF_MUTEX_TESTER    0x20000000    /* Thread belongs to the rt mutex tester */
    #define PF_FREEZER_SKIP    0x40000000    /* Freezer should not count it as freezable */
    #define PF_MTKPASR    0x80000000    /* I am in MTKPASR process */

    下边的宏操作flag,mtk的定制flag和fpu的使用有关,包括了current和非current的

     1 #define task_in_mtkpasr(task)    unlikely(task->flags & PF_MTKPASR)
     2 
     3 /*
     4  * Only the _current_ task can read/write to tsk->flags, but other
     5  * tasks can access tsk->flags in readonly mode for example
     6  * with tsk_used_math (like during threaded core dumping).
     7  * There is however an exception to this rule during ptrace
     8  * or during fork: the ptracer task is allowed to write to the
     9  * child->flags of its traced child (same goes for fork, the parent
    10  * can write to the child->flags), because we're guaranteed the
    11  * child is not running and in turn not changing child->flags
    12  * at the same time the parent does it.
    13  */
    14 #define clear_stopped_child_used_math(child) do { (child)->flags &= ~PF_USED_MATH; } while (0)
    15 #define set_stopped_child_used_math(child) do { (child)->flags |= PF_USED_MATH; } while (0)
    16 #define clear_used_math() clear_stopped_child_used_math(current)
    17 #define set_used_math() set_stopped_child_used_math(current)
    18 #define conditional_stopped_child_used_math(condition, child) 
    19     do { (child)->flags &= ~PF_USED_MATH, (child)->flags |= (condition) ? PF_USED_MATH : 0; } while (0)
    20 #define conditional_used_math(condition) 
    21     conditional_stopped_child_used_math(condition, current)
    22 #define copy_to_stopped_child_used_math(child) 
    23     do { (child)->flags &= ~PF_USED_MATH, (child)->flags |= current->flags & PF_USED_MATH; } while (0)
    24 /* NOTE: this will return 0 or PF_USED_MATH, it will never return 1 */
    25 #define tsk_used_math(p) ((p)->flags & PF_USED_MATH)
    26 #define used_math() tsk_used_math(current)

    memory alloc no io相关的操作

     1 /* __GFP_IO isn't allowed if PF_MEMALLOC_NOIO is set in current->flags
     2  * __GFP_FS is also cleared as it implies __GFP_IO.
     3  */
     4 static inline gfp_t memalloc_noio_flags(gfp_t flags)
     5 {
     6     if (unlikely(current->flags & PF_MEMALLOC_NOIO))
     7         flags &= ~(__GFP_IO | __GFP_FS);
     8     return flags;
     9 }
    10 
    11 static inline unsigned int memalloc_noio_save(void)
    12 {
    13     unsigned int flags = current->flags & PF_MEMALLOC_NOIO;
    14     current->flags |= PF_MEMALLOC_NOIO;
    15     return flags;
    16 }
    17 
    18 static inline void memalloc_noio_restore(unsigned int flags)
    19 {
    20     current->flags = (current->flags & ~PF_MEMALLOC_NOIO) | flags;
    21 }

    5.  unsigned int ptrace; 

    跟ptrace相关,目前不知道怎么用

    6.

    1 #ifdef CONFIG_SMP
    2     struct llist_node wake_entry;

    被唤醒对象的linked list

    7.

    1     int on_cpu;
    2 #endif

    进程跑在哪个CPU上

    8.  int on_rq; 

    不清楚

    9. 10. 11.  int prio, static_prio, normal_prio; 

    进程的优先级

    12.  unsigned int rt_priority; 

    实时优先级

    13.  const struct sched_class *sched_class; 

    调度类别

    14.  struct sched_entity se; 

    调度实体

    15.  struct sched_rt_entity rt; 

    实时调度实体

    16.

    1 #ifdef CONFIG_CGROUP_SCHED
    2     struct task_group *sched_task_group;
    3 #endif

    调度任务组

    17.

    1 #ifdef CONFIG_PREEMPT_NOTIFIERS
    2     /* list of struct preempt_notifier: */
    3     struct hlist_head preempt_notifiers;
    4 #endif

    抢占通知hlist,MTK没定义宏 CONFIG_PREEMPT_NOTIFIERS 

    18.

    1     /*
    2      * fpu_counter contains the number of consecutive context switches
    3      * that the FPU is used. If this is over a threshold, the lazy fpu
    4      * saving becomes unlazy to save the trap. This is an unsigned char
    5      * so that after 256 times the counter wraps and the behavior turns
    6      * lazy again; this to deal with bursty apps that only use FPU for
    7      * a short time
    8      */
    9     unsigned char fpu_counter;

    不清楚

    19.

    1 #ifdef CONFIG_BLK_DEV_IO_TRACE
    2     unsigned int btrace_seq;
    3 #endif

    不清楚

    20.   unsigned int policy; 

    策略

    21.  int nr_cpus_allowed; 

    允许的CPU数量

    22.  cpumask_t cpus_allowed; 

    不清楚,类型 cpumask_t 要看

    23.

    1 #ifdef CONFIG_PREEMPT_RCU
    2     int rcu_read_lock_nesting

    rcu读锁的嵌套层数

    24.  25.

    1 char rcu_read_unlock_special;
    2     struct list_head rcu_node_entry;
    3 #endif /* #ifdef CONFIG_PREEMPT_RCU */

    不清楚

    26.

    1 #ifdef CONFIG_TREE_PREEMPT_RCU
    2     struct rcu_node *rcu_blocked_node;
    3 #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */

    不清楚

    27.

    1 #ifdef CONFIG_RCU_BOOST
    2     struct rt_mutex *rcu_boost_mutex;
    3 #endif /* #ifdef CONFIG_RCU_BOOST */

    不清楚,MTK没定义宏 CONFIG_RCU_BOOST 

    28.

    1 #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT)
    2     struct sched_info sched_info;
    3 #endif

    调度信息,宏 CONFIG_SCHEDSTATS 和 CONFIG_TASK_DELAY_ACCT 未定义

    29.  struct list_head tasks; 

    tasks列表,不知道是否为子进程列表

    30.

    1 #ifdef CONFIG_SMP
    2     struct plist_node pushable_tasks;
    3 #endif

    不清楚

    31. 32  struct mm_struct *mm, *active_mm; 

    该进程内存管理的数据结构

    33. 

    1 #ifdef CONFIG_COMPAT_BRK
    2     unsigned brk_randomized:1;
    3 #endif

    不清楚

    34.

    1 #if defined(SPLIT_RSS_COUNTING)
    2     struct task_rss_stat    rss_stat;
    3 #endif

    不清楚

    35.

    1 /* task state */
    2     int exit_state;

    进程退出时的状态

    36. 37.  int exit_code, exit_signal; 

    进程退出码和退出信号量

    38.  int pdeath_signal; /* The signal sent when the parent dies */ 

    父进程死掉的信号量

    39.  unsigned int jobctl; /* JOBCTL_*, siglock protected */ 

    job ctrl,信号锁保护

    与之相关的宏定义如下

     1 /*
     2  * task->jobctl flags
     3  */
     4 #define JOBCTL_STOP_SIGMASK    0xffff    /* signr of the last group stop */
     5 
     6 #define JOBCTL_STOP_DEQUEUED_BIT 16    /* stop signal dequeued */
     7 #define JOBCTL_STOP_PENDING_BIT    17    /* task should stop for group stop */
     8 #define JOBCTL_STOP_CONSUME_BIT    18    /* consume group stop count */
     9 #define JOBCTL_TRAP_STOP_BIT    19    /* trap for STOP */
    10 #define JOBCTL_TRAP_NOTIFY_BIT    20    /* trap for NOTIFY */
    11 #define JOBCTL_TRAPPING_BIT    21    /* switching to TRACED */
    12 #define JOBCTL_LISTENING_BIT    22    /* ptracer is listening for events */
    13 
    14 #define JOBCTL_STOP_DEQUEUED    (1 << JOBCTL_STOP_DEQUEUED_BIT)
    15 #define JOBCTL_STOP_PENDING    (1 << JOBCTL_STOP_PENDING_BIT)
    16 #define JOBCTL_STOP_CONSUME    (1 << JOBCTL_STOP_CONSUME_BIT)
    17 #define JOBCTL_TRAP_STOP    (1 << JOBCTL_TRAP_STOP_BIT)
    18 #define JOBCTL_TRAP_NOTIFY    (1 << JOBCTL_TRAP_NOTIFY_BIT)
    19 #define JOBCTL_TRAPPING        (1 << JOBCTL_TRAPPING_BIT)
    20 #define JOBCTL_LISTENING    (1 << JOBCTL_LISTENING_BIT)
    21 
    22 #define JOBCTL_TRAP_MASK    (JOBCTL_TRAP_STOP | JOBCTL_TRAP_NOTIFY)
    23 #define JOBCTL_PENDING_MASK    (JOBCTL_STOP_PENDING | JOBCTL_TRAP_MASK)

    操作函数的声明如下,具体的实现位于 kernel/signal.c 文件中

    1 extern bool task_set_jobctl_pending(struct task_struct *task,
    2                     unsigned int mask);
    3 extern void task_clear_jobctl_trapping(struct task_struct *task);
    4 extern void task_clear_jobctl_pending(struct task_struct *task,
    5                       unsigned int mask);

    40.

    1     /* Used for emulating ABI behavior of previous Linux versions */
    2     unsigned int personality;

    不清楚

    41.  unsigned did_exec:1; 

    不清楚

    42.

    1 unsigned in_execve:1;    /* Tell the LSMs that the process is doing an
    2                  * execve */

    进程在执行中

    43.  unsigned in_iowait:1; 

    进程在IO等待中

    44.

    1     /* Revert to default priority/policy when forking */
    2     unsigned sched_reset_on_fork:1;

    在fork的时候调度reset

    45.  unsigned sched_contributes_to_load:1; 

    调度对负载的影响

    46.  unsigned long atomic_flags; /* Flags needing atomic access. */ 

    需要原子操作的flag

    下边为跟此flag有关的宏和函数

     1 /* Per-process atomic flags. */
     2 #define PFA_NO_NEW_PRIVS 0x00000001    /* May not gain new privileges. */
     3 
     4 static inline bool task_no_new_privs(struct task_struct *p)
     5 {
     6     return test_bit(PFA_NO_NEW_PRIVS, &p->atomic_flags);
     7 }
     8 
     9 static inline void task_set_no_new_privs(struct task_struct *p)
    10 {
    11     set_bit(PFA_NO_NEW_PRIVS, &p->atomic_flags);
    12 }

    47.  pid_t pid; 

    进程pid

    48.  pid_t tgid; 

    threadgroup id

    49.

    1 #ifdef CONFIG_CC_STACKPROTECTOR
    2     /* Canary value for the -fstack-protector gcc feature */
    3     unsigned long stack_canary;
    4 #endif

    栈金丝雀,防止栈被篡改,宏 CONFIG_CC_STACKPROTECTOR 未定义

    50.

    1     /*
    2      * pointers to (original) parent process, youngest child, younger sibling,
    3      * older sibling, respectively.  (p->father can be replaced with
    4      * p->real_parent->pid)
    5      */
    6     struct task_struct __rcu *real_parent; /* real parent process */

    真正的父进程

    51.  struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */ 

    不清楚

    52.

    1     /*
    2      * children/sibling forms the list of my natural children
    3      */
    4     struct list_head children;    /* list of my children */

    子进程的list

    53.  struct list_head sibling; /* linkage in my parent's children list */ 

    兄弟姐妹的list

    54.  struct task_struct *group_leader; /* threadgroup leader */ 

    thread group的leader

    55. 56.

    1 #ifdef CONFIG_MTK_SCHED_CMP_TGS
    2     raw_spinlock_t thread_group_info_lock;
    3     struct thread_group_info_t thread_group_info[NUM_CLUSTER];
    4 #endif

    不清楚,宏 CONFIG_MTK_SCHED_CMP_TGS 未定义

    57. 58.

    1     /*
    2      * ptraced is the list of tasks this task is using ptrace on.
    3      * This includes both natural children and PTRACE_ATTACH targets.
    4      * p->ptrace_entry is p's link on the p->parent->ptraced list.
    5      */
    6     struct list_head ptraced;
    7     struct list_head ptrace_entry;

    不清楚

    59.

    1     /* PID/PID hash table linkage. */
    2     struct pid_link pids[PIDTYPE_MAX];

    跟进程namespace相关,不清楚

    60.    struct list_head thread_group; 

    thread group

    61.  struct list_head thread_node; 

    不清楚

    62.  struct completion *vfork_done; /* for vfork() */ 

    不清楚

    63.  struct completion *vfork_done; /* for vfork() */ 

    vfork是否完成

    64. 65.

    1     int __user *set_child_tid;        /* CLONE_CHILD_SETTID */
    2     int __user *clear_child_tid;        /* CLONE_CHILD_CLEARTID */

    不清楚

    66. 67. 68. 69. 70.

    1     cputime_t utime, stime, utimescaled, stimescaled;
    2     cputime_t gtime;

    不清楚

    71.

    1 #ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
    2     struct cputime prev_cputime;
    3 #endif

    不清楚,宏 CONFIG_VIRT_CPU_ACCOUNTING_NATIVE 未定义

    72. 73.

    1 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
    2     seqlock_t vtime_seqlock;
    3     unsigned long long vtime_snap;
    4     enum {
    5         VTIME_SLEEPING = 0,
    6         VTIME_USER,
    7         VTIME_SYS,
    8     } vtime_snap_whence;
    9 #endif

    不清楚,宏 CONFIG_VIRT_CPU_ACCOUNTING_GEN 未定义

    74. 75.

     unsigned long nvcsw, nivcsw; /* context switch counts */ 

    不清楚

    76.  struct timespec start_time; /* monotonic time */ 

    不清楚,单调时间不清楚

    77.  struct timespec real_start_time; /* boot based time */ 

    真实启动时间

    78. 79.

    1 /* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */
    2     unsigned long min_flt, maj_flt;

    不清楚

    80. 81. 82.

    1 /* for thrashing accounting */
    2 #ifdef CONFIG_ZRAM
    3     unsigned long fm_flt, swap_in, swap_out;
    4 #endif

    不清楚,宏 CONFIG_ZRAM 未定义

    83.  struct task_cputime cputime_expires; 

    cputime到期

    84.  struct list_head cpu_timers[3]; 

    不清楚

    85. 86. 87.

    1 /* process credentials */
    2     const struct cred __rcu *real_cred; /* objective and real subjective task
    3                      * credentials (COW) */
    4     const struct cred __rcu *cred;    /* effective (overridable) subjective task
    5                      * credentials (COW) */
    6     char comm[TASK_COMM_LEN]; /* executable name excluding path
    7                      - access with [gs]et_task_comm (which lock
    8                        it with task_lock())
    9                      - initialized normally by setup_new_exec */

    不清楚,什么是process credential

    88. 89.

    1 /* file system info */
    2     int link_count, total_link_count;

    link数和总共link数

    90.

    1 #ifdef CONFIG_SYSVIPC
    2 /* ipc stuff */
    3     struct sysv_sem sysvsem;
    4 #endif

    IPC相关,宏 CONFIG_SYSVIPC 未定义

    91.

    1 #ifdef CONFIG_DETECT_HUNG_TASK
    2 /* hung task detection */
    3     unsigned long last_switch_count;
    4 #endif

    task hung检测,宏 CONFIG_DETECT_HUNG_TASK 未定义

    92.

    1 /* CPU-specific state of this task */
    2     struct thread_struct thread;

    task跟cpu相关的状态

    93.

    1 /* filesystem information */
    2     struct fs_struct *fs;

    这个进程与之相关的文件系统

    94.

    1 /* open file information */
    2     struct files_struct *files;

    这个进程打开的文件

    95.

    1 /* namespaces */
    2     struct nsproxy *nsproxy;

    进程的namespace代理

    96.

    1 /* signal handlers */
    2     struct signal_struct *signal;

    进程的信号

    97.  struct sighand_struct *sighand; 

    signal handler

    98. 99. 100. 101.

    1     sigset_t blocked, real_blocked;
    2     sigset_t saved_sigmask;    /* restored if set_restore_sigmask() was used */
    3     struct sigpending pending;

    不清楚

    102.

    1     unsigned long sas_ss_sp;
    2     size_t sas_ss_size;

    不清楚

    103. 104. 105.

    1     int (*notifier)(void *priv);
    2     void *notifier_data;
    3     sigset_t *notifier_mask;

    notifier相关,不清楚具体通知什么

    106.  struct callback_head *task_works; 

    进程的回调队列

    107.  struct audit_context *audit_context; 

    不清楚

    108.

    1 #ifdef CONFIG_AUDITSYSCALL
    2     kuid_t loginuid;
    3     unsigned int sessionid;
    4 #endif

    不清楚,宏 CONFIG_AUDITSYSCALL 未定义

    109.  struct seccomp seccomp; 

    不清楚

    110. 111.

    1 /* Thread group tracking */
    2        u32 parent_exec_id;
    3        u32 self_exec_id;

    thread group中parent和self的执行id

    112.

    1 /* Protection of (de-)allocation: mm, files, fs, tty, keyrings, mems_allowed,
    2  * mempolicy */
    3     spinlock_t alloc_lock;

    mm、files、fs、tty、keyrings、mems_allowed、mempolicy分配的锁

    113.

    1     /* Protection of the PI data structures: */
    2     raw_spinlock_t pi_lock;

    pi data锁,不清楚pi是什么

    114. 115.

    1 #ifdef CONFIG_RT_MUTEXES
    2     /* PI waiters blocked on a rt_mutex held by this task */
    3     struct plist_head pi_waiters;
    4     /* Deadlock detection and priority inheritance handling */
    5     struct rt_mutex_waiter *pi_blocked_on;
    6 #endif

    不清楚,宏 CONFIG_RT_MUTEXES 有定义

    116.

    1 #ifdef CONFIG_DEBUG_MUTEXES
    2     /* mutex deadlock detection */
    3     struct mutex_waiter *blocked_on;
    4 #endif

    不清楚,宏 CONFIG_DEBUG_MUTEXES 未定义

    117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129.

     1 #ifdef CONFIG_TRACE_IRQFLAGS
     2     unsigned int irq_events;
     3     unsigned long hardirq_enable_ip;
     4     unsigned long hardirq_disable_ip;
     5     unsigned int hardirq_enable_event;
     6     unsigned int hardirq_disable_event;
     7     int hardirqs_enabled;
     8     int hardirq_context;
     9     unsigned long softirq_disable_ip;
    10     unsigned long softirq_enable_ip;
    11     unsigned int softirq_disable_event;
    12     unsigned int softirq_enable_event;
    13     int softirqs_enabled;
    14     int softirq_context;
    15 #endif

    中断跟踪,包括总的中断数、hard和soft中断的enable、disable中断数,不清楚ip是什么意思

    130. 131. 132. 133. 134.

    1 #ifdef CONFIG_LOCKDEP
    2 # define MAX_LOCK_DEPTH 48UL
    3     u64 curr_chain_key;
    4     int lockdep_depth;
    5     unsigned int lockdep_recursion;
    6     struct held_lock held_locks[MAX_LOCK_DEPTH];
    7     gfp_t lockdep_reclaim_gfp;
    8 #endif

    跟锁依赖有关,不清楚具体做什么

    135.

    1 /* journalling filesystem info */
    2     void *journal_info;

    文件系统的日志

    136.

    1 /* stacked block device info */
    2     struct bio_list *bio_list;

    被存入堆栈的block device io list

    137. 

    1 #ifdef CONFIG_BLOCK
    2 /* stack plugging */
    3     struct blk_plug *plug;
    4 #endif

    block device的插拔

    138.

    1 /* VM state */
    2     struct reclaim_state *reclaim_state;

    不清楚

    139.  struct backing_dev_info *backing_dev_info; 

    不清楚

    140.  struct io_context *io_context; 

    进程的io context

    141.  unsigned long ptrace_message; 

    ptrace message

    142.  siginfo_t *last_siginfo; /* For ptrace use. */ 

    最后的signal信息

    143.  struct task_io_accounting ioac; 

    task io计数

    144. 145. 146.

    1 #if defined(CONFIG_TASK_XACCT)
    2     u64 acct_rss_mem1;    /* accumulated rss usage */
    3     u64 acct_vm_mem1;    /* accumulated virtual memory usage */
    4     cputime_t acct_timexpd;    /* stime + utime since last update */
    5 #endif

    累积的rss memory、virtual memory、time话费,宏 CONFIG_TASK_XACCT 未定义

    147. 148. 149. 150.

    1 #ifdef CONFIG_CPUSETS
    2     nodemask_t mems_allowed;    /* Protected by alloc_lock */
    3     seqcount_t mems_allowed_seq;    /* Seqence no to catch updates */
    4     int cpuset_mem_spread_rotor;
    5     int cpuset_slab_spread_rotor;
    6 #endif

    不清楚,宏 CONFIG_CPUSETS 未定义

    151. 152.

    1 #ifdef CONFIG_CGROUPS
    2     /* Control Group info protected by css_set_lock */
    3     struct css_set __rcu *cgroups;
    4     /* cg_list protected by css_set_lock and tsk->alloc_lock */
    5     struct list_head cg_list;
    6 #endif

    css(cgroups subsys state)的cgroups和cgroup list

    153. 154. 155. 156

    1 #ifdef CONFIG_FUTEX
    2     struct robust_list_head __user *robust_list;
    3 #ifdef CONFIG_COMPAT
    4     struct compat_robust_list_head __user *compat_robust_list;
    5 #endif
    6     struct list_head pi_state_list;
    7     struct futex_pi_state *pi_state_cache;
    8 #endif

    不清楚,宏 CONFIG_FUTEX 未定义

    157. 158. 159.

    1 #ifdef CONFIG_PERF_EVENTS
    2     struct perf_event_context *perf_event_ctxp[perf_nr_task_contexts];
    3     struct mutex perf_event_mutex;
    4     struct list_head perf_event_list;
    5 #endif

    performance相关的event context数组、event mutex、event list

    160. 161. 162.

    1 #ifdef CONFIG_NUMA
    2     struct mempolicy *mempolicy;    /* Protected by alloc_lock */
    3     short il_next;
    4     short pref_node_fork;
    5 #endif

    不清楚,宏 CONFIG_NUMA (Non-uniform memory access )未定义

    163.  164. 165. 166. 167.

    1 #ifdef CONFIG_NUMA_BALANCING
    2     int numa_scan_seq;
    3     int numa_migrate_seq;
    4     unsigned int numa_scan_period;
    5     u64 node_stamp;            /* migration stamp  */
    6     struct callback_head numa_work;
    7 #endif /* CONFIG_NUMA_BALANCING */

    不清楚

    168.  struct rcu_head rcu; 

    read copy update头

    169.

    1     /*
    2      * cache last used pipe for splice
    3      */
    4     struct pipe_inode_info *splice_pipe;

    不清楚

    170.

    1     /*
    2      * cache last used pipe for splice
    3      */
    4     struct pipe_inode_info *splice_pipe;

    splice pipe的信息

    171.  struct page_frag task_frag; 

    task的page fragment

    172.

    1 #ifdef    CONFIG_TASK_DELAY_ACCT
    2     struct task_delay_info *delays;
    3 #endif

    不清楚,宏 CONFIG_TASK_DELAY_ACCT 未定义

    173.

    1 #ifdef CONFIG_FAULT_INJECTION
    2     int make_it_fail;
    3 #endif

    不清楚

    174. 175. 176.

    1     /*
    2      * when (nr_dirtied >= nr_dirtied_pause), it's time to call
    3      * balance_dirty_pages() for some dirty throttling pause
    4      */
    5     int nr_dirtied;
    6     int nr_dirtied_pause;
    7     unsigned long dirty_paused_when; /* start of a write-and-pause period */

    dirty page相关

    177. 178.

    1 #ifdef CONFIG_LATENCYTOP
    2     int latency_record_count;
    3     struct latency_record latency_record[LT_SAVECOUNT];
    4 #endif

    不清楚,宏 CONFIG_LATENCYTOP 未定义

    179. 180.

    1     /*
    2      * time slack values; these are used to round up poll() and
    3      * select() etc timeout values. These are in nanoseconds.
    4      */
    5     unsigned long timer_slack_ns;
    6     unsigned long default_timer_slack_ns;

    poll()和select()等的timeout值

    181. 182. 183. 184. 185.

     1 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
     2     /* Index of current stored address in ret_stack */
     3     int curr_ret_stack;
     4     /* Stack of return addresses for return function tracing */
     5     struct ftrace_ret_stack    *ret_stack;
     6     /* time stamp for last schedule */
     7     unsigned long long ftrace_timestamp;
     8     /*
     9      * Number of functions that haven't been traced
    10      * because of depth overrun.
    11      */
    12     atomic_t trace_overrun;
    13     /* Pause for the tracing */
    14     atomic_t tracing_graph_pause;
    15 #endif

    ftrace的图形化跟踪变量,宏 CONFIG_FUNCTION_GRAPH_TRACER 未定义

    186. 187.

    1 #ifdef CONFIG_TRACING
    2     /* state flags for use by tracers */
    3     unsigned long trace;
    4     /* bitmask and counter of trace recursion */
    5     unsigned long trace_recursion;
    6 #endif /* CONFIG_TRACING */

    trace的flag和trace递归的数量和bitmask

    188. 189. 190

     1 #ifdef CONFIG_MEMCG /* memcg uses this to do batch job */
     2     struct memcg_batch_info {
     3         int do_batch;    /* incremented when batch uncharge started */
     4         struct mem_cgroup *memcg; /* target memcg of uncharge */
     5         unsigned long nr_pages;    /* uncharged usage */
     6         unsigned long memsw_nr_pages; /* uncharged mem+swap usage */
     7     } memcg_batch;
     8     unsigned int memcg_kmem_skip_account;
     9     struct memcg_oom_info {
    10         struct mem_cgroup *memcg;
    11         gfp_t gfp_mask;
    12         int order;
    13         unsigned int may_oom:1;
    14     } memcg_oom;
    15 #endif

    不清楚,宏  CONFIG_MEMCG 未定义

    191.

    1 #ifdef CONFIG_HAVE_HW_BREAKPOINT
    2     atomic_t ptrace_bp_refcnt;
    3 #endif

    ptrace的断点引用数量

    192.

    1 #ifdef CONFIG_UPROBES
    2     struct uprobe_task *utask;
    3 #endif

    不清楚,宏 CONFIG_UPROBES 未定义

    193. 194.

    1 #if defined(CONFIG_BCACHE) || defined(CONFIG_BCACHE_MODULE)
    2     unsigned int    sequential_io;
    3     unsigned int    sequential_io_avg;
    4 #endif

    不清楚,宏 CONFIG_BCACHE 和 CONFIG_BCACHE 未定义

  • 相关阅读:
    HTML常用标签
    消息机制JMS
    一个Socket连接管理池(心跳机制)
    Java调用其他程序时waitFor()阻塞
    JDBC连接数据库
    mysql入门
    WebService到底是什么
    Netty详解
    Mongodb集群搭建
    JavaScript入门
  • 原文地址:https://www.cnblogs.com/cascle/p/4755681.html
Copyright © 2011-2022 走看看