2009年12月21日 星期一

libopenh323 and libopal conflict

前陣子為了編譯 t38modem 所以需要 libopenh323 當作 library,(header files 需要 libopenh323-dev)
後來發現 the successor of OpenH323 project --- OPAL project (Open Phone Abstraction Library)
但是在 Debian sqeeze 上,這兩組有些衝突,原因是底層的 libpt 版本需求不同造成的,目前我沒有去解決(或強制把 "依賴" libpt-1.10.10 的部份以 libpt-2.6.5 取代,沒有試過不知道!)衝突關係如下列:

compile libopal-3.6.6 source get  from [ here ], needs libpt-2.6.5

libopal-3.6.6
depends on
libpt-2.6.5

header files in :
libopal-dev-3.6.6
depends on
libpt-dev-2.6.5-1


compile t38modem
needs
libopenh323-dev: /usr/share/openh323/openh323u.mak

libopenh323-dev
depends on
libpt-1.10.10-dev  <-- conflict libpt-dev-2.6.5-1
libopenh323-1.18
   

libopenh323-1.18
depends on
libpt-1.10.10 ← conflict libpt-2.6.5

結論:
所以目前 compile 使用 OpenH323 的 source 與使用 OPAL 的 source 無法同時 compile ,必需把相關的 libpt 重裝(一個用 2.6.5, 另一個用 1.10.10) #Technorati 標籤: , , , ,

2009年12月13日 星期日

Debian 升級 testing (sqeeze) 與 ATI X1450 的 driver 問題

Asus A8J 大約是兩三年前的華碩主流筆電之一,獨立顯卡採用  ATI X1450.
Debian Lenny 下有提供 ATI propietary driver (non-free) :
kernel driver(要 3D 加速,需要 kernel driver ) : fglrx-modules-2.6.26-* 等,driver source : fglrx-kernel-src
for openGL lib : fglrx-glx
根據這篇 [ arch linux ATI ] [ref 1] 知道,X1450 的 code name 為 (RV515, 即 r5xx  系列)

Debian 系統升級到  testing 後,kernel driver 套件變成 : fglrx-source , 且改為支援 r6xx-r7xx 而已,也就是說 ATI 官方 driver 不再支援 r5xx 系列,
但是這些不被支援的系列的 spec 已經  release 給 open source 社群。所以目前升級後的  xorg 7.4 裡面的  xserver-xorg-video-ati 套件,可以支援 r5xx 系列。
xorg.conf 已經不需要了,xorg 會自動偵測掛載  radeon driver。

glxgears 的數據為
1598 frames in 5.0 seconds = 319.450 FPS 
1613 frames in 5.0 seconds = 322.503 FPS  ( 本blog時間測)

6097 frames in 5.0 seconds = 1219.223 FPS 
6014 frames in 5.0 seconds = 1202.697 FPS  ( 2010年4月20測)

跟使用 ATI propietary ~1200 FPS 比較起來,稍稍等待 open source 社群是值得的,
時間會證明 open source community 提供的 code 效能,總會超越 propietary code 的,並且更穩定。
Technorati 標籤: , , ,

2009年12月7日 星期一

製作 beagle board kernel v2.6.29-58cf2f1

約四個月前,在網路上找到了一篇 [ building a customed kernel for beagle board ] ,但是事過境遷,該篇 blog 已經不存在。有位對岸的大哥把步驟給節錄下來了[ 制作beagleboard的kernel  ] ,為了避免以後有類似情形,這裡再節錄一遍過程:

Retrieve the GIT checkout:

    git clone git://git2.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6.git
    cd linux-omap-2.6/
    git checkout 58cf2f1 -b v2.6.29-58cf2f1
    git archive --format=tar --prefix=v2.6.29-58cf2f1/ v2.6.29-58cf2f1 | gzip > ../v2.6.29-58cf2f1.tar.gz
    git checkout master
    git branch v2.6.29-58cf2f1 -D
    cd ..

Download kernel diffs and kernel config:

    wget http://rcn-ee.homeip.net:81/dl/omap/beagle/v2.6.29-58cf2f1-oer34/v2.6.29-58cf2f1-oer34.diff
    wget http://rcn-ee.homeip.net:81/dl/omap/beagle/v2.6.29-58cf2f1-oer34/defconfig

Extract Kernel Source

    tar -xf v2.6.29-58cf2f1.tar.gz
    cd v2.6.29-58cf2f1/

Apply Patch

    patch -p1 < ../v2.6.29-58cf2f1-oer34.diff

Copy Defconfig

    cp ../defconfig .config

Configure the kernel (requires libncurses5-dev installed)

    make menuconfig

Build, Cross-Compiling:

    make CROSS_COMPILE=arm-linux-gnu- uImage

A few moments later, you can find your new kernel in the ‘arch/arm/boot/’ directory.

Make modules:

    make CROSS_COMPILE=arm-linux-gnu- modules

    make CROSS_COMPILE=arm-linux-gnu- modules_install


2009年12月3日 星期四

sparse type checking

因為 compiler 只能檢查 syntax.
Linus 為了檢查程式的 semantics ,創造出 sparse. 在 [ Linux Journal "Linus & Lunatics" ] 這篇文章提到了他當初的想法:

相關的 code 在 compiler.h 可以看得到 (kernel source 2.6.28 )

#ifdef __CHECKER__
# define __user        __attribute__((noderef, address_space(1)))
# define __kernel    /* default address space */
# define __safe        __attribute__((safe))
# define __force    __attribute__((force))
# define __nocast    __attribute__((nocast))
# define __iomem    __attribute__((noderef, address_space(2)))
# define __acquires(x)    __attribute__((context(x,0,1)))
# define __releases(x)    __attribute__((context(x,1,0)))
# define __acquire(x)    __context__(x,1)
# define __release(x)    __context__(x,-1)
# define __cond_lock(x,c)    ((c) ? ({ __acquire(x); 1; }) : 0)
extern void __chk_user_ptr(const volatile void __user *);
extern void __chk_io_ptr(const volatile void __iomem *);
#else
# define __user
# define __kernel
# define __safe
# define __force
# define __nocast
# define __iomem
# define __chk_user_ptr(x) (void)0
# define __chk_io_ptr(x) (void)0
# define __builtin_warning(x, y...) (1)
# define __acquires(x)
# define __releases(x)
# define __acquire(x) (void)0
# define __release(x) (void)0
# define __cond_lock(x,c) (c)
#endif

平常 gcc compile 時,不定義 __CHECKER__,所以這裡的許多 macros 就得到空定義 (程式碼 #else 部份)
那麼使用 sparse 時,就定義 __CHECKER__ ,(程式碼 #ifdef 部份) 舉例來說 第一行:

# define __user        __attribute__((noderef, address_space(1)))

使得 sparse 檢查 __user 定義的變數,是否落在 user space,例如用在 copy_to_user() :

unsigned long
copy_to_user(void __user *to, const void *from, unsigned long n)
{...}

compiler 是不會知道 "to" 的變數是不是正確!但是 sparse 檢查時,若發現 to 所指的不是在 user space 裡,就會發出 warning
因此這些 attributes 是給 sparse 用的,在 gcc 文件裡面查不到這些 attributes (是的,不要怪 gcc 文件寫不好...)

另外這篇 [ linux 內核中 compiler.h 文件的分析 ] 還解釋了 __acquire / __release 必須成對使用,否則 sparse 會發出 warning.

Linus 真神人也,可以讓 kernel source 藉由 sparse 工具來檢查 program semantic !!Technorati 標籤: ,