<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一個(gè)活了 45 年的愚蠢 Bug!

          共 4568字,需瀏覽 10分鐘

           ·

          2022-06-10 00:02

          轉(zhuǎn)自:CSDN,翻譯:彎月
          英文:https://threadreaderapp.com/thread/1058676834940776450.html
          【CSDN編者按】微軟于近期推出了Windows 10操作系統(tǒng)。不斷壓縮的更新周期下,一般而言,系統(tǒng)Bug的存活希望會(huì)被很快掐滅,快速迭代。但是本文的作者在Windows 10上從一個(gè)USB 3.0 SSD向另一個(gè)SSD拷貝文件時(shí)卻遭遇了一個(gè)44年前的bug,他把這個(gè)“愚蠢”的Bug分享到了博客上,并且引起了開發(fā)者們的回憶熱潮。
          以下為譯文:
          現(xiàn)在都2018年了,而這個(gè)來自于1974年的錯(cuò)誤信息居然還在。最新版本的Windows 10依然有這個(gè)限制,而這個(gè)bug第一次出現(xiàn)的時(shí)候星球大戰(zhàn)還沒上映,都跟水門事件一樣老了。
          這個(gè)bug出現(xiàn)時(shí),超市里的東西還沒有UPC條碼,因?yàn)閁PC還沒發(fā)明。
          這個(gè)bug出現(xiàn)時(shí),世界上只有一家電話公司,因?yàn)樗麄冞€沒分家。Ted Bundy還沒被抓。Babe Ruth的本壘打紀(jì)錄還沒有被打破。
          這個(gè)bug出現(xiàn)時(shí),幸運(yùn)大轉(zhuǎn)輪還沒播出,也沒人看過Rocky Horror。斯皮爾伯格只是一系列小眾電視劇的導(dǎo)演,電影票房也十分糟糕。埃德蒙德·費(fèi)茲杰羅號(hào)貨輪還是一堆鐵礦石。
          這個(gè)愚蠢的bug出現(xiàn)時(shí),教父2才剛剛在電影院中上映。

          1、那么,這個(gè)bug究竟是什么?

          因?yàn)閁nix(當(dāng)時(shí)才僅僅5歲)發(fā)明了一個(gè)很好的點(diǎn)子——“一切皆是文件”,也就是說,你可以用同樣的命令和指令讀寫套接字、管道、控制臺(tái)等等。
          這個(gè)點(diǎn)子是由Gary Kildall在1974年想出來的。用這個(gè)方法有很多方便之處,比如可以從串口拷貝數(shù)據(jù)到文本文件,或者直接從命令行打印文本文件。
          在Unix中,這個(gè)點(diǎn)子是通過特殊目錄下的特殊文件實(shí)現(xiàn)的,比如/dev/tty表示控制臺(tái),/dev/lp0表示第一個(gè)打印機(jī)等。/dev/zero可以提供無限的零,/dev/random可以提供隨機(jī)字節(jié),還有很多!
          但有個(gè)問題:CP/M是為8位計(jì)算機(jī)設(shè)計(jì)的,這些計(jì)算機(jī)內(nèi)存很小,也沒有硬盤,最多也就有個(gè)8寸軟驅(qū)。目錄是什么?還要目錄干啥。你換個(gè)軟盤就行了。
          但沒有目錄,就沒辦法把所有特殊文件都放在/dev/目錄下了。所以這些文件實(shí)際上被放到了“所有地方”。所以,如果你要打印FOO.TXT,可以執(zhí)行“PIP LST:=FOO.TXT”,就能把foo.txt拷貝到“文件”LST,而實(shí)際上這個(gè)就是打印機(jī)。
          這個(gè)命令在任何地方都可以使用,因?yàn)楦緵]有目錄!非常簡(jiǎn)單。

          2、那擴(kuò)展名怎么辦?

          這里就有問題了:程序喜歡給自己的文件加上正確的擴(kuò)展名。
          所以如果你運(yùn)行一個(gè)程序,它問你“請(qǐng)輸入要保存代碼的文件名”時(shí),你可以輸入LST讓它直接打印出來,或者輸入PTP讓它輸出到磁帶(別忘了現(xiàn)在是1974年?。?/span>
          但是!程序可能會(huì)自己在文件名后面加上.TXT!LST.TXT不是打印機(jī),對(duì)吧?
          錯(cuò)了,LST.TXT也是打印機(jī)。這些特殊設(shè)備存在于所有擴(kuò)展名中,這樣上面的問題才不會(huì)出現(xiàn)。所以,如果“CON”被用來指代鍵盤,那么CON.TXT、CON.WAT、CON.BUG都是鍵盤。
          額……這確實(shí)是個(gè)hack,但就是好使,而且這只不過是只有4k內(nèi)存的微型計(jì)算機(jī),誰在乎呢?

          3、IBM、微軟等巨頭的加入

          結(jié)果70年代末到80年代初CP/M廣泛流行。
          它是最主要的商用操作系統(tǒng)之一。它定義了一套接口,你可以用這套接口在NorthStar Horizon上寫CP/M代碼,然后放到Seequa Chameleon上運(yùn)行(注:兩者都是計(jì)算機(jī)的型號(hào))。
          由于它缺少圖形標(biāo)準(zhǔn),所以無法進(jìn)入游戲市場(chǎng)(雖然有一些Infocom的東西),所以主要是用于商用。但它實(shí)在太流行了,于是IBM很自然地希望在80年代早期的“個(gè)人電腦”項(xiàng)目上使用它。
          于是IBM計(jì)劃在IBM個(gè)人電腦發(fā)布時(shí)支持幾種操作系統(tǒng),其中CP/M是最主要的那個(gè)。但CPM的x86版直到IBM個(gè)人電腦發(fā)布六個(gè)月之后才出現(xiàn)……而且價(jià)格是感人的$240,相比之下DOS只要$40。
          所以絕大部分用戶選擇了微軟的PC-DOS,這個(gè)產(chǎn)品曾經(jīng)是由Seattle Computer Products開發(fā)的一個(gè)劃時(shí)代的新操作系統(tǒng)。微軟買下了Tim Paterson的這個(gè)項(xiàng)目,并在其基礎(chǔ)上開發(fā)了PC-DOS(后來改名為MS-DOS)。
          Tim Paterson的操作系統(tǒng)叫做“QDOS”,意思是“Quick and Dirty Operation System”——“快速、骯臟的操作系統(tǒng)”。原因基本上是因?yàn)镃P/M還沒有x86版,QDOS就是為了解決CP/M的一些問題而出現(xiàn)的。所以,很多方面都借鑒了CP/M。
          其中主要的一點(diǎn)就是借鑒了不使用目錄來操作特殊文件的點(diǎn)子,因?yàn)樵贑P/M中這個(gè)功能很有用。于是QDOS和PC-DOS 1.0中也有AUX、PRN、CON、LPT等等!

          4、結(jié)果問題來了
          1983年隨著IBM XT一起發(fā)行的PC-DOS 2.0中的大部分被微軟重寫了。因?yàn)镮BM XT帶硬盤,所以PC-DOS需要支持目錄。顯然,一個(gè)10MB的硬盤需要目錄來組織文件!
          但問題來了:用戶在兩年前PC DOS 1.0時(shí)就開始使用這些特殊文件名了。許多軟件都用了這些特殊文件名!各種批處理文件也需要它們。所以,盡管有了目錄之后微軟可以建一個(gè)C:DEV目錄,但他們沒有這樣做。
          這種犧牲可用性來滿足向后兼容性的事情絕不是最后一次。特殊文件依然適用于所有目錄,所有擴(kuò)展名。所以“DIR > LPT”來打印目錄的技巧不會(huì)由于你從A:切換到了C:DOS就不能用了。
          但是,我們現(xiàn)在早就不用DOS 2.0了……Windows 95是基于DOS的,所以很自然地繼承了這一行為。(當(dāng)然Windows 1/2/3也繼承了,但與它們相比,Win95才是真正意義上的操作系統(tǒng)。)
          但是,我們現(xiàn)在早就不用Windows 95了!現(xiàn)在的Windows是基于Windows NT的,不是Win95。
          但Windows NT想要與DOS/Windows程序兼容。而XP合并了兩條產(chǎn)品線,所以這些特殊文件依然存在——這時(shí)距離這個(gè)bug出現(xiàn)已經(jīng)過去44年了!
          你可以自己試試看!打開文件管理器,新建一個(gè)文本文件,命名為con.txt、aux.txt、prn.txt。
          但Windows不會(huì)讓你這么干的:

          這都是因?yàn)镚ary Kiddal說“特殊文件表示硬件設(shè)備!Unix的這個(gè)點(diǎn)子很不錯(cuò)。我要把這個(gè)點(diǎn)子實(shí)現(xiàn)在我的玩具操作系統(tǒng)中”……那一年出生的人的孩子都長(zhǎng)大成人了,但我們?nèi)匀徊荒芙╟on.txt……
          微軟給出的官方列表是:
          CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
          https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file
          更有意思的是,在Win95上訪問C:concon(或C:auxaux)會(huì)直接導(dǎo)致藍(lán)屏。即使在1995年這也非?;闹?,因?yàn)檫@個(gè)bug已經(jīng)21歲了!你能想象一個(gè)錯(cuò)誤的設(shè)計(jì)會(huì)如此長(zhǎng)壽么?
          福利:下面這張圖是Tim Paterson在今年8月的VCF:W上介紹DOS的歷史。
          至于為什么我發(fā)現(xiàn)了這個(gè)無法拷貝文件的bug……這些特殊文件名是在操作系統(tǒng)級(jí)別實(shí)現(xiàn)的,而不是文件系統(tǒng)級(jí)別。所以這些文件名完全是合法的NTFS文件名,而我在Linux下使用這些NTFS文件系統(tǒng)。
          而且顯然OS/2也沒有實(shí)現(xiàn)這些特殊文件名,因?yàn)镮BM在OS/2 devcon磁盤上發(fā)布的一些opengl頭文件中有個(gè)文件叫AUX.H。
          所以我今天想把這個(gè)NTFS盤備份到主PC上然后驚喜地發(fā)現(xiàn),我沒辦法拷貝所有文件,而造成這個(gè)問題的bug的年齡比所有讀者都大……

          5、內(nèi)容糾錯(cuò)

          抱歉我這幾天要么在醫(yī)院里,要么在睡覺,好不容易才有機(jī)會(huì)上來更新一下:
          1.CP/M對(duì)于特殊文件的處理方式其實(shí)不像我說的那么簡(jiǎn)單,所以我一直也沒學(xué)會(huì),也有可能學(xué)會(huì)了然后忘了。其實(shí)特殊文件后面要有個(gè)冒號(hào),就跟盤符一樣。比如PRN:是打印機(jī),而PRN不是。
          2.CP/M并不像DOS那樣在操作系統(tǒng)層次實(shí)現(xiàn)!CP/M中是在PIP(文件復(fù)制)命令中實(shí)現(xiàn)的。所以沒辦法像DOS那樣讓程序直接保存到PRN.TXT進(jìn)行打印。我可能沒說清楚,我想說的是DOS,沒有暗示CP/M也能這樣做。
          3.PC DOS 1其實(shí)沒有重定向或管道,所以沒辦法像我說的那樣做重定向。我忘記了。這些功能是1983年在PC DOS 2.0中加入的。但PC DOS 1的確支持從特殊文件中拷貝或拷貝到特殊文件,所以我說的大方向是對(duì)的,雖然例子搞錯(cuò)了。
          不論如何,感謝大家的回復(fù)!我沒想到這篇文章能這么火,其實(shí)它只是我在遇到一個(gè)44年的bug之后感到很無力而已。
          而且我想重申,這篇文章并不是想說“Windows很垃圾”。一般來說,向后兼容是很好的。實(shí)際上我希望看到更多向后兼容。
          我只是覺得,在Windows 10上從一個(gè)USB 3.0 SSD向另一個(gè)SSD拷貝文件時(shí),遇到個(gè)44年前的bug很奇妙。
          就像你在宇宙空間站中被馬踢了一樣。

          6、開發(fā)者的看法

          Hacker News上的很多開發(fā)者對(duì)于這個(gè)45歲的bug發(fā)表了自己的看法。
          評(píng)論1:
          好懷念那時(shí)的互聯(lián)網(wǎng)……當(dāng)時(shí)我們經(jīng)常搜索21端口,就能找到很多開放了匿名FTP權(quán)限的機(jī)器,其中很多機(jī)器都是Windows的。
          我們?cè)谶@些匿名FTP上經(jīng)常使用的“技巧”是:用這些特殊文件名創(chuàng)建一些嵌套的目錄。在FTP服務(wù)器上,你可以創(chuàng)建這些目錄,也可以訪問它們(只要你知道正確的路徑),但Windows下這些目錄會(huì)導(dǎo)致錯(cuò)誤,或者訪問時(shí)會(huì)造成系統(tǒng)崩潰。再加上你可以創(chuàng)建文件名中只有空格的目錄,所以可以在匿名FTP上放很多東西而不被管理員發(fā)現(xiàn)。
          評(píng)論2:
          我們高中的實(shí)驗(yàn)室中用的是Windows For Workgroups 3.11,我們用Alt+255(這個(gè)字符在DOS下像個(gè)空格,但在Windows下是隱藏的)來隱藏Doom、Descent還有很多其他DOS游戲的安裝文件。
          實(shí)驗(yàn)室管理員禁用了Ctrl+C和Ctrl+Break來防止有人退出DOS下的登錄提示符直接進(jìn)入C:,但我不知怎么發(fā)現(xiàn)了Alt+3也能輸入同樣的字符,起到同樣的作用。
          只有一次有個(gè)老師對(duì)我喊“在實(shí)驗(yàn)室里待了太長(zhǎng)時(shí)間”,但我從來沒被抓到過。我覺得管理員(上了點(diǎn)年紀(jì)的編程和數(shù)學(xué)老師)應(yīng)該知道我們?cè)诟墒裁础?/span>
          評(píng)論3:
          好玩的是那些“COM”、“LTP”等后面加數(shù)字的……或者至少加上個(gè)像是數(shù)字的Unicode,所以COM2跟COM2一樣不能用。
          這種設(shè)備映射是在Win32層進(jìn)行的,而不是NT內(nèi)核上,所以你可以使用“verbatim path syntax”來越過這些規(guī)則。例如,“C:TempCOM2.TXT”是特殊設(shè)備,而“\?C:TEmpCOM2.TXT”就是個(gè)普通文件,完全可以正常讀寫……但像文件管理器這種沒使用verbatim path syntax的程序就會(huì)報(bào)錯(cuò)。
          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  新超碰97| 日本国产欧美 | 亚洲午夜免费视频 | 亚洲人在线观看 | 91性爱片 |