November 27, 2006
「深入淺出 Hello World」演講 Sample 檔案上線 (2)
昨天提到 [
「深入淺出 Hello World Part I/II (台北場次)」簡報上線],今天補上 sample file 下載資訊:
只要有空檔,我會試著把一些跟 "Hacking HelloWorld" 有關的範例程式放入 Subversion,可參考之前的 blog [
符合 ELF32/i386 格式的最小 "Hello World"],這樣就不需頻繁下載 sample file。
由 jserv 發表於
01:45 AM
|
迴響 (0)
November 26, 2006
「深入淺出 Hello World Part I/II (台北場次)」簡報上線
週六去台灣科技大學作 [
深入淺出 Hello World Part II (台北場次)] 的演講,騎了九十幾分鐘的腳踏車終於抵達,雖然這是相當冷門的題目,不過還是有一些朋友參與,也感謝工作人員全程配合。早上是作 Part I 的複習,而下午才是 Part II,簡報檔開放下載:
「深入淺出 Hello World」系列的 slides 命名方式調整為 "HackingHelloWorld-PartN-YYYMMDD,連同 Part I 也會在維護的範圍內。Part II 終於把 syscall 的「探索歷程」帶過,有了基礎的概念後,才能銜接 Part III 以 User-Mode-Linux 分析 "Hello World" 程式運作於 Linux 系統上,種種巨觀與微觀的變化。如此一來,也才能深刻感受到 user-space 與 kernel-space 的互動,以及 Linux 背後的層層布幕,這是我最近回想近十年前拜讀 jjhou 的譯作《
Windows 95 系統程式設計大奧秘》,所萌生的想法:
許多充斥於開放資源的 Linux programming 文件常只敘及概念或技術細節,往往以照單全收卻沒有充分消化的結局作收。我們何嘗不能以「實驗」的心態去思考 "Hello World" 這種小規模應用程式在執行時期的微妙變化,此時再佐以網路上豐富的資料,不是更能享受醍醐灌頂的美妙嗎?
接下來的 Part III 與 IV 就踏入「實戰」的階段,也會有更深入的 Hacking :-)
由 jserv 發表於
01:31 AM
|
迴響 (2)
November 24, 2006
LxDE 羽量級桌面下載 (2)
之前的 blog [
LxDE 羽量級桌面下載] 提過 PCMan 所作的 [
LxDE - Lightweight X Desktop Environment] LiveCD,有許多朋友反映 cdrom image 過於龐大,稍後 [
penk] 做了新的版本 [
PUD GNU/Linux LXDE Edition],有了明顯的改善。
這個容量不到 300 Mb 的 LiveCD 中,算是「麻雀雖小,五臟俱全」,應可滿足基本的桌面系統應用需求。
由 jserv 發表於
06:23 PM
|
迴響 (0)
演講更新:深入淺出 Hello World Part II (台北場次)
之前的 blog [
演講:深入淺出 Hello World Part II (台北場次)] 提過我將在明日 (Nov 25) 於台科大作心得分享,而這幾日準備時,參考了之前的 feedback,我決定 Part II 還是將重點放在釐清 Part I 所提出的技術細節上,也因此,原訂的提綱做了調整,稍早在 StudyArea 的論壇 [
十一月份的SA@Taipei特別邀請到講師jserv來為各位介紹「深入淺出 Hello World」Part II] 提到:
先跟各位朋友說聲抱歉。
基於時間上的安排,我希望 system call 的細節能多提一些,如此一來才能作更深入的 hacking。
- "Hello World" on User-Mode-Linux + gdb
- 透過 x86/ARM emulator 作系統分析
所以呢,以上兩個項目將不在週六的探討範圍之內,而是挪到 Part III 中,造成您的困擾,請多見諒。
儘管我已經將議程所需的 User-Mode-Linux 與 QEMU 改好,甚至撰寫了一個小型的 Debugger,不過我認為可能會對與會者造成困擾,與銜接上的重大技術鴻溝,所以,這兩個子項目被調整到 Part III。
當然,就如之前的承諾,「深入淺出 Hello World」的議程在 x86 平台上都是免費而開放的,有興趣的朋友都可前來指教,不克前來者,也可參考錄影與簡報檔案。至於前一天才宣佈更改議程,實在是本人疏失,還請多包涵。另外,請在 StudyArea 張貼您對本議程的任何疑問或建議,謝謝!
由 jserv 發表於
05:47 PM
|
迴響 (2)
November 22, 2006
Qemu patches (1)
之前的 blog [
quilt - 強大的 patch 管理工具] 提到我最近花了些時間修改 [
QEMU],這裡先放出一些 patches,並作為 quilt 的示範。
首先,這些修改放在 [
qemu::patches],注意到該目錄下有個名為 "series" 的檔案,此為 patches 被 applied 的順序。目前的列表如下: (隨時可能更動,僅供參考)
- configure.patch
- qemu-sdl-cursor.patch
- arm_nptl.patch (NPTL for target-arm)
- pl110_rgb-r0.patch
- compiler.patch
- qemu-usb-wacom.patch (Wacom Tablet device)
- qemu-usb-wacom-pressure.patch
- qemu-usb-wacom-buttons.patch
- nodoc.patch
- qemu-x-no-sdl.patch (X11 output)
- qemu-arm-pxa255.patch (Intel Xscale/PXA255 emulation)
- qemu-hw-pxa255-peripherals.patch (PXA255 peripherals)
- smc91c111-softirq.patch
- qemu-hw-pflash-cfi.patch (CFI parallel flash with Intel command set)
- qemu-machine-gumstix.patch (PXA255-based Gumstix machine)
這些 patches 是提供給 qemu-0.8.2+cvs20061121,checkout 後,將上述 patches/ 目錄置放於 qemu root 後,執行:
quilt setup patches/series
接著我們就可以將上述 patch 逐一 push & applied,操作如下:
quilt push patches/configure.patch
quilt push patches/qemu-sdl-cursor.patch
...
當然也有對應的反向操作,也就是 pop,在上述動作執行後,執行:
quilt pop
即可返回上次更動狀態,若要查詢目前已被 applied 的 patch,可執行:
quilt top
當然我們也可以對這些 patch 作修改。如果現在 "quilt top" 顯示 "qemu-arm-pxa255.patch",而我們想以此為基礎,對 cp14 (system processor) instruction 作修改,那麼可以執行:
quilt edit target-arm/translate.c
這會呼叫 vi 或者 $EDITOR 所定義的文書編輯器來修改 target-arm/translate.c 的內容,注意到這個時候,會一併建立副本,以便後續作 diff 所用。當我們的修改完畢後,確定要更新該 patch 時,可執行:
quilt refresh
這樣一來,patches/qemu-arm-pxa255.patch 的內容也因此會更新,詳情可參考 quilt 文件,這對維護大量的 patch 非常方便。
感謝德國的朋友 Thorsten Zitterell 提供許多建議,現在已經展開 Intel/Marwell PXA27x emulation for Qemu 的開發工作,而我也規劃 emulated machine 也會以 Intel Mainstone DevKit 為基礎。在今年年初,我展開 PXAemu 的個人計畫,目前已經略有成果,[
QEMU] 的架構設計非常優越,效能更讓人激賞,希望在一面研究 Qemu 的 "portable JIT" 同時,我也能慢慢移轉 emulation 過去。
由 jserv 發表於
01:12 PM
|
迴響 (1)
November 19, 2006
探索 Linux bootloader 的佳作
探索 Linux bootloader 的目的才不是為了多重開機或讓自己陷於一堆無趣的指令操作,重點在於:
- 理解 bootloader 的行為模式
- 思考 Linux boot process
- 創作或移植 bootloader
- 以 bootloader 為基礎,創造更大的價值
最後一項看似唐突,事實上在專案開發或研究上,是我們必須面對的議題。以手持式裝置來說,"anti-hacking" 成為相當重要的考量,但採用開放系統又是必經之路,該如何立足於較有利之處呢?自 2003 年起,許多 bootloader 逐漸應用密碼學的範疇技術,整個 kernel image 乃至 partition 都是經過特定加密處理,如何在兼顧實用性與安全性,bootloader 就被賦予重大的使命。又,像 [
SoG] 學長以知名的 bootloader [
U-boot] 為基礎,發展了一套 RTOS,就是創造了新價值,特別在 time-critical 的系統,更能彰顯。
之前的 blog [
Micromonitor 簡介] 提過服務於 Lucent 的 [
Ed Sutter] 詳盡介紹 Firmware 相關技術與指導如何使用並移植 MicroMonitor 的大作,不過如果要更深入探索,一定要拜讀 Christopher Hallinan 的大作《Embedded Linux Primer》裡面的第七章〈Bootloaders〉。Christopher Hallinan 大名鼎鼎,我想也不需多加介紹,MontaVista software 有太多創作是出自此大師之手,同時,也感謝 Christopher Hallinan 願意將〈Chapter 7: Bootloaders〉開放下載,請參考以下資訊:
該章節包含五個子主題:
- bootloader 扮演的角色
- bootloader 設計上的挑戰
- 通用性 bootloader 實做: Das U-Boot
- 移植 U-Boot
- 其他 bootloader
這讓我想到面試新人時,常問及一個問題:
既然 bootloader 是 loader for booting,為何又要大費周章地把 Kernel 載入呢?為何不能直接寫入對應硬體的線性位址呢?
這個問題算是一種 pattern,因為還可套用在特定的硬體架構,比方說 ARM、MIPS,或者 PowerPC 等等,端看應試者的技術背景。x86 bootloader 是個特例,而 Linux bootloader 也可說是一種典型設計下的產物,事實上能發揮的空間很大,比方說 "no-kernel design" 或 exokernel 思維下,bootloader 的身份就有極大的轉變,bootloader 與 kernel 共存是可能的,而且也是相當務實的考量 (想像 watchdog 一類的應用)。不過,這個問題的答案到底是什麼呢?最重要的當然是「適當」去初始化硬體裝置並給予「適當」的狀態,其中需要考量的重點就像是 Flash memory,光是其排列的方式就會引發許多細部的問題。
許多入門書籍總是以一系列的方塊圖,悄悄帶過 bootloader 的原理,好似 kernel 載入前那段「美好時光」中發生的變化、當試著以機械語文與電腦硬體對話時,只是哲學性地闡述海德格的名言:「語言乃存在之家園」,不,黑格爾告訴我們:「存在必合理」。Christopher Hallinan 一針見血指出 boot loader 設計上面臨的挑戰:
Even a simple "Hello World" program written in C requires significant hardware and software resources. The application developer does not need to know or care much about these details because the C runtime environment transparently provides this infrastructure. A bootloader developer has no such luxury. Every resource that a bootloader requires must be carefully initialized and allocated before it is used. One of the most visible examples of this is Dynamic Random Access Memory
(DRAM).
C Programming Language 設計的首要目標就是撰寫作業系統,但有意思的是,即使簡單的 C 程式如 "Hello World" 者,都涉及許多軟體與硬體的交互作用 (微觀角度),對於程式開發者而言,RAM 顧名思義就是「隨機存取」的「記憶體」(按:此說法有爭議,事實上,多數的記憶裝置的確在某些程度上都算「隨機」性「存取」,不過這裡不細究),想當然爾可用 C 語言最美妙與強大的 pointer 進行操作,而這也涉及 C Runtime stack 的微妙變化,不過,這些對 bootloader 來說,都是艱鉅的挑戰,因為 bootloader 得挑起初始化與基本配置的責任,更明確來說,開機初期根本沒有 stack 的概念與具體呈現。
問題才要開始,"7.2.3 Image Complexity" 指出許多經典的議題,C compiler & linker 怎麼去安排機械碼與目的輸出,一般而言,程式設計師不需要太花時間思索,不過對 bootloader 的設計可全然不是這麼一回事。這夢魘的開端就是 C runtime stack,於是作者指出:
The bootloader must create this execution context before any C functions are called. When the bootloader is compiled and linked, the developer must exercise complete control over how the image is constructed and linked. This is especially true if the bootloader is to relocate itself from Flash to RAM. The compiler and linker must be passed a handful of parameters defining the characteristics and layout of the final executable image. Two primary characteristics conspire to add complexity
to the final binary executable image.
所以 "execution context" 的建立成為如此以 C 語言為主體的作業系統或環境之首要任務 (對許多系統是如此,不過像是 Forth 一類的系統則巧妙的以自身的 stack 處理)。再者,自 Flash memory 到 RAM 作重新定址的動作相當重要,如此低階的動作與 image layout 息息相關。所以說,困難處就在於需要建立一套與處理器啟動程序相容的 startup code,而且開頭要符合硬體架構規範之位址,書中提到一個典型的個案:
For example, the AMCC PowerPC 405GP processor seeks its first machine instructions from a hard-coded address of 0xFFFF_FFFC. Other processors use similar methods with different details. Some processors are configurable at power-on to seek code from one of several predefined locations, depending on hardware configuration signals.
為了明確處理這個問題,作者引導我們接觸眾多 ld (Linker) script,接下來繼續探討 "execution context" 的細節。思考之前提到 "Hello World" 的例子,我們面臨的挑戰如作者指出:
Indeed, most processors have no DRAM available at startup for temporary storage of variables or, worse, for a stack that is required to use C program calling conventions. If you were forced to write a "Hello World" program with no DRAM
and, therefore, no stack, it would be quite different from the traditional "Hello World" example.
以剛剛提到 PowerPC 405GP 硬體來說,實際的狀況就是:
This limitation places significant challenges on the initial body of code designed to initialize the hardware. As a result, one of the first tasks the bootloader performs on startup is to configure enough of the hardware to enable at least some minimal amount of RAM. Some processors designed for embedded use have small amounts
of on-chip static RAM available. This is the case with the PPC 405GP we've been discussing. When RAM is available, a stack can be allocated using part of that RAM, and a proper context can be constructed to run higher-level languages such
as C. This allows the rest of the processor and platform initialization to be written in something other than assembly language.
我們可發現,在 PowerPC 硬體架構來說,我們發現 bootloader 竟然須顧及如此低階的行為,才得以讓後續的作業環境得以維護 "execution context"。然而,組合語言並非萬靈丹,如何兼顧快速開發與多種平台支援,又是新的挑戰,為此,[
Das U-boot] 於是生焉。不過這裡就不作導讀,因為 Christopher Hallinan 所作深入的探討實在太精彩,不容我等愚人置喙,總之,那是篇值得反覆拜讀與思索的佳文,唯一的缺點就是 PowerPC 對不少開發者 (包含小弟我) 是不熟悉的硬體架構,所以組合語言列表比較沒有感覺。
另外,大陸網友詹榮開三年前在 IBM developerWorks 發表了一篇文章 [
嵌入式系統 Boot Loader 技術內幕] 也很值得一看,建議可搭配以上兩篇文章閱讀,其中有許多圖文恰好可互補,又其中一者談 [
blob] ,另一者談 [
U-boot],真是恰到好處。有了上述的基礎後,再回頭研讀 ARM-Linux hacker - Vincent Sanders - 的經典作品 [
Booting ARM Linux],就可得心應手。
由 jserv 發表於
02:12 AM
|
迴響 (1)
November 18, 2006
讓地球多活一秒:從自己做起
上個月收到 pptpb 的來信:
jserv 前輩您好:
我是個交大的學生,固定時間會看看您板上的文章。
這幾天寫了一篇文章,借您板上的那篇「讓地球多活一秒:從自己做起」文章標題一用,也取其中的幾個觀點,來跟更多人分享這樣的觀念,不知您是否能夠答應呢?
我隨後附上這篇文章,有任何建議或指教麻煩您告訴我一聲,謝謝! :)
非常高興有像 [
pptpb] 這樣的朋友來信,當然爽快答應,詳情可參考 [
pptpb 的文章],如果沒記錯的話,pptpb 提到的報導文章,似乎出自 2005 年某一期的《
科學人雜誌》,不過手頭沒有資料可確認。
之前 blog [
寧靜的春天] 與 [
萬古千秋不斷情] 所提及的概念都很簡單,要落實也可「知難行易」,人類文化與環境的毀滅是必然的,但我們的確可在有生之年,延緩這些變化,雖然這是不可逆的物理化學反應,但我們仍可坦然面對大自然,環境保護不是專家的研究主題,而是每個在寰宇中生存的朋友都能做到的,哪怕是簡單的垃圾分類,都會有其價值,EcoGarden 一篇發人深省的文章 [
一些有關台灣的統計],透過許多數據,點醒「台灣人除了不要妄自菲薄,小看台灣的影響力之外,也能夠不忘參與國際事務,善盡台灣人身為世界公民的一份責任。」,當然與我們息息相關的環保,更是其中重要的項目。所以:
共勉之!
由 jserv 發表於
12:11 PM
|
迴響 (1)
November 17, 2006
quilt - 強大的 patch 管理工具
[
quilt] 最早是 Linux 知名 hacker - Andrew Morton - 為了維護大量的 patch,而撰寫一系列協助管理的 script,後來經過許多開發者的潤飾,成為 Linux Kernel tree 相當重要的維護工具。
今天繼續修改 [
QEMU],參照了許多 patch 並試著作 ARM/Xscale emulation 的改進,patch 的空間已經超過 495 kb (惡夢!),原本的維護作法是透過 svn 的 import 功能,並使用 svk,但因為某種無法理解的現象 (一方面也是我耍笨),總之,現在只能透過 patchset 的方式管理。[
quilt] 這時候就相當好用,在終端機執行 "quilt" 即可印列功能項目,基本上就是 new --> edit / add / remove --> refresh 與 push / pop 的組合,有兩篇很好的參考資料:
另外,搜尋資料也有技巧,因為 "quilt patch" 的搜尋結果總是會令人迷失,最好追加 "linux" 或者 "apply" 一類的關鍵字。
由 jserv 發表於
03:11 AM
|
迴響 (0)
November 15, 2006
hqscaler - 高品質 RGB 圖片放大
因為工作需要,花了一些時間研究 RGB 圖片縮放。演算法與實做資訊相當多,但是要找到理想且適合應用需求者,就少之又少,[
hq2x] 與其同系列的軟體相當不錯,也被許多電玩模擬器所採用,不過,其使用許多 MASM inline assembly 撰寫,我採用 ANSI C 去改寫並調整實做方式,並整合 [
hq3x] 與 [
hq4x],做了新套件 [
hqscaler-1.0],授權方式為 GNU GPL。
hqscaler 能作 2x、3x,以及 4x 的圖片放大,以下就對 [
ImageMagick] 、[
scale2x] 作比較:
- 原圖:

- ImageMagick (x4)

- scale2x (x4)

- hqscaler (x4)

hqscaler 呈現的效果很棒,但是計算複雜度實在有點高,目前 version 1.0 是 ANSI C 的版本,或許稍後我再把 MMX optimizations 補上去,至於範例程式可參考 main.cpp,修改其中 hq4x 為 hq2x 或 hq3x 即可改變放大比例。
由 jserv 發表於
04:32 PM
|
迴響 (10)
November 09, 2006
不切實際的自憐
俄國大文豪托爾斯泰嘗言:「人人都想改變世界,卻沒有人想到改變自己。」
對於以哲學家為志業的我來說,無疑是迎頭棒喝,對照馬克思的名言:「哲學家在用不同的方式去解釋世界,而問題是如何改變世界。」。這幾年,我投入青春在不同領域的「大融通」,為了奠定足夠的基礎,群論、數論、經濟學、社會主義、組織理論、社會學、電腦科學、... 等等不斷在腦際交錯,只是要驗證小時候提出的看法:
「能否以計算機科學對整個人類社會作理性的分析與重整?」
大學二年級時拜讀 Edward O. Wilson 的大作《
Consilience ─ 知識大融通》,深刻感受到雖然寰宇知識浩瀚無邊,卻有脈絡可循,而,科學與人文之間,並不存在無法跨越的鴻溝,我們所需的,是更高層次的智慧與更謙卑地去體察箇中原理。耗盡寶貴的天然資源、對環境造成不可逆的巨大衝擊後,該如何延續人類文明?到頭來,人類為何存在?在 Edward O. Wilson 對社會科學獨具洞見下,自然科學與社會科學的「融合」,才得以跳脫既有的窠臼,也因此,人類才能邁出新的步伐。而科學和藝術、宗教、倫理與人性間,也進行極為巧妙的交互作用,也因此,人類心靈也得以多采多姿且深入,這本凝煉畢生才學的巨作,著實讓我感動許久。
駑鈍如我者,必須以更大的精力去「融通」相關的知識領域,我想,或許這是我存在的使命:為何願意去思考上述看似荒唐的議題,並對哲學、數學、社會主義、與電腦科學有著濃厚興趣呢?不過,事實上,為了實踐這個瘋狂的「使命」,我的確日趨瘋狂,為此,我度過多次精神與軀體的崩潰,這命題的難度早已超過單一個體能負荷的範疇。讀著尼采的《查拉圖斯特拉如是說》,感受著尼采所面臨曠世的孤寂,也想起晚年的尼采成為無法與人溝通的精神病患,白日躺臥於沙發,午夜時分,尼采卻在房中歇斯底里的嘶吼與怒罵,無法釐清現在的我,處境是否與當年的尼采相似,但目前的生活充滿咆嘯與隨後而生的無力感。
夜間經過松山機場邊陲時,仰望繁星點點,不得不對自身的渺小,進行反省:「我設下一個數百年無法驗證的假設,卻以搖搖欲墜的孱弱生命體去解決」,這的確是人類史上的笑話,欣慰的是,我拋開了名利,這些根本不屬於我,面對理想,憑恃著「
人的一生可能燃燒也可能腐朽,我不能腐朽,我願意燃燒起來!」的信念,瘋狂的作、貪婪地活下去。
必須誠實地說,實踐與驗證的過程加速衰老,此際,年邁的我早已闕失昔日的熱情,現實與理想的平衡也出現難以扭轉的劣勢,又能如何呢?信手拈來紀錄「
在瓶中生活」與「
生活就像洋蔥」,褪下虛偽面具的我,面對著電腦,在寂靜的夜空,才敢於面對自己:胸口刺痛難忍、精神狀況每下愈況、為著虛無飄渺的狂妄想法而苟延殘喘,然,歷經這些苦楚的同時,憶及杜斯妥也夫斯基曾說:「我最害怕的一件事,就是我所受的痛苦分文不值」,這是何苦呢?為此,我有一套說詞,但已不願再辯,只希望能不計成敗、瘋狂的進行,再度引用杜斯妥也夫斯基的話說明之:
「每個人都有些回憶是他不會告訴任何人的,除了告訴他的朋友。還有其他的事,是連朋友也不會講的,他只會對自己說,秘密地說。然而,一個人還有一些事,是他連自己也不敢講的,每個正派的人都有相當數量的這種事,深藏在某處。對於有關自己的事,人必定要撒謊。」
於是,先打住此等無謂的自憐,體力透支且身心尚未平復,竟淪落於此,可悲!
群 於台北瑞光路
Nov 9, 2006 凌晨
由 jserv 發表於
02:11 AM
|
迴響 (10)
November 08, 2006
LxDE 羽量級桌面下載
[
LxDE - Lightweight X Desktop Environment] 就是之前 blog 提到 [
「羽量級桌面」議程] 的概念專案,PCMan 昨天弄好一份可透過 [
qemu] 進行模擬的 disk image,詳情可參考 [
裝好 LXDE 桌面環境的 debian, QEMU image 提供下載試玩]。我在台大放了 [
一份 mirror],執行畫面如下: (click to enlarge)

大部分的 source code 都放在 [
LxDE - Lightweight X Desktop Environment] 位於 SourceForge 的 svn,請自行取用,謝謝!
由 jserv 發表於
03:02 AM
|
迴響 (3)
November 06, 2006
避免寫出釀造災難的 C/C++ 程式
Embedded.com 刊載 Jack Ganssle 的文章 [
MISRA minimizes mishaps],淺顯易懂但又讓人不得不重視 C/C++ 程式設計的細節。文章以 [
International Obfuscated C Code Contest] 2004 年得獎者的「傑作」作為「難以維護的程式碼」範例,因為文章排版不甚清楚,這裡重新引用如下:[
出處]
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define _ ;double
#define void x,x
#define case(break,default) break[O]:default[O]:
#define switch(bool) ;for(;x<bool;
#define do(if,else) inIine(else)>int##if?
#define true (--void++)
#define false (++void--)
char*O=" <60>!?\\\n"_ doubIe[010]_ int0,int1 _ Iong=0 _ inIine(int eIse){int
O1O=!O _ l=!O;for(;O1O<010;++O1O)l+=(O1O[doubIe]*pow(eIse,O1O));return l;}int
main(int booI,char*eIse[]){int I=1,x=-*O;if(eIse){for(;I<010+1;I++)I[doubIe-1]
=booI>I?atof(I[eIse]):!O switch(*O)x++)abs(inIine(x))>Iong&&(Iong=abs(inIine(x
)));int1=Iong;main(-*O>>1,0);}else{if(booI<*O>>1){int0=int1;int1=int0-2*Iong/0
[O]switch(5[O]))putchar(x-*O?(int0>=inIine(x)&&do(1,x)do(0,true)do(0,false)
case(2,1)do(1,true)do(0,false)6[O]case(-3,6)do(0,false)6[O]-3[O]:do(1,false)
case(5,4)x?booI?0:6[O]:7[O])+*O:8[O]),x++;main(++booI,0);}}}
果然讓人深感挫折,無法理解這其實是個多項式描繪製圖程式,拜讀的同時,不禁脫口而出「此曲只應天上有,人間哪得幾回聞」,凡人如我者,還是安分寫「老嫗皆解」的程式吧。
話是這麼說,不過即便「老嫗皆解」,還是可能錯誤百出。[
MISRA - the Motor Industry Software Reliability Association] 針對產業界軟體可靠性與穩定度,提出一系列的方針與準則,而針對 C Programming Language 的部份則稱為 "MISRA-C"。[
MISRA minimizes mishaps] 以 "MISRA-C" 的規範為基礎,標示以下五個原則:
- C is incompletely specified. How does process(j++, j); behave? And exactly what is the size of an int? How astounding that such a basic component of any program is undefined!
- Developers make mistakes, and the language does little to point out many of the even obvious screwups. It's so easy to mix up "=" and "==."
- Programmers don't always have a deep knowledge of the language and so make incorrect assumptions. Compilers have bugs, or purposely deviate from the ANSI standard. Most 8051 compilers, for instance, have run-time packages that take and return single precision results for trig functions instead of the prescribed doubles.
- C offers little intrinsic support for detecting run-time errors.
當然,上述的議題不全然只是「原則」,也可用以解釋為何我們所用的軟體充滿陷阱、安全性漏洞,或者致命的地雷。MISRA-C 羅列若干項概念性的條款,建議程式設計者應該留意,不過有些概念則有待商榷或釐清,比方說:
* Rule 20.4: Dynamic heap memory allocation shall not be used.
啊?那我們該如何表示一些常見的資料結構或演算法呢?Jack Ganssle 做了補充:
This rule also specifically outlaws the use of library functions that dynamically allocate memory. Admittedly, malloc() and its buddies can wreak havoc on deterministic systems that never get cleaned up via a reboot. But it's a whole lot of work to recode libraries that employ these common functions if you even know how the library routines work. What fun we might have stripping all of the malloc()s and free()s from embedded Linux! That would be a jobs-creation program for programmers. Let's see if we can get it stashed in amongst the other 15,000 items of pork Congress awards to their supporters each year.
避免釀造巨大的災難,最好的方法就是防範於未然。
由 jserv 發表於
08:53 PM
|
迴響 (1)
程式語言的啟發性與科學史
每次閱讀 Embedded.com 眾多見解精闢的文章,都會有新的感受。早上拜讀 Jack W. Crenshaw 撰文 [
Motivationally speaking],Jack W. Crenshaw 博士的技術背景主要是計算動力學領域,所以本文也以相關工程應用為主。副標題是 "A vector means many things to many people. Pilot, mathematician, physicist: all of their definitions can help you do your job",這讓我想到 Thomas Kuhn 的《科學革命的結構》,大量將「典範」(paradigm) 與「革命」等概念套用於科學史中,不僅侷限於科學史,事實上,「典範」的提出,幾乎滿足所有領域的需要。
所謂「典範」,是指一具有內部統一性與穩定性的解釋模式,當一個周密整合的典範某一部份發生了問題,一定導致整個典範的動搖,產生一個新的典範來取代舊的。Jack W. Crenshaw 這篇文章也讓我感到程式語言變遷的歷程中,「典範」概念的落實。C/C++ 無疑是當今使用最廣、跨越多種領域的通用程式語言,但 C 語言的初衷是設計作業系統 (很可惜,許多教材並未強調此點),其思考模式極難涵蓋於工程數學運算,稍後在 C++ 提出修正,大幅以 template 與 operator overriding 作為補強,也因此,許多通行的代數與數學 class library 也得兼顧效能、平台相容性,以及思維模式對應的便利性,然而,正如文章提到:
Physicists saw things differently. They recognized the three-dimensional universe thing, and used vectors to describe real, physical quantities like position, velocity, momentum, etc. They used the algebra of the mathematicians, alright, but they only used the parts that related to the real world. And, as you'll see in a moment, they defined some new operations that the mathematicians hadn't thought of. To these physicists, vectors weren't merely a pleasant intellectual exercise. They were useful because they made our computations easier. Their interest in vectors increased tremendously with the discovery of electric and magnetic fields. It's hard to even imagine Maxwell's equations without vectors.
電子學經典的 Maxwell 方程式若以 C/C++ 表示,絕對相當彆扭且難懂,遑論缺乏 native 3D primitives 的 C/C++ 語言該如何表示空間與時間的轉換,此類「典範」的轉變,可說是當今工程技術的挑戰,這印證了 Thomas Kuhn 的核心觀點:科學發展不是一種直線累積的進步,而是一種革命性的結構轉變。
無論如何,在編譯器技術、SIMD/DSP,與 NUMA 等等技術大幅提昇的今日,已經有很大的改觀,要描述一個分子動力系統,可透過許多 modeling 途徑,最終也可轉換成高效能的計算模式,不啻是結構轉變的例證。
由 jserv 發表於
01:26 PM
|
迴響 (1)
November 04, 2006
在瓶中生活

過去在 [
搜尋 "jserv"] 提及 Purple 一席令我感嘆許久的話,不過我沒有交代為何「被隔在玻璃瓶裡」會讓我百感交織。週一將受撞擊而無法開機的筆記型電腦送修,利用返回辦公室的空檔,徒步至台北 101 大樓的 PageOne 書店,瞥見馬森教授的小說作品《
生活在瓶中》,光是第一句話就深深打動我:
鮮少讀小說的我,深受筆下對時空交錯的存在懷疑、意識流手法、文化衝突,與對生命的省思等精細地刻劃方式所牽引,特別是那些尖銳的文字:
「但我呢?我追求的是什麼?是自由?這自由漸漸地要發霉了。是藝術?這藝術似乎不過是個無底的深淵,只偶然飄舞著幾點燐火而已。於是那種無望的感覺又來了,於是那些擺脫不掉的壓力又來了。我羨慕一個工人,用自己的雙手創造自己的世界;我羨慕一個農夫,用自己的血汗創造自己的生活。而我呢?我憑了什麼來創造我的藝術?我的腦子是空的,因為我看不到廣闊的天地,只像一隻關在籠裡的老鼠無望地掙扎。我的靈魂是貧血的,因為我脫離了那個孕育我的群體,像一片枯了的落葉。我想獨立來創造,可是我所遭遇到的只有羞辱。」
讀到這,雙手不由自主發抖著,將軟體設計與系統整合當作藝術的我,完全能體驗那股無望。帶著傷悲的淚水打轉,為何而泣?我不是士大夫,用不著為家國社稷而憂,更非君子,需潔身自愛、不使自己沾染惡息,那又是為何?經過這幾年的訓練,我的社會化程度似乎接近常人,事實上,心情仍是很低落,但招牌笑容卻矯情地掛在嘴角,到處寒暄。撰寫設計文件時,內心忐忑不安,這些架構真的如此美好,而我述及的技術議題,又真的有所突破嗎?
我不懂,迷惘。
結果,我還是採用正面且積極的用詞,我還是用微笑度過一天,只是不希望造成他人的困擾,實在虛偽,不要再演戲了,看清自己的角色,我不過是社會的蠹蟲!這就是所謂的「社會化」、「社會期許」嗎?較有把握的技術議題猶如此,實在難以想像非技術的惡耗會是如何?逐漸,不知該以何種心態面對我所在的世界,永遠受限於這狹隘的瓶中,對這個世界的理解是懸在空中、完全不踏實的,看似富饒的土地、乍看永不枯竭的環境資源,反而因缺乏新陳代謝,如今,我只得舔噬著縫隙中的死水與敗死的污漬,隻身軟綿綿的幻想著。刺痛心脊的文字繼續著:
人生最大的羞辱,莫過於出賣自己的理想。... 我自己知道這樣作畫,不是創造,而是在裝飾,像一個油漆匠遵了主人的命令,油漆一間沙龍,或是油漆一件木器。也許還不如一個油漆匠值得自豪。油漆匠是以工作來換取生活,我卻以工作來欺騙世人。」
我不知道,這樣下去,真的是我要的生活嗎?我不配而且也沒資格過優渥的生活,也厭倦自虐了。又做了深刻的夢,觸及家鄉的一切。自從我做了一個決定後,家父難過一整夜,之後除了勸我回學校唸書外,就鮮少與我對話,但他還是默默的用行動來關心我,一如往常。在夢境中,家父的身影與簡短而有所保留的措辭,就如幻燈片一般重複打著,然,夢醒時分往往伴隨高度的歉意。我希望能完成自己的計畫,也希望自己能夠成功,至少要對得起這個社會。
繼續在台北流浪。
身體很不舒服,同時意志也很不堅定,想到這裡,突然悲從心來。不過我已經不需要用酒精麻痺了,事實上,這些日子來,我沒有一天是清醒的,我只想忘記這一切,而我又想起資本論的論調,我,作為一個旦夕且死的商品,剩餘價值到底在哪呢?
小時候寫文章,總因濫用非尋常的典故而被貼上「無病呻吟」的標籤,不過後來發現,如今只在病困痛楚之際,才得以呻吟幾聲。
最近身體狀況不甚理想,持續數周胸口鬱悶,從台中返回台北住所後,病症加劇。某日上午醒來,鼻血暴噴,感覺全身虛脫,只覺噁心感常駐。被問診前的等待,彷彿瀕死時敲下生命的哀鐘的絕響,離開診療室,連把手都握不太住。在內湖住所休養時,聆聽《
Les Misérables》,體驗躋身於道德淪喪、秩序潰堤的洪澇,那種博死求生的心境,大文豪雨果筆下的主人翁 Jean Valjean 曾判重刑,假釋後原想重生做人,但遭逢種種困難... Claude-Michel Schönberg 和 Alain Boublil 以此小說為主軸,共同創作成音樂劇,以震撼人心的高水準演出,重新詮釋,讓我在這起伏之間,對生命的價值有更高層次的體悟。
那日下午,胸口陣痛,很不舒服,躺在沙發上思索。目前的我,再度陷入困境,不僅是生理狀況的低潮,更是苦於迷失自我,想到貝聿銘的名句:
「你永無法明確知道你已播種的東西何時可以收割;或許只有一次收成,或許可重複收成。
你也許遺忘曾播種了些什麼,一種經驗,一種感受,與某人的關係,抑或一種哲學及一項傳統。
然後,忽然間就開花了,被全然不同的環境所喚醒。這種盛開可以衝破藩籬及整個時代。」
初讀此句時,腦海中浮現的是近代物理的能階變化,而今,又有不同的感受。孱弱者如我,連轉手把都有問題,還癡想有什麼收成?雨果的《Les Misérables》一書,中文翻譯為《悲慘世界》,而我則偏好孩提時聽到的譯名「孤星淚」。人總是會犯下大錯,即使不是受法制仲裁,也會受寰宇中大自然的反撲,再怎樣一帆風順的人生,最終還是會面臨困頓,差別只在於程度上的問題。倘若人的奮鬥,如同佃農的生命歷程,生不帶來、死不帶去,原本即分配不均,如今又受來自罪孽、宿疾,及後天種種的錯誤所污染,作為佃農,可選擇改變土質與耕作型態後,繼續播種,也可能繼續受污染所約束,來日,生命走到盡頭時,過去的收成歷歷在目,我也希望此生得以作個人生的農夫,如馬森教授所說
「用自己的血汗創造自己的生活」那般。
低落的情緒、絕望的病情,與黯然的前程不止息地包圍原本就孱弱的軀體。試圖自救,卻往往走向反面,陷入更深的絕望,或許是此等絕境,讓我對存在主義產生了興趣。存在主義之父 Jean-Paul Sartr 有句名言這麼說:
「行動吧,在行動的過程中就形成了自身,人是自己行動的結果,此外什麼都不是。」
Jean-Paul Sartr 也對「自由」概念本身做了分析:
- l'en-soi,也就是自由的存在
- l'pour-soi,也就是自為的存在
物質的存在具有其物理化學意義,而人類呢?尼采藉著查拉圖斯特拉的口中說出「上帝已死」,不為來生、不為贖罪,更不為遁入約束的人們,如此得為自己的存在創造價值,這也是「存在先於本質」的意含。然,Jean-Paul Sartr 本人又表示,一生不過是一場遊戲,或過分講究,或品味低劣,但終究是場遊戲。最後,他認為無論什麼人物,在走向生命之旅的盡頭時,都最終只能證明一生的挫敗。就某個角度來說,人生的歷程是封閉循環,也就是「生、老、病、死」的循環,沒有人可以逃脫這個原則,除非是生而夭折或意外死亡等等。即便是封閉循環,人,作為一個生命體,還是繼續往人生大道走著,對人來說,前方充滿著未知數,但誠如杜斯妥也夫斯基指出:
「獲得生命的訣竅不僅僅是活著,而在於,為了什麼而活。」
掩抑著胸口的苦楚,或許在種種絕望中,存活的動機信念以及人生的行動力,是支撐我活到今日的最大力量。最後試著引 Hermann Hesse 經典著作《玻璃珠遊戲》的短詩作結:
優美如舞者的獨立前傾
我們的生活沉著而又從容
我們將當下和現前獻給
一種繞著清空而轉的舞踊
我們的夢境可愛而遊戲漂亮
音調和諧,又有美妙的模樣
但平靜的表面之下
卻燃燒著熱血、野性、以及黑夜的渴望
我們的生活旋轉無礙,我們的呼吸猶如空氣一般地自在,活得真愉快
但我們卻悄悄地渴望現實
結婚、生子、受苦、乃至嗚呼哀哉
瓶中生活的我,雖然無法感受外界的五彩繽紛、無法體察世外的冷暖,不過我有個堅定的信念,而且我真實的存在著。
群 於台北瑞光路
Nov 4, 2006
由 jserv 發表於
07:41 AM
|
迴響 (8)
僧侶與哲學家
借用 Jean-Francois Revel 與 Matthieu Ricard 父子檔經典著作《
僧侶與哲學家》書名作為標題,不過本篇內容則與該書無直接關聯。
馬克思曾在《德意志意識形態》表示:
「語言和意識具有同樣長久的歷史;語言具實踐性,既為別人存在並僅僅因此也為自我存在的現實的意識。語言也和意識一樣,只因為需要,由於和他人的交往的迫切需求才產生。」
以馬克思的觀點,意識和社會實踐最明顯的交點,便是語言本身。
當我們可以自由、不求報償,且不為任何物質需求而進行生產時,是我們最具人性,和其他動物最不相似的時候。對馬克思而言,自由是一種超出物質所需的創造性豐收,並超越任何尺度,從而為自己的尺度。對社會結構體發生的所有事物而言,一定的物質條件需先行被要求的,這是因為每個強加於自然之操作的意識 (馬克思將此視為人性的表徵),自身便是一種受制於物質狀況的存在物,頗具諷刺意味。但即便語言是因應需求而生、作為集體勞動的必然面,勢必不永久受制於此一必然性,文學現象正是一個明證。
語言不僅牽涉到「意識」,更涉及系統性反思如哲學者,如此一來,其大量受學者、專家,或者特有組織所掌控,這些都建立於他人的勞動利得之基礎,馬克思透過此概念解釋勞動關係:
「分工也以精神勞動和物質勞動的分工的形式在統治階級中間表現出來,因此在這個階級內部,一部分人是作為該階級的思想家出現的,他們是這一階級的積極的、有概括能力的玄想家,他們把編造這一階級關於自身的幻想當作主要的謀生之道,而另一些人對於這些思想和幻想則採取比較消極的態度,並且準備接受這基思想和幻想,因為在實際中他們是這個階級的積極成員,很少有時間來編造關於自身的幻想和思想。」
只有當一個社會取得超出物質所需的特定經濟剩餘,讓一小部份人免於生產勞動,而成為具有特權的全職政治家、學者或文化生產者等等,哲學才能在其最完美的意涵下綻放。正因思想的實際存在有其物質意義,所以現在的思想才得以開始幻想自己是獨立於物質本質之外。馬克思又提到:
「從精神勞動和體力勞動之別形成起,分工才真正成為現在這個樣子。(同時出現的是最初形式的意識形態家 -- 僧侶) 從這時候起,意識才能真實的這樣想像:它是具有某種和現存實踐的意識不同的東西;它不用想像某種真實之物,
就能真實的想像某物;從這時候起,意識才能擺脫世界而去構造『純粹的』理論 —— 神學、哲學、道德等等。」
這意味著高度分化、純粹且專注的哲學家或類似角色,其概念上可謂是現代的「僧侶」,作為歷史之必然性,這是徹底異於傳統最主要的、凌駕於個人之上的勞動力量,馬克思也指出「個人力量(關係)由於分工而轉化為物的力量這一現象,不能靠人們從頭腦裡拋開關於這一現象的一般觀念的辦法來消滅,而是衹能靠個人重新駕馭這些物的力量,靠消滅分工的辦法來消滅」,這也引來「共同體」與「階級」的思考。
由 jserv 發表於
04:23 AM
|
迴響 (0)
November 03, 2006
演講:深入淺出 Hello World Part II (台北場次)
延續之前 [
演講:深入淺出 Hello World -- 理解 Linux 上運作 Hello World 的種種機制],現在 Part II 也要登場了,引述酷!學園[
公告]:
「深入淺出 Hello World」Part II 延續今年七月份「深入淺出 Hello World」系列演講,並於11月25日移師於台科大舉辦。Part II 預定大綱如下:
- "Hello World" on User-Mode-Linux + gdb
- Linux memory model - VMA, LMA, MMU overview, etc.
- 深入 system call
- 透過 x86/ARM emulator 作系統分析
- Profiling 與 Realtime analysis
注意事項:
- 為銜接 Part II 議程,當天上午10:30 到12:00 時段對 Part I 作複習 (選擇性),以接續下午 14:00 到
17:00 的 Part II。中午中間的空檔開放面對面討論 (允許非直接相關主題)
- 「深入淺出 Hello World」系列演講共分三部份,今年七月份完成 Part I,將於十一月份完成 Part II,而 Part III 估計於明年二月份前結束
- 如同 Part I,此系列演講與心得分享,在 x86 平台上都是 free training,針對 ARM 或 MIPS 的 Embedded Linux 開發與教育訓練,請聯絡講師作進一步安排
講師: jserv
時間: 2006年11月25日(星期六) AM 10:30 ~ PM 5:00
地點: 台灣科技大學-第三教學大樓 T3-305 室;台北市基隆路4段43號.
費用: 0 -
報名網址:http://samc.study-area.org
地理位置/交通路線: http://140.118.32.35/affairs/general_web/lent_around.htm,
http://140.118.31.155/campus_guide/welcome.aspx
這次探討的主題會更深入些,會在 VM/Kernel 層面著墨,不同於許多訓練教材是「直接給魚吃」的作法,「深入淺出 Hello World」的重點則是「觀察」與「思考」,當然,在切入新的探索領域時,還是需要新的背景知識,演講中也會提及。歡迎指教,謝謝!
由 jserv 發表於
08:54 AM
|
迴響 (6)
November 02, 2006
Microsoft WinCE 6 的 100% shared source
Embedded 的環境下若缺 source code,很多事情很難作,Microsoft WinCE 將 source code 分為兩部份,一者是可任意修改的 Public 部份,另一者則是需要簽署 "Shared Source Code Agreement" 的 Private 部份,之前 checko 寫了一份簡短筆記 [
CE : about Shared Source Code ("PRIVATE" folder)] 可作參考。今天的 WindowsForDevices.com 新聞指出 [
Windows CE 6 arrives with 100% kernel source],看來做得更徹底,對開發者來說是項利多,有意思的是這段:
The opening up of Windows CE's kernel source code is likely to make Windows CE more attractive as an alternative to Linux in many embedded applications and devices that require substantial customization of the OS, or where source code availability has been mandated by the development team. Additionally, Microsoft touts the terms of its BSD-like shared source license as being preferred by many device and equipment manufacturers that don't want to be compelled to make their OS customizations public and available to their competitors.
不過現在 "Shared Source License" 並未被 OSI 所認可。
由 jserv 發表於
05:20 PM
|
迴響 (0)
資訊人的角度看
自由軟體法律問題:GPLv2 面臨的挑戰
之前的 blog [
Evil software:逃避 GNU GPL 的途徑] 與 [
邪惡的 Hello World] 提過所謂的 "Evil Programming",也附帶指出 OGCGF (Obfuscated GCC Code Generation Framework) 這個以編譯器技術為基礎的架構,事實上,這不只是腦力激盪,在過去一年研究 GCC 內部實做的過程中,我們已經有具體的實做品 (licensed under GNU GPL,但主要目的卻是要「打擊」GPL'd software),至少有兩個專案採用這樣的技術。
其實 OGCGF 個別的技術細節都不是新玩意,但針對 GPL 第二版許多模糊不清的語意與技術黑色地帶,予以「強化」與提出自動化途徑,卻可發揮很驚人的效果。今天早上去中研院一趟,為資訊所分享了「資訊人的角度看
自由軟體法律問題」[
PDF 簡報] 這個主題,雖然我算是很熟悉這個領域 (許多顧問案子磨練的結果),不過要解釋給非技術背景的聽眾,實在是很大的挑戰,今天也獲得一些迴響與建議。
為什麼我要組合一堆自由軟體來「作壞事」呢?首先,真正的壞事應該是扼殺軟體的價值與發展文化,而 OGCGF 的提出,是以行動證明 GPLv2 漏洞百出,顯然不符合多元化 IT 產業的需求與變革,最重要的,是我們如何從這些挑戰中,作更深入的思考,以及如何讓科技法律結合自由軟體發展。
由 jserv 發表於
04:45 PM
|
迴響 (0)
「羽量級桌面」議程
之前的 blog [
COSCup 2006] 提到 [
PCMan] 跟我分享的 [
羽量級桌面] 議程,因為當天電腦出了點問題,所以現在才提供簡報下載,請參考:
雖然不是第一次演講,但看到參與 [
COSCUP 2006] 的朋友,還是讓我有種感動,還是很多人對這個冷門的主題有興趣,前來聆聽我們闡述「不願面對的真相」,特別是看到一些朋友甚至在搶地板上的空位,非常感謝各位捧場。至於該議題提到的軟體專案,可到以下位址下載:
是時候了,砍掉重鍊,將合理的效能與空間使用率還給我們吧,請愛用「羽量級桌面」!
由 jserv 發表於
01:56 AM
|
迴響 (1)