📄 fork.c
字号:
<a name=L65 href="source/kernel/fork.c#L65">65</a> <b><i> * information (task[nr]) and sets up the necessary registers. It</i></b> <a name=L66 href="source/kernel/fork.c#L66">66</a> <b><i> * also copies the data segment in it's entirety.</i></b> <a name=L67 href="source/kernel/fork.c#L67">67</a> <b><i> */</i></b> <a name=L68 href="source/kernel/fork.c#L68">68</a> int <a href="ident?i=copy_process">copy_process</a>(int nr,long ebp,long edi,long esi,long gs,long none, <a name=L69 href="source/kernel/fork.c#L69">69</a> long ebx,long ecx,long edx, <a name=L70 href="source/kernel/fork.c#L70">70</a> long fs,long es,long ds, <a name=L71 href="source/kernel/fork.c#L71">71</a> long eip,long cs,long eflags,long esp,long ss) <a name=L72 href="source/kernel/fork.c#L72">72</a> { <a name=L73 href="source/kernel/fork.c#L73">73</a> struct <a href="ident?i=task_struct">task_struct</a> *p; <a name=L74 href="source/kernel/fork.c#L74">74</a> int i; <a name=L75 href="source/kernel/fork.c#L75">75</a> struct <a href="ident?i=file">file</a> *f; <a name=L76 href="source/kernel/fork.c#L76">76</a> <a name=L77 href="source/kernel/fork.c#L77">77</a> p = (struct <a href="ident?i=task_struct">task_struct</a> *) <a href="ident?i=get_free_page">get_free_page</a>(); <a name=L78 href="source/kernel/fork.c#L78">78</a> if (!p) <a name=L79 href="source/kernel/fork.c#L79">79</a> return -<a href="ident?i=EAGAIN">EAGAIN</a>; <a name=L80 href="source/kernel/fork.c#L80">80</a> <a href="ident?i=task">task</a>[nr] = p; <a name=L81 href="source/kernel/fork.c#L81">81</a> *p = *<a href="ident?i=current">current</a>; <b><i>/* NOTE! this doesn't copy the supervisor stack */</i></b> <a name=L82 href="source/kernel/fork.c#L82">82</a> p-><a href="ident?i=state">state</a> = <a href="ident?i=TASK_UNINTERRUPTIBLE">TASK_UNINTERRUPTIBLE</a>; <a name=L83 href="source/kernel/fork.c#L83">83</a> p->pid = <a href="ident?i=last_pid">last_pid</a>; <a name=L84 href="source/kernel/fork.c#L84">84</a> p->father = <a href="ident?i=current">current</a>->pid; <a name=L85 href="source/kernel/fork.c#L85">85</a> p->counter = p->priority; <a name=L86 href="source/kernel/fork.c#L86">86</a> p->signal = 0; <a name=L87 href="source/kernel/fork.c#L87">87</a> p-><a href="ident?i=alarm">alarm</a> = 0; <a name=L88 href="source/kernel/fork.c#L88">88</a> p->leader = 0; <b><i>/* process leadership doesn't inherit */</i></b> <a name=L89 href="source/kernel/fork.c#L89">89</a> p-><a href="ident?i=utime">utime</a> = p-><a href="ident?i=stime">stime</a> = 0; <a name=L90 href="source/kernel/fork.c#L90">90</a> p->cutime = p->cstime = 0; <a name=L91 href="source/kernel/fork.c#L91">91</a> p->start_time = <a href="ident?i=jiffies">jiffies</a>; <a name=L92 href="source/kernel/fork.c#L92">92</a> p->tss.back_link = 0; <a name=L93 href="source/kernel/fork.c#L93">93</a> p->tss.esp0 = <a href="ident?i=PAGE_SIZE">PAGE_SIZE</a> + (long) p; <a name=L94 href="source/kernel/fork.c#L94">94</a> p->tss.ss0 = 0x10; <a name=L95 href="source/kernel/fork.c#L95">95</a> p->tss.eip = eip; <a name=L96 href="source/kernel/fork.c#L96">96</a> p->tss.eflags = eflags; <a name=L97 href="source/kernel/fork.c#L97">97</a> p->tss.eax = 0; <a name=L98 href="source/kernel/fork.c#L98">98</a> p->tss.ecx = ecx; <a name=L99 href="source/kernel/fork.c#L99">99</a> p->tss.edx = edx;<a name=L100 href="source/kernel/fork.c#L100">100</a> p->tss.ebx = ebx;<a name=L101 href="source/kernel/fork.c#L101">101</a> p->tss.esp = esp;<a name=L102 href="source/kernel/fork.c#L102">102</a> p->tss.ebp = ebp;<a name=L103 href="source/kernel/fork.c#L103">103</a> p->tss.esi = esi;<a name=L104 href="source/kernel/fork.c#L104">104</a> p->tss.edi = edi;<a name=L105 href="source/kernel/fork.c#L105">105</a> p->tss.es = es & 0xffff;<a name=L106 href="source/kernel/fork.c#L106">106</a> p->tss.cs = cs & 0xffff;<a name=L107 href="source/kernel/fork.c#L107">107</a> p->tss.ss = ss & 0xffff;<a name=L108 href="source/kernel/fork.c#L108">108</a> p->tss.ds = ds & 0xffff;<a name=L109 href="source/kernel/fork.c#L109">109</a> p->tss.fs = fs & 0xffff;<a name=L110 href="source/kernel/fork.c#L110">110</a> p->tss.gs = gs & 0xffff;<a name=L111 href="source/kernel/fork.c#L111">111</a> p->tss.ldt = <a href="ident?i=_LDT">_LDT</a>(nr);<a name=L112 href="source/kernel/fork.c#L112">112</a> p->tss.trace_bitmap = 0x80000000;<a name=L113 href="source/kernel/fork.c#L113">113</a> if (<a href="ident?i=last_task_used_math">last_task_used_math</a> == <a href="ident?i=current">current</a>)<a name=L114 href="source/kernel/fork.c#L114">114</a> __asm__(<i>"clts ; fnsave %0"</i>::<i>"m"</i> (p->tss.i387));<a name=L115 href="source/kernel/fork.c#L115">115</a> if (<a href="ident?i=copy_mem">copy_mem</a>(nr,p)) {<a name=L116 href="source/kernel/fork.c#L116">116</a> <a href="ident?i=task">task</a>[nr] = <a href="ident?i=NULL">NULL</a>;<a name=L117 href="source/kernel/fork.c#L117">117</a> <a href="ident?i=free_page">free_page</a>((long) p);<a name=L118 href="source/kernel/fork.c#L118">118</a> return -<a href="ident?i=EAGAIN">EAGAIN</a>;<a name=L119 href="source/kernel/fork.c#L119">119</a> }<a name=L120 href="source/kernel/fork.c#L120">120</a> for (i=0; i<<a href="ident?i=NR_OPEN">NR_OPEN</a>;i++)<a name=L121 href="source/kernel/fork.c#L121">121</a> if (f=p->filp[i])<a name=L122 href="source/kernel/fork.c#L122">122</a> f->f_count++;<a name=L123 href="source/kernel/fork.c#L123">123</a> if (<a href="ident?i=current">current</a>->pwd)<a name=L124 href="source/kernel/fork.c#L124">124</a> <a href="ident?i=current">current</a>->pwd->i_count++;<a name=L125 href="source/kernel/fork.c#L125">125</a> if (<a href="ident?i=current">current</a>->root)<a name=L126 href="source/kernel/fork.c#L126">126</a> <a href="ident?i=current">current</a>->root->i_count++;<a name=L127 href="source/kernel/fork.c#L127">127</a> if (<a href="ident?i=current">current</a>->executable)<a name=L128 href="source/kernel/fork.c#L128">128</a> <a href="ident?i=current">current</a>->executable->i_count++;<a name=L129 href="source/kernel/fork.c#L129">129</a> <a href="ident?i=set_tss_desc">set_tss_desc</a>(<a href="ident?i=gdt">gdt</a>+(nr<<1)+<a href="ident?i=FIRST_TSS_ENTRY">FIRST_TSS_ENTRY</a>,&(p->tss));<a name=L130 href="source/kernel/fork.c#L130">130</a> <a href="ident?i=set_ldt_desc">set_ldt_desc</a>(<a href="ident?i=gdt">gdt</a>+(nr<<1)+<a href="ident?i=FIRST_LDT_ENTRY">FIRST_LDT_ENTRY</a>,&(p->ldt));<a name=L131 href="source/kernel/fork.c#L131">131</a> p-><a href="ident?i=state">state</a> = <a href="ident?i=TASK_RUNNING">TASK_RUNNING</a>; <b><i>/* do this last, just in case */</i></b><a name=L132 href="source/kernel/fork.c#L132">132</a> return <a href="ident?i=last_pid">last_pid</a>;<a name=L133 href="source/kernel/fork.c#L133">133</a> }<a name=L134 href="source/kernel/fork.c#L134">134</a> <a name=L135 href="source/kernel/fork.c#L135">135</a> int <a href="ident?i=find_empty_process">find_empty_process</a>(void)<a name=L136 href="source/kernel/fork.c#L136">136</a> {<a name=L137 href="source/kernel/fork.c#L137">137</a> int i;<a name=L138 href="source/kernel/fork.c#L138">138</a> <a name=L139 href="source/kernel/fork.c#L139">139</a> repeat:<a name=L140 href="source/kernel/fork.c#L140">140</a> if ((++<a href="ident?i=last_pid">last_pid</a>)<0) <a href="ident?i=last_pid">last_pid</a>=1;<a name=L141 href="source/kernel/fork.c#L141">141</a> for(i=0 ; i<<a href="ident?i=NR_TASKS">NR_TASKS</a> ; i++)<a name=L142 href="source/kernel/fork.c#L142">142</a> if (<a href="ident?i=task">task</a>[i] && <a href="ident?i=task">task</a>[i]->pid == <a href="ident?i=last_pid">last_pid</a>) goto repeat;<a name=L143 href="source/kernel/fork.c#L143">143</a> for(i=1 ; i<<a href="ident?i=NR_TASKS">NR_TASKS</a> ; i++)<a name=L144 href="source/kernel/fork.c#L144">144</a> if (!<a href="ident?i=task">task</a>[i])<a name=L145 href="source/kernel/fork.c#L145">145</a> return i;<a name=L146 href="source/kernel/fork.c#L146">146</a> return -<a href="ident?i=EAGAIN">EAGAIN</a>;<a name=L147 href="source/kernel/fork.c#L147">147</a> }<a name=L148 href="source/kernel/fork.c#L148">148</a> </pre><hr><div align=center> [<b><i>源代码浏览</i></b>] [<a href="diff/kernel/fork.c">区别标定</a>] [<a href="ident">标识符搜索</a>] [<a href="search">文本搜索</a>] [<a href="find">文件搜索</a>] </div><hr>本网页由 <a href="http:blurb.html">LXR引擎</a> 自动生成.<br></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -