發表文章

目前顯示的是 2月, 2008的文章

Multi-dimensional Logic Computing Model 多維邏輯運算模型的廣義構想

圖片
為了弄出一些空硬碟,我整理一些舊資料想燒出來,無意間發現過去的一些有趣想法〔笑〕。這是我高中時期的一個構想,原本是針對思考現今程式邏輯的不足,所提出的另一種邏輯原型。當時純粹只是為了解決線性邏輯的單方向性,所以僅僅在解決新模型的結構問題。過程以簡單的幾何方式來緒述初步架構,並未思考到實際的應用,當然也缺少許多實際的數學推導。但是由於長期接觸資料庫的應用和系統的規劃,後來在高三時的一些空閒時間,有嘗試運用和簡化該模型使用在資料庫處裡的系統上,雖有些初步成果,但也還不到實用階段。 簡單來說,對邏輯要就是 off(false) 不然就是 on(true),這是 0 與 1 的基本概念。但進一步的邏輯是線性的, 0 與 1 決定了兩條向前走的路,如果每碰到一個 0 與 1 的判斷算是一個 Node ,那每個 Node 連起來最終會形成一條直線,且這條直線上有一個 Node 會是我們要的答案,至於是哪一個呢?就是由程式設計師決定了。線性邏輯已經被全世界的數學家、哲學家、科學家和 Hacker 發揮到淋離盡緻,它的確可以稱為今日的科技之母,當然,Multi-dimensional Logic Computing Model 也是架構在這上面。 只不過線性邏輯總是無法處理意外(exception) 的狀況,解決兩個選擇以外的組合,需要靠更多的 Node 去解決。我們必需先用人腦判斷是否有意外發生,再去針對意外設計 Node 解決,這也是為什麼當今 Artificial Intelligence 遲遲無重大突破的原因。雖然出現很多模糊理論、基因演算法、神經網路理論,但也不過是想辦法將 exception 當成訓練因子,歸納收斂成一個運算的方向,再用固定形式去求出答案。 在這種狀況下,線性邏輯顯然不夠用。從幾何的角度切入,一直線可以有無盡的 Node;從數學方程式來看,若是等號兩邊相等,一條線最終的 Node 必等於第一個 Node。從此假設可以發現,邏輯線被繞成一個圈,但是在應用面來說,這個圈沒有答案、沒有意義。為了解決這問題,於是想到種方法,若使用兩條邏輯線,必會產生兩個互相交集的點,這也代表答案將可能出現在這兩個點上面〔也就是停住有解答〕。 現在假設邏輯線可能很多且不論是否有交集:若每條線相同長度,無窮的圓周線將有可能變成一個球體狀,但事實上不同的邏輯不可能同樣長,這造成了形狀

OS Kernel 相關閱讀與實作心得﹝一﹞

極慚愧的是,這次寒假的計劃並未完全如期完成,實作 OS Kernel 的計劃只進行到 IRQ 的部份。不過,自從最近拜讀《 即時多工核心程式設計 》之後,深深被其所影響,讓我想好好重新調整實作的步調並整理針對 OS Kernel 設計的心得。 這本大作將核心架構在 DOS 環境上,用 DOS 省去了讀者摸索低階的時間,並以 C++ 的邏輯表達和 Template 的優勢加上必要的 ASM coding 設計一個 pure 的即時多工核心。尤其以直接切入 Kernel 運作為主題的方式,讓讀者更能立即擁有享受 Hacking Kernel 的成就感。 一個多工 OS Kernel 應該具備的機制,大致如下: Task Context Switching/Scheduler IPC (Inter Process Communication) Semaphore 事實上, OS Kernel 基礎的結構本來就並不龐大、複雜,這與『 microkernel 』的定義指標極為相似。而且,只存在該有的 Task Handler 和各工作 Connection 的機制,也容易理解與設計。至於其它的 Hardware Manager 等功能,其實並不需要在第一時間就去規劃,依據需求再決定於 Kernel Mode 或 User Mode 之下實作就可以了。 【Task Context Switching/Scheduler】 除了 Context Switching 會無可避免的消耗 CPU 資源之外,在 Task 控制的規劃上,有著兩種模式,可視 OS 用途而定: Preemptive Non-preemptive Preemptive 即為強佔式〔強取式〕核心,在 Scheduler 被觸發時,優先權高的 Task 將會搶去優先權低的排隊位置,取得先執行的權力。此方式的系統回應快,對於 Realtime OS 是非常必要的技術。Linux 在 2.6 版後就加入了這項技術,以提升需要 Realtime 的多媒體效能。 Non-preemptive 則是無論如何,每個 Task 用完自己的時間後交出使用權利,照順序一個個 Task 執行,對於優先權高的 Task 來說也不能不遵守此規則,要等到自己的時間到來才可以執行,故可能造成 Task 無法即時回應使用者的需求。此種核心適合

經典著作《即時多工核心程式設計》

日前 Jserv 康慨借我一本經典著作《即時多工核心程式設計》,於是在寒假最後的空閒時間先快速看過了一遍。真不愧是 Jserv 大力推薦的好書,作者將多工核心的藍圖具體而詳盡的勾勒出來,短短數個章節已將重要細節交代非常清楚,由於該書的範例說明用 C++ 來撰寫表達,結構與觀念也都非常易懂,重複閱讀了幾遍也能品嘗出不同細節的奧妙之處。這本經典著作的模樣可以在 Jserv's blog 找到: http://blog.linux.org.tw/~jserv/archives/001258.html 該書於 1995 年出版,所附 Floppy 早就發霉爛掉了,不過有 Jserv 大神的筆記和筆跡,想必比那片張 Floppy 更值不少錢吧!〔笑〕 Jserv 說這本書在某些書店架上還可以看得到,有興趣的人可以去找找看。

GTK+ 馬戲團:邪惡的 g_signal_connect 出場

GTK+ 馬戲團有五花八門的精彩表演,而今天壓軸好戲就是『邪惡的野獸 - g_signal_connect 』。g_signal_connect 可以戰勝所有的 widget 和 window,有強而有力的爪子,能劃破層層阻礙;有尖銳嚇人的牙齒,只須咬一口便深可見骨。雖然它已被馴服,但隨時還是有機會獸性大發反撲過來。:P GTK+ Program 本身並不難,就算是第一次接觸的人,也能輕易上手並寫出什麼東西來。但對於較常接觸 GTK+ programing 的人,卻常會抱怨 GTK+ 的設計,層層的 window 和 widget 常搞到什麼事都要兜個大圈才能解決。而對 GTK+ 設計架構和細節了解不夠透徹的人,更是常常寫 5 分鐘 code ,卻要花 5 個小時 debug ,小弟我就是最好的例子 :( 所以,探討 GTK+ 的一些細節,有助於我們在撰寫 GTK+ 程式時避免問題的發生,減少 debug 的時間。 接觸過的人都曉得, GTK+ 的優點就是將各種東西都寫成一個個直接的 function call,任何人都可以很容易的去呼叫使用。但那些 function call 的背後常常各自為政互相打架,卡來卡去的結果不是『無限迴圈』就是『程式流程大亂』,我們如果不深入了解 GTK+ 的運作,這些問題將都會無解。 在 GTK+ 之中很多問題的發生,都是從邪惡的 g_signal_connect 開始。它是 GTK+ 各種物件的共通管道,programer 們可以利用它設定各種狀況的 handler,像是 widget 的 button-press-event, toggled ...etc。不過 g_signal_connect 所決定好的事,卻是有各種不同的觸發時機,有些會馬上就觸發如: toggled 事件,有些會在所有 event 處理完後,idle 時才觸發。若是沒有掌握好觸發的時機,一切的流程設計將會毀滅,而且找不到問題所在。 但是這些不同的時機,要深入了解 GTK+ Source 之後才會發現。對於一般 programer 來說,可沒這麼多時間一一深入了解每一個元件的運作,最好的解決辦法就是養成習慣,所有 widget 和 window 都設定好 Ready 之後,再呼叫 g_signal_connect 設定 event handler,這樣可以避

解決 Atheros AR5007EG driver 和 bus numbers 不正確的問題

買新的 Laptop 本該是快樂的,但為了讓新電腦能夠好好的跑 Linux ,卻讓我睡不好覺好幾天,一點快樂的心情都沒有! 在抗戰了整整一個星期,挖遍了 madwifi.org 每個角落,請 google 大神解答了無數個問題後,終於成功的使我新買 Laptop -『 Toshiba Satellite L40 PSL48T-00K00J 』的 Wireless 動起來了!宣告戰勝的心情真是難以言喻! :P 扣除掉 Wireless,這台機器對 Linux 的支援度非常好,所有 Device 都能很順利的跑起來。由於顯示晶片是 Intel 965 ,Compiz 3D Desktop 不必特別設定就能順利的運作,3D 特效的效能也相當令人滿意﹝不能跑3D桌面我就不買了﹞。最重要的是整台機器只需要 2 萬元不到,實在是非常划算,對於預算不高的我,可以不必花大錢就足以應付 coding 、 presentation 、 炫麗的視覺效果等需求,有一分錢都沒浪費的感覺。﹝有些電腦就不知道在貴什麼了,令人想不透!﹞ 因為目前的 Linux 並不支援這機器的 Wireless chipset -『 Atheros AR5007EG 』(與 EeePC 同系列的晶片),必須使用 Atheros 公司 patch 後的 madwifi driver 才能驅動 Wireless,這是比較麻煩的地方。﹝該 patch 並未 opensource 給 madwifi team,導致 madwifi team 不能接受此 patch,因此近期要看見 madwifi 正式支援 AR5007EG,恐怕是很困難的一件事﹞ 關於該 patch 的取得和其詳細討論可在這找到: http://madwifi.org/ ticket/1679 But, 別高興太早,如果是這麼簡單,我也不必奮戰一整個星期了。 如果你的 NB 在 patch driver 後就能使 AR5007EG chipset 正常啟動,非常恭喜你。但是,如果你跟我一樣是 『 Toshiba Satellite L40 PSL48T-00K00J 』這台機器,你應該會發現你的 wireless 還是不會動才對。:( 原本以為是驅動程式的問題,但經過多天的更換 madwifi driver 或使用 ndiswrapper 都無法搞定,

實作 Linux Kernel-space 的 UDP Server

今天在『 Linux Kernel Newbies 』閒逛,看近期 Kernel 的動態和變化,心中不時贊歎 Linux 發展的複雜和快速,每次去都令人驚奇。該網站上除了有 kernel 的最新資訊,也有一些相關的文件和教學手冊,而其中一篇文獻『 Simple UDP Server in Kernel-space 』簡單示範了 kernel thread 的使用以及 Module 的撰寫,相當值得推薦參考。 由於完整程式碼不長,在這裡摘錄: #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/kthread.h> #include <linux/errno.h> #include <linux/types.h> #include <linux/netdevice.h> #include <linux/ip.h> #include <linux/in.h> #include <linux/delay.h> #define DEFAULT_PORT 2325 #define CONNECT_PORT 23 #define MODULE_NAME "ksocket" //# define INADDR_SEND ( ( unsigned long int ) 0x7f000001 ) /* 127.0.0.1 */ #define INADDR_SEND INADDR_LOOPBACK /* 2006/06/27 - Added ksocket_send, so, after receive a packet, the kernel send another back to the CONNECT_PORT - Rodrigo Rubira Branco <rodrigo@kernelhacking.com> 2006/05/14 - Initial version - Toni Garcia-Navar