Email me: jollen # jollen.org

more: Jollen 的 Embedded Linux 教育訓練

« November 2007 | (回到Blog入口) | January 2008 »

December 2007 歸檔

December 2, 2007

register_netdev 的入門實例: bonding.c

今天在「Linux 驅動程式: 進階」的訓練課程中提到,找到正碓的入門實例,比起什麼都來得重要。

有時,老舊的程式碼,更容易幫助初學者掌握基本的架構與 API 用法。在 Linux 驅動程式的課程裡,我推薦同學研究一個早期的網路介面驅動程式,叫做 bonding.c。bonding 是一個用來合併網路卡的驅動程式,而早期的 bonding 驅動程式並沒有太多額外的 algorithm 實作,因此我建議同學,拿出 kernel 2.4.14 裡的 bonding.c 來做實例研究。由於這個版本的 bonding 驅動程式非常赤祼祼地呈現 register_netdev、struct net_device 與封包傳送的介面實作,因此肯定比許多最新的網路卡驅動程式更適合初學者。

kernel 2.4.14 的 bonding.c 可以在 2.6.x 的 kernel 上使用,美中不足的是,使用古老的 bonding driver 無法將 eth 介面合併進來,但至少可以配合 ifconfig 指令來做動態的操作與觀察,例如了解 'ifconfig bond0 down' 與 struct net_device::close 的實作。

如果要實際把玩 bonding 的功能,只要直接使用 kernel 2.6.x 本身的 bonding driver 即可。另外,kernel 2.4.14 的 bonding.c 必須修改一行 code,才能在 kernel 2.6.x 的環境下順利載入。以下提供此修改的 patch:

--- bonding.c.orig      2007-12-02 21:15:03.000000000 +0800
+++ bonding.c   2007-12-02 22:07:44.000000000 +0800
@@ -275,12 +275,11 @@
        /* Find a name for this unit */
        int err;
 
-       dev_bond.init = bond_init;
-
        err = dev_alloc_name(&dev_bond,"bond%d");
        if (err<0)
                return err;
 
+       bond_init(&dev_bond);
        SET_MODULE_OWNER(&dev_bond);
        if (register_netdev(&dev_bond) != 0)
                return -EIO;

Google Android 採用 Apache License: 為什麼不是 GPL?

Google 讓基於 Android 技術平臺的「應用程式」採用 [Apache License, Version 2] 的授權條款。許多 Free & Open Source Software(FOSS)採取 GPL 的授權條款,目前 OpenMoko 的架構,也都是選用基於 GPL 授權條款的 FOSS。

Android 與 OpenMoko 一個是開放手機平臺,另一個則是開放源碼手機平臺;前幾日對二個平臺做了差異比較,並且製作了一份 [OpenMoko vs. Android 主要差異比較表],可透過此表約略了解二個手機平臺之間的不同。

為什麼 Android 的應用程式要採取 Apache License 的授權方式?由 [Apache Software Foundation] 所發展的軟體,也都改採 Apache License 授權的故事來看,我想 Android 平臺的應用程式選擇 Apache License 的授權條款,也是很合理的。這要由 Apache License 與 GPL 之間的二個大差異講起。

第一、GPL 要求程式碼在重新散佈或修改時,必須提供原始程式碼(source code),並且也要基於 GPL 條款進行授權。因此,我們無法由原始授權者取得 GPL 軟體後,就無法再做「再授權」的動作。Apache License 則不然。如果軟體是基於 Apache License 授權,我們在重新散佈或進行程式碼修改時,就不會被要求必須要提供原始程式碼;同時,Apache License 授權也允許他人對軟體做「再授權」的動作。

第二、若是程式包含專利技術,使用 Apache License 時,表示授權者願意將程式的專利技術授權出來(Patent License)。但是,GPL 授權則不允許專利授權,因此在某些情況下,使用 GPL 授權的軟體可能會有侵害專利權的問題。

另外,Apache License 也對商標(trademarks)做保護,「不」允許他人使用原始授權人的 trademark、product name 與 service mark,除非是基於「合理」用途,並且附上 Apache License 的 NOTICE 聲明檔案。在 Android 的 SDK 裡,隨處可見 NOTICE 聲明檔。

Android vs. OpenMoko

Android 的授權方式,以及 OHA 的成立,代表著 Google 對未來手機市場的策略將會是一個建構舞台者的角色。Android 的出現對 OpenMoko 是否構成威脅,我倒覺得不必將 Android 當成是 OpenMoko 的假想敵,因為OpenMoko 未來潛在的競爭對手,恐怕不是 Android,而是使用者。走好自己路,是目前比較穩健的做法。

對開放或開源的手機平臺來說,最大的受益者是開發者以及使用者。就現況而言,顯然開發者對 Android 還沒有產生太大的興趣,OpenMoko 在開發者這個族群做得還算不錯。不過,OpenMoko 要能吸引真正使用者,還有努力的空間,所以 OpenMoko 真正要搞定的應該是使用者,倒不必太在意 Android 對他的影響。

至少就開發者族群來講,Android 還在起步階段;Google 現階段也很努力地在經營開發者族群。開發者的確是開放手機業者的兵家必爭之地。當然,最後還是必須在使用者族群裡分出高下。

總結來看,目前 Android 還沒有一個真正的商業模式。Terrence Russell 在他的 blog [Google: Android Has No Built-in Business Model] 提到,Android 的主要開發者之一 Richard Miner 告訴他:"For Android, there is no built-in business model"。至少就我目前的觀察來說,我是相信這個說法的。

也別忘記,Google 總是喜歡做實驗,任何新的 Google 服務都要在 Lab 裡育成,也會被掛上 Lab 的 logo。Android 是 Google 的新服務,或許現在他還是個「Android Lab」,只是沒有被掛上 Lab 字眼。Google 正在對開放手機平臺做大規模的實驗。

December 21, 2007

簡報下載:Linux 驅動程式的 read/write 觀念解析

12/19(三) 下午於 [OpenMoko] 的 [OpenLab] 發表了一場演說,時間是一個小時。這是一場有關 Linux 驅動程式的演講訓練活動,本次演講主要在解析 Linux 驅動程式的 read/write 程式碼框架(framework)與觀念解析。大綱如下:

* read/write system call
* vfs switch
* user-space vs. kernel-space: I/O data
* short discussion on wait queue: blocking I/O
* cdata example

時間只有一個小時,因此在規劃簡報時,決定採取範例導向的方式做介紹。當天以一個 cdata 的範例做主軸,直接透過程式碼來做講解。在此提供簡報電子檔供參考 [linux-device-drivers-read-write]。

December 29, 2007

Linux 2.6.22 新增 display class

Linux 2.6.22 於 2007 年 7 月 8 日正式釋出,這個版本的 kernel 有一個令我感興趣的新功能。Linux 2.6.22 新增一個 class driver,稱為「display class」。顧名思義,這個新的 class driver 是用來管理與 "display" 有關 device driver。以下引用自 [include/linux/display.h]:

28 struct display_device;
29
30 /* This structure defines all the properties of a Display. */
31 struct display_driver {
32         int  (*set_contrast)(struct display_device *, unsigned int);
33         int  (*get_contrast)(struct display_device *);
34         void (*suspend)(struct display_device *, pm_message_t state);
35         void (*resume)(struct display_device *);
36         int  (*probe)(struct display_device *, void *);
37         int  (*remove)(struct display_device *);
38         int  max_contrast;
39 };
40
41 struct display_device {
42         struct module *owner;                   /* Owner module */
43         struct display_driver *driver;
44         struct device *parent;                  /* This is the parent */
45         struct device *dev;                     /* This is this display device */
46         struct mutex lock;
47         void *priv_data;
48         char type[16];
49         char *name;
50         int idx;
51 };
52
53 extern struct display_device *display_device_register(struct display_driver *driver,
54                                         struct device *dev, void *devdata);
55 extern void display_device_unregister(struct display_device *dev);

在 Kconfig 選單中,可以找到一個 "Display device support" 的項目。根據 display class 的規劃,這個新的驅動程式界面除了支援 LCD 外,也會支援 CRT、TVout 以及其它的顯示界面。

2007 年下半年度因為工作特別忙碌,或者說,工作項目比較繁雜,無法將時間有效利用,便堆積了許多未讀的資料。正好利用 2007 結束前的幾個放假日,將這半年來累積的資料一次消化完畢,並將一些紀錄和大家分享。

延伸閱讀

2007.08.29: Linux frame buffer 驅動程式開發簡報下載

新的 Linux Wireless Stack 現身

Linux 2.6.22 有一個重要的更新,就是改進了過去對於 wireless 支持的不足。一家叫做 [Devicespace] 的公司,為 open source 做了一項重要的貢獻,他們將一份新的 wireless stack 實作提交給 kernel,並正式收錄於 Linux 2.6.22。詳情可參考 kernelnewbies.org 上的說明 [New Wireless stack]。

Linux 在 wireless stack 上的功能並不是很充份,在 Devicespace 貢獻 kernel 更好的全新 wireless stack 實作後,對 Linux 在無線網路上的支援與應用,將是一個重要的進展。由 Devicespace 所提交的新一代 wireless stack 包含的實作有(引述 kernelnewbies.org 原文):

This wireless stack has many features, like a complete software MAC implementation, WEP, WPA, a "link-layer" bridging module, hostapd, QoS support to prioritize things like VoIP, 802.11g support, and full debug capabilities.

此外,另一個重要的改進則是:

Another feature of this stack is a completely new user interface.

這裡所指的「全新 user interface」指的是新的 user-space interface 實作。過去的 wireless stack 是採取 ioctl-based interface,新的 user-space interface 實作則是 netlink-based,並且能與舊有的 ioctl-based interface 相容。

另外,kernelnewbies.org 上也提到:

The disadvantage is the lack of drivers using this stack: the drivers that have been in the tree for a long time do not support this stack, and will need to be ported.

目前長久存在於 "tree"(kernel tree,kernel 原始碼目錄樹)裡的驅動程式並不支援新的 stack,必須要做 porting 的工作。不過,kernelnewbies.org 也提到,這個工作從技術角度來講並不困難,而且以現在的 kernel community 來說,這些工作不久的將來就會完成。

December 31, 2007

qemu + Linux kernel 模擬與除錯環境實習

Qemu 是一個功能強大的「processor emulator」,qemu system emulator 還能模擬開發板的週邊。此外,qemu 還包含一個 gdb server 的實作,配合 gdb client 能組合出一個很棒的 kernel & device driver「source-level debug」環境。

Jollen-Kit! Pro. 是由 jollen.org 所推出的 ARM9 開發板,主要用途是拿來做 Embedded Linux 的教育訓練。在前一陣子的 Linux Device Driver 訓練課程中,特別規劃了一個時段的「qemu + Linux kernel 模擬與除錯環境實習」的操作課程,此課程所採用的 qemu 能模擬我們的 Jollen-Kit! Pro. 開發板,同時也介紹如何設定 breakpoint 以進行 kernel debug。

在此提供實習簡報電子檔 [qemu_jk2410_cgdb] 供下載。由於這是帶領操作的課程,簡報內容可能帶不到一些細節,但主要的內容大多能帶出,還請見諒。本月即將於台北開班的 [Linux Device Driver 課程],也會介紹 qemu 除錯環境的安裝與操作指導。

若台北教室時段許可,或許可以提供免費的 seminar 課程。

延伸閱讀

2007.04.19: Qemu 模擬週邊的兩三事
2007.04.18: 再聊 CPUState、qemu 的 gdbserver
2007.04.11: 小聊 qemu 的 CPUState
2007.04.08: qemu-neo1973 / openmoko-emulator / jk2410-emulator
2006.09.28: QEMU 虛擬機器

關於 December 2007

此頁面包含了在December 2007發表於Jollen's Blog的所有日記,它們從老到新列出。

前一個存檔 November 2007

後一個存檔 January 2008

更多信息可在 主索引 頁和 歸檔 頁看到。

Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org