⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fork.c

📁 linux0.11 version(301k)
💻 C
📖 第 1 页 / 共 2 页
字号:
 <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-&gt;<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-&gt;pid = <a href="ident?i=last_pid">last_pid</a>; <a name=L84 href="source/kernel/fork.c#L84">84</a>         p-&gt;father = <a href="ident?i=current">current</a>-&gt;pid; <a name=L85 href="source/kernel/fork.c#L85">85</a>         p-&gt;counter = p-&gt;priority; <a name=L86 href="source/kernel/fork.c#L86">86</a>         p-&gt;signal = 0; <a name=L87 href="source/kernel/fork.c#L87">87</a>         p-&gt;<a href="ident?i=alarm">alarm</a> = 0; <a name=L88 href="source/kernel/fork.c#L88">88</a>         p-&gt;leader = 0;          <b><i>/* process leadership doesn't inherit */</i></b> <a name=L89 href="source/kernel/fork.c#L89">89</a>         p-&gt;<a href="ident?i=utime">utime</a> = p-&gt;<a href="ident?i=stime">stime</a> = 0; <a name=L90 href="source/kernel/fork.c#L90">90</a>         p-&gt;cutime = p-&gt;cstime = 0; <a name=L91 href="source/kernel/fork.c#L91">91</a>         p-&gt;start_time = <a href="ident?i=jiffies">jiffies</a>; <a name=L92 href="source/kernel/fork.c#L92">92</a>         p-&gt;tss.back_link = 0; <a name=L93 href="source/kernel/fork.c#L93">93</a>         p-&gt;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-&gt;tss.ss0 = 0x10; <a name=L95 href="source/kernel/fork.c#L95">95</a>         p-&gt;tss.eip = eip; <a name=L96 href="source/kernel/fork.c#L96">96</a>         p-&gt;tss.eflags = eflags; <a name=L97 href="source/kernel/fork.c#L97">97</a>         p-&gt;tss.eax = 0; <a name=L98 href="source/kernel/fork.c#L98">98</a>         p-&gt;tss.ecx = ecx; <a name=L99 href="source/kernel/fork.c#L99">99</a>         p-&gt;tss.edx = edx;<a name=L100 href="source/kernel/fork.c#L100">100</a>         p-&gt;tss.ebx = ebx;<a name=L101 href="source/kernel/fork.c#L101">101</a>         p-&gt;tss.esp = esp;<a name=L102 href="source/kernel/fork.c#L102">102</a>         p-&gt;tss.ebp = ebp;<a name=L103 href="source/kernel/fork.c#L103">103</a>         p-&gt;tss.esi = esi;<a name=L104 href="source/kernel/fork.c#L104">104</a>         p-&gt;tss.edi = edi;<a name=L105 href="source/kernel/fork.c#L105">105</a>         p-&gt;tss.es = es &amp; 0xffff;<a name=L106 href="source/kernel/fork.c#L106">106</a>         p-&gt;tss.cs = cs &amp; 0xffff;<a name=L107 href="source/kernel/fork.c#L107">107</a>         p-&gt;tss.ss = ss &amp; 0xffff;<a name=L108 href="source/kernel/fork.c#L108">108</a>         p-&gt;tss.ds = ds &amp; 0xffff;<a name=L109 href="source/kernel/fork.c#L109">109</a>         p-&gt;tss.fs = fs &amp; 0xffff;<a name=L110 href="source/kernel/fork.c#L110">110</a>         p-&gt;tss.gs = gs &amp; 0xffff;<a name=L111 href="source/kernel/fork.c#L111">111</a>         p-&gt;tss.ldt = <a href="ident?i=_LDT">_LDT</a>(nr);<a name=L112 href="source/kernel/fork.c#L112">112</a>         p-&gt;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-&gt;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&lt;<a href="ident?i=NR_OPEN">NR_OPEN</a>;i++)<a name=L121 href="source/kernel/fork.c#L121">121</a>                 if (f=p-&gt;filp[i])<a name=L122 href="source/kernel/fork.c#L122">122</a>                         f-&gt;f_count++;<a name=L123 href="source/kernel/fork.c#L123">123</a>         if (<a href="ident?i=current">current</a>-&gt;pwd)<a name=L124 href="source/kernel/fork.c#L124">124</a>                 <a href="ident?i=current">current</a>-&gt;pwd-&gt;i_count++;<a name=L125 href="source/kernel/fork.c#L125">125</a>         if (<a href="ident?i=current">current</a>-&gt;root)<a name=L126 href="source/kernel/fork.c#L126">126</a>                 <a href="ident?i=current">current</a>-&gt;root-&gt;i_count++;<a name=L127 href="source/kernel/fork.c#L127">127</a>         if (<a href="ident?i=current">current</a>-&gt;executable)<a name=L128 href="source/kernel/fork.c#L128">128</a>                 <a href="ident?i=current">current</a>-&gt;executable-&gt;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&lt;&lt;1)+<a href="ident?i=FIRST_TSS_ENTRY">FIRST_TSS_ENTRY</a>,&amp;(p-&gt;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&lt;&lt;1)+<a href="ident?i=FIRST_LDT_ENTRY">FIRST_LDT_ENTRY</a>,&amp;(p-&gt;ldt));<a name=L131 href="source/kernel/fork.c#L131">131</a>         p-&gt;<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>)&lt;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&lt;<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] &amp;&amp; <a href="ident?i=task">task</a>[i]-&gt;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&lt;<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 + -