• 2005-01-17

    快速关机 - [技术流]

    在CSDN上,用户pbtincsu 给出了这么一段代码,据说可以用来超快速关机:

    Public Declare Function RtlAdjustPrivilege& Lib "ntdll" (ByVal Privilege&, ByVal Newvalue&, ByVal NewThread&, Oldvalue&)
    Public Declare Function NtShutdownSystem& Lib "ntdll" (ByVal ShutdownAction&)
    Public Const SE_SHUTDOWN_PRIVILEGE& = 19
    Public Const SHUTDOWN& = 0

    Sub Main()
        RtlAdjustPrivilege SE_SHUTDOWN_PRIVILEGE, 1, 0, 0
        NtShutdownSystem SHUTDOWN
    End Sub

    我 试了一下,关机速度的确非常快,大约是两秒钟(我的机器配置:Pentium M 1.5GHz /w 2MB L2 Cache,512 MB DDR 333 SDRAM,40GB 4200 rpm HDD,Mobility Radeon 9600 /w 64MB ,使用Windows XP SP2 Professional 操作系统)。后来用户Tenner告诉大家,按下Ctrl+Alt+Del后在弹出的Windows安全对话框(如果你在使用Windows XP而且没有进行必要的设置,或许你只能看到任务管理器)里面按着Ctrl键单击“关机”会有同样的效果。我试了一下,Windows这时会跳出一个对话 框,并且告诉我这是紧急关机。
      pbtincsu 在帖子里提出的问题是,这样关机是否会对硬件有损伤。
      首先我尝试在MSDN上寻找这段代码使用的两个函数:RtlAdjustPrivilege和NtShutdownSystem,结果很令人沮丧,没有任何和这两个函数有关的信息。在Google上搜索也只找到NtShutdownSystem的部分内容:
    NtShutdownSystem

    NTSYSAPI
    NTSTATUS
    NTAPI
    NtShutdownSystem(IN SHUTDOWN_ACTION      Action );
    Function NtShutdownSystem closes system. Caller should manually inform running processes about pending shutdown action.
    (翻译)NtShutdownSystem函数用于关闭系统。调用者应该手动向运行的进程发送有关即将关闭操作系统的消息。
    ----------------------------------------------------------------------
    Action
        Type of shudown defined in SHUTDOWN_ACTION enumeration type.
    (翻译)
    Action
        关机类型,在SHUTDOWN_ACTION枚举中有定义。

    所 以我决定自己试试。再次执行这段代码,我在音频属性中禁用掉声音,把耳朵贴在机器的右下位置,那里有这台机器的唯一一块硬盘。结果很明显,在机器关掉的同 时,我清楚的听到硬盘磁针复位的声音。这说明这段代码在关机时复位了硬盘,而一般非法关机带来的硬件损伤就是硬盘磁针没有复位而在震荡中刮伤盘片,所以可 以认为这段代码的关机方式不会对硬件构成损伤。
      再对上面找到的关于函数NtShutdownSystem的说明,看上去就是不告诉任何正在运 行的进程有关即将关机的消息,然后直接把Windows喀嚓掉,既然Windows都关了,那正在运行的进程也就活不了了。也就是不用慢吞吞等那些进程自 己退出掉,直接强制关闭整个系统。
      从这一点上分析,对硬件是没有损伤的。但如果某个进程正在读写硬盘上的文件,就可能导致文件系统出错。如果某个进程有未保存的信息,这些信息将会丢失。
       因此,我认为,如果确实嫌Windows关机太慢的话(我的关机大约要1分钟),在保存了所有数据并且确保没有程序在读写硬盘的情况下,使用这种方法关 机是可行的。当然,受函数的限制,这两个函数(或者,至少NtShutdownSystem这个函数)只能在Windows 2000/XP/2003 或者更新的Windows上工作,这段代码也就不能支持 Windows 95/98/ME 了。

  • 2005-01-17

    那时花开 - [挖坑]

      这篇小说自从高三暑假写到第四章(确切的说,第四部分)就再没写过,我希望有一天我会把它写完,而不是像我的大多数小说一样,半途而废。我曾希望把我自己,和我的朋友、我的爱人,把他们的故事都写进里面,可是我发现这很困难。
      表妹对这篇小说的评价很高,非常感谢她,从很早以前起她就在支持我,她认为我写的不错,这至少满足了我一定时间段内的虚荣心,虽然有些东西在后来看起来并不是想象中那么好。或许一年或者两年,或者更短的时间后,这篇小说也会被我定义为我的失败作品之一。
      我发现我的心情,很大程度上,很容易变化。比如说,写这篇小说时心情很极端的郁闷,所以如果现在让我接着写,肯定找不到那种感觉。或许这篇小说完工的时候,就是我下次失恋的时候。不过现在看起来,那一天还很远。


    那时的天空
    是晴晴的朗
    守在蓝蓝的窗台上
    看青春走过山冈
    偶尔掠过的风
    吹散了你的歌唱
    忽远忽近的心思
    想着永远就是这样

    又是风起
    你在收拾着行囊
    我转过身
    躲避你含泪的眼光
    你说梦想
    它等你就在远方
    还说花开的时候你会回头望

    花开的时候
    你在我的身旁
    轻轻的歌唱里有淡淡的忧伤
    花谢在天涯
    你在何处流浪
    疲惫的梦中有没有遗忘



     
       叶末趴在阳台的栏杆上,望着日暮时分的海,看着它在越来越暗的天色里一如既往的平静。楼下街上的路灯自西向东一顺儿地点亮了,凄清的街顿时变得辉煌了起 来。一条龙似的灯火点到楼下正对的那盏灯时突然停住了,接着跳过它从下一盏灯开始继续向东绵延。街湿漉漉的,通亮的反着光,没有行人,显得那么孤独。远处 敲响了十九点的钟声,他这才从呆滞的状态中醒来,饥饿的肚子已经等了他超过半个小时的时间。他回过头正想问林凝晚上吃什么那,却只看见屋里一片漆黑,一种 怅然的失落让他的心一沉。他苦笑着拉开阳台的门,走进了屋里。
      他点亮了灯,光瞬间钻进了房间的每个角落。房间很整洁,林凝离开时显然用心整理 过。壁上贴着《最终幻想X-2》的海报,边上时一幅一开大小的照片,那是他和林凝在北海公园照的。林凝抱着一包薯片,像孩子一般笑的很灿烂,而他却很老实 地站着,显得有些拘谨。林凝说他这幅照片照的最有味道,拿到喷绘店去喷了一张超大的挂到墙上。对面的墙上是个壁橱,上面摆着叶末的杂志和林凝的CD。壁橱 下面的茶几上一块大理石镇纸压着一张纸条,清秀的字迹告诉叶末,她走了。
      他在地上坐下,抽出镇纸下面的纸条,心里突然一种说不出的味儿。这不 是他希望的结果么,为什么自己却这么犹豫。他闷闷地想着,终于还是放下了纸条,打开了旁边地柜子。柜子里只有几个孤单的塑料袋,以及一张长长的购物发票。 他和林凝很喜欢吃米线,每次都买十几盒用自行车架了回来,发票开的老长。他摇摇头,拿起茶几上的钥匙出了门。
      街上基本上没有人。他没撑伞,淋着小雨径直走着。边上的路灯在某次投掷比赛中不幸牺牲,至今未被修复。走到街道与一条大公路的接口处,他停了下来,看着公路上来往的车流,今天是六号,他决定向他看到的第一辆尾号是6的车行进的方向走。一辆白色的捷达决定了他该向南走。
       一路的车水马龙和刚刚那条安静的街道形成了鲜明的对比。路边的音像店里放着孙燕姿的《懒得去管》,叶末踢了一脚地上的石子,听到这么一句歌词,“才发现 钥匙忘在家里”。他忙摸了摸口袋,空荡荡的什么都没有;再往深一点的地方探去,发现裤子口袋破了一个大洞。他无奈的摇了摇头,回过头去找钥匙,一无所获。 和钥匙一起失踪了的是他的钱夹子。他沮丧的在路边坐下,里外的翻动着裤子口袋,像要在上面找到有关钥匙和钱夹的线索。不一会儿,肚子又开始叫了。这让他打 定了主意:必需先填饱肚子。他摸出放在衬衫口袋里的手机,上下翻着条目不多的电话簿。翻到“林凝”,他呆了一下,把这一条删掉了。手机忠诚的告诉他“已删 除”。他握着手机,眼睛直直的盯着屏幕。我这是怎么了呢。手机柔和的蓝色背光熄灭了,却显得格外的刺眼。许久,他站起身来,开始往回走。走到自家楼下时, 他留意到不亮的路灯的柱子上贴的几张小广告:一张“专治性病”,一张“疏通下水道”,一张“小X家电维修”,还有一张正是他需要的,“专业开锁”。他站在 路灯下面拨通了那上面刊的电话,一个阴森森的女声告诉他对方不在服务区。他闷闷的走到另一盏路灯下面,上面贴着一个不同的开锁公司的广告。叶末一边想着平 时怎么没留意到这些,一边再次拨通电话。开锁公司接电话的小伙子很热情,告诉他马上就到。
      他走上楼,打开楼道里的灯。这是一幢八十年代的居民 楼,设施陈旧,但是能在阳台上看见海景,另外还很便宜。楼梯扶手上的漆早已经没有了,木质的扶手被上下楼居民的手磨得光溜溜得。楼道的角落堆着古老的煤炉 和煤球,不知道放了多少年,脏兮兮的染的周边地上一片黑。叶末走上四楼,发现钥匙和钱包正掉在门口。他拾起来,却丝毫没有庆幸的意味。他正要开门,想起刚 刚叫了开锁公司的人来,便在一旁的楼梯上坐了下来。
      开锁公司的小伙子如约而至,叶末示意他动手。他用几根铁丝轻松的把门弄开了,叶末付了钱,走进屋里也不顾肚子叫唤了,倒头便睡。
       没多久手机响了。叶末用的是号称史上销量最好的摩托罗拉V998,铃声是刺耳的单音。他摸起手机,不小心按错了键,拒接了电话。他看看对方的号码,是黄 埔蒻打来的,又接着睡。接下来的一个电话更是来势凶猛,刚按下接听键就听见黄埔蒻用招牌式的吼叫声骂道,叶末你真不是人你现在就给我下楼要不我上去把你家 门踢开,说完就挂掉了。叶末揉揉眼睛,到阳台上向下看,只看得清有两个人站在一盏路灯下面。叶末嘟哝着下楼,在漆黑的楼道里踩扁了一个煤球,吱嘎一声。
       黄埔蒻如悍妇一般凶神恶煞的盯着叶末。叶末看见黄埔蒻边上的林凝,不由得心一沉。林凝正转身要走,被黄埔蒻一把抓住,黄埔蒻开口就骂,叶末你真不是人, 林凝对你那么好你为什么要抛弃她。林凝低着头,摇摇黄埔蒻的手轻声说,你别……黄埔蒻说林凝你别管我今天非得让这个不是人的交代,接着冲着叶末又骂了起 来。叶末摇摇头,走到黄埔蒻面前说我们的事你别管,转身往回走。黄埔蒻愣了一下,又接着骂起来,叶末你真不是人,你他妈真不是人。

     

    零点一

      他只是坐着,一言不发,纠结的眉毛让人能看到来自他心底的痛。我只能慌乱的透过从杯中缓缓升起的雾气看着他凝重的神情,无所适从。
       “我说,想开点吧……”一开口我就知道不该说,我几乎不知道该怎么控制自己的语气。依稀的我看到他的满脸笑容突然僵住在街角,对面正在上演他决未想到也 决不愿意看到的一幕。我不知道该不该和该如何对他说,他所看到的只能算是小场面。那里,陈可和覃秦手拉着手,说说笑笑。
      “覃秦,”自嘲般的苦笑挤满了他的脸,“覃秦。”黑褐色的蒸馏咖啡随着他的手起伏不定,他一仰头,透彻的玻璃杯中只剩下一张逐渐消散的褐色水膜。他用手支着下巴,呆呆的看着空荡荡的杯子。
    我端起咖啡壶,杯里的黑褐色液体缓慢的向上爬,像七年来陈可在他心中逐渐被神化的形象,直至溢出,最后却被一饮而尽。叶末啊,一个长达七年的等待,难道真的值得。
      “我是不是真的很糟。”他突然这么说,像自言自语,又似在对我发问。我抬起头,“不,真的不是。”不等我说话,他又说,“是吧,覃秦比我更适合她。”他抬起头,看着我的双眼开始模糊。
       我不知该怎么才好,第一次知道男孩也会哭。他趴在桌上,开始抽泣。我感觉自己几乎是不由自主的站起身来,坐到了他的旁边,轻抚着他杂乱的头发,这是我能 想出的唯一合适的动作。他放声哭起来,释放着多年来的积郁:从让我转交情书时的神秘兮兮,到得到否定答案时的黯然神伤;从发誓要坚持到底时的信誓旦旦,到 向我倾诉难以继续时的低沉落寞。我一直是一个见证者,一个卧底和一个媒婆。作为比她自己更了解她的人,我是陈可十几年来最好的朋友,同时我也在为另一个好 朋友担着心。他深爱陈可,却不知道如何得到回馈。他从来都天真的以为时间会证明一颗真心的同时,也一定会给之以回报。他不了解陈可,只是为表象所迷惑。他 眼里的陈可太简单,以至于看见陈可和覃秦牵手散步都会茫然失措。叶末,我知道在这个谜潭里,你进退维谷。
      他的头发很长很乱,但很干净,夹着些 许白发,那是彻夜工作带来的。他是个忘我的工作狂,能为了一个算法放弃两天的饮食和睡眠,最后趴在键盘上睡着。在软件技术上,他是个令人敬重的年轻的专 家,可是在爱情上,他却输的一塌糊涂。高二时一封糟糕透顶的情书让他成了陈可的笑柄;大一时被当场否定在离散数学课教室的门口。他没有过成功的恋爱经历, 从小学五年级情窦初开起。看着这个可怜的人,他的哭声渐渐低了下去,站起身,他红着眼睛轻轻的说了声对不起,向门走去。
      我拉住了他。
      我很慌乱,不知道如何是好。许久,我感觉手上的汗湿了他的衬衫。
      “别想太多。”我的声音吓了自己一跳。
      背对着我,他轻轻点了点头。手松开,我听见清脆的关门声。沙发上,我没头没脑的哭了起来,心隐隐作痛,却不知道为什么。

     

    零点二

      单调的铃声让我从睡梦中惊醒,空杯子的旁边,叶末的手机被忘在了这里。窗外一轮红日正要没入高矮不一的建筑群中,我甩甩头,拿起手机。
      “您好。
      “您是……”
      “找叶末是吗?”
      “对。他今天一天都没来公司……”
      我恍然,这已然是另一天了。说明情况,我匆忙下了楼。

       门没有关,即使背对着我,我也能看出他的颓然。他坐在地上,撑在膝盖上的手支着下巴。墙角的音箱里飘出略显陈旧的乐音。他似乎觉察到站在门口的我,回过 头看了看,强挤出了一个微笑。我走上前,和他并排坐着。放在旁边的是歌词页,Bigfish的《Sometimes Love Just Ain’t Enough》。复歌被重重的划了线。
        “But there’s a danger in loving somebody too much
        “And it’s sad when you know it’s your heart you can’t trust
        “There’s a reason why people don’t stay where they are
        “Cos baby sometimes love just ain’t enough…”

      “叶末。”
      他没说话。
      “你……别太难过。” 我找不出别的话来说。
      他依然没有开口,静静的听着歌,却让人怀疑他是不是什么都没有听到。
        “… Cos baby sometimes love just ain’t enough
        “Baby sometimes love just ain’t enough”

      他转过头,“林凝。”
      我看着他,几丝乱发从他眼前搭过。
      “真的,很谢谢你。”歌词页被拿起,“这许多年,你付出了很多。”
      “都是朋友,干嘛说这些。”
      “是啊,都是朋友。覃秦也算一个。”他苦笑着,这首歌的前奏又响了起来。
        “I don’t wanna lose you
        “I don’t wanna use you
        “Just to have somebody by my side
        “I don’t wanna hate you
        “I don’t wanna take you
        “But I don’t wanna be the one to cry…”
      覃秦。叶末自初中起最好的朋友。
      “我永远不可能拿自己的朋友怎么样。如果必须要我做出放弃谁的选择,我的答案会是陈可。”
      他这么说着,声音低沉沙哑。夕阳余晖灭尽,漆黑的屋里只有两颗指示灯在闪耀。窗外的天空深邃的蓝,无边无际。黑暗里,我能看见他的轮廓。抱着膝盖,他看着窗外的天,那里一颗星星若隐若现。
      我深吸了一口气,却听见来自身边的一声叹息。他摸起遥控器,墙角的指示灯灭了。一小片没有希望的光灭了。他一只手支地站了起来,却腿一软跌倒在地上。我急忙过去扶住他,他一定是坐了太久,突然站起来导致脑部供血不足。他扶住墙,轻轻地喘气。
      “你看,我就是这么个废物。”他自嘲的笑声散播开来,却如一团恼人的蛛丝缠住了我。我心里突然升起一团无名怒火,猛地推了他一把:
      “你看,你就是这么个废物。”
       他向前扑倒在地,突然一声不吭,只是平静的呼吸着。我愣住了,开始怀疑自己刚刚的举动。走上去,我蹲下握住了他的手。“对不起。”我这么说,却清楚的听 到他也说出了同一句话。他支撑着站起来,我看见他脸上晶莹的泪滴倒映出一城繁灯。我伸手去擦,却没有碰到他的脸。突然一种奇怪的感觉从我的心底升腾而起, 我感到他是那般遥不可及。遥不可及。他的轮廓开始模糊起来,像要远离而去。我伸出手去,却被两只更大的手轻轻抱住。
      瞬间,时间凝固了。他把头放在我的肩上,泪很快湿了我的衣服,就像他的左胸也已一片温热透湿。慌乱中,我如僵尸一般尴尬地伸着两只手,却不知该放在哪里才好。

     

    零点三

      我没有预料到事情会转变得这么快,快到来不及让我适应。我想要回味昨天发生的事情,却受到一种未知起源的强大阻力。我只记得我全身发热,却在那温暖的怀抱中瑟瑟发抖,事情已经容不得我多想,他告诉我让我做他的女朋友。
    女朋友。
       这个词真有讽刺意味。如果在平时,我敢肯定我会转过身,理都不理他。我不过给他帮了点忙,他居然敢得寸进尺的要我做他的女朋友,这是个什么想法,这么肮 脏,枉我这么多年为他和陈可的关系操心。他喜欢陈可,他把这件事弄得整个城市都知道了,然后让我做他的女朋友。我甩甩头,一时间没了主意。我只记得我轻轻 的点了头,不知羞耻的接受了一个不知羞耻的请求。“这么多年我一直走错了路。”他这么说,轻易的把一个七年的事实推下悬崖。他喜欢陈可呀,他怎么会说出那 样的话。
      我呆呆的想着,无数的车子从我面前呼啸而过。这条熟悉的街突然间变得陌生起来。一辆TAXI停下,我看见他从车窗里探出脑  袋。
      “林凝——”
      我转过身,我没听见。但我能感觉到他向我走来,手放在我的肩膀上。
      “干什么哪!”甩开他的手,我径直走着,不管身后跟上的脚步:“林凝~怎么了林凝~失忆了还是怎么着林凝~我是……”
      “你给我滚。”我停下来,身后一片空寂。
       他再没跟上,我机械的走着,不觉眼泪又掉了下来。我不知道为什么,也不知道该怎么办,我感觉一切都很麻烦,杂乱不堪,像一团打了 死结的麻绳,一缸盘绕 的蟒蛇。我不知道自己是怎么回去的,但无疑最终我扑倒在床上,然后我在半夜发现泪湿的床垫和红肿的眼睛,以及在门外靠着墙鼾声大作的叶末。
      我 没有惊动他,靠墙在他旁边坐下,开始认真的考虑几天以来,以及几年以来发生的事情。一切都突如其来,毫无征兆却又像是精心安排好了的。男孩爱上女孩,女孩 的朋友帮助男孩,男孩最终爱上女孩的朋友,多么落俗的故事,却真实的可怕。我想我该拒绝他,然而总是有难以名状的力量阻挡着我,牵引着我,逼着我走上一条 我本不想走的路,做一些违背我的意愿的事情。事情越来越烦杂,烦杂到我的脑袋已经装不下它。夜空里月亮柔和的笑着,幸灾乐祸的看着头晕脑胀的我,昏昏沉沉。

     

  •   我们经常会遇到这样的问题,例如要按次序执行几个程序,不是同时执行,也不是依次打开,而是当第一个程序执行完毕后再执行第二个,接着是第三个,等等等等。在CSDN社区里,用户ww111222 就遇到了这样的一个问题:如何按顺序执行4个EXE程序
    一种解决的方案是使用特定的API启动一个程序,监视它,不停的监视它,直到了解到它已经关闭了,再执行第二个。这种方法确实可行:如果你见过某些安装程序的话,你会发现它们会在安装过程中执行一个程序,等待它执行完毕再继续安装进程,但显然这种方法比较麻烦。
      同时,如果你还记得DOS时代有个批处理的概念的话(实际上,这个概念现在依然存在),你也许会和我一样想到用批处理解决这个问题。在这个帖子中,我是这么回答的:

    假设4个DOS程序分别是1.exe,2.exe,3.exe,4.exe,都放在c:\下:
    Private Sub Form_Load()
    Dim sCmd As String
    sCmd = "C:" & vbCrLf & "cd \" & vbCrLf & "1.exe" & vbCrLf & "2.exe" & vbCrLf & "3.exe" & vbCrLf & "4.exe"
    Open "c:\1.bat" For Output As #1
      Print #1, sCmd
    Close #1
    ShellExecute 0, "open", "c:\1.bat", vbNullString, vbNullString, vbNull
    End Sub

      程序的逻辑很简单,编写一个bat文件,然后保存到c:\下,接着使用 ShellExecute API(如果不了解的话,请参考MSDN)执行它。后来我了解到,直接使用shell语句也可以达到相同的效果(执行bat文件),而且来得更简单。然后 贴主提出,各个程序分别有它们的参数。我把程序修改了一下:

    假设4个DOS程序分别是1.exe,2.exe,3.exe,4.exe,都放在c:\下;参数分别是param1,param2,param3,param4:

    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
    Private Sub Form_Load()
    Dim sCmd As String
    sCmd = "C:" & vbCrLf & "cd \" & vbCrLf & "1.exe /" & param1 & vbCrLf & "2.exe /" & param2 & vbCrLf & "3.exe /" & param3 & vbCrLf & "4.exe /" & param4
    Open "c:\1.bat" For Output As #1
      Print #1, sCmd
    Close #1
    ShellExecute 0, "open", "c:\1.bat", vbNullString, vbNullString, vbNull
    End Sub

      接下来用户terry6394“狗尾续貂”了一下:如果你想运行之后还留下命令行窗口你可以这样:

    sCmd="C:" & vbcrlf & "cd \" & vbcrlf & "1.exe /" & param1 & vbcrlf & "2.exe /" & param2 & vbcrlf & "3.exe /" & param3 &  vbcrlf & "4.exe /" & param4 & vbcrlf  & "%SystemRoot%\system32\cmd.exe"

      这个的思路是在批处理执行结束前再打开一个命令行窗口,但是我怀疑它的可行性。举个例子,打开命令行窗口,输入cmd,你得到的不是两个命令行窗口,而是在原窗口里cmd再执行了一遍。所以我认为这个窗口还是会关闭,但是我没有真正的试过。
    贴主下面提出的问题是,他需要在批处理结束后删除批处理文件,但是如果把
    kill  "c:\1.bat" 直接放到 shellexecute语句后面,就会导致批处理文件还没有执行完就被删除了。我提出的建议是,修改如下一行为:

    sCmd="C:" & vbcrlf & "cd \" & vbcrlf & "1.exe /" & param1 & vbcrlf & "2.exe /" & param2 & vbcrlf & "3.exe /" & param3 &  vbcrlf & "4.exe /" & param4 & vbcrlf  & "%SystemRoot%\system32\cmd.exe /c " & chr$(34) & "del  c:\1.bat" & chr(34)

      其中chr$(34)的结果是半角的双引号。贴主对于问题的解决表示满意。

      这仅仅是批处理文件在编程应用中的一个例子。在编程中灵活的使用批处理文件,可以大大的减轻编程的负担和提高程序的效率。

  •   作为计算机的核心组件,CPUCentral Processor Unit,中央处理器)在用户的心中一直是十分神秘的:在多数用户的心目中,它都只是一个名词缩写,他们甚至连它的全写都拚不出来;在一些硬件高手的眼里,CPU也至多是一块十余平方厘米,有很多脚的块块儿,而CPU的核心部分甚至只有不到一平方厘米大。他们知道这块不到一平方厘米大的玩意儿是用多少微米工艺制成的,知道它集成了几亿几千万晶体管,但鲜有了解CPU的制造流程者。今天,就让我们来详细的了解一下,CPU是怎样练成的。

     

     


    基本材料

     

     

      多数人都知道,现代的CPU是 使用硅材料制成的。硅是一种非金属元素,从化学的角度来看,由于它处于元素周期表中金属元素区与非金属元素区的交界处,所以具有半导体的性质,适合于制造 各种微小的晶体管,是目前最适宜于制造现代大规模集成电路的材料之一。从某种意义上说,沙滩上的沙子的主要成分也是硅(二氧化硅),而生产CPU所使用的硅材料,实际上就是从沙子里面提取出来的。当然,CPU的制造过程中还要使用到一些其它的材料,这也就是为什么我们不会看到Intel或者AMD只是把成吨的沙子拉往他们的制造厂。同时,制造CPU对硅材料的纯度要求极高,虽然来源于廉价的沙子,但是由于材料提纯工艺的复杂,我们还是无法将一百克高纯硅和一吨沙子的价格相提并论。

      制造CPU的另一种基本材料是金属。金属被用于制造CPU内部连接各个元件的电路。铝是常用的金属材料之一,因为它廉价,而且性能不差。而现今主流的CPU大都使用了铜来代替铝,因为铝的电迁移性太大,已经无法满足当前飞速发展的CPU制造工艺的需要。所谓电迁移,是指金属的个别原子在特定条件下(例如高电压)从原有的地方迁出。很显然,如果不断有原子从连接元件的金属微电路上迁出,电路很快就会变得千疮百孔,直到断路。这也就是为什么超频者尝试对Northwood Pentium 4的电压进行大幅度提升时,这块悲命的CPU经常在“突发性Northwood死亡综合症(Sudden Northwood Death SyndromeSNDS)”中休克甚至牺牲的原因。SNDS使得Intel第一次将铜互连(Copper Interconnect)技术应用到CPU的生产工艺中。铜互连技术能够明显的减少电迁移现象,同时还能比铝工艺制造的电路更小,这也是在纳米级制造工艺中不可忽视的一个问题。不仅仅如此,铜比铝的电阻还要小得多。种种优势让铜互连工艺迅速取代了铝的位置,成为CPU制造的主流之选。

      除了硅和一定的金属材料之外,还有很多复杂的化学材料也参加了CPU的制造工作。

     

     

    准备工作

     

     

      解决制造CPU的材料的问题之后,我们开始进入准备工作。在准备工作的过程中,一些原料将要被加工,以便使其电气性能达到制造CPU的 要求。其一就是硅。首先,它将被通过化学的方法提纯,纯到几乎没有任何杂质。同时它还得被转化成硅晶体,从本质上和海滩上的沙子划清界限。在这个过程中, 原材料硅将被熔化,并放进一个巨大的石英熔炉。这时向熔炉里放入一颗晶种,以便硅晶体围着这颗晶种生长,直到形成一个几近完美的单晶硅。如果你在高中时把 硫酸铜结晶实验做的很好,或者看到过单晶冰糖是怎么制造的,相信这个过程不难理解。同时你需要理解的是,很多固体物质都具有晶体结构,例如食盐。CPU制造过程中的硅也是这样。小心而缓慢的搅拌硅的熔浆,硅晶体包围着晶种向同一个方向生长。最终,一块硅锭产生了。

    单晶硅硅锭
      现在的硅锭的直径大都是
    200毫米,而CPU厂商正在准备制造300毫米直径的硅锭。在确保质量不变的前提下制造更大的硅锭难度显然更大,但CPU厂商的投资解决了这个技术难题。建造一个生产300毫米直径硅锭的制造厂大约需要35亿美元,Intel将用其产出的硅材料制造更加复杂的CPU。而建造一个相似的生产200毫米直径硅锭的制造厂只要15亿美元。作为第一个吃螃蟹的人,Intel显然需要付出更大的代价。花两倍多的钱建造这样一个制造厂似乎很划不来,但从下文可以看出,这个投资是值得的。

      硅锭的制造方法还有很多,上面介绍的只是其中一种,叫做CZ制造法。

      硅锭造出来了,并被整型成一个完美的圆柱体(图1),接下来将被切割成片状,称为晶圆。晶圆才被真正用于CPU的制造。一般来说,晶圆切得越薄,相同量的硅材料能够制造的CPU成品就越多。接下来晶圆将被磨光,并被检查是否有变形或者其它问题。在这里,质量检查直接决定着CPU的最终良品率,是极为重要的。

      没有问题的晶圆将被掺入适当的其它材料,用以在上面制造出各种晶体管。掺入的材料沉积在硅原子之间的缝隙中。目前普遍使用的晶体管制造技术叫做CMOSComplementary Metal Oxide Semiconductors,互补式金属氧化物半导体)技术,相信这个词你经常见到。简单的解释一下,CMOS中的CComplementary)是指两种不同的MOS电路“N”电路和“P”电路之间的关系:它们是互补的。在电子学中,“N”和“P”分别是NegativePositive的缩写,用于表示极性。可以简单的这么理解,在“N”型的基片上可以安装“P”井制造“P”型的晶体管,而在“P”型基片上则可以安装“N”井制造“N”型晶体管。在多数情况下,制造厂向晶圆里掺入相关材料以制造“P”基片,因为在“P”基片上能够制造出具有更优良的性能,并且能有效的节省空间的“N”型晶体管;而这个过程中,制造厂会尽量避免产生“P”型晶体管。

      接下来这块晶圆将被送入一个高温熔炉,当然这次我们不能再让它熔化了。通过密切监控熔炉内的温度、压力和加热时间,晶圆的表面将被氧化成一层特定厚度的二氧化硅(SiO2),作为晶体管门电路的一部分——基片。如果你学过逻辑电路之类的,你一定会很清楚门电路这个概念。通过门电路,输入一定的电平将得到一定的输出电平,输出电平根据门电路的不同而有所差异。电平的高低被形象的用01表示,这也就是计算机使用二进制的原因。在Intel使用90纳米工艺制造的CPU中,这层门电路只有5个原子那么厚。

      准备工作的最后一步是在晶圆上涂上一层光敏抗蚀膜,它具有光敏性,并且感光的部分能够被特定的化学物质清洗掉,以此与没有曝光的部分分离。

     

     

    完成门电路

     

     

      这是CPU制造过程中最复杂的一个环节,这次使用到的是光微刻技术。可以这么说,光微刻技术把对光的应用推向了极限。CPU制造商将会把晶圆上覆盖的光敏抗蚀膜的特定区域曝光,并改变它们的化学性质。而为了避免让不需要被曝光的区域也受到光的干扰,必须制作遮罩来遮蔽这些区域。想必你已经在Photoshop之 类的软件里面认识到了遮罩这个概念,在这里也大同小异。在这里,即使使用波长很短的紫外光并使用很大的镜头,也就是说,进行最好的聚焦,遮罩的边缘依然会 受到影响,可以简单的想象成边缘变模糊了。请注意我们现在讨论的尺度,每一个遮罩都复杂到不可想象,如果要描述它,至少得用10GB的数据,而制造一块CPU,至少要用到20个这样的遮罩。对于任意一个遮罩,请尝试想象一下北京市的地图,包括它的郊区;然后将它缩小到一块一平方厘米的小纸片上。最后,别忘了把每块地图都连接起来,当然,我说的不是用一条线连连那么简单。

      当遮罩制作完成后,它们将被覆盖在晶圆上,短波长的光将透过这些石英遮罩的孔照在光敏抗蚀膜上,使之曝光。接下来停止光照并移除遮罩,使用特定的化学溶液清洗掉被曝光的光敏抗蚀膜,以及在下面紧贴着抗蚀膜的一层硅。

      当剩余的光敏抗蚀膜也被去除之后,晶圆上留下了起伏不平的二氧化硅山脉,当然你不可能看见它们。接下来添加另一层二氧化硅,并加上了一层多晶硅,然后再覆盖一层光敏抗蚀膜。多晶硅是上面提到的门电路的另一部分,而以前这是用金属制造而成的(即CMOS里的MMetal)。光敏抗蚀膜再次被盖上决定这些多晶硅去留的遮罩,接受光的洗礼。然后,曝光的硅将被原子轰击,以制造出N井或P井,结合上面制造的基片,门电路就完成了。

     

     

    重复

     

     

      可能你会以为经过上面复杂的步骤,一块CPU就已经差不多制造完成了。实际上,到这个时候,CPU的完成度还不到五分之一。接下来的步骤与上面所说的一样复杂,那就是再次添加二氧化硅层,再次蚀刻,再次添加……重复多遍,形成一个3D的结构(图2),这才是最终的CPU的核心。每几层中间都要填上金属作为导体。IntelPentium 4处理器有7层,而AMDAthlon 64则达到了9层。层数决定于设计时CPU的布局,以及通过的电流大小。

     

     


    测试、测试和测试

     

     

      在经过几个星期的从最初的晶圆到一层层硅、金属和其它材料的CPU核心的制造过程之后,该是看看制造出来的这个怪物的时候了。这一步将测试晶圆的电气性能,以检查是否出了什么差错,以及这些差错出现在哪个步骤(如果可能的话)。接下来,晶圆上的每个CPU核心都将被分开(不是切开)测试(图3)。


    CPU晶圆
      通过测试的晶圆将被切分成若干单独的
    CPU核心,上面的测试里找到的无效的核心将被放在一边。接下来核心将被封装,安装在基板上。然后,多数主流的CPU将在核心上安装一块集成散热反变形片(Integrated Heat SpreaderIHS)。每块CPU将被进行完全测试,以检验其全部功能。某些CPU能够在较高的频率下运行,所以被标上了较高的频率;而有些CPU因为种种原因运行频率较低,所以被标上了较低的频率。最后,个别CPU可能存在某些功能上的缺陷,如果问题出在缓存上(缓存占CPU核心面积的一半以上),制造商仍然可以屏蔽掉它的部分缓存,这意味着这块CPU依然能够出售,只是它可能是Celeron,可能是Sempron,或者是其它的了。

      当CPU被放进包装盒之前,一般还要进行最后一次测试,以确保之前的工作准确无误。根据前面确定的最高运行频率不同,它们被放进不同的包装,销往世界各地。

     

     

      读完这些,相信你已经对CPU的制造流程有了一些比较深入的认识。CPU的制造,可以说是集多方面尖端科学技术之大成,CPU本身也就那么点大,如果把里面的材料分开拿出来卖,恐怕卖不了几个钱。然而CPU的制造成本是非常惊人的,从这里或许我们可以理解,为什么这东西卖这么贵了。

     

     

     

     CPU核心的3D结构