07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

内核的核心位置,kernel/exit.c 中,她完成了这么一件事情,把一个普通的进程转换成为了精灵进程,不过<br />

此<br />

处咱们可以不去深究精灵进程的原理,甚至咱们可以认为这句话没有做任何事情,只是从此之后咱们ps命令<br />

一看能够看到有一个叫做usb-storage 的进程.比如下面所看到的:<br />

localhost:~ # ps -el<br />

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD<br />

4 S 0 1 0 0 76 0 - 195 - ? 00:00:02 init<br />

1 S 0 2 1 0 -40 - - 0 migrat ? 00:00:00 migration/0<br />

1 S 0 3 1 0 94 19 - 0 ks<strong>of</strong>ti ? 00:00:00 ks<strong>of</strong>tirqd/0<br />

1 S 0 18 1 0 70 -5 - 0 worker ? 00:00:00 events/0<br />

1 S 0 26 1 0 71 -5 - 0 worker ? 00:00:00 khelper<br />

113<br />

1 S 0 27 1 0 70 -5 - 0 worker ? 00:00:00 kthread<br />

1 S 0 45 27 0 72 -5 - 0 worker ? 00:00:00 kacpid<br />

1 S 0 229 27 0 80 0 - 0 pdflus ? 00:00:00 pdflush<br />

1 S 0 230 27 0 75 0 - 0 pdflus ? 00:00:00 pdflush<br />

1 S 0 231 1 0 76 0 - 0 kswapd ? 00:00:00 kswapd0<br />

1 S 0 961 27 0 70 -5 - 0 scsi_e ? 00:00:00 scsi_eh_0<br />

1 S 0 1033 27 0 70 -5 - 0 scsi_e ? 00:00:00 scsi_eh_1<br />

1 S 0 1045 27 0 71 -5 - 0 scsi_e ? 00:00:00 scsi_eh_2<br />

1 S 0 1047 27 0 70 -5 - 0 worker ? 00:00:00 scsi_wq_2<br />

5 S 0 1262 1 0 72 -4 - 1774 - ? 00:00:02 udevd<br />

1 S 0 1939 27 0 70 -5 - 0 hub_th ? 00:00:00 khubd<br />

1 S 0 7804 27 0 70 -5 - 0 scsi_e ? 00:00:00 scsi_eh_3<br />

1 S 0 7805 27 0 70 -5 - 0 - ? 00:00:00 usb-storage<br />

4 S 0 13905 13902 0 75 0 - 2430 wait pts/1 00:00:00 bash<br />

0 R 0 19098 13905 0 77 0 - 821 - pts/1 00:00:00 ps<br />

显然,您在终端按ctrl-c 是不可能中止这个usb-storage 进程的.这是精灵进程诸多特性中的一个,她运<br />

行于后台.试一下kill -9 加进程号,看你能杀死她不?(系统崩溃了我可不负责哦...)<br />

294行,这里为目前的进程设置一个flag,PF_NOFREEZE,在整个内核代码中,这个flag 也只出现过几次.<br />

这个flag 是与电源管理相关的,2.6 的内核为了实现与Windows 相似的一个功能,Hibernate,也就是"冬<br />

眠",(别说您不知道,Windows 关机选项里面有"关机","重启","注销","Stand by",以及"Hibernate").在<br />

内核编译菜单里面,Power managerment options 中,有一个选项S<strong>of</strong>tware Suspend,也就是内核编译<br />

选项中的CONFIG_SOFTWARE_SUSPEND,选择了她使得机器可以被suspended.显然咱们不用care<br />

她. 但是这里之所以要设置这个flag,是因为suspend 要求把内存里的冬冬写到磁盘上,而一个进程设置了<br />

这个flag 就表明它在suspend 的时候不会被冻住,用行话来讲就是,they’re not refrigerated during a<br />

suspend.freeze 就是冷冻,冻住的意思,过去分词frozen 是形容词,冻结的,冰冻的,其实就是让进程睡眠.<br />

所以总的来说,这里的做法就是说,即使系统suspend 了,这个进程,或者准确地说,这个内核线程,也不应该<br />

进入睡眠.<br />

要执行这两个操作需要执行lock_kernel()/unlock_kernel()这一对函数.然后299 行,执行complete<br />

唤醒前面那节的父进程.而子进程并不退出,她继续行走,她无怨无悔的行走,只不过余秋雨先生是为追寻人<br />

类文明足迹而进行的域外旅程,而此处子进程(执)行的她对内核的守护.她像天使一般,守护着心爱的人.<br />

于是咱们也继续跟着她行走,299 行, complete(&(us->notify)),这正是和刚才在父进程里看到的那句<br />

使进程进入睡眠的wait_for_completion(&(us->notify))相对应,这里自然是唤醒父进程,我们先继续看

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!