📄 sched.c
字号:
<a name=L274 href="source/kernel/sched.c#L274">274</a> struct <a href="ident?i=timer_list">timer_list</a> * p;<a name=L275 href="source/kernel/sched.c#L275">275</a> <a name=L276 href="source/kernel/sched.c#L276">276</a> if (!fn)<a name=L277 href="source/kernel/sched.c#L277">277</a> return;<a name=L278 href="source/kernel/sched.c#L278">278</a> <a href="ident?i=cli">cli</a>();<a name=L279 href="source/kernel/sched.c#L279">279</a> if (<a href="ident?i=jiffies">jiffies</a> <= 0)<a name=L280 href="source/kernel/sched.c#L280">280</a> (fn)();<a name=L281 href="source/kernel/sched.c#L281">281</a> else {<a name=L282 href="source/kernel/sched.c#L282">282</a> for (p = <a href="ident?i=timer_list">timer_list</a> ; p < <a href="ident?i=timer_list">timer_list</a> + <a href="ident?i=TIME_REQUESTS">TIME_REQUESTS</a> ; p++)<a name=L283 href="source/kernel/sched.c#L283">283</a> if (!p->fn)<a name=L284 href="source/kernel/sched.c#L284">284</a> break;<a name=L285 href="source/kernel/sched.c#L285">285</a> if (p >= <a href="ident?i=timer_list">timer_list</a> + <a href="ident?i=TIME_REQUESTS">TIME_REQUESTS</a>)<a name=L286 href="source/kernel/sched.c#L286">286</a> <a href="ident?i=panic">panic</a>(<i>"No more time requests free"</i>);<a name=L287 href="source/kernel/sched.c#L287">287</a> p->fn = fn;<a name=L288 href="source/kernel/sched.c#L288">288</a> p-><a href="ident?i=jiffies">jiffies</a> = <a href="ident?i=jiffies">jiffies</a>;<a name=L289 href="source/kernel/sched.c#L289">289</a> p->next = <a href="ident?i=next_timer">next_timer</a>;<a name=L290 href="source/kernel/sched.c#L290">290</a> <a href="ident?i=next_timer">next_timer</a> = p;<a name=L291 href="source/kernel/sched.c#L291">291</a> while (p->next && p->next-><a href="ident?i=jiffies">jiffies</a> < p-><a href="ident?i=jiffies">jiffies</a>) {<a name=L292 href="source/kernel/sched.c#L292">292</a> p-><a href="ident?i=jiffies">jiffies</a> -= p->next-><a href="ident?i=jiffies">jiffies</a>;<a name=L293 href="source/kernel/sched.c#L293">293</a> fn = p->fn;<a name=L294 href="source/kernel/sched.c#L294">294</a> p->fn = p->next->fn;<a name=L295 href="source/kernel/sched.c#L295">295</a> p->next->fn = fn;<a name=L296 href="source/kernel/sched.c#L296">296</a> <a href="ident?i=jiffies">jiffies</a> = p-><a href="ident?i=jiffies">jiffies</a>;<a name=L297 href="source/kernel/sched.c#L297">297</a> p-><a href="ident?i=jiffies">jiffies</a> = p->next-><a href="ident?i=jiffies">jiffies</a>;<a name=L298 href="source/kernel/sched.c#L298">298</a> p->next-><a href="ident?i=jiffies">jiffies</a> = <a href="ident?i=jiffies">jiffies</a>;<a name=L299 href="source/kernel/sched.c#L299">299</a> p = p->next;<a name=L300 href="source/kernel/sched.c#L300">300</a> }<a name=L301 href="source/kernel/sched.c#L301">301</a> }<a name=L302 href="source/kernel/sched.c#L302">302</a> <a href="ident?i=sti">sti</a>();<a name=L303 href="source/kernel/sched.c#L303">303</a> }<a name=L304 href="source/kernel/sched.c#L304">304</a> <a name=L305 href="source/kernel/sched.c#L305">305</a> void <a href="ident?i=do_timer">do_timer</a>(long cpl)<a name=L306 href="source/kernel/sched.c#L306">306</a> {<a name=L307 href="source/kernel/sched.c#L307">307</a> extern int <a href="ident?i=beepcount">beepcount</a>;<a name=L308 href="source/kernel/sched.c#L308">308</a> extern void <a href="ident?i=sysbeepstop">sysbeepstop</a>(void);<a name=L309 href="source/kernel/sched.c#L309">309</a> <a name=L310 href="source/kernel/sched.c#L310">310</a> if (<a href="ident?i=beepcount">beepcount</a>)<a name=L311 href="source/kernel/sched.c#L311">311</a> if (!--<a href="ident?i=beepcount">beepcount</a>)<a name=L312 href="source/kernel/sched.c#L312">312</a> <a href="ident?i=sysbeepstop">sysbeepstop</a>();<a name=L313 href="source/kernel/sched.c#L313">313</a> <a name=L314 href="source/kernel/sched.c#L314">314</a> if (cpl)<a name=L315 href="source/kernel/sched.c#L315">315</a> <a href="ident?i=current">current</a>-><a href="ident?i=utime">utime</a>++;<a name=L316 href="source/kernel/sched.c#L316">316</a> else<a name=L317 href="source/kernel/sched.c#L317">317</a> <a href="ident?i=current">current</a>-><a href="ident?i=stime">stime</a>++;<a name=L318 href="source/kernel/sched.c#L318">318</a> <a name=L319 href="source/kernel/sched.c#L319">319</a> if (<a href="ident?i=next_timer">next_timer</a>) {<a name=L320 href="source/kernel/sched.c#L320">320</a> <a href="ident?i=next_timer">next_timer</a>-><a href="ident?i=jiffies">jiffies</a>--;<a name=L321 href="source/kernel/sched.c#L321">321</a> while (<a href="ident?i=next_timer">next_timer</a> && <a href="ident?i=next_timer">next_timer</a>-><a href="ident?i=jiffies">jiffies</a> <= 0) {<a name=L322 href="source/kernel/sched.c#L322">322</a> void (*fn)(void);<a name=L323 href="source/kernel/sched.c#L323">323</a> <a name=L324 href="source/kernel/sched.c#L324">324</a> fn = <a href="ident?i=next_timer">next_timer</a>->fn;<a name=L325 href="source/kernel/sched.c#L325">325</a> <a href="ident?i=next_timer">next_timer</a>->fn = <a href="ident?i=NULL">NULL</a>;<a name=L326 href="source/kernel/sched.c#L326">326</a> <a href="ident?i=next_timer">next_timer</a> = <a href="ident?i=next_timer">next_timer</a>->next;<a name=L327 href="source/kernel/sched.c#L327">327</a> (fn)();<a name=L328 href="source/kernel/sched.c#L328">328</a> }<a name=L329 href="source/kernel/sched.c#L329">329</a> }<a name=L330 href="source/kernel/sched.c#L330">330</a> if (<a href="ident?i=current_DOR">current_DOR</a> & 0xf0)<a name=L331 href="source/kernel/sched.c#L331">331</a> <a href="ident?i=do_floppy_timer">do_floppy_timer</a>();<a name=L332 href="source/kernel/sched.c#L332">332</a> if ((--<a href="ident?i=current">current</a>->counter)>0) return;<a name=L333 href="source/kernel/sched.c#L333">333</a> <a href="ident?i=current">current</a>->counter=0;<a name=L334 href="source/kernel/sched.c#L334">334</a> if (!cpl) return;<a name=L335 href="source/kernel/sched.c#L335">335</a> <a href="ident?i=schedule">schedule</a>();<a name=L336 href="source/kernel/sched.c#L336">336</a> }<a name=L337 href="source/kernel/sched.c#L337">337</a> <a name=L338 href="source/kernel/sched.c#L338">338</a> int <a href="ident?i=sys_alarm">sys_alarm</a>(long seconds)<a name=L339 href="source/kernel/sched.c#L339">339</a> {<a name=L340 href="source/kernel/sched.c#L340">340</a> int old = <a href="ident?i=current">current</a>-><a href="ident?i=alarm">alarm</a>;<a name=L341 href="source/kernel/sched.c#L341">341</a> <a name=L342 href="source/kernel/sched.c#L342">342</a> if (old)<a name=L343 href="source/kernel/sched.c#L343">343</a> old = (old - <a href="ident?i=jiffies">jiffies</a>) / <a href="ident?i=HZ">HZ</a>;<a name=L344 href="source/kernel/sched.c#L344">344</a> <a href="ident?i=current">current</a>-><a href="ident?i=alarm">alarm</a> = (seconds>0)?(<a href="ident?i=jiffies">jiffies</a>+<a href="ident?i=HZ">HZ</a>*seconds):0;<a name=L345 href="source/kernel/sched.c#L345">345</a> return (old);<a name=L346 href="source/kernel/sched.c#L346">346</a> }<a name=L347 href="source/kernel/sched.c#L347">347</a> <a name=L348 href="source/kernel/sched.c#L348">348</a> int <a href="ident?i=sys_getpid">sys_getpid</a>(void)<a name=L349 href="source/kernel/sched.c#L349">349</a> {<a name=L350 href="source/kernel/sched.c#L350">350</a> return <a href="ident?i=current">current</a>->pid;<a name=L351 href="source/kernel/sched.c#L351">351</a> }<a name=L352 href="source/kernel/sched.c#L352">352</a> <a name=L353 href="source/kernel/sched.c#L353">353</a> int <a href="ident?i=sys_getppid">sys_getppid</a>(void)<a name=L354 href="source/kernel/sched.c#L354">354</a> {<a name=L355 href="source/kernel/sched.c#L355">355</a> return <a href="ident?i=current">current</a>->father;<a name=L356 href="source/kernel/sched.c#L356">356</a> }<a name=L357 href="source/kernel/sched.c#L357">357</a> <a name=L358 href="source/kernel/sched.c#L358">358</a> int <a href="ident?i=sys_getuid">sys_getuid</a>(void)<a name=L359 href="source/kernel/sched.c#L359">359</a> {<a name=L360 href="source/kernel/sched.c#L360">360</a> return <a href="ident?i=current">current</a>->uid;<a name=L361 href="source/kernel/sched.c#L361">361</a> }<a name=L362 href="source/kernel/sched.c#L362">362</a> <a name=L363 href="source/kernel/sched.c#L363">363</a> int <a href="ident?i=sys_geteuid">sys_geteuid</a>(void)<a name=L364 href="source/kernel/sched.c#L364">364</a> {<a name=L365 href="source/kernel/sched.c#L365">365</a> return <a href="ident?i=current">current</a>->euid;<a name=L366 href="source/kernel/sched.c#L366">366</a> }<a name=L367 href="source/kernel/sched.c#L367">367</a> <a name=L368 href="source/kernel/sched.c#L368">368</a> int <a href="ident?i=sys_getgid">sys_getgid</a>(void)<a name=L369 href="source/kernel/sched.c#L369">369</a> {<a name=L370 href="source/kernel/sched.c#L370">370</a> return <a href="ident?i=current">current</a>->gid;<a name=L371 href="source/kernel/sched.c#L371">371</a> }<a name=L372 href="source/kernel/sched.c#L372">372</a> <a name=L373 href="source/kernel/sched.c#L373">373</a> int <a href="ident?i=sys_getegid">sys_getegid</a>(void)<a name=L374 href="source/kernel/sched.c#L374">374</a> {<a name=L375 href="source/kernel/sched.c#L375">375</a> return <a href="ident?i=current">current</a>->egid;<a name=L376 href="source/kernel/sched.c#L376">376</a> }<a name=L377 href="source/kernel/sched.c#L377">377</a> <a name=L378 href="source/kernel/sched.c#L378">378</a> int <a href="ident?i=sys_nice">sys_nice</a>(long increment)<a name=L379 href="source/kernel/sched.c#L379">379</a> {<a name=L380 href="source/kernel/sched.c#L380">380</a> if (<a href="ident?i=current">current</a>->priority-increment>0)<a name=L381 href="source/kernel/sched.c#L381">381</a> <a href="ident?i=current">current</a>->priority -= increment;<a name=L382 href="source/kernel/sched.c#L382">382</a> return 0;<a name=L383 href="source/kernel/sched.c#L383">383</a> }<a name=L384 href="source/kernel/sched.c#L384">384</a> <a name=L385 href="source/kernel/sched.c#L385">385</a> void <a href="ident?i=sched_init">sched_init</a>(void)<a name=L386 href="source/kernel/sched.c#L386">386</a> {<a name=L387 href="source/kernel/sched.c#L387">387</a> int i;<a name=L388 href="source/kernel/sched.c#L388">388</a> struct <a href="ident?i=desc_struct">desc_struct</a> * p;<a name=L389 href="source/kernel/sched.c#L389">389</a> <a name=L390 href="source/kernel/sched.c#L390">390</a> if (sizeof(struct <a href="ident?i=sigaction">sigaction</a>) != 16)<a name=L391 href="source/kernel/sched.c#L391">391</a> <a href="ident?i=panic">panic</a>(<i>"Struct sigaction MUST be 16 bytes"</i>);<a name=L392 href="source/kernel/sched.c#L392">392</a> <a href="ident?i=set_tss_desc">set_tss_desc</a>(<a href="ident?i=gdt">gdt</a>+<a href="ident?i=FIRST_TSS_ENTRY">FIRST_TSS_ENTRY</a>,&(<a href="ident?i=init_task">init_task</a>.<a href="ident?i=task">task</a>.tss));<a name=L393 href="source/kernel/sched.c#L393">393</a> <a href="ident?i=set_ldt_desc">set_ldt_desc</a>(<a href="ident?i=gdt">gdt</a>+<a href="ident?i=FIRST_LDT_ENTRY">FIRST_LDT_ENTRY</a>,&(<a href="ident?i=init_task">init_task</a>.<a href="ident?i=task">task</a>.ldt));<a name=L394 href="source/kernel/sched.c#L394">394</a> p = <a href="ident?i=gdt">gdt</a>+2+<a href="ident?i=FIRST_TSS_ENTRY">FIRST_TSS_ENTRY</a>;<a name=L395 href="source/kernel/sched.c#L395">395</a> for(i=1;i<<a href="ident?i=NR_TASKS">NR_TASKS</a>;i++) {<a name=L396 href="source/kernel/sched.c#L396">396</a> <a href="ident?i=task">task</a>[i] = <a href="ident?i=NULL">NULL</a>;<a name=L397 href="source/kernel/sched.c#L397">397</a> p->a=p->b=0;<a name=L398 href="source/kernel/sched.c#L398">398</a> p++;<a name=L399 href="source/kernel/sched.c#L399">399</a> p->a=p->b=0;<a name=L400 href="source/kernel/sched.c#L400">400</a> p++;<a name=L401 href="source/kernel/sched.c#L401">401</a> }<a name=L402 href="source/kernel/sched.c#L402">402</a> <b><i>/* Clear NT, so that we won't have troubles with that later on */</i></b><a name=L403 href="source/kernel/sched.c#L403">403</a> __asm__(<i>"pushfl ; andl $0xffffbfff,(%esp) ; popfl"</i>);<a name=L404 href="source/kernel/sched.c#L404">404</a> <a href="ident?i=ltr">ltr</a>(0);<a name=L405 href="source/kernel/sched.c#L405">405</a> <a href="ident?i=lldt">lldt</a>(0);<a name=L406 href="source/kernel/sched.c#L406">406</a> <a href="ident?i=outb_p">outb_p</a>(0x36,0x43); <b><i>/* binary, mode 3, LSB/MSB, ch 0 */</i></b><a name=L407 href="source/kernel/sched.c#L407">407</a> <a href="ident?i=outb_p">outb_p</a>(<a href="ident?i=LATCH">LATCH</a> & 0xff , 0x40); <b><i>/* LSB */</i></b><a name=L408 href="source/kernel/sched.c#L408">408</a> <a href="ident?i=outb">outb</a>(<a href="ident?i=LATCH">LATCH</a> >> 8 , 0x40); <b><i>/* MSB */</i></b><a name=L409 href="source/kernel/sched.c#L409">409</a> <a href="ident?i=set_intr_gate">set_intr_gate</a>(0x20,&<a href="ident?i=timer_interrupt">timer_interrupt</a>);<a name=L410 href="source/kernel/sched.c#L410">410</a> <a href="ident?i=outb">outb</a>(<a href="ident?i=inb_p">inb_p</a>(0x21)&~0x01,0x21);<a name=L411 href="source/kernel/sched.c#L411">411</a> <a href="ident?i=set_system_gate">set_system_gate</a>(0x80,&<a href="ident?i=system_call">system_call</a>);<a name=L412 href="source/kernel/sched.c#L412">412</a> }<a name=L413 href="source/kernel/sched.c#L413">413</a> </pre><hr><div align=center> [<b><i>源代码浏览</i></b>] [<a href="diff/kernel/sched.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 + -