2011年5月31日 星期二

自製OS作業系統所需基本知識?

上篇,參考 wiki.osdev.org的OS開發之始一文,加入本人的心得寫了在OS開發中所需要的基礎。
(圖:引用自Wikipedia)


就實際上來說,寫OS向來被認為是一件十分困難且複雜的事。初學程式設計者,並不適合一開就自製OS。


以下是您必須瞭解的知識:

  • 電腦科學基礎: 你需深入且熟悉16進位和二進位符號之間邏輯運算,以及其他必要知識如:
    • 資料結構,相關的演算法的建立、 操作、搜尋和排序, 程式概念等等。

  • 語言與字彙: 你需能夠略懂讀和寫英文技術文章. 絕大部分從網站找到OS技術文章都以英文寫成。一般而言,中文譯書大約落後英文書二年左右。

  • 語言與字彙: 大部分OS的功能範例在osdev.org是均以程式語言C或C++寫成。假使你選用其他語言像是FreeBASICPascal;但 C 語言是程式設計通用語, 故而你應能以所使用之程式語言來轉換。

  • 組合語言Assembly: 應對組合語言有所瞭解。它是一種與硬體緊密相關的程式設計低階語言。組譯語言是機器語言便於記憶和理解的符號形式。 至少你必須閱讀關於這語言的教程, 並寫過用戶空間(user-space)的應用程式碼以便你能熟悉它。就算你使用更高階語言,你還必須瞭解它,例如bootloader, input/output 程式均少不了它的存在。當然你可將你所慣用的組言語言部分寫成函式,如此一來,便可使用C語言來呼叫(可參考Linux kernel )

  • 程式設計經驗: 你不僅需要知道相關程式語言,且需要瞭解並熟悉版本控制,如何偵錯等等。 簡言之,你必須在你開始寫OS之前,先成功地寫完一些user-space程式。

  • 開發環境:
    • 使用Linux來開發: 你將注意你需要許多 Unix工具。 Linux kernel 是一個常用學習的不錯參考範例,用以瞭解系統如何運作及其設計。 命令提示的工具(如bash 或 ksh等等) 是最低需求,並安裝Toolchain。

    • 使用Window來開發: Cygwin 提供一個簡易的方法來安裝unix開發環境, mingw 為一個精簡的GNU開發環境。


  • 工具集(Toolchain): 你必須瞭解如何使用編譯器(compiler: GCC)、組譯器(assembler: GNU as, NASM, MASM), 連結器(linker: GNU ld)及相關編譯工具(如make)。

  • 可執行的檔案格式: 核心空間(Kernel space)程式設計有許多額外的要求,以提供必要功能來給未知的應用程式開發所使用。故需要解析可執行的二進位檔案 (若你的OS需要載入並執行應用程式),請熟悉可執行檔格式 Executable File Types(其內部結構和如何連結產生)。

  • 自製OS 平台(Platform): 你必須學習相關CPU的說明手冊來寫你的OS所支援的平台. 手冊將包含必要的資訊來設計你的核心 。如x86 (Intel IA-32程式開發英文手冊)

以上心得,僅為拋磚引玉。

2011年5月25日 星期三

精簡版作業系統實戰: 自製OS用Qemu執行

源起一直以來想自己寫一個OS,練練功,去年到今年斷斷續續花了一至兩個月時間,寫了 我自己的陽春作業系統,最近正在整理程式碼做個記錄;證明有達成自己的目標。以下是從我的Xubuntu 10.10 執行benos 使用QEMU的畫面截圖。

qemu-system-x86_64 -boot a -M pc-0.11 -fda /home/ben/osdev/../main.img


畫面左上為Ben OS 執行結果。

目前實作了下列功能:

  1. 簡易的記憶體管理

  2. Timer中斷處理

  3. 鍵盤I/O, 佇列

  4. 多個執行緒的多工切換

  5. 簡單的命令模式 (ps, uname, free, clear, type mem)

  6. 精簡 libc 函式庫
在寫自己小OS過程中,最痛苦的莫過於不知道為什麼OS又沒畫面了。開發期間,學習了不少以前觀念有些模糊的部分,例如:如何進入保護模式、程式執行期權限模式、記憶管理、多工處理等等。
之後可能的研究議題如下:
  • 如何編繹及改寫BenOS支援網路開機方式(PXE)?

  • 如何支援檔案系統從S-ATA 硬碟?
如果想寫自己的OS,如何開始呢?
首先在完全沒有基礎情況,起步是最難的。
其實坊間有多本自製OS的書,以下是本人看過書:
- 偏重Linux 0.01 相關觀念介紹
- 較不適合初學者
- 偏重圖形介面實作,且用到許多自制工具或其他工具
- 較適合進階網友
- 比較全面詳細介紹觀念細節
- 較適合初學者
作業系統開發實戰手冊:以開發一個視窗多工作業系統為例(2011.5)
- 圖形介面實作
- 提供多平台的開發
- 使用大量表格來對照行號,進行解說。
再來最常遇到就是卡關,卡在某一環節良久,無法解決。這時如果有人可以討論,相信情況會大為改善。
wiki at osdev.org裡有英文文章,如英文尚可考慮精讀,有很多初學者的參考文章。
另外在Jserv's CURT v1 ARM 精簡作業系統一文中,Jserv 留言說有熱心網友將CURT v1移植到i386平台,可供大家參考練習。以上一點淺見,希望對您有所幫助。

更新2011-07-22:
建立共筆用的站台:Julu 作業系統開發協作平台,有興趣的人可留言(改到社群論壇,詳參閱協作平台),歡迎一同編修內容。

更新2011-08-17:

更新2011-12-14
BOS 使用新的bootloader(By Dennis) 以及初步整合VFS(By Wayling) 

2011年5月20日 星期五

Facebook iOS SDK 學習筆記及其範例簡介

參考Facebook mobile官方網址,將iOS相關部分翻譯成中文, 並加入相關心得。
在開始開發Facebook iOS程式之前,你需要先安裝iOS開發工具、原始碼版本控制工具Git 以及從GitHub上抓下最新版本函式庫:
   git clone git://github.com/facebook/facebook-ios-sdk.git


fackbook-ios-sdk 檔案結構如下:


README.mdown: 英文說明檔
sample/DemoApp/DemoApp.xcodeproj: (請使用Xcode 3.2來執行並編譯)
src/facebook-ios-sdk.xcodeproj: (SDK用來聯結到你的應用程式專案中)
src/JSON/:一個輕量Objective-C版的JSON(JavaScript Object Notation)的語法分析器及產生器
test/UnitTest: 單元測試



DemoApp:範例程式
前置作業、編譯及執行順序
  • 建立Facebook App ID: (請參考 http://www.facebook.com/developers/createapp.php)
  • 修改 DemoAppViewController.m 和 DemoApp-Info.plist (under URL types > Item 0 > URL Schemes > Item 0)內[app_id] 置換你的Facebook AppId。
  • 最後編譯及執行


此範例提供下列功能:
-(IBAction)fbButtonClick:(id)sender; // 登入/登出按鈕事件
-(IBAction)getUserInfo:(id)sender; // 使用GraphAPI來取得目前登入使用者資訊
-(IBAction)getPublicInfo:(id)sender; // 取得使用者公開資訊:例如使用者名稱
-(IBAction)publishStream:(id)sender; // 開啟一個談話視窗來讓使用者可把訊息貼到塗鴉牆
-(IBAction)uploadPhoto:(id)sender; // 上傳圖片


2011年5月14日 星期六

解決Python 跨平台相容性問題 (Mac OS X)

最近因工作需要使用Python來寫技術支援的程式,且其能在Tiger(10.4+), Leopard(10.5.5+), Snowlepoard (10.6.2+)正確執行。


測試開發用環境
Snowleopard 10.6.7 內建  python 2.6.1,
Leopard 10.5.8 內建 python 2.5.1
Tiger 10.4.8 內建 python 2.3.5

開發過程中,遇到下列問題:
Exception處理
try:

    open("/var/log/testexcept.log", w)
except IOError as (errno, strerror):
    print "Error %d: %s" % (errno, strerror)

上列程式,在Leopard 發生Exception錯誤。
$ python except_invalid.py
except_invalid.py:4: Warning: 'as' will become a reserved keyword in Python 2.6
  File "except_invalid.py", line 4
    except IOError as (errno, strerror):
                    ^
SyntaxError: invalid syntax
就Mac OS X 平台來說,"as" 是Python 2.6的保留字

解決方案:
try:
    open("/var/log/test.log", 'w')
except IOError, v:
    try:
       (code, msg) = v
    except:
       code = 0
       msg
    print "I/O Error:%d %s" % (code , msg)

執行結果:
$ python except_ok.py
I/O Error:13 Permission denied

readPlist/writePlist 不支援10.4


查了一下python plistlib 函式 python 2.5.1 and 2.6.1 都有相關函式
Python 2.5.1 (r251:54863, Jun 17 2009, 20:37:34)     ==>
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import plistlib
>>> dir(plistlib)
['Data', 'Dict', 'DumbXMLWriter', 'PLISTHEADER', 'Plist', 'PlistParser', 'PlistWriter', 'StringIO', '_InternalDict', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '_controlCharPat', '_dateFromString', '_dateParser', '_dateToString', '_encodeBase64', '_escapeAndEncode', 'binascii', 'datetime', 're', 'readPlist', 'readPlistFromResource', 'readPlistFromString', 'writePlist', 'writePlistToResource', 'writePlistToString']

python 2.3.5 沒有所需函式
Python 2.3.5 (#1, Jul 25 2006, 00:38:48)
[GCC 4.0.1 (Apple Computer, Inc. build 5363)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import plistlib
>>> dir(plistlib)
['Data', 'Date', 'Dict', 'DumbXMLWriter', 'False', 'INDENT', 'PLISTHEADER', 'Plist', 'PlistParser', 'PlistWriter', 'True', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '_encode', 'bool', 'sys']

解決方案:

使用Plist()的函式 fromFile(file) and write(file)
import plistlib
pl = plistlib.Plist()
file="/Applications/iTunes.app/Contents/version.plist"
dict = pl.fromFile(file)
print dict['CFBundleShortVersionString']
dict['CFBundleShortVersionString'] = "10.1"
dict.write("my.plist")

2011年5月10日 星期二

學習iPhone/iPad 程式設計的參考資料清單(2)

續上次書目,如英文書讀起比較吃力的話,可以考慮下列我朋友所讀的中文譯書。

精通Objective-C 2.0程式設計2/e(平裝)
本譯書是由蔡明志所翻譯,譯者在C++領域有很深的造詣,曾譯過Ivor Horton's C++ 教學範本(Beginning the complete language)等書。值得列參考書看看。

探索iPhone程式開發實戰
這本書是從英文版翻譯:英文書(4th printing edition)出版日期為(2008年11月)與這本中文書(2010年10月)相差了兩年,遠遠追不上Apple iOS 更新的速度。
而這本書的第二版加入的iphone4 新的技術,在2011年1月出版Beginning iPhone 4 Development: Exploring the iOS SDK如果已有基礎,要看看iPhone 4 技術,可考慮新書。

2011年5月6日 星期五

學習iPhone/iPad 程式設計的參考資料清單

最近有朋友問我說有沒有相關初學者學iPhone/iPad 程式設計的參考資料?
其實讀程式設計相關書籍或資料,重點在於你看了以有沒有吸收進去,會不會活用,以及花時間練習。

以下只是我曾經看過的書,供大家參考而已。

第一本:Programming in Objectvie-C (我買的是第一版,目前在Amazon 已有第二版了)
你要寫Apple iOS 上的程式就不能不會Objective-C 來使用CocoaTouch,這是基礎。

第二本:Xcode 3 Unleashed
整合開發環境總要學會,所謂欲工善其事,必先利其器。

第三本:Beginning iPad Application Development
這本對初學者來說,不算好,不過我當時在書店只找到這本,在Amazon上評價不高。建議你可考慮找其他書,如:iPad Application Development For DummiesGetting Started with Making iPhone Apps

有一些書可參考後,也可到史丹佛大學網站去下載相關課程資料。
參考網址如下:
CS 193P iPhone Application Development
十分感謝,史丹佛大學的教授,很認真準備了非常豐富的教材;本人還下載了2009年課程教學錄影檔來看,感覺好似又回到大學去上課的時光。2010年版教授們又改進投影片,將很多觀念用投影片動畫表現出來。

最後我覺得有了基礎後,在Apple iOS Dev Center上有許多文作範例可接著學習,此外Apple WWDC影片與講義也是不可多得的寶庫,有待網友去發掘。

更新07-30