- 浏览: 298729 次
文章分类
最新评论
-
浪子秋水:
exp导出备份数据库 报EXP-00026:指定了冲突模式 -
zm8859001:
收缩左边菜单,右边的grid表格宽度也跟着自适应宽度!这个怎么 ...
ExtJs4(5)——左边树,右边表结构 -
努力吧飞翔:
有代码例子就好了
ExtJs4(1)——一些实例 -
cwocwo:
这是要一次把所有数据都取出来?
DOJO-dojox.grid.EnhancedGrid(带刷新函数,分页工具栏,复选框,行号等功能) -
loookto:
oracle最近推出一个东西你看看
Access数据表转化成mysql数据表
本系列文章由张同浩编写,转载请注明出处:http://blog.csdn.net/muge0913/article/details/7479714
邮箱:muge0913@sina.com
在do_fork中调用了copy_process,该函数及其重要。该函数创建进程描述符和子进程需要的其他数据结构。它定义在linux2.6.xxx/kernel/fork.c。
只对关键部分进行了注释如下:
- /*
- * This creates a new process as a copy of the old one,
- * but does not actually start it yet.
- *
- * It copies the registers, and all the appropriate
- * parts of the process environment (as per the clone
- * flags). The actual kick-off is left to the caller.
- */
- /*这部分代码是在2.6.38中实现的*/
- static struct task_struct *copy_process(unsigned long clone_flags,
- unsigned long stack_start,
- struct pt_regs *regs,
- unsigned long stack_size,
- int __user *child_tidptr,
- struct pid *pid,
- int trace)
- {
- int retval;
- struct task_struct *p;//保存新的进程描述符地址
- int cgroup_callbacks_done = 0;
- /*CLONE_NEWNS和CLONE_FS是冲突的不能同时设置,否则出错*/
- if ((clone_flags & (CLONE_NEWNS|CLONE_FS)) == (CLONE_NEWNS|CLONE_FS))
- return ERR_PTR(-EINVAL);
- /*
- * Thread groups must share signals as well, and detached threads
- * can only be started up within the thread group.
- */
- /*CLONE_THREAD和CLONE_SIGHAND是冲突的不能同时设置,否则出错*/
- if ((clone_flags & CLONE_THREAD) && !(clone_flags & CLONE_SIGHAND))
- return ERR_PTR(-EINVAL);
- /*
- * Shared signal handlers imply shared VM. By way of the above,
- * thread groups also imply shared VM. Blocking this case allows
- * for various simplifications in other code.
- */
- /*CLONE_SIGHAND和CLONE_VM冲突不能同时设置。否则出错*/
- if ((clone_flags & CLONE_SIGHAND) && !(clone_flags & CLONE_VM))
- return ERR_PTR(-EINVAL);
- /*
- * Siblings of global init remain as zombies on exit since they are
- * not reaped by their parent (swapper). To solve this and to avoid
- * multi-rooted process trees, prevent global and container-inits
- * from creating siblings.
- */
- if ((clone_flags & CLONE_PARENT) &&
- current->signal->flags & SIGNAL_UNKILLABLE)
- return ERR_PTR(-EINVAL);
- /*调用系统安全框架创建进程,在配置内核时没有选择CONFIG_SECURITY,则系统安全框架函数为空*/
- retval = security_task_create(clone_flags);
- if (retval)
- goto fork_out;
- retval = -ENOMEM;
- /*来复制一份当前进程的进程描述符,为子进程描述符做准备
- *该函数为子进程创建一个新的内核栈,并分配一个新的进程描述符和thread_info结构,然后
- *把父进程的进程描述符和thread_info拷贝进去。这里是完全拷贝,子进程和父进程的描述符完全
- *相同。
- */
- p = dup_task_struct(current);
- if (!p)
- goto fork_out;
- ftrace_graph_init_task(p);
- rt_mutex_init_task(p);
- #ifdef CONFIG_PROVE_LOCKING
- DEBUG_LOCKS_WARN_ON(!p->hardirqs_enabled);
- DEBUG_LOCKS_WARN_ON(!p->softirqs_enabled);
- #endif
- /*判断是否超出了设置权限*/
- retval = -EAGAIN;
- if (atomic_read(&p->real_cred->user->processes) >=
- task_rlimit(p, RLIMIT_NPROC)) {
- if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) &&
- p->real_cred->user != INIT_USER)
- goto bad_fork_free;
- }
- retval = copy_creds(p, clone_flags);
- if (retval < 0)
- goto bad_fork_free;
- /*
- * If multiple threads are within copy_process(), then this check
- * triggers too late. This doesn't hurt, the check is only there
- * to stop root fork bombs.
- */
- /*判断线程数量是否超出系统允许范围,否则释放已经申请到的资源*/
- retval = -EAGAIN;
- if (nr_threads >= max_threads)//max_threads在kernel_fork中的fork_init中有定义。
- //系统最大进程数和系统的内存有关
- goto bad_fork_cleanup_count;
- /*下面的代码主要是对子进程的描述符初始化和复制父进程的资源给子进程*/
- /*模块引用计数操作*/
- if (!try_module_get(task_thread_info(p)->exec_domain->module))
- goto bad_fork_cleanup_count;
- /*execve系统调用数初始化为0*/
- p->did_exec = 0;
- delayacct_tsk_init(p); /* Must remain after dup_task_struct() */
- /*设置状态标记,因为目前状态表示是从父进程拷贝过来的*/
- copy_flags(clone_flags, p);
- INIT_LIST_HEAD(&p->children);
- INIT_LIST_HEAD(&p->sibling);
- rcu_copy_process(p);
- p->vfork_done = NULL;
- spin_lock_init(&p->alloc_lock);
- init_sigpending(&p->pending);
- p->utime = cputime_zero;
- p->stime = cputime_zero;
- p->gtime = cputime_zero;
- p->utimescaled = cputime_zero;
- p->stimescaled = cputime_zero;
- #ifndef CONFIG_VIRT_CPU_ACCOUNTING
- p->prev_utime = cputime_zero;
- p->prev_stime = cputime_zero;
- #endif
- #if defined(SPLIT_RSS_COUNTING)
- memset(&p->rss_stat, 0, sizeof(p->rss_stat));
- #endif
- p->default_timer_slack_ns = current->timer_slack_ns;
- task_io_accounting_init(&p->ioac);
- acct_clear_integrals(p);
- posix_cpu_timers_init(p);
- p->lock_depth = -1; /* -1 = no lock */
- do_posix_clock_monotonic_gettime(&p->start_time);
- p->real_start_time = p->start_time;
- monotonic_to_bootbased(&p->real_start_time);
- p->io_context = NULL;
- p->audit_context = NULL;
- cgroup_fork(p);
- #ifdef CONFIG_NUMA
- p->mempolicy = mpol_dup(p->mempolicy);
- if (IS_ERR(p->mempolicy)) {
- retval = PTR_ERR(p->mempolicy);
- p->mempolicy = NULL;
- goto bad_fork_cleanup_cgroup;
- }
- mpol_fix_fork_child_flag(p);
- #endif
- #ifdef CONFIG_TRACE_IRQFLAGS
- p->irq_events = 0;
- #ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW
- p->hardirqs_enabled = 1;
- #else
- p->hardirqs_enabled = 0;
- #endif
- p->hardirq_enable_ip = 0;
- p->hardirq_enable_event = 0;
- p->hardirq_disable_ip = _THIS_IP_;
- p->hardirq_disable_event = 0;
- p->softirqs_enabled = 1;
- p->softirq_enable_ip = _THIS_IP_;
- p->softirq_enable_event = 0;
- p->softirq_disable_ip = 0;
- p->softirq_disable_event = 0;
- p->hardirq_context = 0;
- p->softirq_context = 0;
- #endif
- #ifdef CONFIG_LOCKDEP
- p->lockdep_depth = 0; /* no locks held yet */
- p->curr_chain_key = 0;
- p->lockdep_recursion = 0;
- #endif
- #ifdef CONFIG_DEBUG_MUTEXES
- p->blocked_on = NULL; /* not blocked yet */
- #endif
- #ifdef CONFIG_CGROUP_MEM_RES_CTLR
- p->memcg_batch.do_batch = 0;
- p->memcg_batch.memcg = NULL;
- #endif
- /* Perform scheduler related setup. Assign this task to a CPU. */
- sched_fork(p, clone_flags);
- retval = perf_event_init_task(p);
- if (retval)
- goto bad_fork_cleanup_policy;
- if ((retval = audit_alloc(p)))
- goto bad_fork_cleanup_policy;
- /* copy all the process information */
- if ((retval = copy_semundo(clone_flags, p)))
- goto bad_fork_cleanup_audit;
- if ((retval = copy_files(clone_flags, p)))
- goto bad_fork_cleanup_semundo;
- if ((retval = copy_fs(clone_flags, p)))
- goto bad_fork_cleanup_files;
- if ((retval = copy_sighand(clone_flags, p)))
- goto bad_fork_cleanup_fs;
- if ((retval = copy_signal(clone_flags, p)))
- goto bad_fork_cleanup_sighand;
- if ((retval = copy_mm(clone_flags, p)))
- goto bad_fork_cleanup_signal;
- if ((retval = copy_namespaces(clone_flags, p)))
- goto bad_fork_cleanup_mm;
- if ((retval = copy_io(clone_flags, p)))
- goto bad_fork_cleanup_namespaces;
- retval = copy_thread(clone_flags, stack_start, stack_size, p, regs);
- if (retval)
- goto bad_fork_cleanup_io;
- if (pid != &init_struct_pid) {
- retval = -ENOMEM;
- pid = alloc_pid(p->nsproxy->pid_ns);
- if (!pid)
- goto bad_fork_cleanup_io;
- if (clone_flags & CLONE_NEWPID) {
- retval = pid_ns_prepare_proc(p->nsproxy->pid_ns);
- if (retval < 0)
- goto bad_fork_free_pid;
- }
- }
- p->pid = pid_nr(pid);
- p->tgid = p->pid;
- if (clone_flags & CLONE_THREAD)
- p->tgid = current->tgid;
- if (current->nsproxy != p->nsproxy) {
- retval = ns_cgroup_clone(p, pid);
- if (retval)
- goto bad_fork_free_pid;
- }
- p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? child_tidptr : NULL;
- /*
- * Clear TID on mm_release()?
- */
- p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? child_tidptr:
- NULL;
- #ifdef CONFIG_FUTEX
- p->robust_list = NULL;
- #ifdef CONFIG_COMPAT
- p->compat_robust_list = NULL;
- #endif
- INIT_LIST_HEAD(&p->pi_state_list);
- p->pi_state_cache = NULL;
- #endif
- /*
- * sigaltstack should be cleared when sharing the same VM
- */
- if ((clone_flags & (CLONE_VM|CLONE_VFORK)) == CLONE_VM)
- p->sas_ss_sp = p->sas_ss_size = 0;
- /*
- * Syscall tracing and stepping should be turned off in the
- * child regardless of CLONE_PTRACE.
- */
- user_disable_single_step(p);
- clear_tsk_thread_flag(p, TIF_SYSCALL_TRACE);
- #ifdef TIF_SYSCALL_EMU
- clear_tsk_thread_flag(p, TIF_SYSCALL_EMU);
- #endif
- clear_all_latency_tracing(p);
- /* ok, now we should be set up.. */
- p->exit_signal = (clone_flags & CLONE_THREAD) ? -1 : (clone_flags & CSIGNAL);
- p->pdeath_signal = 0;
- p->exit_state = 0;
- /*
- * Ok, make it visible to the rest of the system.
- * We dont wake it up yet.
- */
- p->group_leader = p;
- INIT_LIST_HEAD(&p->thread_group);
- /* Now that the task is set up, run cgroup callbacks if
- * necessary. We need to run them before the task is visible
- * on the tasklist. */
- cgroup_fork_callbacks(p);
- cgroup_callbacks_done = 1;
- /* Need tasklist lock for parent etc handling! */
- write_lock_irq(&tasklist_lock);
- /* CLONE_PARENT re-uses the old parent */
- if (clone_flags & (CLONE_PARENT|CLONE_THREAD)) {
- p->real_parent = current->real_parent;
- p->parent_exec_id = current->parent_exec_id;
- } else {
- p->real_parent = current;
- p->parent_exec_id = current->self_exec_id;
- }
- spin_lock(¤t->sighand->siglock);
- /*
- * Process group and session signals need to be delivered to just the
- * parent before the fork or both the parent and the child after the
- * fork. Restart if a signal comes in before we add the new process to
- * it's process group.
- * A fatal signal pending means that current will exit, so the new
- * thread can't slip out of an OOM kill (or normal SIGKILL).
- */
- recalc_sigpending();
- if (signal_pending(current)) {
- spin_unlock(¤t->sighand->siglock);
- write_unlock_irq(&tasklist_lock);
- retval = -ERESTARTNOINTR;
- goto bad_fork_free_pid;
- }
- if (clone_flags & CLONE_THREAD) {
- current->signal->nr_threads++;
- atomic_inc(¤t->signal->live);
- atomic_inc(¤t->signal->sigcnt);
- p->group_leader = current->group_leader;
- list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group);
- }
- if (likely(p->pid)) {
- tracehook_finish_clone(p, clone_flags, trace);
- if (thread_group_leader(p)) {
- if (clone_flags & CLONE_NEWPID)
- p->nsproxy->pid_ns->child_reaper = p;
- p->signal->leader_pid = pid;
- p->signal->tty = tty_kref_get(current->signal->tty);
- attach_pid(p, PIDTYPE_PGID, task_pgrp(current));
- attach_pid(p, PIDTYPE_SID, task_session(current));
- list_add_tail(&p->sibling, &p->real_parent->children);
- list_add_tail_rcu(&p->tasks, &init_task.tasks);
- __get_cpu_var(process_counts)++;
- }
- attach_pid(p, PIDTYPE_PID, pid);
- nr_threads++;
- }
- total_forks++;
- spin_unlock(¤t->sighand->siglock);
- write_unlock_irq(&tasklist_lock);
- proc_fork_connector(p);
- cgroup_post_fork(p);
- perf_event_fork(p);
- /*返回子进程描述符的指针*/
- return p;
- bad_fork_free_pid:
- if (pid != &init_struct_pid)
- free_pid(pid);
- bad_fork_cleanup_io:
- if (p->io_context)
- exit_io_context(p);
- bad_fork_cleanup_namespaces:
- exit_task_namespaces(p);
- bad_fork_cleanup_mm:
- if (p->mm) {
- task_lock(p);
- if (p->signal->oom_score_adj == OOM_SCORE_ADJ_MIN)
- atomic_dec(&p->mm->oom_disable_count);
- task_unlock(p);
- mmput(p->mm);
- }
- bad_fork_cleanup_signal:
- if (!(clone_flags & CLONE_THREAD))
- free_signal_struct(p->signal);
- bad_fork_cleanup_sighand:
- __cleanup_sighand(p->sighand);
- bad_fork_cleanup_fs:
- exit_fs(p); /* blocking */
- bad_fork_cleanup_files:
- exit_files(p); /* blocking */
- bad_fork_cleanup_semundo:
- exit_sem(p);
- bad_fork_cleanup_audit:
- audit_free(p);
- bad_fork_cleanup_policy:
- perf_event_free_task(p);
- #ifdef CONFIG_NUMA
- mpol_put(p->mempolicy);
- bad_fork_cleanup_cgroup:
- #endif
- cgroup_exit(p, cgroup_callbacks_done);
- delayacct_tsk_free(p);
- module_put(task_thread_info(p)->exec_domain->module);
- bad_fork_cleanup_count:
- atomic_dec(&p->cred->user->processes);
- exit_creds(p);
- bad_fork_free:
- free_task(p);
- fork_out:
- return ERR_PTR(retval);
- }
发表评论
-
窥探 kernel,just for fun --- 浅析do_exit
2012-04-23 22:51 1106本系列文章由张同浩编写,转载请注明出处:http://b ... -
EBOOT通过bin文件形式读取、下载LOGO
2012-04-23 22:50 1295一般的WINCE系统都是在EBOOT阶段初始化LC ... -
network logon failure unknown username or bad password
2012-04-22 16:28 1221系统 :windows 7 情况":别人可以 ... -
TNS-12560: TNS:协议适配器错误终极配置
2012-04-22 16:27 1643我们知道oracle客户端连接时涉及用到的几个配置文件有 ... -
CentOS 修改网络设置以及解决一些命令不存在
2012-04-22 16:26 1210一、CentOS 修改IP地址 修改对应网卡的IP地址 ... -
centos 下安装jdk,mysql,tomcat,eclipse
2012-04-22 16:25 1105一个小小的配置了花了好长时间才解决,看来只学好多东西只看 ... -
linux下没有设置jmxremote port的时候,如何显示jconsole的图形界面
2012-04-20 20:40 2235在linux服务器上,因为gui显示的问题。我们直接jc ...
相关推荐
Qt源码窥探(1)---创建窗口过程图解。。
【华为智能汽车布局】 华为作为全球知名的科技巨头,在近年来逐渐涉足智能汽车领域,尤其是在新能源汽车市场,华为通过三种合作模式——零部件模式、HI模式(Huawei Inside模式)、智选车模式,展现了其在汽车行业...
标题中的“e-Border-driver-win_3_5_1”显然指的是一个特定版本的软件,即e-Border驱动程序的Windows版本,版本号为3.5.1。...通过这个软件,用户可以有效地绕过某些网络限制,同时保护他们的网络活动免受窥探。
总结,SANSUI-A-A7CD Teletext解析源代码为我们提供了一个难得的机会,去窥探过去的技术如何在现代设备中实现,同时也揭示了早期交互式信息系统的原理。通过深入学习和分析,我们可以从中获得宝贵的知识和经验,这...
`pspy`的名字来源于“process spy”,即进程间窥探,它为开发人员提供了一个方便的接口来获取和分析运行中的进程信息。 `pspy-1.4.7-cp37-cp37m-macosx_10_9_x86_64.whl`这个文件是一个预编译的Python轮子包(wheel...
这个压缩包文件,标志着JDK 9开发过程中的一个重要里程碑,为我们提供了窥探新特性、改进和优化的窗口。 首先,"ea"(Early Access)表明这是JDK 9的一个早期预览版本,用于开发者测试和反馈,帮助Oracle公司在正式...
8. **安全性**: μTorrent支持加密连接,保护用户的下载活动免受窥探,同时还有防止病毒和恶意软件的内置保护。 9. **BYRBT**: BYRBT可能是指某个社区或种子库的标识,表明这个μTorrent版本可能是从这个特定的社区...
窥探安卓内核 企业安全 物联网安全云安全 安全意识教育 安全管理
大数据是21世纪信息技术发展的重要领域,它标志着我们正从传统的IT时代迈向DT时代。DT时代强调以数据为中心,利用先进的数据处理技术提升服务质量、驱动生产力。马云曾指出,DT时代将取代IT时代,成为未来的主要发展...
SSL/TLS加密支持:确保数据传输的安全性,无论是使用FTPS还是SFTP协议,都能保护数据免遭窥探。 防火墙支持:兼容大多数代理和防火墙设置,适合在各种网络环境下使用。 队列管理:用户可以安排文件传输的顺序,...
软件提供了强大的密码保护机制,确保用户的私密日记不被他人窥探。同时,数据加密技术的应用,保证了即使日记文件被盗,内容也无法被轻易解密,为用户的隐私安全筑起了一道坚实的防线。 在eDiary-3.3.1这个版本中,...
例如,当发现有同事希望担任你的职位时,可以选择主动接触,而不是无视或暗中窥探。 在与同事的日常互动中,诚实和公平的沟通原则很重要。如果竞争对手向你借书,大方地借出是一种展示胸怀的方式,而不是试图贬低...
它可能使用操作系统级别的安全特性来保护密码不被窥探。 2. **剪贴板交互**:库可能提供了与系统剪贴板交互的API,允许程序读取、写入或清除剪贴板内容,特别适用于需要处理敏感信息的场景。 3. **加密/解密**:...
### VB源代码-文本防窥探工具知识点解析 #### 一、概述 本文将深入解析一个基于Visual Basic(简称VB)编写的文本防窥探工具的源代码。该工具主要功能在于实现文本文件的安全加密与解密操作,通过简单的用户界面...
《风险评估:窥探安卓内核 - 应急响应》 在当今数字化社会,信息安全的重要性不言而喻,特别是对于移动设备操作系统,如安卓内核的安全性更是关注的焦点。本资料集中,我们将深入探讨“风险评估”在安卓内核中的...
Volume与CoW(Copy-on-Write)的分层文件系统是完全独立的,且可以通过Volume Plugin机制轻松地整合外部存储。 Docker Volume Plugin机制允许Docker方便地整合第三方存储系统,为容器提供存储卷。Volume Plugin的...
SSL/TLS加密支持:确保数据传输的安全性,无论是使用FTPS还是SFTP协议,都能保护数据免遭窥探。 防火墙支持:兼容大多数代理和防火墙设置,适合在各种网络环境下使用。 队列管理:用户可以安排文件传输的顺序,...