`
dato0123
  • 浏览: 944937 次
文章分类
社区版块
存档分类
最新评论

Linux那些事儿之我是U盘(33)彼岸花的传说(一)

 
阅读更多

彼岸花,花语是悲伤的回忆.

很久很久以前,城市的边缘开满了大片大片的曼珠沙华,它的花香有一种魔力,可以让人想起自己前世的事情.守护曼珠沙华的是两个妖精,一个是花妖叫曼珠,一个是叶妖叫沙华.他们守侯了几千年,可是从来没有见过面,因为开花的时候,就没有叶子,有叶子的时候没有花.他们疯狂地想念着彼此,并被这种痛苦折磨着.终于有一天,他们决定违背神的规定偷偷地见一次面.那一年的曼珠沙华红艳艳的花被惹眼的绿色衬托着,开得格外妖冶美丽.

曼珠和沙华受到惩罚,被打入轮回,并被诅咒永远也不能在一起,生生世世在人世间受到磨难.从那以后,蔓珠沙华又叫彼岸花,意思是开放在天国的花,它的花的形状像一只只在向天堂祈祷的手掌,可是再也没有在这个城市出现过.每年的秋彼岸期间(春分前后三天叫春彼岸,秋分前后三天叫秋彼岸)她会开在黄泉路上,曼珠和沙华的每一次转世在黄泉路上闻到彼岸花的香味就能想起前世的的自己,然后发誓不分开,但只有在这一刻,因为他们会再次跌入诅咒的轮回,灵魂籍由着这花的指引,走向幽冥……

而为了纪念这个美丽而又忧伤的传说,Linux内核中引入了守护进程,也正是与这个传说对应,守护进程也叫内核精灵,当然,如果你觉得人们都太迷信,而你是员,是无神论者,那么ok,你可以叫它为内核线程.事实上我也是无神论者,不过我只敢在白天承认这一点.我们来看具体的代码.

801,调用了kernel_thread()函数,kernel_thread(usb_stor_control_thread, us, CLONE_VM),并将返回值用一个整型变量p来表示,如果从前您对内核本身不是很熟悉,那这个函数就会让您有点头疼了.这个函数将会创建一个内核线程,而函数usb_stor_control_thread()将会执行,us将是传递给她的参数,CLONE_VM只是设定的一个flag,Linux内核不是很熟悉的话,可以将kernel_thread看作类似于fork的冬冬,什么?fork您也不知道?好吧.不知道就不知道,只是依稀记得在那毕业求职的日子里,很多外企的笔试面试中都会问起fork,问一些关于她的返回值的问题,印象中,2004年维尔软件的校园招聘笔试中考过,后来我去Sun中国工程研究院面试也被问起过. 实际上,简单一点说,kernel_thread()这么一执行呢,就会有两个进程,一个是父进程,一个是子进程,子进程将会执行usb_stor_control_thread(),us是作为usb_stor_control_thread函数的参数(实参),CLONE_VM标志表征父子进程之间共享地址空间,执行完usb_stor_control_thread()之后,子进程就结束了,她会调用exit()函数退出.而父进程继续顺着usb_stor_acquire_resources()函数往下走,kernel_thread()函数对于父进程而言返回的是子进程的进程id,所以802行先判断,若是返回值p小于0,则说明出错了,否则,那就把p赋给us的元素pid.

于是,咱们接下来必须再次兵分两路,分别跟踪父进程和子进程前进了.先看父进程,810,执行wait_for_completion(&(us->notify)),如果您说wait_for_completion是谁?您早已经把她忘怀,那么她会很伤心的.记得咱们当初在提交urb的时候调用过她吗?咱们初始化了一个等待队列,urb->done,然后咱们提交了urb,然后咱们通过调用wait_for_completion(&urb->done)进入了等待,进入了睡眠,urbusb core处理完了,或者说被urb host controller处理完了,complete()函数将会被调用,从而唤醒咱们那个进入睡眠的进程.所以此处也一样,us->notify是在很早很早以前storage_probe()函数中初始化的,该函数的945,init_completion(&(us->notify)),struct us_data,有这么一个元素notify,struct completion结构体变量,所以在这里,父进程将进入睡眠,谁来唤醒他?没错,您很聪明,正是子进程,也正是在usb_stor_control_thread()函数中,会有complete(&(us->notify))这么一句,wait_for_completion()complete()是一对青梅竹马的函数,她们总是一起被用,一个设置进程进入睡眠,另一个则负责把这个进入睡眠的进程唤醒,如果您知道信号量的话,她们就类似于信号量中的down()/up()函数对,只不过她们更加安全.

,父进程先搁一搁,反正他进入睡眠了,没人唤醒他的话,他是不会往下走的.来看子进程,也就是usb_stor_control_thread()函数,这个函数定义于drivers/usb/storage/usb.c.咱们下一节再深入这个函数,现在,休息,休息一会...

分享到:
评论

相关推荐

    Linux那些事儿之我是U盘

    根据给定的信息,“Linux那些事儿之我是U盘”这一标题及描述主要聚焦于USB技术在Linux环境下的工作原理和技术细节。接下来,我们将基于这个主题展开深入探讨,涵盖USB技术的基本概念、USB在Linux系统中的实现机制...

    Linux那些事儿

    Linux那些事儿之我是U盘 Linux那些事儿之我是Hub Linux那些事儿之我是USB Core Linux那些事儿之我是UHCI Linux那些事儿之我是EHCI控制器 Linux那些事儿之我是PCI Linux那些事儿之我是SCSI硬盘 Linux那些事儿之我是...

    Linux那些事儿1-9合集

    读过《linux那些事儿之我是U盘》的人,都知道其风格,我就不多说了。 导读: linux那些事儿之我是U盘 linux那些事儿之我是HUB linux那些事儿之我是USB Core linux那些事儿之我是UHCI Linux那些事儿之我是EHCI主机控制...

    Linux那些事儿之我是USB(第2版)

    ### Linux那些事儿之我是USB(第2版)关键知识点概览 #### 一、书籍概述 - **核心主题**:本书主要围绕Linux内核中的USB子系统展开,深入剖析其工作原理和技术细节。 - **目标读者**:面向Linux初学者、驱动开发者...

    linux那些事儿之我是USB.zip

    本压缩包文件"linux那些事儿之我是USB.zip"包含了深入理解Linux USB驱动及内核相关知识的九个文档,包括Block层、EHCI主机控制器、HUB、PCI、SCSI硬盘、Sysfs、UHCI、USB core以及U盘。这些文档旨在提供一个系统性的...

    LINUX\Linux那些事儿系列

    3. **Linux那些事儿之我是U盘.pdf**: USB闪存驱动器,通常称为U盘,是常见的便携式存储设备。这部分可能讲述Linux如何识别、挂载和管理U盘,包括使用ums(USB Mass Storage)驱动程序,以及如何处理文件系统的读写...

    Linux那些事儿之全集

    导读.doc Linux那些事儿之我是Block层.pdf Linux那些事儿之我是EHCI主机控制器.pdf Linux那些事儿之我是Hub.pdf Linux那些事儿之我是USB_core.pdf Linux那些事儿之我是U盘.pdf等等 Linux那些事儿系列全在这里了

    Linux那些事儿系列.rar

    》包括《Linux那些事儿之我是Hub》、《Linux那些事儿之我是Sysfs》《Linux那些事儿之我是UHCI》、《Linux那些事儿之我是USB core》、《Linux那些事儿之我是U盘》,令人叹为观止的一个linux系列书籍。只能说,江山代...

    linux 那些事儿全集

    “Linux那些事儿之我是U盘.pdf”将关注通用串行总线(USB)闪存驱动器。这部分会解释Linux如何识别和处理USB闪存设备,包括文件系统的挂载和数据交换过程。 “Linux那些事儿之我是USB Core.pdf”涉及Linux内核的USB...

    linux的那些事儿全集

    Linux那些事儿之我是Block层 Linux那些事儿之我是EHCI主机控制器 Linux那些事儿之我是Hub Linux那些事儿之我是PCI Linux那些事儿之我是SCSI硬盘 Linux那些事儿之我是Sysfs ...Linux那些事儿之我是U盘

    linux那些事儿之我是U盘

    本文基于一篇幽默且深入的教程《Linux那些事儿之我是U盘》,该文章通过作者的亲身经历和深入浅出的讲解,介绍了Linux操作系统中USB存储设备的工作原理及相关技术细节。以下是对该文中涉及的重要知识点的梳理。 ####...

Global site tag (gtag.js) - Google Analytics