分類
科技相關 Mac

【翻譯】為何選擇Mac OSX?

Bottom Line

Mac OSX給我相當優的印象:如果說要選一個運算平台來滿足我的數位生活,那Mac OSX絕對是第一首選!除非我的工作或是特殊需求非得用其他平台不可。
當然我這樣想可不表示其他人也會如此。我這樣的結論也不代表說Mac OSX就全然沒有缺點可言,甚至我覺得還不少:像是它使用太多」舊技術」、舊包袱、某些方面的表現並不優秀、在美麗的介面下仍有一些醜陋的玩意兒、得花錢買、一定得用Apple的硬體(雖然我個人相當喜歡Apple的硬體)、有時後會出現kernel panic。即便是這樣,Mac在我個人的觀感裡仍是最值得擁有的終端平台:它是目前市面上唯一能讓你真正看得到也吃得到的好產品。

尋找理想的終端電腦
過去很長一段時間,我使用過相當多個作業系統來當我的主要工作平台,到現在仍在繼續使用的只有三個:Linux系列、Mac OSX、Windows系列(這是依字母排列)。
這邊我特別說明一下,我所使用的終端電腦(client computing)或是終端平台(client platform)這個詞彙,意義上其實比較接近桌面電腦,這個邏輯跟許多人用notebook取代桌上型電腦來使用的邏輯很像。在我的文章裡面,這一類的詞彙主要是指這樣的電腦會是每天處理多種目的、功用的電腦,例如我們會在同一台電腦上工作和玩遊戲。

* BSD與Solaris

各式各樣的BSD平台都可以是優秀的伺服器或是嵌入式應用平台。特別當你想要好好搞清楚作業系統是怎麼一回事時,它們絕對是最棒的學習範例!在一些特殊的、具侷限性的應用上,BSD表現也是相當優異。但是如果要作為一個終端平台,我不認為BSD系列中任何一個能夠出線(當然,BSD可以作為明日終端平台所使用的底層技術的中流砥柱,像Mac OSX就是)。我本身相當熟悉Solaris,並覺得它依然是相當可靠的系統(作為server)!這點倒是跟Sun昇陽公司本身的財務表現正好相反。

讓我們簡單地回顧一下三個終端電腦系統候選人:
對了,這三個平台各自都有server版本,但是我們今天只談它們的終端版本


Windows

市場上偏好選用Windows的情形已經到十分荒謬的程度,而我自己則儘量保持一個中立的態度來審視Windows:雖然自己常常在使用Windows時會有快得幽閉恐懼症的傾向,但我並沒有因此而討厭這個平台(我知道有些人對Windows已經是情緒性的厭惡了)。通常我都會將使用Windows所生的種種不適,歸咎於我自己的背景:我第一個使用的系統是 SVR4 ,之後分別是Linux與 * BSD。Windows有許多自己的調調,而讓我覺得跟我所熟悉的環境相較起來顯得陌生。過去幾年我嘗試過許多作給 Windows的仿 * nix-like環境,像是MKS toolkit for DOS、 Cygwin、MKS for Win32、Microsoft Services for Unix… 等等,而這些玩意兒的確是很努力試著模仿得唯妙唯俏,但畢竟是不一樣的東西。我承認單單只是無法提供一個「純粹的Unix環境」,這樣的理由是無法整個否定掉Windows的,事實上在很多方面它已經是一個很不錯的平台 —- 特別是當你是重度地在多種平台上(包含Windows)發展,你就會同意我說的。
Windows有太多entropy,白話一點就是這系統太「忙」了:太多過去的包袱以及往前相容的要求,使得上面的軟體容易出錯或是故障。基於這樣的缺陷衍生出來的問題越演越烈,簡直變成一種流行趨勢,特別是安全性部份的問題。許多電腦老手對於Windows的使用者介面設計深深不以為然;而這些每天都會發生的小瑕疵累積起來,似乎讓你的生活越來越難熬(makes your life difficult)。舉例來說:這系統在你要清空一個無限迴圈的垃圾檔時;或是當你想要複製一個超大檔案時;或是當你想要清空IE的快取檔時,表現實在混帳透了!而最偷吃步的就是XP雖然開機後很快讓你看到桌面,但是卻還要等很久系統才真的能使用,而這段等待的時間裡,甚至點選「開始」選單都沒有反應?!你能弄清楚到底有多少關鍵值在你的登錄檔裡面嗎?你知道當一堆獨立辦公室同時要維護Windows該怎麼辦嗎?你是否曾經花了好幾小時,甚至一整天時間才安裝完Windows以及各式驅動程式(特別當你用Sony VAIO、IBM ThinkPads… . )?你是否對Windows的穩定性頗有微詞?

市面上甚至有人出書來教你解決上述問題!

Windows XP預設的樣式簡直像是從Disney樂園學來的 — 當然Disney樂園沒什麼不好啦,很多人喜歡呢!真的!

有人說,其實Windows是一個相當有趣的平台,特別當你是個Hacker時。試想:你在這平台上可以搞到許多不錯的開發工具、像SoftICE 這種除錯工具、從一堆未證明的API裡面理出頭緒、系統常會天外飛來一奇怪訊息、找出並修正安全性問題… . 等等。這麼多事情可以作,在這樣一個市佔率超高的平台上面,你所作所為都是貢獻良多啊!但是Windows是如此跟 * nix世界搭不上線,我想光這點就夠嚇壞一堆(深具傳統的)Hacker,並讓他們將Windows踢出自己的電腦了。當然,看不到原始碼也是主因之一。

但不管怎樣,這世界上大部分的電腦還是搭載Windows。其結果就是Windows上可用程式越來越多,這應該是一個不斷反饋的迴圈。太多使用者根本沒有選擇,事實上他們自己也不知道原來還有其他選擇。或真或假,總流傳著有一股想跳槽遠離Windows的趨勢。但事實上,許多人早就在 Windows這平台上投資了像是金錢、智慧權、法律權利、甚至是政策性的東西,對他們來說,根本就沒有誘因去嘗試或意圖轉換到其他平台上面。他們覺得人生中實在是有太多更重要的事情要作;至於考慮、計畫轉換電腦平台這種鳥事根本就排不上待辦事項清單裡面。畢竟大部分的人壓根兒不喜歡電腦 —- 簡直可以說他們是被迫使用電腦的。

微軟他們擁有相當多機會和資源,在未來新的Windows版本裡解決目前所存在的諸多問題。我個人覺得他們的Windows2000就做得還不錯。而微軟擁有相當多的技術(自己的、第三方廠商的、或是開放原始碼計畫裡的),所以或許有一天,他們可以做出真正適用於終端平台的系統,或許有一天… .

目前,就我的看法,Mac OSX顯然是優秀許多 —- 特別是針對有心要擁有選擇權並肯實際實行的人。

Linux

我對Linux是情有獨鍾,因為這些年來我受惠於GNU、Linux、BSD社群裡許多優秀並相當有用的程式碼良多。不管是在學術領域或是工作方面,我完全是Linux的重度使用者。但正因為我對他的愛好,使得我認為要作為一個終端平台,Linux真是令人沮喪。

我認為在許多應用上面,Linux就算不是第一,也絕對是第二的作業系統,像是:跑server應用程式、各種嵌入式應用、學術研究、讓高科技團隊有個平台可以針對自己的特殊需求開發程式;幾乎所有領域均優,獨獨就不包含大眾型終端平台。

Linux作為終端平台,跟Windows一樣有許多惱人的問題。

選擇,到處都要選擇

Linux提供的選擇多到你無法相信!光是單單要選擇你想用的套件,就多到讓人抓狂;當然主流套件數量不多(這樣說就是騙人啦!即便是主流也是多到不行,有些僅僅是細微上有差異,但有些卻是極端不同)。你總可以在根本無法想像能跑「系統」的平台上面跑Linux,像是手錶、PDA、甚至叢集…幾乎你想得出來的電子裝置都能安裝Linux。另外你還可以重新從原始碼來編譯出整個系統(Gentoo Linux) —- 針對你的機器,將效能操到最高點!你還可以選擇各式各樣的檔案系統;連核心配置方式都能選擇(這部份就會遠超出這份文件的範圍囉)。你可以找到你從來不知道曾經在這世界上存在過的裝置的驅動程式;你還可以用一個世界上沒人用的通訊協定(當然,通用的協定是一定支援的啦);找到一堆支援 X11的視窗管理員;使用數不清的各種程式語言;一堆選不完的視窗環境,而且這視窗環境還能針對你個人的設置、品味、工作方式、文化… . 作微調;你還能選擇各式原生的、移植的API。連在Linux裡面都有主流或非主流之分!無數無盡的組織、人員、軟體,都得利於Linux(這當然包含Mac OSX囉)。

上述絕不誇張,我不過是小小描述一下而已。我想,就我寫這篇文章之時,不知道又有多少Linux系統、技術、軟體同時被創造、發表 —- 而且同時是自由軟體(或免費)。

為避免我們這篇文章裡面所使用的Linux造成誤解,我想要先說清楚這邊所指的Linux是基於Linux這個核心的作業系統(Linux核心加上大量其他相配合之軟體)。這平台上面可有大量的應用程式、函式庫、文件供君選擇到不亦樂乎呢!

即便如上述這樣,Linux先天有相當多資源可供利用,但是針對特定的終端平台這個主題來說,它還是有先天上許多缺乏之處。這樣的缺失造成許多實體用戶(一般人、組織、商商業)不太會去考慮使用它,當然我們都知道問題絕對不會是因為Linux技術上有所不足。

如果你今天想要開發一個終端平台專用的Linux,瞬間你人生馬上會變黑白;當然啦,如果你是以開發Linux為樂的開發人員,一定反而覺得人生變彩色。第一時間你就會發現:哪來這麼多原始碼啊?!原始碼多到讓你眼睛不夠用,更別說要從中找出問題、提昇效能。根據你想要達成的目標不同,你各有一堆函式庫、toolkits、APIS要選擇,另外還要注意運行的桌面環境… . 。

說到這,你發現那裡不對勁了嗎?

如果你是個學生、研究人員、純為興趣、一家專門開發Linux的公司或是試著透過Linux去提供一個客制化系統的人,Linux上人生是彩色的!

但是相反地,如果你目標是大眾化的終端平台,這一切簡直比黑白還糟。假設,你今天是一個開發人員(獨立或是隸屬於一個team… . 隨便),要開發一套影像編輯程式(當然,事實上已經有一套很棒的軟體 — Kino)。你覺得要能相容眾多平台需要多少時間?要選用那個toolkit?你主要針對的桌面環境是哪一個?支援那個套件?你要如何知道你個人的「偏好」具有市場正確?該使用哪個函式庫才能事半功倍,不需要自己重新造輪?你如何確保在不知道使用者將如何安裝下,這個程式能完美運行?使用者的套件、桌面環境、甚至韌體都不可知的情形下,你該怎麼辦?另外你還需要考量到專業或是非專業層級軟體有不同開發方式。所以顯見太多選擇對於軟體開發來說並不是一件好事。

因為這樣眾多、豐富的環境,Linux很快就發展出令人眼花撩亂的分支,你根本找不到所謂的「通用」系統。一個優秀的核心搭配無邊無際的各式技術,這樣的系統真是讓Hacker們夢想成真,但要跟Windows或是Mac OSX競爭,則是另外一回事。

Linux提供了你眾多選擇之中,偏偏就是少了這一個:「假設我根本就不想選、不想煩!」假設我想要的、我需要的,它就是準備地好好的,彼此緊密連結(因為我可能根本不懂技術;或許我沒這種美國時間;或許我急著用電腦來作其他重要工作而不是跟它奮鬥…)作為這樣的終端系統,Linux能滿足我嗎?就目前看來,顯然作不到!

我想關於「選擇」這個論點,有時候是被誤用的:你想有多少人會自己在Linux上面寫硬碟驅動程式只因為他們能作這樣的選擇?應該是非常少吧!而且通常都是因為有特殊需求才會這樣。畢竟這對程式設計師來說是非常低階的程式語言工作(譯者註:如果可以,通常不會有人想跟低階語言打交道),再加上前人已經有不錯的作品可供使用…等眾多原因。所以,面對終端系統,我們必須要去套用跟上述硬碟驅動程式一樣的邏輯來看待:大部分的大眾消費者根本沒有心思去弄懂磁柱是幹什麼用的?更別想訓練他們上Freshmeat下載軟體或是讓他們愉快地面對不能百分百成功讀取Word檔案的OpenOffice。

雖然說目前看出來Linux陣營裡面也往正確方向走出幾步,像是大家開始瞭解低階部份應該要有一致的標準(如LSB),並提出整體的人機界面標準(如KDE、GNOME),建立一個新Linux套件運動也耕耘了好一段時間,但是我們仍難免擔憂其步調是如此不統合協調。

雖然隱憂仍在,但是隨著Linux越來越受到注目,對於其在終端系統平台的發展是越顯樂觀。政府或是商業組織也慢慢地基於成本、基於對微軟壟斷的反制或是其他政治性的考量,將目光放到Linux系統上面。Linux在開發中國家相當受到歡迎,這當然對Linux的發展有其正面的影響,不過這並不代表是成功的保證。我依然相信「利益考量」才是最關鍵的影響因子(這同時是Linux的考驗與機會)。我個人比較希望看到有人提出不一樣的方式來親近 Linux —- 或許正像是現在Apple推出的Mac OSX。

我已經停止在我的主要電腦上面使用Linux(用Mac OSX替代)。我工作時使用Linux,而回家則透過VirtualPC操作。一般說來,我們通常都可以在Mac OSX上面做到Linux上面能做的事情,而且效能上不會耗損太多。

Mac OSX

從我購買第一台Apple電腦使用到現在其實時間並不算長(2003 / 04 / 01),但是我相當贊同Apple所製定的Mac OSX發展方向。關於這部份我已經在前面的文件提過我的看法和相關介紹,所以我想你可以從這些論述裡面看看是否符合你的需求。

Mac OSX計畫要隨著時間成熟,逐漸成為一個烏托邦理想般的系統。如果你擔心Mac OSX會讓你疏離 * nix,那我要說你大可放一百二十萬個心,因為Mac OSX在提供Unix環境方面真是多采多姿:Mach、FreeBSD、優秀的驅動程式開發環境以及大量的系統原始碼供君使用。

假如你習慣使用 * nix環境(包含Linux),你能在Mac OSX這平台上面找到很多一樣地或是相似的軟體:你可以自己編譯原始碼或是找到已經port過來的軟體。

之前我們曾經在《Mac OSX上可用的軟體》這篇文章中提到相當多具有專業水準的軟體,你都能找到Mac OSX版本。跟其他系統很不一樣的是,透過跟Unix世界的融合互用,其實Mac OSX上面軟體的豐富程度就像是Windows世界一樣。當然Apple自己也一直致力於在自家平台上面開發有用的軟體。

Apple傳統上一直都是致力於讓產品易於使用,雖然說偶爾有例外發生,但是就我個人的意見,Mac OSX絕對會是這個目標—最佳效率—的最佳代言人。Apple這給年來致力於彙整許多技術,並將開放原始碼世界裡面的技術包上華麗的包裝,一起整合到這個優秀的系統上。

到目前為止,還沒有我想要作但是在Mac OSX這平台上面作不到的事情。

本文由張元毓所翻譯,本人保有一切法律權利。
Copyright@ alan chang

分類
科技相關 Mac

【翻譯】Mac OSX系統啟動

這篇我們來談談Mac OSX啟動過程會經歷的程序。
一些關於開機的細節部份,我已經在之前的文章「Mac OSX開機」與「XNU:核心」這兩篇文章中說明過了。略摘錄重點如下:

  • 電源打開
  • 執行韌體
  • 硬體資訊匯集與初使化
  • 開機項目選擇;此時可能會去詢問使用者要以何種裝置開機
  • 控制權移轉至Boot loader(/System/Library/CoreServices/BootX)。BootX會去載入核心與標記OS。
  • BootX此時會嘗試去載入之前的系統裝置驅動程式快取(/usr/sbin/kextcache)。快取裡面會包含相關資訊、函示庫以及套件供核心使用。如果說核心找不到或是檔案已經毀損,那核心會自動去讀取/System/Library/Extensions來完成開機動作。
  • 核心中重要參數此時會載入,同時有關裝置也會完成定義。在這個時點,Open Firmware跟著退出。
  • 各種Mach/BSD資料架構由核心完成初使化。
  • I/O kit初使化
  • 核心啟動/sbin/mach_init,開始各項系統上的服務與port。

此時,開機程序進入使用者層級

  • mach_init會去啟動/sbin/init(BSD基本init程序)。Init將會去定義系統上的運行層級,同時起動/etc/rc.boot來讓系統準備好進入單人模式。
  • rc.boot會去確定開機裝置為何(多人使用模式、安全模式、硬碟、光碟或是網路開機)。舉例來說,如果是網路開機模式,那rc.boot就會去啟動/etc/rc.netboot來進行開機程序。
  • rc.boot還會去確認是不是需要做磁碟修復的動作。單人模式或是光碟開機就不會有這個步驟;而安全模式開機不管如何都會做磁碟修復—fsck。
  • 如果rc.boot功成身退,/etc/rc多人模式開機程序就會啟動。如果是光碟開機,這時候就會轉去/etc/rc.cdrom。
  • /etc/rc會去載入本地磁碟(HFS、HFS+、UFS…),並確認/private/var/tmp目錄存在、執行/etc/rc.installer_cleanup。
  • /etc/rc.installer_cleanup會去清空一些Mac/Unix檔案
  • BootCache啟動
  • 各個sysctl變數設定完成,如果/etc/sysctl.conf存在,那變數就是這樣設定。
  • syslogd啟動
  • 建立Mach符號檔
  • /etc/rc啟動kextd,從核心或是終端程序中載入核心延伸程序
  • /usr/libexec/Register_mach_bootstrap_servers會去載入/etc/mach_initd檔案中所包含的各個Mach bootstrap服務
  • portmap與netinfo啟動
  • 如果/System/Library/Extensions.mkext檔案比/System/Library/Extensions舊,那麼/etc/rc會將之刪除並另外製作一個較新的。相對地,如果說那個檔案並不存在,則會製作一個全新的。
  • /etc/rc透過/usr/sbin/update將內部的檔案系統快取與各磁碟同步化
  • /etc/rc啟動虛擬記憶體。/private/var/vm會被設置成swap。
  • /etc/rc啟動/usr/libexec/fix_prebind來修復prebind binary的錯誤
  • /etc/rc透過/etc/rc.cleanup來清空並重新設置檔案和裝置
  • /etc/rc最後會載入/sbin/Systemstarter去啟動「啟動元件」,像是/System/Library/StartupItems和/Library/StartupItems。顧名思義,StartupItems這個Shell dcripts程式就是一個「啟動元件」,其中包含相當多的系統關鍵值,例如:Description、Provides、Requries、OrederPreference、開始/停止訊息…等等。你可以用root身分在Terminal底下輸入SystemStarter -n –D看看系統所有的錯與獨立資訊。
  • CoreGraphics啟動Apple Type Services(ATSServer)來作為視窗服務。(WindowServer)

根據預設,登入視窗(這個程式是在/System/Library/CoreServices底下)其實是一個指令模式的包裝。你可以透過修改/etc/ttys來讓登入時僅僅只有指令模式。

本文由張元毓所翻譯,本人保有一切法律權利。
Copyright@ alan chang

分類
科技相關 Mac

【翻譯】XNU:核心

Mac OSX 核心叫做XNU。有關他的說明簡述如下:

Mach

XNU內的程式碼主要是基於Mach 3.0版所開發出來的。Mach本身是卡內基、梅隆大學在1980年代中期一個傳奇性的研究計畫的產物。目前Mach也漸漸成為許多重要系統的核心了。 較早版本的Mach還是一個擁有許多BSD程式碼的單一核心,Mach3.0則是第一個微核心。
XNU的Mach並不是微核心。核心中包含像是BSD的子系統以及其他具代表性的子系統。XNU的Mach還是負擔了一些系統裡較低層次的部份,像是:

  • 核心執行緒支援先佔式多工。
  • 記憶體保護
  • 虛擬記憶體管理
  • 內部程序通訊 ( IPC )
  • 中斷管理
  • 即時支援
  • 核心Debug支援
  • console I/O

如前一章所述,在核心接續接續開機程序之前,bootloader會去呼叫核心的「啟動」程式碼,以進一步進入不同的開機模式。這個低層程式碼是任何一種系統開機程序裡面都會有的。 各種不同的重要變數都會初始化,像是:最大虛擬或物理位址、CPU降速溫度調節閥,同時BAT也會清除,Altivec和快取也都會初始化。之後程式會跳到系統架構的初始程式碼(PowerPC 上的 ppc_init())。
其後程序如下:

  • 一個模組執行緒將會插入,並從中產生一個初始化的執行緒來作為現時執行用的執行緒。
  • 部份CPU終至在執行的程序完成。
  • 「Platform Expert」初始化(PE_init_platform())。而同時設置旗標指出未被初始化的虛擬記憶體。
  • Mach 虛擬記憶體初始化
  • 呼叫machine_startup()程序。這步驟會用到許多系統內部的變數。並呼叫calls setup_main()
  • calls setup_main()會完成很多工作,像是:initializing the scheduler, IPC, kernel extension loading, clock, timers, tasks, threads…等等。最後還會產生一個核心執行緒,叫做tartup_thread,來完成更進一步的其他核心執行緒。
  • startup_thread會製造許多其他的執行緒(靜態的執行緒、負責時間與裝置的執行緒…..等等)。

此時,輪到Mach開始運作執行。
附帶一提,BSD系統會載入相當多APIs,並使用Mach messaging和IPC來讓使用者與系統核心之間轉換資訊。
XNU也提供相當多不同的方式來處理記憶體設置。因為對許多程式設計師來說處理這些問題是相當大的負擔,所以這樣的設計可以讓他們能用更聰明的方式去選擇要使用的API。
這在Mac OSX使用者部份的API處理方式也是一樣的。

BSD

XNU的BSD是以FreeBSD為主要程式碼參考基準(雖然說某些程式碼是參考其他BSD的)。Darwin 7.x(Mac OSX 10.3.x)之後是使用FreeBSD 5.x。如同前面說過的,BSD在這裡並非用在外部(或者說:使用者層級)的部份, 而是系統核心本身的一部份。在某些方面BSD還擔負以下的任務:

  • 程序模型
  • user ids, 權限, 基本安全
  • POSIX API, BSD style system calls
  • TCP/IP stack, BSD sockets, firewall
  • VFS 和 檔案系統
  • System V IPC
  • crypto framework
  • various synchronization mechanisms

XNU雖會統整暫存的快取,但是這東西都會跟Mach的虛擬記憶體綁在一起。
XNU利用一種叫做「漏斗」的同步摘要技術來整合核心中BSD的部份,而核心中會有個用「_flock」作為字尾的東西來將核心中的變數指向「漏斗」,像是kernel_flock或network_flock。當Mach透過呼叫bsd_init()來初始化BSD子系統 時,系統會先將這些漏斗定址(像是核心的漏斗就會定為TRUE)。之後:

  • 核心記憶體運算元會被重新初始。
  • “Platform Expert" 會去偵測有無任何關於BSD啟動的設定
  • VFS 暫存檔列表會重新定址並初始化
  • 程序相依性架構會重新定址並初始化
  • 這裡會創置一個Process 0,而核心程序的變數就是指向Process 0
  • 主機獨立時間和日期也會初始化
  • 統一的暫存快取初始化
  • 不同的 VFS 架構 初始化: the vnode table、檔案系統架構、 the vnode name cache, etc. 每一個現時的檔案系統時間也都初始化
  • mbufs (記憶體暫存、 網路上已使用的記憶體管理) 透過mbinit()初始化
  • 系統環境以及子系統像是 syslog, audit, kqueues, aio, and System V IPC 也都初始化
  • 核心的總 MIB (management information base) 初始化
  • 資料連結介面層初始化
  • Sockets 和各種協定初始化

XNU使用一種特製的核心延伸方式,NKEs(網路核心延伸套件)來讓4.4BSD網路架構可以適用於Mac OSX

  • 開啟核心剖析且 BSD 被當作是IOKit的資源
  • 乙太網路裝置初始化
  • A Mach Zone is initialized for the vnode pager.
  • BSD試著去掛載根目錄檔案系統 (這根目錄系統可以是透過網際網路來掛載,透過NFS掛載MacOSX映像檔–.dmg).
  • devfs 掛載在 /dev
  • kernproc (process 0)創造一個pid 1的新程序(cloned)以作為init (actually mach_init, which starts init)。 mach_init 透過 BSD asynchronous trap handler (bsd_ast())所呼叫出來的bsdinit_task()載入並執行

I/O Kit

I/O Kit,這個XNU核心裡面的物件導向裝置驅動程式韌體跟一般傳統系統是非常不同的。
I/O Kit使用有限制的C++語言子集合(基於Embedded C++)來撰寫,而這系統是由核心的函式庫提供函式。其中,C++在這子集合裡面的限制有:

  • 例外事件
  • 多重繼承
  • 多模組
  • RTTI (run-time type information), I/O Kit 有自己的執行時期系統

I/O Kit也提供裝置驅動程式模組許多相當有用的東西:

  • 各種裝置族群 (ATA/ATAPI, FireWire, Graphics, HID, Network, PCI, USB, HID, …)
  • 各個裝置的物件導向抽象元件可以相互分享使用
  • 隨裝即用以及熱插拔
  • 電源管理
  • 先佔式多工處理, 執行緒, 對稱式多重程序執行, 記憶體保護以及資料管理
  • 驅動程式動態比對以及載入 (multiple bus types)
  • 物件資料追蹤以及資訊建立的資料庫功能(the I/O Registry)
  • 全部系統上可用的I/O Kit classes資料庫 (the I/O Catalog)
  • 衍生API
  • 應用程式架構以及使用者介面與user-space drivers和I/O Kit之間的溝通
  • driver stacking

I/O Kit供給工具包含核心中3個C++函式庫,並可以供載入的驅動程式使用:IOKit.framework、 Kernel/libkern 與 Kernel/IOKit。藉著擷取各種不同的硬體、軟體之間的動態關係,I/O Kit包含模組化、層級化執行時期架構, 而這就是底層硬體的抽象化的現時情況。
各種不同的工具像是:ioreg, ioalloccount, ioclasscount, iostat, kextload, kextunload, kextstat, kextcache…等,讓我們可以操控I/O Kit。舉例來說,下列示範就能顯示出核心動態載入的物件:

% kextstat
Index Refs Address Size Wired Name (Version)
1 1 0x0 0x0 0x0 com.apple.kernel (7.2)
2 1 0x0 0x0 0x0 com.apple.kpi.bsd (7.2)
3 1 0x0 0x0 0x0 com.apple.kpi.iokit (7.2)
4 1 0x0 0x0 0x0 com.apple.kpi.libkern (7.2)

下列指令就會顯示出I/O Kit登錄檔的細節:

% ioreg -l -w 0
+-o Root
| {
| “IOKitBuildVersion" = “IOKit Component Version 7.2:
Thu Dec 11 16:15:20 PST 2003;
root(rcbuilder):RELEASE_PPC/iokit/RELEASE
"
| “IONDRVFramebufferGeneration" = <0000000200000002>

/* thousands of lines of output */

Platform Expert

Platform Exper是個能知道現在系統正在跑甚麼平台的物件(你能先把他看成是個驅動程式)。I/O Kit會登錄一個節點給Platform Exprt,而這節點會去載入正確的驅動程式給平台,甚至更進一步去發現系統上正在執行的匯流, 並為每一個匯流登錄一個節點。然後I/O Kit會為每個匯流節點載入正確的驅動程式,並將發現的裝置與節點連結起來。總結來說,Platform Expert負責:

  • 建造裝置樹狀結構
  • 分析開機程序內容
  • 辨別機器硬體 (包含硬體與bus clock 速度)
  • 如果發生kernel panic,則初始化其使用者介面

libkern and libsa

如前面所述,I/O Kit是使用C++的受限制的子集合,而這東西內容主要是libkern,提供以下的服務:

  • 動態元件整合 、建構、反建構(including data structures such as Arrays, Booleans, Dictionaries, …)
  • 自動化作用、 混合式方程式 (bcmp(), memcmp(), strlen(), …)
  • 追蹤即時class的預覽功能
  • 避免"Fragile Base Class Problem"

libsa則提供許多方程式來處理多樣的目的:binary搜尋、symbol、 remanglinggraphs, catalogs, kernel extension management, sorting, patching vtables…等等。

分類
科技相關 Mac

【翻譯】Mac OSX開機

現在我們來談談有關Mac的韌體(很多時候這東西可以說很類似PC上面的BIOS),要大家注意的是新舊版的ROM之間非常不同。舊版像是68k這種舊世界的PowerMacs,新版的就像是目前可見的Mac,用的是Open Firmware3.x版。而我們只討論較新的版本。
雖然說這些韌體不包含在MacOSX裡面,但是對機器上運行的系統來說,它還是扮演著非常重要的角色,此外這玩意兒在除錯上也是非常有用,所以我們才會在這邊加以論述。

Open Firmware

背景

Open Firmare(IEEE-1275 開機韌體標準:執行以及條件核心)是個非專利的平台。這個就像是PC上的BIOS,寫在ROM裡面,是電源開啟時電腦第一個載入的程式。
Open Firmware是用Forth程式語言:FCode所編寫而成的。而目前主要使用Open Firmware工具的電腦系統有Apple和SUN(SUN把這個叫做OpenBoot)。 大家可以參考Open Firmware的網頁。 (譯者註:有關Forth語言大家可以參考http://www.figtaiwan.org/f_intro.htm和http://www.figtaiwan.org/f_history.htm)
正如前面所述,firmware是用Forth語言寫在ROM裡面,而以bytecode的方式執行,所以電腦的設備驅動程式也是以類似的模式在系統啟動之時運行。 這些驅動程式通常是在擴充卡上的延伸ROM裡面,並且在作業系統啟動之前就被載入。

相互作用

你可以在按下Mac電源時,同時按著cmd+opt+O+F 這四個鍵,來進入Open Firmware。cmd鍵就是所謂的蘋果鍵,而opt就是Option鍵。之後你應該會看到一個歡迎訊息並進入一個提示像是下面這樣:

ok
0 >

你可以打入mac-boot來開機或是輸入shut-down來關機。
雖然說Forth “shell“提供一個還算不錯用的文字操作編輯模式(你可以藉著ctrl+a到該行的起始點;ctrl+e到結束點;ctrl+u殺掉該行;up-arrow鍵看輸入記錄), 但是你會發現透過網路從其他別的電腦來操作Mac的Open Firmware將更方便,特別是如果你想要在firmware上寫入些程式碼。下面是個指令範例(Open Firmware除了透過文字模式操作外,別無他法):

0 > dev /packages/telnet

注意:
當你輸入成功的時候,Open Firmware會在你按下的那一行列出ok字串。所以在這一篇文件中所舉的範例,如果你看到ok,記得這個是Open Firmware所列出的,不是要你輸入的指令喔!

前面所舉的例子,如果你的Mac的Open Firmware裡面有telnet server這套件,則應該會看到:

0 > dev /packages/telnet ok

如果你看到ok,則你就可以在上面使用TELNET server 服務:

" enet : telnet , 10 .0 . 0 . 1 " io

這樣就會在你的機器用IP10.0.0.1在上面跑TELNET server(當然你也可以選用你個人喜歡的IP),之後你就可以透過telnet連接到這台機器的Open Firmware,Windows也可以連接上喔!

注意:
G4之後的Apple Mac機種,會透過乙太網路port作自動偵測以及自我設定,所以你不需要另外用跳線就能直接連接到其他電腦。

範例:

1.這個指令可以列出你的裝置:

0 > dev / ls
ff880d90: /cpus
ff881068: /PowerPC,750@0
ff881488: /l2-cache
ff882148: /chosen
ff882388: /memory@0
ff882650: /openprom
ff882828: /client-services

More [,,q,a] ? _

2.這個指令可以告訴你有關RAM的資訊:

0 > dev /memory .properties ok
name memory
device_type memory
reg 00000000 10000000
10000000 10000000
slot-names 00000003
SODIMM0/J25LOWER
SODIMM1/J25UPPER

dimm-types DDR SDRAM
DDR SDRAM
dimm-speeds PC2700U-25330
PC2700U-25330

我們可以看出來這台機器(PowerBook G4 15″)有兩條個PC2700 DDR SDRAM。而兩對 reg欄的數字表示記憶體中的起始定址位置和晶片的大小, 也就是第一條ram 晶片從0x0000000這位址開始,大小是0x10000000(也就是256MB啦)。第二條的晶片從0x1000000開始,大小也是256MB,所以總記憶體就是512MB囉!
如果因為各種理由使得你必須把記憶體回復到原廠的樣子,而又不想拆機器拆下記憶體(或是想模擬記憶體較少時的狀態),你可以用delete-property指令來刪掉reg欄。 像是下面的例子就是把我們機器中的第二條記憶體暫停(記得,這個指令只有暫時的作用,當你重開機記憶體就會自己抓回來)

0 > " reg" delete-property ok
0 > 0 encode-int 10000000 encode-int encode+ " reg" property ok

注意:
特別需要注意的是更改reg這方法有其風險,而且也常因為機器的不同而不一定能適用(像是PowerMac G5就不能這樣搞),因此如果你想限制記憶體最保險的方法是透過maxmem:

# nvram boot-args="maxmem=128″

3.下面這組指令可以告訴你各種有關機器上CPU的資訊:

0 > dev / ok
0 > dev /cpus ok
0 > ls
ff886d58: /PowerPC,G4@0
ff8871f8: /l2-cache
ok
0 > dev PowerPC,G4@0 ok
0 > .properties
name cpu
reg 00000000
cpu-version 80020101
state running
clock-frequency 4a817c7b
bus-frequency 09ef21aa

電腦輸出的結果說明了各種不同的cache大小以及晶片繪圖能力…..等等,你可以當作這是類似Linux上面 /proc/cpuinfo 的功能。

4.下面這指令會列出root目錄下的檔案

0 > dir hd:
Size/ GMT File/Dir
bytes date time Name
6148 12/25/ 3 4:25:25 .DS_Store
156 9/12/ 3 20:41:59 .hidden
589824 12/25/ 3 6:45: 6 .hotfiles.btree

5.下面這指令會詳述hd,並以樹狀圖的方式給你完整的裝置路徑:

0 > devalias hd /pci@f4000000/ata-6@d/disk@0 ok

6.你可以用load指令來載入核心檔案,並用boot指令來用這檔案開機。當然就像是前面說過的,通常我們還是用mac-boot和shut-down來開關機, 而你可以透過printenv和setenv來取得或設定環境變數。這些變數都設定在Open Firmware裡並存在非揮發性記憶體上(NVRAM)。舉個例來說,如果你想用“OEM banner“來當你的e-mail位址,你應該這樣做:

0 > setenv oem-banner you@your.email.address
0 > setenv oem-banner? true

其實你不需要進入Open Firmware裡面來設定NVRAM的變數,你可以在OSX裡面透過nvram這指令做到一樣的事。
總結以上所述,Open Firmware 其實就是個控制、除錯、探索你的電腦的強力工具!

運作過程
當開機電源打開之時,Mac的硬體會進行一個自我診斷程序(透過一些POST的程式碼)並初始化,之後第一個掌控了CPU的就是firmware—韌體。 Open Firmware此時會開始建立裝置架構、偵測裝置插槽、檢測PCI裝置並為各個裝置定址,隨即再去尋找開機裝置。“snag“可以讓使用者在通電之後看到開機裝置:

C device referred to by the ‘cd’ alias, a CD-ROM drive
D device referred to by the ‘hd’ alias, a hard disk drive
N device referred to by the ‘enet’ alias, a network card
Z device referred to by the ‘zip’ alias, a ZIP drive

有人會特別把開機時按住T鍵然後進入的模式取名叫:Firewire目標磁碟模式,個人覺得沒啥意義。事實上這不過就是把你的Mac裝成一個延伸的Firewire磁碟裝置。
你可以透過網路開機的方式並使用TFTP來取得更完整的裝置路徑說明:
boot enet:,,;,;
如果此時Open Firmware找不到開機裝置,就會顯示一個閃爍的檔案夾。
Open Firmware然後會從系統磁區載入tbxi類型的檔案(ToolBox ROM Image),注意在Mac OS9的System Folder裡叫做“Mac OS ROM“,而Mac OSX則是從 /System/Library/CoreServices/BootX 載入。 BootX之後會執行並且控制權也換到它手上。
提醒一點,雖然Open Firmware可以直接載入 ELF,XCOFF和“bootinfo“(任何被支援的有XML檔頭的格式),但是卻不能載入Mac OSX真正可執行的原生格式—-Mach-O。所以需要BootX,因為BootX可以載入Mach-O。

Bootloader

BootX(/System/Library/CoreServices/BootX )是Mac OSX預設的開機管理員程式。
BootX也是一個開放源始碼的開機管理員程式的名字(跟Apple的BootX是不一樣的程式喔),這程式能讓你在「舊時代」的Mac機器上雙重開機:Mac OS和Linux。
BootX會根據不同的檔案系統載入不同的核心:HFS+ , HFS , UFS , ext2 , 和 TFTP(網路開機時,會當作是一種檔案系統)。除了Mach-O之外,BootX還能載入ELF核心,可是Apple並沒有在OSX上面運用這個功能。 換句話說,BootX可以在ext2磁區中載入ELF核心。
因為「舊時代」的Mac機在處理Open Firmware個有不同的問題,所以對Apple的工程師來說就造成了許多開機上的問題,同時對Linux PPC的port工作上也就有同樣的困擾。 Apple這邊透過許多NVRAM上面的修補程式或是直接更改Bootx程式碼的方式,來解決這樣的問題。而隨著BootX的成熟,Apple也增加了對ext2和ELF支援的目標,使得OSX有跟Linux PPC競爭的實力。
緊接著BootX執行的程序是:
1. BootX首先會初始化Open Firmware客端介面(這介面會開始跟韌體溝通)並取得韌體的版本。
2.接著它會在韌體裡製作一個假的裝置叫做 sl_words (‵sl′表示次級載體),並定義各個FORTH字串(這時會顯示一個旋轉的游標)。
3.BootX接著會在韌體中尋找可選擇的裝置,並將各個變數導入(你可以在Open Firmware裡用printenv和setenv指令觀測和設定)。

0 > dev /options .properties
name options
little-endian? false
real-mode? false
auto-boot? true
diag-switch? false

boot-command mac-boot

4. BootX找出被選好的裝置,像是input/output裝置,記憶體,MMU,PMU,CPU,PIC…..等等。例如底下這Open Firmware指令會顯示出被選擇的裝置:

0 > dev /chosen ok
0 > .properties
name chosen
stdin ffbc6e40
stdout ffbc6600
memory ffbdd600
mmu …

5.BootX透過chosen將記憶體和MMU初始化。
6.BootX會將螢幕和健盤也初始化。
7.BootX會確認「安全模式」是否有啟動。
8.BootX會確認是否有「verbose」(即開機時按著cmd+v)或「單人模式」(cmd+s)
9.BootX確認系統是否要在「安全模式」上啟動
10.BootX會要求記憶體針對不同行程作調整
11.BootX會找到所有的螢幕並將之做好設定,這步驟主要藉由搜尋裝置樹狀目錄裡面關於螢幕的節點來達成。而主營幕就是透過screen來映射。例如你可以試試下面這Open Firmware指令:

0 > dev screen ok
0 > .properties
name ATY,Bee_A
compatible ATY,Bee
width 00000400
height 00000300
linebytes 00000400
depth 00000008
display-type 4c434400
device_type display
character-set ISO859-1

12.當螢幕啟動之後,BootX就會讓螢幕顯示我們熟悉的灰白色。
13.BootX會去找啟動裝置並從中定義要從哪裡抓到核心(mach_kernel),同時核心檔案的路徑來源也會建構起來。如果是從磁碟裝置啟動(通常也是這樣),則那個指向kext cache的路徑跟著其他延伸目錄 (通常是/System/Library/Extensions)一起被運算。
Mac OSX 用了些不同「kext」(kernel extension)的快取來加速kexts的載入。核心的快取通常是保留在 /System/Library/Caches/com.apple.kernelcaches 這目錄裡。 這些快取檔通常叫kernelcache.XXXXXXX之類的名稱,並且會用跟Gzip一樣的32位元的壓縮運算法儲存。
14.此時,BootX會在螢幕上畫出一個Apple的標誌,並開始出現旋轉游標。如果是網路開機,則是旋轉的地球。
15.依據不同的情況,BootX會試著追溯以及載入核心快取檔。
16.下一步就是翻譯核心檔。如果核心檔頭指出這是個壓縮過的核心,則BootX就會試著解壓縮(用的是LZSS壓縮格式,專門適合那種壓縮一次但是要常常解開的資料)。因為核心的二進位檔是個胖核心 (多重架構的程式碼都在同一個二進位檔裡),BootX將會先確定它是不是個胖核心,如果是,就想辦法讓它減肥。
17.BootX會盡量翻譯這些檔案轉為Mach-O二進位檔,如果失敗了,BootX也會努力將之轉為ELF。
18.如果又失敗了,BootX只好放棄,在螢幕上畫出開機失敗的圖片,進入無窮迴圈再重頭來過。
19.如果BootX成功了,就會儲存檔案系統快取,設置各種啟動環境參數,這步驟又叫做搞定各個裝置的遞迴方程式。
20.最後,BootX會呼叫核心。而很快地,它也讓許多像是firmware,timers或DMA等不同步程序都隨著Open Firmware沉寂安靜下來。

系統啟動

Mac OSX使用者層級的啟動計不是純粹的BSD模式也不是SYSV模式,雖然/etc/rc是從BSD繼承過來的。事實上許多東西比較像是NEXTSTEP。
下一章XNU : The Kernel將會說明有關核心的東西。Mac OSX System Startup則會接著介紹user-level的啟動方式。

BootCache

Mac OSX在開機時會用一個叫做Bootcache的東西對系統做最佳化,也就是讀取磁碟裝置並將之做索引為「playlist」。
所有可以備讀取的磁碟裝置都會作出索引在 /var/db/Bootcache.playlist。當這裝置載入使用時,這些快取就會自動生效。
需注意的是這個優點必須有128MB以上的實體記憶體。滿足這條件系統就會自動啟動這功能。

本文由張元毓所翻譯,本人保有一切法律權利。
Copyright@ alan chang

分類
公告

【翻譯】Mac OSX檔案系統

一如現今其他作業系統,Mac OSX使用物件導向的vnode層。XNU使用的VFS layer則是從FreeBSD而來。而這兩種檔案系統之間有點小小的不同(例如:FreeBSD使用mutexes,xnu使用simple locks)

本地檔案系統
HFS

HFS(Hierachical File System)過去是Mac上面的主要檔案系統,從Mac OS 8.1之後則改為HFS+。
這個小節將會去簡述Mac OSX上所支援的幾個主要檔案系統。

HFS+

HFS+是Mac OSX上面的預設檔案系統,它支援了日誌式檔案系統功能、磁碟配額功能、位元範圍鎖定、Finder的「後設資料索引(metadata)」功能、多重編 碼功能、實體與記號連結檔、別名檔、隱藏檔…等。HFS+內部式使用B-Tree架構。

就像是目前多數的日誌型檔案系統,Mac OSX只針對後設資料索引(metadata)作日誌化的動作。而日誌功能係透過在既有的HFS上面,以XNU裡一個獨立的日誌型檔案系統層級,引入此功 能到HFS+上。HFS+卷宗上的日誌檔檔名叫:.journal或.journal_info_block。這個檔案系統還支援了其他許多獨立的功能, 並在Apple上運行良好。

與HFS相似之處

HFS+在架構上其實跟HFS十分相 近,但是它另外有許多重要的改進:

  • 磁柱採用32位元(原本是16位元),HFS將磁碟空間分為等大的allocation-blocks,且最多支援到2的16次方個 allocation-blocks。因此使用32位元的檔案會是最節省磁碟空間的方法。
  • 檔名最長支援到255個字元
  • Unicode檔名編碼
  • 檔案/目錄的屬性都有可擴充性
  • 加入System Folder ID(用以啟動Apple作業系統),在開機過程中這個非常容易被系統找到的開機用檔案會加速開機程序。另外這檔案也支援非Apple作業系統透過HFS +檔案系統來開機。
  • 單一檔案最大支援到2的63次方位元。

別名檔(Aliases)

別名檔跟記號連結檔一樣可以同時指向多個檔案或是目錄,但是如果你今天將所指向的目標檔案搬移,記號連結檔就會失去連結,但是別名黨會自己去更改連結使得 其連結依然有效。這是因為在HFS+下面,所有的檔案都有一個獨一無二、永恆的認證,其中會包含它的路徑。如果二者之中有一個出錯(可能是路徑或是認 證),別名檔會自動去更新成對的(去檢視哪個能找到檔案)。這個功能就是為什麼你可以隨便搬移應用程式裡面的程式,但是Dock上面的icon永遠能連到 正確程式位置讓你輕鬆開啟程式。

最佳化
HFS+有個特殊的最佳化機制。當我們開啟一個位於HFS+卷宗上的檔案時,系統會自動進行下列測試程序:

  • 檔案小於20MB
  • 檔案並非處於使用忙碌中
  • 檔案不是唯讀
  • 檔案是破裂的(磁碟上非連續的)
  • 系統至少正常運作超過3分鐘

如果上述所有條件通通吻合,那系統將會針對這個檔案重新定位(Windows上叫這個為「磁碟重組」)。
另外一個最佳化方式就是「熱門檔案叢集」– 這是透過多重的定位(例如:DISABLE、IDLE、BUSY、RECORDING、EVALUATION、EVICTION和ADOPTION)方 式,找出什麼是熱門檔案並將其搬移到「熱門檔案磁碟區」(注意,日誌型檔案以及磁碟配額檔案會被排除)。而這機制將會使用磁碟上的B-Tree檔案加以追 蹤(/.hotfiles.btree)。

#ls -l /.hotfiles.btree
-rw——- 1 root admin 589824 Jul 23 2004 /.hotfiles.btree

補充一下,這個機制最多選入5000個檔案,而且必須 是大小小於10MB的檔案。

多重叉

HFS+/HFS上的檔案都有兩個「叉(fork)」– 傳統上同時有資料(data)和資源(resource)兩個叉,而可能其中一個會是“空“的。資源叉(resource fork)上面通常會記錄不同的東西像是圖標、偏好設定、認證資訊…等。而如預料之中的,這個檔案系統這樣的設置跟我們一般的Unix檔案系統架構是 不相容的。所以當你想要將這個檔案系統上面的資料搬移到Unix檔案系統上面時,你最好小心一點。Command Line Archival in Mac OSX這片文章中有針對這個問題加以作進一步的討論以及提供解決方案。
BSD得文字指令方式下,會這樣去處理資源叉:

% ls -l Icon
128 -rwxrwx— 1 amit amit 0 11 Jun 2003 Icon
#這表示資料叉是空的
% ls -l Icon/rsrc
128 -rwxrwx— 1 amit amit 65535 11 Jun 2003 Icon/rsrc
#這表示資源叉裡面有65535個位元

跟別名檔不一樣的地方在於,多重叉的被POSIX API支援。

Device Driver Partition

雖然說這部份比較跟HFS+沒關係,但是我稍微提一下:Mac OSX可以從各種地方去掛載鎖定型的裝置當作是卷宗—像是ROM、USB或Firewire裝置、固定式硬碟上的特殊磁區。為了能支援各種系統或是功 能,磁碟可以在他唯一的磁區上面安裝不同的裝置驅動程式。舉例來說,你可以透過/Applications/Utilities/Disk Utility.app(譯者:即磁碟工具程式)來檢視磁碟資訊,並從中得知Mac OS9的驅動程式也同時運行在這個磁碟上面。一台標準的PowerBook磁區規劃方式可能如下:

# pdisk /dev/rdisk0 -dump

Partition map (with 512 byte blocks) on ‘/dev/rdisk0’
#: type name length base ( size )
1: Apple_partition_map Apple 63 @ 1
2: Apple_Free 262144 @ 64 (128.0M)
3: Apple_HFS Untitled 156039270 @ 262208 ( 74.4G)
4: Apple_Free 10 @ 156301478

Device block size=512, Number of Blocks=156301488 (74.5G)
DeviceType=0x0, DeviceId=0x0

在上面的資訊裡面,我們可以看到Apple_partition_map是個描述硬碟上磁區的後設資料索引磁區。 而這個後設資料索引磁區在開機過程中也是最先被載入的部份。

遲鈍之處

注意一下,HFS+是個事件先占、事件遲鈍的檔案系統,也就是在下述這樣的情形下檔案系統會發生衝突:

#tar -tf freebsd.tar
FreeBSD.txt
freeBSD.txt
#tar檔案裡面同時包含兩個檔案
#tar -xvf freebsd.tar
FreeBSD.txt
freebsd.txt
#ls *.txt
freebsd.txt

Apple Technical Note有篇叫HFS Plus Volumes Format的文件,有詳細描述HFS+的內部技術。

ISO9660
ISO9660是個獨立 的檔案系統,主要適用於唯讀的資料CD。而事實上,你應該會想要在一片光碟上面同時使用Mac/ISO9660兩種檔案系統,因為這樣你就可以同時在 Mac或是其他作業系統上面讀取同一片光碟。

MSDOS
Mac OSX支援MSDOS的檔案系統格式(FAT12、FAT16、FAT32)

NTFS
Mac OSX支援NTFS檔案系統,但是僅僅唯讀。

UDF
UDF(Universal Disk Format)是DVD-ROM(包含DVD-video和DVD-audio)和許多CD-R/RW所使用的格式。Mac OSX 10.3 Panther在本文撰寫之時僅僅支援UDF 1.5而非UDF 2.0。

UFS
Darwin裡面的UFS跟*BSD很像,跟過去的NEXTSTEP也很像,但是它們絕對不是一樣的東西。目前僅有NetBSD完全支援。Apple的 UFS是big enidan(譯者註:這個詞我不知道怎麼翻,我將牛津字典上的意思放在後面),即便是在x86硬體上也一樣。這個檔案系統裡面包含新的目錄配 置演算法。這個演算法的作者在他的網站上面有更多相關資訊可供參考。(denoting or relating to a system of ordering data in a computer’smemory whereby the most sidnificant or least significant byte is fisrt.)

網路檔案系統

AFP
Apple Filling Protocol (AFP)是Apple主要用來進行網路上檔案分享的專有網路通訊協定。關於AFP或NFS兩者之間的比較,其實已經是在本文件所要討論的範圍之外的命 題,但Mac OSX上面有一些軟體可以讓兩者並存。(AFP檔案分享可以作得看起來用起來都很像是NFS。)

/usr/sbin/AppleFileServer是AFP的背景程序,當你在「系統偏好設定」–>「分享」裡面勾選「個人檔案分享」時,這程 序就會載入。

FTP
透過mont_ftp這個指令,你可以將遠端的FTP網站以目錄的方式掛載在你的Mac上面。注意一下,這指令目前僅支援唯讀的方式,而這功能可以透過 Finder或是網頁瀏覽器運作。

# mount_ftp ftp://user:password@hostname/directory/path node

NFS
Mac OSX上面同時內建BSD上面的NFS的client端與server端的程式(version 3),當然也包含NQ這個延伸套件。其幕後程序:rpc.lockd、rpc.statd、nfsiod…等。

SMB/CIFS
Mac OSX “Panther"內建Samba 3.0。

其他/偽裝的檔案系統

cddafs
cdda檔案系統主要是要用來讓音樂CD上面的音軌偽裝成aiff檔案格式。除此之外,如果音軌名稱可以順利嵌入,系統會自動地會音軌“檔案“找到一個對 應的檔名。
所以當你放入一片CD到你的Mac上時,Mac OSX會用cddafs將其掛載起來。你也可以透過指令模式完成:

# mount_cddafs /dev/disk /tmp/audiocd

deadfs
當底層的檔案系統跟vnode(在vclean()操 作下)分離時,他的vnode作向量將會導向dead filesystem。除了close()程序之外,其他程序都無法在dead filesystem裡面運行。如果你想要終止一個已經登出的使用者在幕後的執行程序,但是卻因為身分權限的關係而沒有這樣的控制權,你就可以透過 Terminla以deadfs來取代那個程序的vnode。

devfs
devfs,裝置檔案系統,一般都是掛載在/dev這個目錄底下。通常都會在BSD初始化過程中載入Mac OSX的核心,當然你也可以在開機完成之後用mount_devfs指令掛載:

# mount -t devfs devfs /tmp/dev

fdesc
fdesc檔案系統都掛載在/dev/fd目錄底下,功能角度來看它的角色很像是Linux上面的/proc//fd(或是 /proc/self/fd)。這玩意兒提供一個所有正在運行的程序的活動檔案描述子的清單。提醒一下,Linux上面/dev/fd是 /proc/self/fd的連結檔。
/etc/rc會在系統啟動過程中掛載fdesc:

# mount -t fdesc -o union stdin /dev

fifofs
fifofs功能目的跟specfs很相像。

loop
功能上很像是Linux上面的loop(或是Solaris的lofi),讓你可以簡單地在磁碟映像檔上面點兩下滑鼠,就自動地掛載起來。當然如果你願意 用指令模式,那功能會更多一點:

# hdid floppy.img
/dev/disk3

# hdid http://127.0.0.1/disk.img
/dev/disk4

disk3、disk4將會偽裝成像是普通的磁碟一樣。需要注意的是如果你是透過HTTP方式去掛載,那它會是個雙叉檔案,你需要比較多的技巧才能順利使用。
hdid還可以指向磁碟映像檔案底下的“影子檔“。

nullfs
null mount filesystem在4.4BSD裡是個可以堆疊起來的檔案系統,它允許將不同地方的磁區掛載成一個檔案系統。也就是將多個目錄整合成一個目錄樹,於是 乎,你可以將不同硬碟通通掛載成一個目錄樹,而底下的目錄樹還可以將可讀寫的權限設定為唯讀。
這東西跟union mount有個小小不同點,nullfs會完全跳過下列VFS/vnode讓他們保持原來的檔案格式:
vop_getattr()、vop_lock()、vop_unlock()、vop_inactive()、vop_reclaim()、 vop_print()。

null檔案系統層一樣是預設的標準檔案系統,而新建的層可以將null作為模板來使用。
最後,我想這是一定要強調的:雖然nullfs是Darwin核心原始碼中bsd子樹,但事實上Mac OSX並沒有使用它。

ramfs
ramfs可用以下方式在Mac OSX裡創建:

# hdid -nomount ram://1024
/dev/disk3

上面這指令會製造出一個1024個磁柱的記憶體磁碟(一個磁柱大小是512),並其後顯示掛載結果的磁碟名稱。之後,你就可以製作一個檔案系統在這個裝置 上面:

# newfs_msdos /dev/rdisk3
/dev/rdisk3: 985 sectors in 985 FAT12 clusters (512 bytes/cluster)
bps=512 spc=1 res=1 nft=2 rde=512 sec=1024 mid=0xf0 spf=3 spt=32 hds=16 hid=0

這磁碟還可以這樣掛載起來:

# mount -t msdos /dev/disk3 /tmp/msdos
# mount
/dev/disk0s3 on / (local, journaled)
devfs on /dev (local)
fdesc on /dev (union)
on /.vol
automount -nsl [148] on /Network (automounted)
automount -fstab [155] on /automount/Servers (automounted)
automount -static [155] on /automount/static (automounted)
/dev/disk2s10 on /Volumes/Firewire (local, nodev, nosuid, journaled)

如果你要卸載,請這樣作:

#hdiutil detach /dev/disk3
“disk3″ unmounted.
“disk3″ ejected.

specfs
裝置和FIFO可以存在於任何的檔案系統上面,這表示 它們的名稱或是屬性都可以被主檔案系統所接受;然而主檔案系統並不能完全掌管其運作,裝置還需要透過其底層的驅動程式驅動。也就是說,每個裝置化身還是需 要經過適當的驗證與控制。
specfs的功用就是將上述運作變得簡單容易。但是specfs本身是使用者看不見的檔案系統,並且它不會掛載 在任何地方。

synthfs
synthfs是個存在於記憶體裡面的一個偽裝型檔案系統,它的功用是建立一個任意型目錄樹。synthfs並非是出自於FreeBSD的產物。
掛載synthfs就像是掛載典型的偽裝型檔案系統一樣:

# mount -t synthfs synthfs /tmp/synthfs

union
關於4.4BSD的union檔案系統,在Union Mounts in 4.4BSD-Lite這篇文章裡面有相當詳盡的說明以及相類似檔案系統的簡史。用最簡單的解說方式:union檔案系統比 起null檔案系統,更進一步地步將檔案通通隱藏在已掛載的目錄底下。它將不同的目錄包裝成像一個一樣。
可以參考下列一連串指令,看看union基本內容:

# hdiutil create /tmp/msdos1 -volname one
-megabytes 1 -fs MS-DOS

created: /tmp/msdos1.dmg
# hdiutil create /tmp/msdos2 -volname two
-megabytes 1 -fs MS-DOS

created: /tmp/msdos2.dmg
# hdid -nomount /tmp/msdos1.dmg
/dev/disk3
# hdid -nomount /tmp/msdos2.dmg
/dev/disk4
# mount -t msdos /dev/disk3 /tmp/union
# echo “msdos1: a" > /tmp/union/a.txt
# umount /dev/disk3
# mount -t msdos /dev/disk4 /tmp/union
# echo “msdos2: a" > /tmp/union/a.txt
# echo “msdos2: b" > /tmp/union/b.txt
# umount /dev/disk4
# mount -t msdos -o union /dev/disk3 /tmp/union
# mount -t msdos -o union /dev/disk4 /tmp/union
# ls /tmp/union
a.txt b.txt
# cat /tmp/union/a.txt
msdos2: a
# umount /dev/disk4
# ls /tmp/union
a.txt
# cat /tmp/union/a.txt
msdos1: a
# umount /dev/disk3
# mount -t msdos -o union /dev/disk4 /tmp/union
# mount -t msdos -o union /dev/disk3 /tmp/union
# cat /tmp/union/a.txt
msdos1: a

真實案例:/etc/rc將一個descriptor檔案系統掛載成一個union

# mount -t fdesc -o union stdin /dev

volfs
volfs,卷宗檔案系統,是HFS+、 VFS上面的一個虛擬檔案系統,支援兩個不同的API(POSIX/Unix路徑名稱與Mac OS )。其存在目的就是為了能夠支援Carbon檔案管理員的API在BSD檔案系統上面運行。

支援volfs的檔案系統有:HFS+、HFS、ISO9660與UDF。

參閱下面例子:

# mount
/dev/disk0s9 on / (local, journaled)
devfs on /dev/ (local)
fdesc on /dev (union)
on /.vol

#ls -l /.vol
total 0

簡單說,就是掛載在/.下面的儲存裝置都會表示在/.vol下面
再以/mach_kernel檔案為例:

# ls -li /mach_kernel

這個檔案隨後會在/.volfs被接受(1045670是檔案的inode數字)

# ls -li /.vol/234881033/1045670

volfs通常是在系統啟動過程中掛載在/etc/rc底下

# mkdir -p -m 0555 /.vol && chmod 0555 /.vol && mount_volfs /.vol

關於XYZ?

雖然說Mac OSX已經支援了相當多的檔案系統,但是你或許還是會碰到沒被支援到的。像是Linux上面的ext2/3和Reiser就沒有支援,但是你還是能找到開放原始碼的工具—ext2 for Mac OSX—來解決問題。
有趣的是,BootX,Mac OSX的開機控制程式卻支援ext2檔案系統,甚至還可以從中載入核心來開機。
這邊遺漏了一個重點:proc檔案系統!關於這部份,請參考/proc on Mac OSX這篇文章吧。

本文由張元毓所翻譯,本人保有一切法律權利。
Copyright@ alan chang

分類
法律

球場上的攻擊行為,有無民法侵權行為適用?

這學期我修了【英美侵權行為法】
老師相當的棒而且我對英美法體制也是相當的醉心,因此從開學到現在學得相當愉快,甚至認為這是我在政大法律裡面最快樂、收穫最多的課之一!

今天討論到一個特別、有趣的案例:
O’Brien v. Cunard S.S. Co.
Srpreme Judicial Court of Massachusetts, 1981

這個案例故事內容其實蠻簡單的:
A、B分屬兩個不同的職業美式足球隊隊員。他們兩個在比賽時,A惡意犯規造成B身體上的傷害。B於是對A提出民事侵權行為控訴,要求A損害賠償。

那這個案例放在Privileges這一章下面,也就是說案例主要在討論本案有沒有法律上所謂「阻卻違法事由」之存在。
從大陸法的觀點,所謂阻卻違法事由是說這件事情基於道德、正義是你應該作的,但是因為法律規定的方式變成如果你做了會負上違法的責任;法律為了鼓勵社會大眾去為正義之士所應為之事,於是特別規定阻卻違法事由來阻卻你的違法。
舉個例來說:
你看到路上有人高喊:「搶劫啊!」然後看到一個年輕小夥子拿著一個女用包包快速奔跑,你見義勇為地將他拖到旁邊打了一頓,扭送警察局!
基本上其實你已經犯了妨害自由、傷害…等等罪責,但是因為這是見義勇為的應為之事,法律上特別在這樣的情形下規定這種本來就應該作的可以免除罪責。所以說你打傷那個小偷是沒有罪責的。