Tag Archive
【翻譯】為何選擇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顯然是優秀許多 [...]
【翻譯】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
【翻譯】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” [...]
【翻譯】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: [...]
【翻譯】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 [...]




