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

📄 sched.c

📁 linux0.11 version(301k)
💻 C
📖 第 1 页 / 共 3 页
字号:
<a name=L122 href="source/kernel/sched.c#L122">122</a> <b><i>/* this is the scheduler proper: */</i></b><a name=L123 href="source/kernel/sched.c#L123">123</a> <a name=L124 href="source/kernel/sched.c#L124">124</a>         while (1) {<a name=L125 href="source/kernel/sched.c#L125">125</a>                 c = -1;<a name=L126 href="source/kernel/sched.c#L126">126</a>                 next = 0;<a name=L127 href="source/kernel/sched.c#L127">127</a>                 i = <a href="ident?i=NR_TASKS">NR_TASKS</a>;<a name=L128 href="source/kernel/sched.c#L128">128</a>                 p = &amp;<a href="ident?i=task">task</a>[<a href="ident?i=NR_TASKS">NR_TASKS</a>];<a name=L129 href="source/kernel/sched.c#L129">129</a>                 while (--i) {<a name=L130 href="source/kernel/sched.c#L130">130</a>                         if (!*--p)<a name=L131 href="source/kernel/sched.c#L131">131</a>                                 continue;<a name=L132 href="source/kernel/sched.c#L132">132</a>                         if ((*p)-&gt;<a href="ident?i=state">state</a> == <a href="ident?i=TASK_RUNNING">TASK_RUNNING</a> &amp;&amp; (*p)-&gt;counter &gt; c)<a name=L133 href="source/kernel/sched.c#L133">133</a>                                 c = (*p)-&gt;counter, next = i;<a name=L134 href="source/kernel/sched.c#L134">134</a>                 }<a name=L135 href="source/kernel/sched.c#L135">135</a>                 if (c) break;<a name=L136 href="source/kernel/sched.c#L136">136</a>                 for(p = &amp;<a href="ident?i=LAST_TASK">LAST_TASK</a> ; p &gt; &amp;<a href="ident?i=FIRST_TASK">FIRST_TASK</a> ; --p)<a name=L137 href="source/kernel/sched.c#L137">137</a>                         if (*p)<a name=L138 href="source/kernel/sched.c#L138">138</a>                                 (*p)-&gt;counter = ((*p)-&gt;counter &gt;&gt; 1) +<a name=L139 href="source/kernel/sched.c#L139">139</a>                                                 (*p)-&gt;priority;<a name=L140 href="source/kernel/sched.c#L140">140</a>         }<a name=L141 href="source/kernel/sched.c#L141">141</a>         <a href="ident?i=switch_to">switch_to</a>(next);<a name=L142 href="source/kernel/sched.c#L142">142</a> }<a name=L143 href="source/kernel/sched.c#L143">143</a> <a name=L144 href="source/kernel/sched.c#L144">144</a> int <a href="ident?i=sys_pause">sys_pause</a>(void)<a name=L145 href="source/kernel/sched.c#L145">145</a> {<a name=L146 href="source/kernel/sched.c#L146">146</a>         <a href="ident?i=current">current</a>-&gt;<a href="ident?i=state">state</a> = <a href="ident?i=TASK_INTERRUPTIBLE">TASK_INTERRUPTIBLE</a>;<a name=L147 href="source/kernel/sched.c#L147">147</a>         <a href="ident?i=schedule">schedule</a>();<a name=L148 href="source/kernel/sched.c#L148">148</a>         return 0;<a name=L149 href="source/kernel/sched.c#L149">149</a> }<a name=L150 href="source/kernel/sched.c#L150">150</a> <a name=L151 href="source/kernel/sched.c#L151">151</a> void <a href="ident?i=sleep_on">sleep_on</a>(struct <a href="ident?i=task_struct">task_struct</a> **p)<a name=L152 href="source/kernel/sched.c#L152">152</a> {<a name=L153 href="source/kernel/sched.c#L153">153</a>         struct <a href="ident?i=task_struct">task_struct</a> *tmp;<a name=L154 href="source/kernel/sched.c#L154">154</a> <a name=L155 href="source/kernel/sched.c#L155">155</a>         if (!p)<a name=L156 href="source/kernel/sched.c#L156">156</a>                 return;<a name=L157 href="source/kernel/sched.c#L157">157</a>         if (<a href="ident?i=current">current</a> == &amp;(<a href="ident?i=init_task">init_task</a>.<a href="ident?i=task">task</a>))<a name=L158 href="source/kernel/sched.c#L158">158</a>                 <a href="ident?i=panic">panic</a>(<i>"task[0] trying to sleep"</i>);<a name=L159 href="source/kernel/sched.c#L159">159</a>         tmp = *p;<a name=L160 href="source/kernel/sched.c#L160">160</a>         *p = <a href="ident?i=current">current</a>;<a name=L161 href="source/kernel/sched.c#L161">161</a>         <a href="ident?i=current">current</a>-&gt;<a href="ident?i=state">state</a> = <a href="ident?i=TASK_UNINTERRUPTIBLE">TASK_UNINTERRUPTIBLE</a>;<a name=L162 href="source/kernel/sched.c#L162">162</a>         <a href="ident?i=schedule">schedule</a>();<a name=L163 href="source/kernel/sched.c#L163">163</a>         if (tmp)<a name=L164 href="source/kernel/sched.c#L164">164</a>                 tmp-&gt;<a href="ident?i=state">state</a>=0;<a name=L165 href="source/kernel/sched.c#L165">165</a> }<a name=L166 href="source/kernel/sched.c#L166">166</a> <a name=L167 href="source/kernel/sched.c#L167">167</a> void <a href="ident?i=interruptible_sleep_on">interruptible_sleep_on</a>(struct <a href="ident?i=task_struct">task_struct</a> **p)<a name=L168 href="source/kernel/sched.c#L168">168</a> {<a name=L169 href="source/kernel/sched.c#L169">169</a>         struct <a href="ident?i=task_struct">task_struct</a> *tmp;<a name=L170 href="source/kernel/sched.c#L170">170</a> <a name=L171 href="source/kernel/sched.c#L171">171</a>         if (!p)<a name=L172 href="source/kernel/sched.c#L172">172</a>                 return;<a name=L173 href="source/kernel/sched.c#L173">173</a>         if (<a href="ident?i=current">current</a> == &amp;(<a href="ident?i=init_task">init_task</a>.<a href="ident?i=task">task</a>))<a name=L174 href="source/kernel/sched.c#L174">174</a>                 <a href="ident?i=panic">panic</a>(<i>"task[0] trying to sleep"</i>);<a name=L175 href="source/kernel/sched.c#L175">175</a>         tmp=*p;<a name=L176 href="source/kernel/sched.c#L176">176</a>         *p=<a href="ident?i=current">current</a>;<a name=L177 href="source/kernel/sched.c#L177">177</a> repeat: <a href="ident?i=current">current</a>-&gt;<a href="ident?i=state">state</a> = <a href="ident?i=TASK_INTERRUPTIBLE">TASK_INTERRUPTIBLE</a>;<a name=L178 href="source/kernel/sched.c#L178">178</a>         <a href="ident?i=schedule">schedule</a>();<a name=L179 href="source/kernel/sched.c#L179">179</a>         if (*p &amp;&amp; *p != <a href="ident?i=current">current</a>) {<a name=L180 href="source/kernel/sched.c#L180">180</a>                 (**p).<a href="ident?i=state">state</a>=0;<a name=L181 href="source/kernel/sched.c#L181">181</a>                 goto repeat;<a name=L182 href="source/kernel/sched.c#L182">182</a>         }<a name=L183 href="source/kernel/sched.c#L183">183</a>         *p=<a href="ident?i=NULL">NULL</a>;<a name=L184 href="source/kernel/sched.c#L184">184</a>         if (tmp)<a name=L185 href="source/kernel/sched.c#L185">185</a>                 tmp-&gt;<a href="ident?i=state">state</a>=0;<a name=L186 href="source/kernel/sched.c#L186">186</a> }<a name=L187 href="source/kernel/sched.c#L187">187</a> <a name=L188 href="source/kernel/sched.c#L188">188</a> void <a href="ident?i=wake_up">wake_up</a>(struct <a href="ident?i=task_struct">task_struct</a> **p)<a name=L189 href="source/kernel/sched.c#L189">189</a> {<a name=L190 href="source/kernel/sched.c#L190">190</a>         if (p &amp;&amp; *p) {<a name=L191 href="source/kernel/sched.c#L191">191</a>                 (**p).<a href="ident?i=state">state</a>=0;<a name=L192 href="source/kernel/sched.c#L192">192</a>                 *p=<a href="ident?i=NULL">NULL</a>;<a name=L193 href="source/kernel/sched.c#L193">193</a>         }<a name=L194 href="source/kernel/sched.c#L194">194</a> }<a name=L195 href="source/kernel/sched.c#L195">195</a> <a name=L196 href="source/kernel/sched.c#L196">196</a> <b><i>/*</i></b><a name=L197 href="source/kernel/sched.c#L197">197</a> <b><i> * OK, here are some floppy things that shouldn't be in the kernel</i></b><a name=L198 href="source/kernel/sched.c#L198">198</a> <b><i> * proper. They are here because the floppy needs a timer, and this</i></b><a name=L199 href="source/kernel/sched.c#L199">199</a> <b><i> * was the easiest way of doing it.</i></b><a name=L200 href="source/kernel/sched.c#L200">200</a> <b><i> */</i></b><a name=L201 href="source/kernel/sched.c#L201">201</a> static struct <a href="ident?i=task_struct">task_struct</a> * <a href="ident?i=wait_motor">wait_motor</a>[4] = {<a href="ident?i=NULL">NULL</a>,<a href="ident?i=NULL">NULL</a>,<a href="ident?i=NULL">NULL</a>,<a href="ident?i=NULL">NULL</a>};<a name=L202 href="source/kernel/sched.c#L202">202</a> static int  <a href="ident?i=mon_timer">mon_timer</a>[4]={0,0,0,0};<a name=L203 href="source/kernel/sched.c#L203">203</a> static int <a href="ident?i=moff_timer">moff_timer</a>[4]={0,0,0,0};<a name=L204 href="source/kernel/sched.c#L204">204</a> unsigned char <a href="ident?i=current_DOR">current_DOR</a> = 0x0C;<a name=L205 href="source/kernel/sched.c#L205">205</a> <a name=L206 href="source/kernel/sched.c#L206">206</a> int <a href="ident?i=ticks_to_floppy_on">ticks_to_floppy_on</a>(unsigned int nr)<a name=L207 href="source/kernel/sched.c#L207">207</a> {<a name=L208 href="source/kernel/sched.c#L208">208</a>         extern unsigned char <a href="ident?i=selected">selected</a>;<a name=L209 href="source/kernel/sched.c#L209">209</a>         unsigned char mask = 0x10 &lt;&lt; nr;<a name=L210 href="source/kernel/sched.c#L210">210</a> <a name=L211 href="source/kernel/sched.c#L211">211</a>         if (nr&gt;3)<a name=L212 href="source/kernel/sched.c#L212">212</a>                 <a href="ident?i=panic">panic</a>(<i>"floppy_on: nr&gt;3"</i>);<a name=L213 href="source/kernel/sched.c#L213">213</a>         <a href="ident?i=moff_timer">moff_timer</a>[nr]=10000;           <b><i>/* 100 s = very big :-) */</i></b><a name=L214 href="source/kernel/sched.c#L214">214</a>         <a href="ident?i=cli">cli</a>();                          <b><i>/* use floppy_off to turn it off */</i></b><a name=L215 href="source/kernel/sched.c#L215">215</a>         mask |= <a href="ident?i=current_DOR">current_DOR</a>;<a name=L216 href="source/kernel/sched.c#L216">216</a>         if (!<a href="ident?i=selected">selected</a>) {<a name=L217 href="source/kernel/sched.c#L217">217</a>                 mask &amp;= 0xFC;<a name=L218 href="source/kernel/sched.c#L218">218</a>                 mask |= nr;<a name=L219 href="source/kernel/sched.c#L219">219</a>         }<a name=L220 href="source/kernel/sched.c#L220">220</a>         if (mask != <a href="ident?i=current_DOR">current_DOR</a>) {<a name=L221 href="source/kernel/sched.c#L221">221</a>                 <a href="ident?i=outb">outb</a>(mask,<a href="ident?i=FD_DOR">FD_DOR</a>);<a name=L222 href="source/kernel/sched.c#L222">222</a>                 if ((mask ^ <a href="ident?i=current_DOR">current_DOR</a>) &amp; 0xf0)<a name=L223 href="source/kernel/sched.c#L223">223</a>                         <a href="ident?i=mon_timer">mon_timer</a>[nr] = <a href="ident?i=HZ">HZ</a>/2;<a name=L224 href="source/kernel/sched.c#L224">224</a>                 else if (<a href="ident?i=mon_timer">mon_timer</a>[nr] &lt; 2)<a name=L225 href="source/kernel/sched.c#L225">225</a>                         <a href="ident?i=mon_timer">mon_timer</a>[nr] = 2;<a name=L226 href="source/kernel/sched.c#L226">226</a>                 <a href="ident?i=current_DOR">current_DOR</a> = mask;<a name=L227 href="source/kernel/sched.c#L227">227</a>         }<a name=L228 href="source/kernel/sched.c#L228">228</a>         <a href="ident?i=sti">sti</a>();<a name=L229 href="source/kernel/sched.c#L229">229</a>         return <a href="ident?i=mon_timer">mon_timer</a>[nr];<a name=L230 href="source/kernel/sched.c#L230">230</a> }<a name=L231 href="source/kernel/sched.c#L231">231</a> <a name=L232 href="source/kernel/sched.c#L232">232</a> void <a href="ident?i=floppy_on">floppy_on</a>(unsigned int nr)<a name=L233 href="source/kernel/sched.c#L233">233</a> {<a name=L234 href="source/kernel/sched.c#L234">234</a>         <a href="ident?i=cli">cli</a>();<a name=L235 href="source/kernel/sched.c#L235">235</a>         while (<a href="ident?i=ticks_to_floppy_on">ticks_to_floppy_on</a>(nr))<a name=L236 href="source/kernel/sched.c#L236">236</a>                 <a href="ident?i=sleep_on">sleep_on</a>(nr+<a href="ident?i=wait_motor">wait_motor</a>);<a name=L237 href="source/kernel/sched.c#L237">237</a>         <a href="ident?i=sti">sti</a>();<a name=L238 href="source/kernel/sched.c#L238">238</a> }<a name=L239 href="source/kernel/sched.c#L239">239</a> <a name=L240 href="source/kernel/sched.c#L240">240</a> void <a href="ident?i=floppy_off">floppy_off</a>(unsigned int nr)<a name=L241 href="source/kernel/sched.c#L241">241</a> {<a name=L242 href="source/kernel/sched.c#L242">242</a>         <a href="ident?i=moff_timer">moff_timer</a>[nr]=3*<a href="ident?i=HZ">HZ</a>;<a name=L243 href="source/kernel/sched.c#L243">243</a> }<a name=L244 href="source/kernel/sched.c#L244">244</a> <a name=L245 href="source/kernel/sched.c#L245">245</a> void <a href="ident?i=do_floppy_timer">do_floppy_timer</a>(void)<a name=L246 href="source/kernel/sched.c#L246">246</a> {<a name=L247 href="source/kernel/sched.c#L247">247</a>         int i;<a name=L248 href="source/kernel/sched.c#L248">248</a>         unsigned char mask = 0x10;<a name=L249 href="source/kernel/sched.c#L249">249</a> <a name=L250 href="source/kernel/sched.c#L250">250</a>         for (i=0 ; i&lt;4 ; i++,mask &lt;&lt;= 1) {<a name=L251 href="source/kernel/sched.c#L251">251</a>                 if (!(mask &amp; <a href="ident?i=current_DOR">current_DOR</a>))<a name=L252 href="source/kernel/sched.c#L252">252</a>                         continue;<a name=L253 href="source/kernel/sched.c#L253">253</a>                 if (<a href="ident?i=mon_timer">mon_timer</a>[i]) {<a name=L254 href="source/kernel/sched.c#L254">254</a>                         if (!--<a href="ident?i=mon_timer">mon_timer</a>[i])<a name=L255 href="source/kernel/sched.c#L255">255</a>                                 <a href="ident?i=wake_up">wake_up</a>(i+<a href="ident?i=wait_motor">wait_motor</a>);<a name=L256 href="source/kernel/sched.c#L256">256</a>                 } else if (!<a href="ident?i=moff_timer">moff_timer</a>[i]) {<a name=L257 href="source/kernel/sched.c#L257">257</a>                         <a href="ident?i=current_DOR">current_DOR</a> &amp;= ~mask;<a name=L258 href="source/kernel/sched.c#L258">258</a>                         <a href="ident?i=outb">outb</a>(<a href="ident?i=current_DOR">current_DOR</a>,<a href="ident?i=FD_DOR">FD_DOR</a>);<a name=L259 href="source/kernel/sched.c#L259">259</a>                 } else<a name=L260 href="source/kernel/sched.c#L260">260</a>                         <a href="ident?i=moff_timer">moff_timer</a>[i]--;<a name=L261 href="source/kernel/sched.c#L261">261</a>         }<a name=L262 href="source/kernel/sched.c#L262">262</a> }<a name=L263 href="source/kernel/sched.c#L263">263</a> <a name=L264 href="source/kernel/sched.c#L264">264</a> #define <a href="ident?i=TIME_REQUESTS">TIME_REQUESTS</a> 64<a name=L265 href="source/kernel/sched.c#L265">265</a> <a name=L266 href="source/kernel/sched.c#L266">266</a> static struct <a href="ident?i=timer_list">timer_list</a> {<a name=L267 href="source/kernel/sched.c#L267">267</a>         long <a href="ident?i=jiffies">jiffies</a>;<a name=L268 href="source/kernel/sched.c#L268">268</a>         void (*fn)();<a name=L269 href="source/kernel/sched.c#L269">269</a>         struct <a href="ident?i=timer_list">timer_list</a> * next;<a name=L270 href="source/kernel/sched.c#L270">270</a> } <a href="ident?i=timer_list">timer_list</a>[<a href="ident?i=TIME_REQUESTS">TIME_REQUESTS</a>], * <a href="ident?i=next_timer">next_timer</a> = <a href="ident?i=NULL">NULL</a>;<a name=L271 href="source/kernel/sched.c#L271">271</a> <a name=L272 href="source/kernel/sched.c#L272">272</a> void <a href="ident?i=add_timer">add_timer</a>(long <a href="ident?i=jiffies">jiffies</a>, void (*fn)(void))<a name=L273 href="source/kernel/sched.c#L273">273</a> {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -