關於證券交易法第一條的一點想法

一般而言,一部法律的第一條均是大部分人都會忽略的八股文
不外乎說明為何制定本法之類高調

但往往在面對案件艱澀隱晦時,第一條會是認事用法的精神總指標!

我國證券交易法第一條規定:「為發展國民經濟,並保障投資」
就許多學者的看法,認為證券市場最主要的兩個目的就是「發展經濟(又有認為是活絡市場)」、以及「保障投資人」這兩種想法彼此對抗衡平。以美國來說,他們就比較重視活絡市場這一部分。
而有學者認為保障投資人才是最主要的目的,一旦保障投資人之後發展經濟的效果就會出來。
活絡經濟反變成保障投資人目的下的效果了
繼續閱讀 “關於證券交易法第一條的一點想法”

新聞自由關你屁事?

過去我曾經有一篇批評中天新聞誤解新聞自由的文章,提到所謂的新聞自由是對政府主張的自由。
為什麼自由權是對政府主張的呢?

這要說到歐洲國家憲法的緣起:
過去歐洲很多次革命運動,都有一個共同點就是對於政府或是專制者過度的權力擴張感到不滿。因此基本上憲法訂立之出發點,就是對政府權力的質疑以及約束。
繼續閱讀 “新聞自由關你屁事?”

八寸晶圓工程師,蛋糕店顯神威!

剛剛我聽到廣播新聞:
晶圓廠某工程師憑藉其平常接觸8″與12″晶圓的經驗
精準地發現蛋糕店的蛋糕根本不到8″
甚至當場拿出量尺來加以證明之!!
帥啊!這才叫geek風範!

蛋糕店辯稱,幾吋是以蛋糕盒來計算,而業界卻普遍沒有標準

這該怎麼辦?

嘿嘿!
這就是本篇放在「法律相關」這個分類下的目的
繼續閱讀 “八寸晶圓工程師,蛋糕店顯神威!”

玻璃娃娃事件判決之我見

這個新聞背後有相當多值得探討的問題 。根據以往的慣例我僅討論法律上的概念,且盡量加入法律經濟分析的想法。(還不是很完整,所以我可能會陸續修改)

1.事件假設
實際上事件到底如何認定,在我真正看到法院判決書之前都無法確定。所以我先假設一個:玻璃娃娃同學A,在下雨天時仍想要上體育課,因為該景文高中沒有無障礙空間建築設計,因此央求同班同學B揹他下樓。同學B出於一片好心,揹他上課。沒想到因為天雨路滑,在樓梯上摔倒卻致使玻璃娃娃同學A重傷死亡。

牽涉法條:民法184、192、194、217、187II
繼續閱讀 “玻璃娃娃事件判決之我見”

中天新聞記者,你們可能已經犯法了!

根據今天的蘋果日報:【裴勇俊生氣變臉斬行程 接連遭設計 記者闖房間】的報導。中天新聞記者似乎在裴勇俊不在之時,趁機混入他的房間裡面採訪。

雖然中天辯稱圓山飯店沒有震怒,但這件事情已經不是單純道德上可議的問題,而是涉及刑事案件!

首先我先聲明,我從沒看過裴先生的任何作品,更不是他的fans(老實說,我完全不覺得他有魅力),所以希望能不帶情緒地看這件事情。

根據刑法第306條第一項規定:無故侵入他人住宅、建築物或附連圍繞之土地或船艦者,處一年以下有期徒刑、拘役或三百元以下罰金。

中天新聞記者主管辯稱圓山飯店沒有抗議,顯然是對於法律不了解。因為理論上,當我們去承租一個旅館之後,我們所承租的房間就是我們的私人領域!
也就是說,這個建築物所有權雖然屬於圓山飯店,但是在這個時間點之內,這個房間的使用權卻是承租人所享有,因此在承租時間之內,跟一般人自有或是承租的住宅,具有一樣的性質。
因此不管是飯店當局或是其他閒雜人等,隨意地未經同意進入承租人的房間領域裡,就是侵入住宅罪!即便記者獲得圓山飯店同意,也不能在租賃期間進入該房間,只能在非租賃期間進入。

過去警察未有搜索票,就自以為可以未經同意進入飯店房間搜索,其實是一樣的問題。只是警察是適用第307條違法搜索罪。

新聞自由是對政府主張的自由!

新聞自由、言論自由這些憲法裡面的自由權,念過法律的都知道,除了特殊情況下,都是對政府主張的自由權,而不是對其他同樣人民地位的人主張。

因此記者不能一句:「新聞自由」,就可以免去上述侵害他人人權之刑事犯罪責任!
你是記者沒錯。你要採訪新聞沒錯,但不代表你就能違法亂紀!

如果自己已經違法還不知羞恥地大喇喇嗆聲,那這種記者叫人瞧不起也是應該的!

保留法律追訴權? 保留個屁啊!

我們常見許多公眾人物在電視媒體上面
常常會去強調他們要保留法律追訴權或是保留法律告訴權之類的

特別是發生涉及侵害名譽權的案子時
就可見到袞袞諸公們在SNG鏡頭前面是怎樣奮力疾呼:「我…我保留我的法律追訴權!」

保留個屁啊!

不管你是要走民法(請求權消滅時效規定在民法第125以下以及其他部份)或是刑法(追訴權時效規定在刑法第80條以下以及其他部份)

法律時效都是從事件發生開始,也就是你具有請求權或是該當告訴權人資格起算,中間除非有法律事由不然絕不中斷。

你保留個屁啊!

除了少數法律特別規定可能因為你自己的行為而致使喪失行使權利的法定原因之外,法律根本不管你有沒有聲明保留或是放棄!
也就是說,本來就沒有的權利不會因為你在那邊哇啦哇啦白目說自己保留,就會有;本來有的也不會特別因為你哇啦哇啦耍白目而消失。

自己要立法的人,連這都不懂,實在不知道在幹嘛?

結果長久下來就是對人民最錯誤的示範!搞得大家都亂喊亂叫的,還自以為自己的行使神聖法律權利而沾沾自喜勒~

失敗的法學教育,造成人民對法律有錯誤的期待

我說明一下文章背景:
該研究生認為「假使殺人只是償命,對於苦難的受害家屬其實也未必是公平的,因為加諸傷害的陰影恐將永遠揮之不去,如果一個人的偏差行為讓整個社會受到那麼大的傷害,罪犯就這麼一死百了,讓大家付出如此龐大的成本其實是更不公平的。因此筆者認為我們應該要審慎考慮,將目前刑法所制定的死刑予以凍結執行,也就是讓這些死刑犯不只是受到一時的處罰刑,更要讓他們終身都受到「教育刑」。詳全文網址

以下是我的回應

回應「咱的社會‭ ‬殺人償命‭ ‬正義在其中」一文

關於7.13日陳同學一文,筆者身為法律系的學生,試著從法律的角度來作不同的解讀。

1.應報刑 vs. 行為成本

刑法與刑罰普遍認為最初來自於「應報刑」的觀念,也就是一命還一命、以眼還眼的傳統觀念。但是很快地如此的觀念就發現無法適用的地方:一方面如同陳同學所言,這樣的報復性處罰,其實對於受害人或是受害人家屬並沒有實質上經濟幫助;另一方面則是很多抽象的法益(例如公共危險罪、通敵罪…)無法透過這樣的觀念解釋。
如果換個方向從法律經濟分析的角度來看,我們可以認為刑法的存在某種程度上是大大地增加行為人的行為成本。雖然說許多犯罪行為本身不能算是經濟學上所謂的理性行為,但是導致這樣的行為的策略則是。透過國家刑罰權的介入,能大幅增加行為成本,使得一個原本想要殺人或是傷害的行為人,會因顧忌刑罰的後果而有所退卻。
所以說,如果我們以行為成本的角度來思考,毒蠻牛案法官能速判速決,在明案明斷的前提下其實已達到嚇阻往後可能想要起而效之的「隱身千面人」的效果。到這裡,刑法所要處理的已經完畢。

2.補償制度:

陳同學另外提到的補償受害人方式,筆者認為可能因為台灣普通法制教育長年來失調錯誤的結果。關於補償制度,我國民法的侵權行為部份就是法律上的補償制度。
毒蠻牛案中行為人對於當事人,絕對是該當民法的侵權行為要件,則依據侵權行為,這個刑事部份判決已確定的案子自然可以「附帶民事求償」的方式,來請求侵權行為損害賠償。也就是說,法律在受害人或受害人家屬補償方面並不是沒有相關規範。
當然民事強制執行結果可能執行不到東西,因為可能本案犯罪行為人名下無任何財產;但這部份本來應該就是法律力有未逮之處。筆者認為這種生活上隨時存在之風險(如誤食毒物、車禍喪命),尚須透過人壽保險、勞保…等保險制度來分擔風險。
若受害人家屬因本身經濟狀況沒有投保,則屬於社會福利制度的問題。
也就是說,筆者認為後面許多問題都不應是刑法或刑事處罰規範所該介入的。
3.最後再回頭檢視陳同學所提出的「由受刑人工作所得,透過受害人基金會補償受害人」。同樣地以法律經濟分析觀之:
筆者認為以受刑人在受刑狀態下所能創造的利益,應該是相當有限;但相對地,在這段期間社會所需要付出的成本(如:監獄、獄警、監督人員…)卻可能十分昂貴。 為了維持以受刑人薪資來彌補受害人的制度和所付出之社會成本,兩相衡量下筆者認為應該是不符合憲法的比例原則。
所以如果想要推動這樣的制度,就算我國的立法院願意如此立法,在適用憲法上依然問題重重。因為在已經存在上述補償制度下,另設這樣極端的手段其實某種程度上將犧牲「非受害人」的利益。法律制度設計不應該僅僅出於情緒性的憐憫,還尚須更多理性辯證。

結論:筆者以法律角度來看,想強調不同的問題需要透過不同的法律制度來解決。而不能以法律的最後防線—刑法來一併處理;同時,法律在很多時候已經存在配套措施,但是因為我國法學教育之不足,一般大眾並不知道一個刑事案件背後同時也有民法與其他法律之適用,保險、社會福利制度也能在法律力有未逮之處適時伸出援手。
至於社會正義….這種過於抽象的法律概念,連許多法律學者都還「說不清、講不明」,所以不如讓它存在於風中就好。

【翻譯】為何選擇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 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” 會去偵測有無任何關於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…等等。