2008年11月13日 星期四

List ASM code and C code together

"arm-linux-objdump -lSDx rylcd.ko > dump.txt" ,

2008年7月8日 星期二

kernel/module debugging

REF:Inside the Linux kernel debugger

Kernel Module .ko 的Makefile

REF:http://wshlab2.ee.kuas.edu.tw/personal/simon/archives/000735.html

目前小弟常用的兩種寫法,敬供參考。
KERNEL_VERSION  := `uname -r`
KERNEL_DIR := /lib/modules/$(KERNEL_VERSION)/build
#KERNEL_DIR :=
$(KERNEL_SRC)
CROSS_COMPILE := arm-linux-


PWD := $(shell pwd)

obj-m := snd-dummy.o
snd-dummy-objs := dummy.o

all: snd-dummy

snd-dummy:
@echo "Building a dummy driver..."
@(make -C $(KERNEL_DIR) M=$(PWD) CROSS_COMPILE=$(CROSS_COMPILE) modules)

clean:
-rm -f *.o *.ko .*.cmd .*.flags *.mod.c Module.symvers modules.order tags
-rm -rf .tmp_versions


ifneq   ($(KERNELRELEASE),)
obj-m :=
dummy.o

else
KERNEL_VERSION := `uname -r`
KERNEL_DIR := /lib/modules/$(KERNEL_VERSION)/build
#KERNEL_DIR :=
$(KERNEL_SRC)
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
rm -r .tmp_versions *.mod.c .*.cmd *.o *.ko

endif

2008年7月2日 星期三

抓當代已patched kernel source

apt-get source linux-source-2.6.22
註:apt-get source [按TAB可以查詢且補齊]

2008年6月30日 星期一

轉檔:Covnert wma to mp3

#先轉至pcm
mplayer Samba.wma -ao pcm:file=test.pcm
#再編成MP3
lame -ms test.pcm -o Samba.mp3

#!/bin/sh
for i in *.wma ;
do
mplayer "$i" -ao pcm:file=audiodump.wav
lame -ms audiodump.wav -o "`basename "$i" .wma`.mp3";
rm -f audiodump.wav
done
rm -f audiodump.wav

2008年5月19日 星期一

U-Boot 便捷開機法

REF:U-Boot 便捷開機法

編寫與製作文稿檔
文稿檔案存成 "nand-kern.script"
==================================
echo
echo Load kernel from NAND and download rootfs via tftp.
echo
nand read.jffs2 30F00000 0 00400000; tftpboot 32000000 urootfs26.img; bootm 30F00000 32000000
==================================

把檔案存成 "nand-kern.script",再利用 U-Boot 的 mkimage 工具把 nand-kern.script 做成 U-Boot 格式。指令如下:

# mkimage -A ARM -O linux -T script -C none -a 0 -e 0 -n "Autoscr" -d nand-kern.script nand-kern.img

將 nand-kern.img download 到板子(或燒在NOR flash),並使用 autoscr 指令來啟動。U-Boot 指令如下:
# tftp 30000000 nand-kern.img
# autoscr 30000000

Cron:例行性排程

REF:Gentoo Linux Cron 指南
自動工作排程管理
例行性命令的建立

Cron 是一個根據 crontab 的輸入資料執行排程程序的服務。他藉由每分鐘啟動, 檢查每個使用者的 crontab 是否有要執行的程序來完成這個功能。
新增一個crontab檔,可以利用crontab -e 或是自行編輯
==========================================================================
#Mins Hours Days Months Day of the week

* * * * * /bin/echo "I'm Ryan" >> /tmp/ryan.log
=========================================================================
記得執行
crontab this.file
#crontab -l

objcopy-jpg2ascii 搭配 objcopy 的展示

REF:jpg2ascii 搭配 objcopy 的展示
很有趣的展示。實作利用原始圖檔,然後 objcopy 可產生不折不扣的 ELF relocatable object,然後進一步作 linking 的動作。
=============================================================
The GNU objcopy utility copies the contents of an object file to another. objcopy uses the GNU BFD Library to read and write the object files. It can write the destination object file in a format different from that of the source object file. The exact behavior of objcopy is controlled by command-line options. Note that objcopy should be able to copy a fully linked file between any two formats. However, copying a relocatable object file between any two formats may not work as expected.

objcopy creates temporary files to do its translations and deletes them afterward. objcopy uses BFD to do all its translation work; it has access to all the formats described in BFD and thus is able to recognize most formats without being told explicitly.

2008年5月18日 星期日

Linux ABI(Application Binary Interface)

REF:FreeBSD + GNU/Linux 聯合大作戰
在 FreeBSD 有實作 Linux ABI(Application Binary Interface),他能夠很巧妙的在執行 Linux binary 時,把該呼叫的函式,轉為呼叫 Linux 的函式,這樣就能『直接』在 FreeBSD 上執行 Linux binary 了。雖然官方文件仍然沿著歷史的因素,稱呼為 Linux emulator,但他其實並不是模擬器,因為執行時也載入真正的 Linux kernel/lib 供應用軟體呼叫,也因此有人稱他為 Linuxulator。
當然,要達成這樣子的功能,必須先安裝一套 GNU/Linux base system。Linux 核心(系統呼叫的部份)也需先載入 linux 模組(linux.ko)。GNU/Linux base system 可以從 ports 安裝,目前有 Fedora Core/Gentoo/Debian/SuSE 等可供選擇,這樣就行了。

2008年5月14日 星期三

幾個免費英文字型下載網站。

REF:http://blog.joaoko.net/?s=%E7%B6%B2%E5%8F%8B

1001 Fonts提供了為數眾多、各種樣式的字型。網站將字型分類,並設有投票機制,讓第一次拜訪的網友很快就能找到適用的字型及熱門的字型。
FontFreak提供超過 5000 個免費字型,依照字型名稱排序,可以很容易的找到需要的字型。在進入字型列表之前會有一個網頁詢問是否要一次下完所有字型,這是付費服務,要免費下載的話得選擇 one by one 下載進入字型列表。

Font Reactor這個網站有評分機制,列出了站內最多人下載及分數最高的字型,藉此使用者可以很快的找到公認的優質字型。除此之外,它還另一項特點就是允許 使用者預覽字型,輸入一段文字後按下 Preview 就會出現套用該字型後的文字。還有,它的字型下載連結擺在兩個 Google 廣告的中間,要注意看才找的到連結。

FontFace擁有超過 1000 個免費字型,以名稱順序排列。網站也整理出最優質的 25 個字型 (Top 25 Fonts),方便使用者第一時間就能找到站內的精華。

SketchPad與其他的字型網站相比,這個網站的排版較為簡潔,也沒有亂七八糟的廣告擾亂視線。網站裡的字型以名稱排列順序,使用者能很輕鬆的瀏覽並下載字型。

Abstract Fonts擁超超過 10000 個免費字型。這個網站也提供了自訂文字的字型預覽,在尚未下載字型之前我們就可以知道某段文字在該字型之下的呈現方式。

FreeFontsNow站內的字型以樣式分類及以名稱排序。網頁裡的廣告不算多,每個字型旁邊皆有清楚的下載連結,所以可以很輕鬆地下載自己所需的字型。

Font Shack
FontFiles該網站目前擁有 4000 多個免費字型,字型以名稱排序,但是後面從 M 開始還沒有可下載的字型。

Fontica這個網站擁有相當多的免費字型,除了以字型名稱排序之外,他也有評分機制,方便網友找到站內比較受歡迎的字型。

以下幾個字型下載網站都與上面介紹的大同小異,所以請自行拜訪並尋找適合自己需求的字型。
Font Garden
Font Paradise
SimpleTheBest
Chank
Font File

2008年5月5日 星期一

pydot

REF:pydot

Requires:


#apt-get install python-pyparsing
#apt-get install python-pydot

example:
import pydot
edges=[(1,2), (1,3), (1,4), (3,4)]
g=pydot.graph_from_edges(edges)
g.write_jpeg('graph_from_edges_dot.jpg', prog='dot')

2008年4月27日 星期日

有關 Firefox 的plugins on Ubuntu

REF:
http://blog.xuite.net/ericsk0313/ubuntu/5247881

在使用 Ubuntu 時,它預設使用的網頁瀏覽器就是 Firefox,現在各式各樣的網頁都會內嵌一些多媒體物件,比方說 flash 或是播放音樂影片等等。從前要在 Linux 上裝這一類網頁的 plug-in 都是一種夢魘,不過現在這一切都變得很容易了!

在 Ubuntu Linux 裡面,Mozilla/Firefox 的 plug-in 會安裝的地方主要有三個目錄:
  • /usr/lib/mozilla/plugins
  • /usr/lib/mozilla-firefox/plugins
  • $HOME/.mozilla/plugins
其中 $HOME 指的是你個人的 home 目錄(比方說,帳號是 abcd 的話,那 $HOME 指的就是 /home/abcd),因為各個套件預設安裝的位址不太一樣,所以最好確定一下這些目錄都存在。

Flash player plug-in:

當 你瀏覽含有 flash 物件的網頁時,Firefox 會提示你是否要安裝 flash player plugin,如果你的 $HOME/.mozilla/plugins 目錄存在的話,那就可以順利安裝好。但要注意的是,別忘了利用 apt-get 或是 synaptic 來安裝 gsfonts-x11 這個軟體,才能讓 flash player 能夠顯示文字。

mplayer plug-in:

如 果你使用 Ubuntu Dapper 之後的版本,那應該可以在套件管理中找到 mozilla-mplayer 這個套件來安裝,不過它會安裝在 /usr/lib/mozilla/plugins 這個目錄下,如果你發現裝完之後沒辦法使用,那就可以在 $HOME/.mozilla/plugins 裡建立那些檔案的 link。(範例:在 $HOME/.mozilla/plugins 目錄下打 ln -s /usr/lib/mozilla/plugins/mplayerplug-in* 就好了。
倘若你是使用 Ubuntu Breezy ,那可以到 Project網站 下載來自行編譯安裝。

Java Runtime Environment:

如果你從 Java 的官方網站上 下載了 JDK 或 JRE 回來安裝,那可以在目錄中找到 plugin 的目錄,在其中的 desktop 目錄下,修改 sun_java.desktop 這個檔案,設定執行 java 的路徑,然後再從 GNOME 下的檔案瀏覽器去點擊這個檔案兩下,就可以設定好 Mozilla/Firefox 中的 jre plugin

然後在 mozilla 的 plugins 目錄中打 ln -s $JRE_HOME/plugin/i386/ns7/libjavaplugin_oji.so

相 信裝好這些 plugin 之後就可以讓你使用 Firefox 輕鬆瀏覽許多網頁了(當然,如果該網頁的設計是 for IE only 的,那可能就沒那麼輕鬆了),這裡介紹了 Firefox 安裝 plugin 的方式(你可以在 firefox 的網址列輸入 about:plugins 來檢視你安裝了哪些 plugins),如果有些 plugins 沒辦法順利安裝的話,起碼可以先知道該怎麼初步解決。
========================================
for current my ppc only
#apt-get install libflash*
#mkdir ~/.mozilla/plugins
#ln -s /usr/lib/mozilla/plugins/libflash-mozplugin.so ~/.mozilla/plugins/libflash-mozplugin.so

FAQ:Ubuntu 正體中文站 討論區

Q:檔案瀏覽器 有時候會無法更改檔名!
檔案瀏覽器 有時候會無法更改檔名,
情況是說,當你選擇了一個檔案後,按下F2(或用滑鼠右鍵選單的重新命名),
此時 該檔名會變為反白,可是,不管您怎麼輸入,鍵盤看起來就像是沒反應
可是按 鍵盤的上下鍵,檔案瀏覽器的選取項目就移到上方或下方的檔案了,
但是,我如果將檔案瀏覽器關掉重開後,馬上照上述的方法改檔名就可以正常的修改...
A:
vi ~/.profile
加入這兩行,
export GTK_IM_MODULE=scim
export QT_IM_MODULE=scim
登出 > 重新登入
輸入法跑掉了的關係
不加那兩行,還可以在改檔名(或是需要輸入文字的地方)
按滑鼠右鍵選擇輸入法來解決
REF:here

totem看影片需知(含rmvb)

http://noviceworld.blogspot.com/2007/09/totem.html
http://help.ubuntu.org.cn/index.php?title=UbuntuHelp:Medibuntu/zh&variant=zh-tw (w32codecs )
RMVB:
http://bbs.linuxsir.org/thread195990.html
http://www.ubuntu.org.tw/modules/newbb/viewtopic.php?viewmode=flat&type=&topic_id=539&forum=22
字幕:
http://www.ubuntu.org.tw/modules/newbb/viewtopic.php?post_id=374
http://www.study-area.org/apt/firefly-font/

這篇文章蠻完整的
==================

關於ubuntu看影片的問題
我今天做了一個報告
雖然我只報告了字幕那一段
但我還是把他看各個檔案的流程po出來
想必大家有在使用ubuntu的使用者
並不可能只有上上網打打字而已
應該也會享受其影音生活
相信大家在開啟影片檔時
有很多副檔名不能啟用ex:rm avi等等
這時我們可以更改及增加一些軟體來啟用及開啟字幕
首先 我們要先移除舊版的totem
sudo apt-get remove totem
再安裝totem-xine
sudo apt-get install totem-xine
再安裝必要的函式庫→這是為了可以播放avi格式檔案
sudo apt-get install libxine1*
接著我們下載codec
wget http://www.debian-multimedia.org/pool/main/w/w32codecs/w32codecs_20061022-0.0_i386.deb
接著就安裝codec
sudo dpkg -i w32codecs_20061022-0.0_i386.deb
安裝完後記得執行一次totem-xine後會多出一個~/.xine/catalog.cache
編輯這個設定檔
sudo vim ~/.xine/catalog.cache
修改設定檔內的/usr/lib/xine/plugins/1.1.4/xineplug_decode_real_audio.so項目
並將其decoder_priority選項改為10→此更改是為了播放rmvb時能有聲音
再來就是字幕的問題
因為 totem 使用的字型預設放在 /usr/share/xine/libxine1/fonts,
但是沒有中文字型,所以得利用 xine-fontconv 這工具來製作,
ubuntu沒有包這個工具,但是可以抓 xine-lib 原始碼裡面的 xine-fontconv.c 來編譯:
apt-get source xine-lib
接著進入xine-lib-1.1.4/misc
cd xine-lib-1.1.4/misc
再來編譯xine-fontconv.c
gcc -o xine-fontconv xine-fontconv.c `freetype-config --cflags --libs` -lz
接著利用編出來的 xine-fontconv 來製作 totem 可以使用的中文字型,
用法如下:
我是用蘋果電腦的LiHei_Pro來製作
./xine-fontconv /usr/share/fonts/truetype/LiHei_Pro.ttf LiHei_Pro big-5
上面ttf字型位置及後面製作出來的字型名稱是看個人字型位置及想製作出的名稱而異
接著會產生LiHei_Pro-16.xinefont.gz , LiHei_Pro-20.xinefont.gz , LiHei_Pro-24.xinefont.gz
LiHei_Pro-32.xinefont.gz , LiHei_Pro-48.xinefont.gz , LiHei_Pro-64.xinefont.gz等六種大小的字型檔案
再丟到 /usr/share/xine/libxine1/fonts 就好;
接著編輯 ~/.gnome2/totem_config,修改底下部份:
# tiny small normal large very large huge
# 分別對應到剛剛的六個大小字型,
# 我全螢幕看電影感覺用 large 差不多
subtitles.separate.subtitle_size:large
# 這是字幕位置離最底端的距離,40 也差不多適合全螢幕
subtitles.separate.vertical_offset:40
# 這是剛剛自訂的字型名稱
subtitles.separate.font:LeHei_Pro
# 字型編碼
subtitles.separate.src_encoding:big-5
這樣就一切OK了喔!

2008年4月26日 星期六

ubuntu on Mac Mini (G4)

REF:
http://stephon.wordpress.com/2006/11/08/ubuntu-on-mac-mini-g4/
http://millenniumdark.blog.ubuntu.org.cn/2007/08/page/5/
https://player.helixcommunity.org/2005/downloads/
http://www1.mplayerhq.hu/MPlayer/releases/codecs/
http://www.ubuntu.org.tw/modules/newbb/viewtopic.php?topic_id=7273
http://tetralet.luna.com.tw/index.php?op=ViewArticle&articleId=72&blogId=1

設定MPlayer與其他的codecs

官網 的codecs link中抓for powerpc的codec

解壓縮以後, 丟到/usr/lib/win32底下,

realvideo部份, 到這裡抓檔解壓以後(

#apt-get install libstdc++5 libstdc++5-3.3-dev
#chmod +x realplay-10.0.5.756-linux-2.2-libc6-gcc32-powerpc.bin
#sudo ./realplay-10.0.5.756-linux-2.2-libc6-gcc32-powerpc.binsudo

), 只要把codecs目錄下的所有檔案也丟到/usr/lib/win32底下,

wmv部份, 參考jserv大的說明, 編完後同樣丟到/usr/lib/win32下.

基本上大部分的video都能看了.

=====================================

更快速的方式就是直接使用totem

讓系統自已找並自動抓相對映的codec,很方便

比較麻煩是是加字幕,小弟建議用可直接從xime-lib自已建立fonts或copy已有的

#apt-get install dpkg-dev
#apt-get source xine-lib
#cp ./xine-lib-1.1.4/misc/fonts/sans* /usr/share/xine/libxine1/fonts
#vi ~/.gnome2/totem_config

如下:
# tiny small normal large very large huge
# 分別對應到剛剛的六個大小字型,
# 我全螢幕看電影感覺用 large 差不多
subtitles.separate.subtitle_size:large
# 這是字幕位置離最底端的距離,40 也差不多適合全螢幕
subtitles.separate.vertical_offset:40
# 這是剛剛cp的字型名稱
subtitles.separate.font:sans
# 字型編碼
subtitles.separate.src_encoding:utf8
#可以使用iconv -f big-5 -t utf-8 xxx.big5.srt >xxx.utf8.srt 來轉.srt檔

=====================================

2008年4月17日 星期四

Shell 無知的雜記

字串變數比對
if [ "$A" =="$B" ] then
echo "ok"
fi

置換單字
echo "ABC" |tr "A" "R"

變數加總

times=0

until [ "$times" = 3 ];

do

echo "I love linux."

sleep 2

times=`expr $times + 1`

done



REF:http://b123.hlc.edu.tw/shellscript.htm

2008年4月16日 星期三

Ubuntu便民雜記

TAB 自動找可補的參數如 :make [按TAB] "出現可以補的參數"
#/etc/bash.bashrc
# enable bash completion in interactive shells
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
=============================================================

VirtualDub使用

REF:
http://club.ntpu.edu.tw/ntpuccc/lecture/vd2tmpg/index.htm
http://club.ntpu.edu.tw/ntpuccc/lecture/
VirtualDub直接輸出TMPGEnc編碼
北大卡漫社制作,相當細心的文件。

2008年4月15日 星期二

Win32截圖軟體-MWSnap, screen capture utility

臨事要用~~小工具,還不錯用唷!!
http://www.mirekw.com/winfreeware/mwsnap.html

GCC 函式追蹤功能

REF:
http://www.katdc.com/kosforum/download.htm
http://blog.linux.org.tw/~jserv/archives/001870.html
http://www-128.ibm.com/developerworks/cn/linux/l-graphvis/
http://www.study-area.org/cyril/opentools/opentools/gcc.html

透過 GCC Function instrumentation 的機制。該機制出現於 GCC 2.x
#include <stdio.h>
#define DUMP(func, call) \
printf("%s: func = %p, called by = %p\n", __FUNCTION__, func, call)

void __attribute__((__no_instrument_function__))
__cyg_profile_func_enter(void *this_func, void *call_site)
{
DUMP(this_func, call_site);
}
void __attribute__((__no_instrument_function__))
__cyg_profile_func_exit(void *this_func, void *call_site)
{
DUMP(this_func, call_site);
}

main()
{
puts("Hello World!");
return 0;
}
編譯與執行:
$ gcc -finstrument-functions hello.c -o hello
$ ./hello
__cyg_profile_func_enter: func = 0x8048468, called by = 0xb7e36ebc
Hello World!
__cyg_profile_func_exit: func = 0x8048468, called by = 0xb7e36ebc

2008年4月14日 星期一

Vertical Blanking Interval (VBI)

REF:http://chentravel.blogspot.com/2006/12/vertical-blanking-interval-vbi.html
垂直回掃期

我們通常收看的電視圖像是由電子槍發射的電子串高速轟擊顯像管上的螢光物質而產生的,電子串按從左至右,從上至下的方式掃瞄整 個屏幕,因為速度十分快,所以我們的眼睛感覺不到,當電子槍的掃瞄位置從左上角達到右下角時,必須由右下角回到左上角,開始下一次掃瞄,從右下角回到左上 角所花費的時間就是垂直回掃期,這一段時間對於設備來說是一個浪費,因此人們想了辦法來利用這一段時間,電視台可以利用這一時間發送一些不可顯示信息,如 果您使用過圖文電視(Teletext)您就會立刻明白,為什麼圖文電視卡要接收電視信號,電視卡可以解讀這一信息,而電視不能,這種信息就是利用垂直回掃期發送的,電視卡通 過RS-232端口將接收到的不可顯示信息傳送給計算機,由計算機加以處理,這就是圖文電視的原理,也就是說,電視台利用垂直回掃期發送一些不可顯示的信 息,而圖文電視卡將這種信息接收下來,經過解碼發送到計算機內由計算機處理。

這種信息傳送稱為VBI信息傳送,對於這種信息的傳送的一個 開放的國際標準,稱為北美基本圖文說明(North American Basic Teletext Specification,NABTS),它用於歐洲,南美和遠東地區,其它的標準還有WST,Gemstar和Nielsen。

2008年4月9日 星期三

ftp server: proftpd

~/sudo apt-get install proftpd
~/sudo /etc/init.d/proftpd start
standalone nor in inetd/xinetd
#記得要將自已的home設為根目錄
# chroot environment you would do this:
DefaultRoot ~

REF:
http://linux.vbird.org/linux_server/0410proftpd.php
http://gentoo-wiki.com/HOWTO_ProFTPD

2008年4月8日 星期二

Makefile 語法簡介

REF:
http://tetralet.luna.com.tw/index.php?op=ViewArticle&articleId=185
注意:
[1]
if [空白 -f foo空白 ]; then rm foo; fi
[2]
變數 $$i
for i in $(SUBDIRS); do
(cd $$i && make);
done



2008年4月7日 星期一

Makefile.am, Makefile.in, Makefile文件之間關係

REF:
http://cax.bloghi.com/2006/08/03/makefile-am-makefile-in-makefilea-a-a-e-a-c.html
http://www.ccw.com.cn/htm/app/linux/develop/01_7_25_7.asp



Makefile.am, Makefile.in, Makefile文件之間關係以及aclocal, automake, autoconf等命令作用的探究

aclocal # 產生 aclocal.m4
libtoolize --force
automake --add-missing # 根據Makefile.am生成Makefile.in
autoconf # 根據configure.in 生成configure
autoheader

為了弄清楚automake等一系列命令的作用,專門蒐集並閱讀了一些相關資料。並通過下面一個小例子,熟悉了一下這些GNU工具的使用:

例子:在/hello/目錄下創建一個hello.c文件,並編譯運行它:

#cd /hello/

(1) 編寫源文件hello.c:

include
int main(int argc, char** argv)
{
printf("Hello, GNU!n");
return 0;
}

(2) #autoscan
->生成 configure.scan 和 autoscan.log

(3) 將configure.scan 修改為 configure.in:

# Process this file with autoconf to produce a configure script.
AC_INIT(hello.c)
AM_INIT_AUTOMAKE(hello, 1.0)

# Checks for programs.
AC_PROG_CC

# Checks for library functions.
AC_OUTPUT(Makefile)

(4) #aclocal
->生成 aclocal.m4 和 autom4te.cache (生成aclocal.m4的過程中涉及到configure.in)

(5) #autoconf
->生成 configure (根據 configure.in, 和 aclocal.m4)

(6) 編寫Makefile.am:

AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.c

(7) #automake --add-missing
->生成 Makefile.in, depcomp, install-sh, 和 missing (根據 Makefile.am, 和 aclocal.m4)

(8) #./configure
->生成 Makefile, config.log, 和 config.status

2008年3月31日 星期一

核心進行開檔,讀檔與寫檔的程式作為範例

透過

oldfs=get_fs();

set_fs(KERNEL_DS);

把目前執行程式current可存取的記憶體範圍設定為4GB,這樣當Kernel-Mode的程式碼呼叫函式時,就可以存取目前在3-4GB記憶體範圍內核心程式碼所包含的參數. 在開檔動作之後,就可以透過filp->f_pos移動檔案指標,寫入檔案,與讀取檔案的動作,而且這些動作所帶入的參數都是位於核心所屬的記憶體範圍內(3GB-4GB).

REF:http://loda.zhupiter.com/LinuxProtectModeArch.htm

gcc -D__KERNEL__ -DMODULE -Wall -O2 -I/usr/include/linux -I/usr/src/linux/include -c kernel.c -o kernel.o
#include <linux/kernel.h>

#include <linux/module.h>

#include <linux/errno.h>

//

#include <asm/atomic.h>

#include <asm/processor.h>

#include <asm/uaccess.h>

#include <linux/file.h>

//

char buf[]="This is a kernel-mode file operation testing program";

char b_buf[128];

//

int init_module(void)

{

char filename[]="/linux.tmp";

struct file *filp;

int r;

mm_segment_t oldfs;

//

printk("\ninit_module\n\n");

//

oldfs=get_fs();

set_fs(KERNEL_DS);

filp=filp_open(filename,O_CREAT|O_RDWR,0777);

if(IS_ERR(filp))

{

printk("\nFile Open Error:%s\n",filename);

return 0;

}

if(!filp->f_op)

{

printk("\nFile Operation Method Error!!\n");

return 0;

}

//

printk("\nFile Offset Position:%xh\n",(unsigned)filp->f_pos);

r=filp->f_op->write(filp,buf,sizeof(buf),&filp->f_pos);

printk("\nWrite :%xh bytes Offset=%xh\n",r,(unsigned)filp->f_pos);

//

filp->f_pos=0x00;

r=filp->f_op->read(filp,b_buf,sizeof(b_buf),&filp->f_pos);

printk("\nRead %xh bytes %s\n",r,b_buf);

filp_close(filp,NULL);

set_fs(oldfs);

return 0;

}

//

void cleanup_module(void)

{

printk("\nclean_module\n\n");

}

2008年3月9日 星期日

PC上使用jffs2

製作jffs2 image
#mkfs.jffs2 -d /jffs2 -o /jffs2.img -l iVU

#/sbin/mtd.ready.sh
#!/bin/sh
modprobe mtdcore
modprobe jffs2
modprobe mtdram total_size=32768 erase_size=256
modprobe mtdchar
modprobe mtdblock

會產生/dev/mtd0 及/mtd/mtdblock0檔案
dd if=/jffs2.img of=/dev/mtd0
mount /dev/mtdblock0 /mnt


REF:http://martin-yang.blogspot.com/2007/04/pcjffs2-imagemount-jffs2loop-back.html

2008年3月5日 星期三

關掉吃效能的cidaemon

建議若是使用NT4/2000/XP系統的人,遇到PF檔使用量莫名激增,致使效能降低,無法恢復正常,可以試試看下面的方法。


CiDaemon.exe是WindowsNT4/2000/XP下的指引服務,它會預先讀取硬碟內所有的資料並作連結索引,簡單的說就是作超文 字連結,通常應該不會造成問題,但是在某些狀況下它會佔據大量記憶體及CPU處理序,此時可進入(WinNT4)控制台或是(Win2000/XP)系統 管理工具將它停掉。

或進入msconfig將它關掉,可是這個程式並不是放在startup裡面,它會不定時執行(我三次狀況,一次是結 束遊戲,一次是檢查磁碟錯誤之後,最後是重新灌備份的ghost檔之後重新啟動),因此沒有辦法用傳統 :rolleyes: 的方法關掉,我先找到TweakHound-調校最佳效能的地方找,終於讓我找到關於服務如何關閉,接著我看了BlackViper寫的有關於服務 (service)的網頁,他提到如何關掉索引(Indexing)的服務,在XP下(因為我用XP)有兩個方法:

1. 第一個是執行"services.msc",這樣就會開啟[服務]這個程式框,接著在右邊的的樹狀目錄找到"Indexing Service",按下滑鼠右鍵,選擇[內容],在[啟動類型]那邊選擇"已停用"就可以了。

2. 第二個就是到[程式集]中找[系統管理工具]的[元件服務],從中在選[服務(本機)]也可以。

REF:http://blog.pixnet.net/yunchii/post/835334

2008年3月3日 星期一

不定參數的 C 函式

只要寫過 C 程式的人,都用過 printf 這個函式,也都知道它可是一個
不定參數的函式,了解它的運作方式,你也可以實作自己的不定參數的
函式。
先看一下 printf 的原型:
int printf( const char *format [, argument]... );
在format後面的參數不但不定個數且型態也是不定的。
這些參數是one bye one 的堆在stack裡面。
printf這個函式如何正確的取出這些參數?
秘訣就在 format,函式根據format裡的格式("%d %f...")
依序把堆在stack裡的參數取出。而這取出的動作就是用到
va_arg, va_end, va_start這三個macro再加上va_list。
va_list 事實上是一個 char * 的型態:
typedef char * va_list;
其它的三個macro的例子(不同的平台會有不太一樣的macro)
/* A guess at the proper definitions for other platforms */
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )

這三個macro若看得懂,對了解它們的運作會很有幫助;看不太懂也沒關係
,看一下下面的說明也差不可以了。
首先 va_start 把取出的指標(va_list)指到第一個不定參數。
然後就可以用 va_arg 以指定的型態從va_list取出資料並把va_list
指標移到下一個位置(例如取走了一個int 4 bytes 的資料, va_list便會加 4)
當取完資料後便可使用 va_end 把 va_list 歸零(這個macro應看得懂吧)。
其實對大部份的應用來說 va_end 做不做是沒太大的關係的。

下面是一個不定參數函式的範例(轉載自MSDN):
int average( int first, ... )
{
int count = 0, sum = 0, i = first;
va_list marker;

va_start( marker, first ); /* Initialize variable arguments. */
while( i != -1 )
{
sum += i;
count++;
i = va_arg( marker, int);
}
va_end( marker ); /* Reset variable arguments. */
return( sum ? (sum / count) : 0 );
}

註:_INTSIZEOF 是 int size memory alignment,如果你不知那是什麼
  就把 _INTSIZEOF 看成這樣的定義會比較容易理解:
#define _INTSIZEOF(n) sizeof(n)
為什麼不直接用sizeof(n)就好了,使用 macro 是為了跨平台時能保持運
作正確。若傳了一個2 bytrs的不定參數(如 short),但在一個 32 bits的
平台推入堆疊就會是4個bytes(32 bits)不是2 bytes,所以參數的取出
就要非常的小心。使用_INTSIZEOF 在於保證引數指標移動的正確。

=================================================
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

這應屬概數問題吧!?
有n個蘋果,無條件進位取x的倍數,會是幾個蘋果?
A. (n+(x-1)) - ((n+(x-1))%x)
如果x是2的m次方(x=1,2,4,8...),那麼上面的A.公式可簡化為:
B. (n+(x-1)) & ~(x-1)
因為 :
令 N=(n+(x-1)) 那麼 A.公式可以說成
N減去N除以x的餘數
如果x是2的幾次方(1,2,4,8...),N減去N除以x的餘數可以寫成:
& ~(x-1)
why?
x=1-->N減去N除以1的餘數
= N & (0xFF..FF)
= N & ~(1-1)

x=2-->N減去N除以2的餘數
= N & (0xFF..FE)
= N & ~(2-1)

x=4-->N減去N除以4的餘數
= N & (0xFF..FC)
= N & ~(4-1)

::::::::::::::::::::::::::::::::::
最後把B.公式以 n代入sizeof(n), x代入sizeof(int)就得到
C. (sizeof(n)+(sizeof(int)-1)) & ~(sizeof(int)-1)
這個解釋是不是老太婆的纏腳布又臭又長?這是為什麼我沒在該篇文章
說明的原因。
_INTSIZEOF(n) 目的是要得到參數n無條件進位取sizeof(int)的倍數。
為什麼是無條件進位取sizeof(int)的倍數?因為這是一個較通用版本的
macro,一般的編譯器的定的int 型態的大小和堆疊存取的單位是相同的
(但不是絕對的,所以才又有特殊版本)

REF:http://ehome.hifly.to/showthread.php?s=&threadid=329

2008年3月2日 星期日

diff 與 patch

使用 diff 來產生新舊兩個 source tree(source code directory tree) 的差異性列表有助於比較前後的差異(修改、增減),另外還可以提供較精簡的源碼更新,後者就需要 patch 這支工具配合。

我習慣用下面的命令來產生 diff 檔:
diff -ruN DirA DirB > xx.diff

上述產生的 xx.diff 若是由其他人拿到要更新(同步)源碼的話, 只需要切換到產生 diff 的同目錄(可以看到 DirA 的那一層)再下: patch -p0 <> 即可。或者像我的話比較喜歡切換到 DirA 目錄下 patch -p1 < ../xx.diff 這樣較不會有混淆的狀況。

至於 diff 與 patch 的選項請自行參考說明文件。若是在 M$ OS 下,建議安裝 cygwin,它可以說是讓你在 M$ OS 下具有眾多 Linux 工具的最佳解決方案。

REF:http://wadefs.blogspot.com/2007/05/diff-patch.html

2008年2月28日 星期四

Linux Shell腳本Ldd命令原理及使用方法

1、首先ldd不是一個可執行程式,而只是一個shell腳本

2、 ldd能夠顯示可執行模組的dependency,其原理是通過設置一系列的環境變數,如下:LD_TRACE_LOADED_OBJECTS、 LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。當 LD_TRACE_LOADED_OBJECTS環境變數不為空時,任何可執行程式在運行時,它都會只顯示模組的dependency,而程式並不真正執 行。要不你可以在shell終端測試一下,如下:

(1) export LD_TRACE_LOADED_OBJECTS=1

(2) 再執行任何的程式,如ls等,看看程式的運行結果

3、ldd顯示可執行模組的dependency的工作原理,其實質是通過ld-linux.so(elf動態庫的裝載

器)來實現的。我們知道,ld-linux.so模組會先於executable模組程式工作,並獲得控制權,因此當上述的那些環境變數被設置時,ld-linux.so選擇了顯示可執行模組的dependency。

4、實際上可以直接執行ld-linux.so模組,如:/lib/ld-linux.so.2 --list program(這相當於ldd program)

ldd命令使用方法(摘自ldd --help)


REF:http://hon0612.blogspot.com/2007/09/linux-shellldd.html

2008年2月26日 星期二

SVN 基本指令教學

SVN 基本功能:

Import: 將整個 project_directory 的資料 import 進 svn 裡面

  • svn import project_directory http://DOMAIN/svn_project
  • svn import project_directory file:///SVN_PATH/svn_project

Checkout: (checkout 可簡寫成 co), 將資料 checkout 回來

  • svn co http://SVN_PATH/svn_project
  • svn co file:///SVN_PATH/svn_project
  • svn co -r 12 file:///var/lib/svn/dev/projects # 出第12版的 projcets code

List: (list 可簡寫成 ls), 看上面有哪些檔案/資料

  • svn ls http://SVN_PATH/svn_project
  • svn ls file:///SVN_PATH/svn_project

Update: (update 可簡寫成 up), 將目前資訊更新成 SVN 線上最新版本.

  • SVN_CHECKOUT_DIR$ svn up
Commit: (commit 可簡寫成 ci), 將目前所做的修改 commit 回 svn
  • SVN_CHECKOUT_DIR$ svn ci
Status: (status 可簡寫成 st), 看目前檔案/結構 跟 SVN 線上的版本有哪些不同
  • SVN_CHECKOUT_DIR$ svn st
Add: 將此 檔案/目錄 新增進 svn
  • SVN_CHECKOUT_DIR$ svn add filename 或 svn add directory
MV: 改檔名, 並且此檔案之前紀錄還要繼續留下
  • SVN_CHECKOUT_DIR$ svn mv filename new_filename
Revert: 還原這次的修改, 回到前一版的檔案狀態(未 commit 前可用)
  • SVN_CHECKOUT_DIR$ svn revert [file | directory]

SVN 檔案狀態資訊:

  • ?: 此檔案不存在 SVN 裡面
  • A: 此次新增的檔案
  • C: 此檔案已經有人改過, 合併不成功, 需要人工介入
  • D: 此次移除的檔案
  • M: 此檔案有修改過
  • U: 此檔案有被更新過
REF:http://plog.longwin.com.tw/my_note-programming/2007/07/10/svn_tutorial_2007

2008年2月24日 星期日

Ubuntu's Runlevel

Ubuntu 不採用inittab 管理方式
而採用upstart
來啟用或停止
(但還是可以用inittab這種方式來設定)
Upstart 設定檔: /etc/event.d
Ubuntu Default Runlevel= 2
如何在commendline底下切換level
sudo init 0 進入runlevel 0 等於關機
sudo init 6 進入runlevel 6 重新開機
在每一個/etc/rcX.d/ X=0~6
S開頭的是開機會執行,後面數字為順序
K開頭的是依數字大小關閉程式 通常k開頭的只會在rc0.d or rc6.d
如果有k與s開頭 就會先把k開頭跑完在跑s開頭
可重建立一個
/etc/inittab 來測試:
id:2:initdefault: 2

REF:http://ku777.blogspot.com/2007/10/ubuntu-runlevel.html

2008年2月21日 星期四

Hello, world!

I am on the intarweb!

south park &harry potter

Lego 300

HDD/Network performance testing

*********************************
HDD
*********************************
1.hdparm
hdparm -Tt /dev/sda

2.The Flexible Filesystem Benchmark (FFSB)
http://sourceforge.net/projects/ffsb/
~/ tar xzvf ffsb-5.2.1.tar.gz
~/configure
To edit Makefile
CC=arm-linux-gcc
~/ make

*********************************
Network
*********************************
IxChariot(console/endpoint):
http://www.ixiacom.com/products/performance_applications/pa_display.php?skey=pa_ixchariot
http://www.ixiacom.com/support/endpoint_library/embedded_endpoints

2008年2月20日 星期三

vim +taglist

下載taglist:
http://vim.sourceforge.net/scripts/script.php?script_id=273
解開taglist.vim至~/.vim/plugin下

修改.vimrc的配置如下

” FOR Tlist
let Tlist_Ctags_Cmd = “/usr/local/bin/exctags” ” FOR BSD
let Tlist_Auto_Open=1 ” 開啟vim/gvim 的時自動打開 Tlist
let Tlist_Auto_Update=1 ” 自動更新目前的 tag 列表
let Tlist_Enable_Fold_Column=1
let Tlist_Sort_Type = “name” ” 顯示的 tag 排序方式:name/order
let Tlist_WinWidth = 30 ” Tlist 視窗的寬度
let Tlist_Show_One_File = 0 ” 是否只顯示目前文件的 tag
let Tlist_Exit_OnlyWindow = 1 ” 關閉打開的文件的同時,也關閉taglist視窗
let Tlist_Use_SingleClick = 1
map :Tlist: “按F8 自動打開Tlist
map :wincmd p “兩個視窗切換

REF:http://blog.johnpupu.tw/?p=125