tag:blogger.com,1999:blog-328420462024-02-19T23:50:08.189+08:00lazyf's den : A Personal WeblogThe personal weblog about lazyf, including chat, news, computer technology, and blah blah about me (in Traditional Chinese).Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.comBlogger122125tag:blogger.com,1999:blog-32842046.post-10245602230195084492013-02-20T23:05:00.003+08:002013-02-20T23:34:38.012+08:00[技術] Build GDB for Linux ARM platformNote for building ARM GDB & GDB Server tools.<br />
<br />
gdb part:
<pre class="prettyprint">$cd gdb-7.4.1
$./configure --host=x86_64-linux-gnu --target=arm-linux \
--with-expat=yes \
CC=/usr/bin/cc \
CXX=/usr/bin/c++ \
AR=/usr/bin/ar \
AS=/usr/bin/as \
LD=/usr/bin/ld \
NM=/usr/bin/nm \
RANLIB=/usr/bin/ranlib \
STRIP=/usr/bin/strip \
OBJCOPY=/usr/bin/objcopy \
OBJDUMP=/usr/bin/objdump \
READELF=/usr/bin/readelf \
CC_FOR_TARGET=${CROSS_TOOL}gcc \
CXX_FOR_TARGET=${CROSS_TOOL}c++ \
AR_FOR_TARGET=${CROSS_TOOL}ar \
LD_FOR_TARGET=${CROSS_TOOL}ld \
NM_FOR_TARGET=${CROSS_TOOL}nm \
OBJDUMP_FOR_TARGET=${CROSS_TOOL}objdump \
RANLIB_FOR_TARGET=${CROSS_TOOL}ranlib \
READELF_FOR_TARGET=${CROSS_TOOL}readelf \
STRIP_FOR_TARGET=${CROSS_TOOL}strip
$make</pre>
<br />
gdbserver part:
<pre class="prettyprint">$cd gdb/gdbserver
$./configure --host=arm-linux \
CC=${CROSS_TOOL}gcc \
CXX=${CROSS_TOOL}c++ \
AR=${CROSS_TOOL}ar \
LD=${CROSS_TOOL}ld \
NM=${CROSS_TOOL}nm \
OBJDUMP=${CROSS_TOOL}objdump \
RANLIB=${CROSS_TOOL}ranlib \
READELF=${CROSS_TOOL}readelf \
STRIP=${CROSS_TOOL}strip
$make</pre>Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-69959937260259367042011-07-02T23:31:00.001+08:002011-07-02T23:32:27.272+08:00[技術] Milestone 刷機步驟整理一般來說,刷機步驟如下:<br />
1. 進入Recovery Mode。<br />
2. 啟動Open Recovery。<br />
3. 從OpenRecovery裡安裝ROM與Google Apps。<br />
4. wipe & Reboot。<br />
<br />
一般來說,Milestone要刷機主要是透過Open Recovery來幫忙,<br />
使用Open Recovery幫我們省掉不少的麻煩與風險。<br />
要使用Open Recovery,我們要先能進Recovery Mode才行。<br />
如果Milestone進不去Recovery Mode,那請先到<a href="http://and-developers.com/sbf">http://and-developers.com/sbf</a><br />
抓一版官方版的ROM,使用SBF燒錄進去,再安裝Vulnerable Recovery SBF Flash即可。<br />
<br />
接著把Open Recovery的解開,全部放到記憶卡中,長這樣:<br />
/SDCARD/OpenRecovery 和 /SDCARD/update.zip。<br />
然後把ROM檔與Google Apps也放到/SDCARD/OpenRecovery/updates裡.<br />
<br />
再來按著X開機,等到三角型圖示出來,按著音量鍵上+相機鍵進入Recovery Mode,<br />
若已經是CM的ROM,可以直接用Reboot -> Recovery進去Recovery Mode,<br />
進去後選Apply update.zip就可以進到Open Recovery。<br />
<br />
在Open Recovery裡和剛才一樣,選Apply Update,然後選ROM檔安裝,<br />
接著再選Google Apps安裝。<br />
<br />
都裝完後記得要wipe,按下Go back,分別執行三個選項:<br />
Wipe Dalvik Cache、Wipe Data/Factory Reset、Wipe Cache Partition,<br />
這三個步驟俗稱3Wipe,在刷機完後都一定要清除所有的個人資料,以便新系統穩定。Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-51060566990912480822011-03-24T00:32:00.001+08:002011-03-24T00:33:06.601+08:00[技術] PGP & GnuPG最近需要和國外的客戶合作,<br />
期間有用到PGP的加密來傳送機密文件,用的就是PGP。<br />
PGP是一種混合密碼系統,它結合了傳統密碼法和公開金鑰密碼法的多種最棒的特色。 <br />
<br />
在加密時,PGP會產生一個階段金鑰,這把階段金鑰是一種只有當時有效的秘密金鑰,<br />
是利用任意的滑鼠移動以及鍵盤輸入所產生的亂數。<br />
它以非常秘密而快速的傳統加密演算法來加密純文字,而產生出密文。<br />
當資料加密完成後,這把階段金鑰接著就會開始以收信者的公鑰被加密。<br />
這個被公鑰加密過的階段金鑰將會與密文一併交付給收信者。<br />
<br />
解密的過程就是反向運作了。<br />
收信者的PGP會利用他的私鑰來還原那把暫時的階段金鑰,<br />
然後PGP再利用這把階段金鑰來將傳統加密過的密文解密。<br />
<br />
在此我用的是Gnu所提供的GnuPG,<br />
GnuPG是GNU由RFC4880所訂出來的OpenPGP的實做。<br />
以下是GnuPG在使用上的說明。<br />
<br />
1. 產生鑰匙: <br />
<br />
gpg --gen-key<br />
<br />
一開始一定沒有自己的一對公私鑰,我們可以透過--gen-key來產生。<br />
<br />
2. 輸出鑰匙: <br />
<br />
gpg -a -o [Filename] --export [USERID]<br />
<br />
其中-a是指輸出成ASCII格式,-o則是指定輸出到檔案,<br />
--export則是將[USERID]的公鑰輸出。<br />
一般我們是將一開始產生出來的公私鑰的公鑰export出檔案來,<br />
然後就可以將公鑰傳送給別人了。<br />
<br />
3. 輸入鑰匙<br />
<br />
gpg --import [Filename]<br />
<br />
當你收到一把別人的公鑰(或好幾把公鑰)時,為了能使用它們,<br />
你得把它們加進你的鑰匙數據庫。<br />
<br />
4. 列出公鑰<br />
<br />
gpg --list-keys<br />
<br />
5. 列出私鑰<br />
<br />
gpg --list-secret-keys<br />
<br />
6. 刪除公鑰<br />
<br />
gpg --delete-key [USERID]<br />
<br />
7. 刪除私鑰<br />
<br />
gpg --delete-secret-key [USERID]<br />
<br />
8. 鑰匙簽名<br />
<br />
gpg --sign-key [USERID]<br />
<br />
PGP在使用上有一個最大的弱點,那就是公鑰的真實性問題。<br />
如果用的是錯誤的公鑰,你加密的價值就全沒了。<br />
要克服這種風險,必須確信這把鑰匙是真實的,並在上面簽名,<br />
簽名就表示承認鑰匙上的用戶身份確實是這把鑰匙的主人。<br />
<br />
9. 加密<br />
<br />
gpg -r [Recipient] -e [filename]<br />
<br />
系統會用[Recipient]的公鑰對[filename]這個檔案加密,<br />
並產生出[filename].pgp檔來。<br />
這樣[Recipient]即可用自己的私鑰進行解密的動作,<br />
還原出檔案來。<br />
<br />
10. 解密<br />
<br />
gpg -d [filename].pgp<br />
<br />
當你收到別人用你的公鑰加密的檔案時,即可用-d來進行解密,<br />
還原出檔案來。Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-30365936692745435292011-03-19T00:18:00.005+08:002011-03-19T00:22:24.990+08:00[技術] Boost C++ Libraries的shared_ptrRef: <a href="http://msnlite.org/thread-365-1-1.html">http://msnlite.org/thread-365-1-1.html</a><br />
<br />
C++是使用pointer來靈活方便地控制memory與instance的,這是它強大的原因之一,<br />
但它缺乏像Java一樣的Garbage Collector機制來回收instance,<br />
因此Programmer必須要自己手動delete掉new出來的instance。<br />
<br />
這在軟體規模小的時候還好,但在規模大、多人協同工作、多線程環境加入時,<br />
往往memory與instance的分配和釋放變的越來越難控制。<br />
<br />
因此Boost C++ Libraries提供了shared_ptr,<br />
shared_ptr實際上是一個Template Class,<br />
透過instance成不同Class,為Class提供Pointer操作。<br />
<br />
例如:<pre class="prettyprint">shared_ptr<int> p1(new int);
shared_ptr<int> p2=p1;</pre><br />
這樣p1和p2都可以point到int。<br />
shared_ptr Class內有2個variable,一個是原始pointer,<br />
可以用get()取得,用reset(T* p)可以重新設置。<br />
另一個是instance的引用次數,其值可以用use_count()獲得。<br />
它會隨著引用的shared_ptr來增加,當shared_ptr銷毀時,<br />
引用次數也會減少,當減少到0時,shared_ptr會呼叫delete function來delete instance。<br />
<br />
使用方法:<pre class="prettyprint">shared_ptr<Object> p1(new Object); //Use constructor
shared_ptr<Object> p2=p1; //assign
shared_ptr<Object> p3.reset(p1); //reset function
p1.reset(); //放棄引用</pre><br />
另外shared_ptr也可以配合malloc()來使用,但這樣point到的空間沒辦法被正常釋放掉,<br />
必須額外定義delete function才行,malloc()的delete function即為free()。<br />
所以使用如下:<pre class="prettyprint">shared_ptr p(malloc(100),free);</pre><br />
最後,我想坦白說句我心理的話: "C++搞成這樣,實在只是讓人覺得更難用而已。= ="Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-54273362067132610062011-02-22T15:25:00.004+08:002011-02-22T15:29:57.661+08:00[技術] SquashFS其實Squashfs已經用一陣子了,在用它之前是使用initramfs。<br />
和initramfs相比,Squashfs較不佔記憶體的空間,<br />
因為它是可以跑在mtd上的唯讀型壓縮檔案系統。<br />
但也因為是唯讀的,所以在使用上仍需另外配置ramfs來提供Linux使用。<br />
另外,initramfs和Kernel是包成同一個image的,而Squashfs是分開的。<br />
<br />
Squashfs是一套供Linux核心使用的GPL開源唯讀壓縮檔案系統。<br />
Squashfs能夠為檔案系統內的檔案、inode及目錄結構進行壓縮,<br />
並支援最大1024千位元組的區段,以提供更大的壓縮比,<br />
標準版的Squashfs採用gzip的數據壓縮。<br />
<br />
Squashfs可以至<a href="http://squashfs.sourceforge.net/">http://squashfs.sourceforge.net/</a>下載。<br />
<br />
目前最新的是4.1版,是提供給Linux Kernel 2.6.29版本使用。<br />
若使用較舊版本的Linux Kernel,請改用3.4版本。<br />
<br />
以下是安裝Note,寫的有點亂,請見諒。<br />
另外可以參考<a href="http://tldp.org/HOWTO/html_single/SquashFS-HOWTO/">SquashFS HOWTO</a>。<br />
<br />
1. 裝Linux Kernel上SquashFS patch。<br />
# cd /opt/linux-2.6.xx<br />
# patch -p1 < /opt/squashfs/kernel-patches/linux-2.6.xx/squashfs3.4-patch<br />
<br />
2. 修改MTD配置,在Flash上配置出Kernel和Squashfs的partition出來。<br />
(在此共切4個Partition,分別是0-Bootloader, 1-Kernel, 2-Rootfs, 3-Other)<br />
若已經調整好或是使用類似Redboot的fis,可跳過這段。<br />
<br />
3. 編Linux Kernel。<br />
# make distclean<br />
# make mrproper<br />
# make menuconfig<br />
在File systems->Miscellaneous file systems將Squashed filesystem啟動(bundled with the kernel)。<br />
# make<br />
<br />
4. 編出SquashFS tools (mksquashfs)。<br />
# cd /opt/squashfs/squashfs-tools<br />
# make<br />
<br />
5. 將root file system透過mksquashfs來產生image。<br />
# mksquashfs ./root_file_system rootfs.bin<br />
<br />
6. 在Loader上用tftp把rootfs.bin載入後燒錄到Partition Rootfs對應在Flash上的Address。<br />
e.g. # flash 0x00100000 0x80100000 <file_size><br />
<br />
7. 修改kernel command line。<br />
請改成 "console=ttyS0 root=/dev/mtdblock2 rootfstype=squashfs"<br />
<br />
PS1: <br />
在root file system裡的/etc/fstab裡可加入<br />
ramfs /tmp ramfs defaults 0 0,避免Linux無寫入的File System可以使用。<br />
<br />
PS2: <br />
配合mtd,在Linux下亦可以透過mtd tools直接upgrade root file system。<br />
# flash_eraseall /dev/mtd2<br />
# flashcp -v rootfs.bin /dev/mtd2Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-86250990411516572812011-02-22T14:16:00.000+08:002011-02-22T14:16:27.357+08:00[技術] Dropbear - 輕量化SSH Server and Client最近工作上需要在嵌入式系統中加入SSH Server,本來是要使用OpenSSH,<br />
但Code size差太大(1.4M vs 170K),於是改用了Dropbear。<br />
<br />
載點: <a href="http://matt.ucc.asn.au/dropbear/dropbear.html">http://matt.ucc.asn.au/dropbear/dropbear.html</a><br />
<br />
以下是安裝方法:<br />
<br />
# ./configure --host=mips-linux --disable-zlib<br />
# make<br />
<br />
編譯完後會產生出以下的執行檔:<br />
<br />
1. dropbear : SSH Server<br />
2. dbclient : SSH Client<br />
3. dropbearkey : Key Generator<br />
4. dropbearconvert : OpenSSH Key Convertor<br />
<br />
在使用上記得要有host key,才能執行dropbear,沒有的要請透過dropbearkey來產生。<br />
<br />
# dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key<br />
# dropbearYu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-40744521146211024932011-01-31T11:55:00.001+08:002011-01-31T12:00:38.236+08:00[技術] CVS相關指令距離上次使用CVS已經是大學時代了,<br />
後來都是改用subversion來處理Version Control。<br />
現在工作上又需要用到CVS,整理一下當成備忘吧。<br />
<br />
1. 設定 CVSROOT<br />
$ export CVSROOT=:pserver:id@cvs.server:/var/cvsroot<br />
<br />
2. 下載原始碼 (checkout)<br />
$ cvs login<br />
CVS password: (在這裡輸入密碼)<br />
<br />
$ cvs -z5 co <module_name><br />
<br />
3. 更新原始碼 (update)<br />
$ cvs update -dP<br />
<br />
4. 提交修改 (commit)<br />
$ cvs commit<br />
<br />
5. 新增目錄 (add)<br />
$ mkdir foo<br />
$ cvs add foo<br />
<br />
6. 新增檔案 (add)<br />
$ cvs add myfile.c<br />
<br />
7. 遞迴新增目錄<br />
由於cvs在這方面不像svn一樣,直接對主目錄做add就好。<br />
它要先將目錄先add後才能對檔案做add。<br />
$ find <folder_name> -type d -print | grep -v CVS | xargs cvs add<br />
$ find <folder_name> -type f -print | grep -v CVS | xargs cvs add<br />
<br />
8. 移除檔案 (remove)<br />
$ rm myoldfile.c<br />
$ cvs remove myoldfile.c<br />
<br />
9. 移除目錄 (remove)<br />
$ rm *.c<br />
$ cvs remove<br />
$ cvs commit<br />
$ cd ..<br />
$ cvs remove mydir<br />
$ rm -rf mydir<br />
<br />
10. .cvsrc 檔案<br />
設定一系列 cvs 命令有用的參數,建議如下:<br />
cvs -q<br />
diff -u -b -B<br />
checkout -P<br />
update -d -PYu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-7025732358372300752011-01-21T20:48:00.002+08:002011-01-21T20:52:22.205+08:00[閒聊] 我退伍啦就在今天2011/01/21,我退伍啦。<br />下禮拜就是新的挑戰的開始了,Hala Lazyf。Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-33302153788994213782011-01-12T12:41:00.004+08:002011-01-12T12:49:24.380+08:00[技術] 在Linux上用C撰寫RS-232通訊程式最近工作上玩到的,總結一下當Note吧。<br />主要是Ref: <a href="http://www.easysw.com/~mike/serial/serial.html">Serial Programming Guide for POSIX Operating Systems</a>。<br />配合pthread把收跟送的部份分開,<br />以下是收的部份。<br /><pre class="prettyprint">struct tty_q {<br /> int len;<br /> unsigned char buff[TTY_Q_SZ]; /* TTY_Q_SZ=1024 */<br />} tty_q;<br /><br />int tty_fd;<br />pthread_mutex_t tty_mutex;<br /><br />void * rs232com(void *arg) {<br /><br /> int c=0, len;<br /> struct termios oldtio, newtio;<br /> char buf[256];<br /><br /> pthread_detach(pthread_self());<br /> pthread_mutex_init(&tty_mutex, NULL);<br /><br /> /* Open the rs232 port */<br /> tty_fd = open(TTYDEVICE, O_RDWR|O_NOCTTY);<br /> if (tty_fd < 0) {<br /> perror(TTYDEVICE);<br /> exit(1);<br /> }<br /><br /> /* Get the current options */<br /> tcgetattr(tty_fd, &oldtio);<br /><br /> /* Set new options */<br /> bzero(&newtio, sizeof(newtio));<br /> newtio.c_cflag = BAUDRATE|CS8|CLOCAL|CREAD;<br /> newtio.c_iflag = IGNPAR;<br /> newtio.c_oflag = 0;<br /> newtio.c_lflag = ICANON;<br /> <br /> /* Set the options */<br /> tcflush(tty_fd, TCIFLUSH);<br /> tcsetattr(tty_fd, TCSANOW, &newtio);<br /><br /> while(1) {<br /> len = read(tty_fd, buf, 255);<br /> buf[len]=0;<br /><br /> MCP_LOG("RS-232 recv, len=%03d, buf=%s\n", len, buf);<br /><br /> pthread_mutex_lock(&tty_mutex);<br /><br /> if(tty_q.len + len > TTY_Q_SZ) {<br /> memset(tty_q.buff, 0, TTY_Q_SZ);<br /> tty_q.len = 0;<br /> }<br /><br /> memcpy(&tty_q.buff[tty_q.len], buf, len);<br /> tty_q.len += len;<br /><br /> pthread_mutex_unlock(&tty_mutex);<br /> }<br />}</pre><br />而送的部份在這裡。<br /><pre class="prettyprint">int rs232send(U8 * buf) {<br /><br /> pthread_mutex_lock(&tty_mutex);<br /><br /> memset(tty_q.buff, 0, TTY_Q_SZ);<br /> tty_q.len = 0;<br /><br /> pthread_mutex_unlock(&tty_mutex);<br /><br /> return write(tty_fd, buf, strlen(buf));<br /><br />}</pre>Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-83719992172907336782010-12-03T09:59:00.009+08:002010-12-06T14:38:56.972+08:00[技術] FreeBSD上安裝Apache + subversion + LDAP(AD Server)最近公司的svn server一整個狂當機,於是決定換一台電腦當Server,<br />除了repository的轉移外,也把OS從XP換到FreeBSD。<br /><br />以下是安裝的一些過程。<br /><br />1. 安裝FreeBSD<br />這個安裝就不寫了,有興趣的人可以參考 FreeBSD Handbook。<br /><br />2. 安裝Apache<br />使用ports安裝,由於我們需要透過LDAP來認證使用者,<br />所以在安裝時記得把LDAP和AUTHNZ_LDAP選項勾選起來,<br />而在Apache安裝的過程中,會先安裝apr1套件,<br />此時也記得把LDAP選項勾選起來。<br /><pre class="prettyprint"># cd /usr/ports/www/apache22<br /># make WITH_LDAP_MODULES=yes all install clean</pre><br /><br />3. 安裝Subversion<br /><pre class="prettyprint"># cd /usr/ports/devel/subversion<br /># make -DWITH_SVNSERVE_WRAPPER -DWITH_MOD_DAV_SVN -DWITH_APACHE2_APR install clean</pre><br /><br />4. 設定Apache<br />先確認/usr/local/etc/apache22/httpd.conf裡有以下內容。<br /><pre class="prettyprint">LoadModule dav_module libexec/apache22/mod_dav.so<br />LoadModule dav_svn_module libexec/apache22/mod_dav_svn.so<br />LoadModule authz_svn_module libexec/apache22/mod_authz_svn.so<br />LoadModule ldap_module libexec/apache22/mod_ldap.so<br />LoadModule authnz_ldap_module libexec/apache22/mod_authnz_ldap.so</pre><br /><br />接著編輯/usr/local/etc/apache22/Includes/svn.conf。<br /><pre class="prettyprint"> <Location /svn></pre><pre class="prettyprint">DAV svn<br />SVNParentPath /svn_repos<br />SVNListParentPath on<br /><br /># our access control policy<br />#AuthzSVNAccessFile /svn_repos/svn-access-file<br /><br />AuthType Basic<br />AuthName "Subversion repository"<br /><br /># Make LDAP the authentication mechanism<br />AuthBasicProvider ldap<br /><br /># Make LDAP authentication is final<br />AuthzLDAPAuthoritative on<br />AuthLDAPBindDN "CN=svn,CN=Users,DC=blahblah,DC=com"<br />AuthLDAPBindPassword "xxxxxxxx"<br />AuthLDAPURL "ldap://ldap-server/CN=Users,DC=blahblah,DC=com?sAMAccountName?sub?(objectClass=*)"<br />Require valid-user</pre><pre class="prettyprint"></Location></pre><br /><br />接著編輯/etc/rc.conf,把apache22_enable="YES"加入。最後啟動apache。<br /><pre class="prettyprint"># /usr/local/etc/rc.d/apache22 start</pre><br /><br />5. 建立SVN Repository目錄<br /><pre class="prettyprint"># mkdir -p /svn_repos<br /># chown -R www /svn_repos</pre><br /><br />6. 轉移SVN Repository<br />首先在windows下使用舊版的svnadmin將repository db檔dump出來。<br /><pre class="prettyprint">D:\SVN>svnadmin dump repos > repos.dump</pre><br />接著將repos.dump丟到FreeBSD下,再使用新版的svnadmin將dump檔load回去。<br /><pre class="prettyprint"># svnadmin create repos<br /># svnadmin load repos < repos.dump</pre><br /><br />若repository很多的話,可以透過以下的perl script幫忙。<br /><pre class="prettyprint"># cat > load.pl<br />foreach (@ARGV) {<br /> s/.dump//;<br /> print "Loading $_ repository.\n";<br /> system "svnadmin create $_";<br /> system "svnadmin load $_ < $_.dump";<br />}<br />^D<br /># perl load.pl *.dump</pre><br /><br />7. 建立定期備份的crontab<br />這裡我使用了crontab+perl script來進行每周日的早上4點進行備份的動作,<br />備份檔保留60天,超過的備份檔會被移除。<br /><pre class="prettyprint"># mkdir -p /svn_backup<br /># cat > /svn_backup/backup.pl<br />#!/usr/bin/perl<br /><br /># Get date information<br />($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);<br />$year += 1900;<br />$Month += 1;<br />$file_name = sprintf "/svn_backup/svn-%04d%02d%02d.tgz", $year, $mon, $mday;<br /><br /># Do backup<br />system "/usr/local/etc/rc.d/apache22 stop"; # Stop apache<br />chdir "/svn_repos/";<br />system "tar zcvf $file_name *";<br />system "/usr/local/etc/rc.d/apache22 start"; # Start apache<br /><br /># Remove old backup file<br />chdir "/svn_backup/";<br />@tgz_files = glob "*.tgz";<br />foreach $file (@tgz_files) {<br /> unlink $file if -M $file > 60;<br />}<br />^D<br /># chmod +x /svn_backup/backup.pl<br /># crontab -e<br />0 4 * * 0 /svn_backup/backup.pl</pre>Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-27355591558018075892010-10-30T00:27:00.003+08:002010-11-08T11:02:12.290+08:00[技術] Milestone + mCool299 + TransProxy我一聽到mCool有支援Skype, 今天就跑去申請了mCool 299,<br />申請好後, 也請中華電信把internet APN關掉, 並在Milestone上設定:<br /> APN: emome<br /> Proxy: 10.1.1.1<br /> Port: 8080<br />一如預期, 設定好後WWW, GMail, Skype都OK, <br />但是Market, Maps, YouTube都不行.<br /><br />後來想了解一下為什麼, 於是Google了一個晚上, <br />發現似乎是Android只有Browser會走APN的proxy.<br />其他的App好像傻了一樣, 都直接連線, 難怪Android+mCool會有些App不能用.<br />能用的都是中華電信特別開出來的才能用, 搞得好像Android用的mCool是被閹割過似的.<br /><br />沒關係, App不走Proxy, 那就找方法強制它走Proxy.<br />在XDA-Developers上有個人有wifi環境需要走proxy才能用的問題,<br />於是就去抓了transproxy並配合iptables和voila完成了transparent proxy的功能.<br />最後還把它打包成APK給大家下載使用, 真是佛心來的.<br />網址如下: <a href="http://forum.xda-developers.com/showthread.php?t=766569">http://forum.xda-developers.com/showthread.php?t=766569</a><br /><br />安裝上, 先確認Milestone要先ROOT過, 並且先斷線.<br />我是抓TransProxy2.04.apk回來安裝,<br />安裝時還遇到找不到iptable的問題,<br />於是先到<a href="http://code.google.com/p/cmwrap/downloads/list">http://code.google.com/p/cmwrap/downloads/list</a>抓回來放在/system/bin下.<br />安裝完後, 執行它, 在設定裡選HTTP, 10.1.1.1, 8080, 開啟.<br />設定完再重新連線, 以上設定中有錯誤發生, 請重開機試試吧.<br />最後把Market或Maps打開試看看, 你就會發現都可以用了.<br /><br />PS1: 因為這是transparent proxy, 所以當你要用wifi不走mCool時, 請關掉, 不然你會不能用. XD<br /><br />PS2: 其實emome說mCool不能當數據機給NB上網, 但配合wireless tether+NB的Proxy似乎.... 嘿嘿.Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com1tag:blogger.com,1999:blog-32842046.post-1221274828240979212010-09-23T00:23:00.007+08:002010-09-23T00:40:35.992+08:00[技術] SDRAM研究心得唉,只能說大學老師教的時候沒學好。<br />導致現在要和SDRAM打交道時被它欺負啊 >__<~。<br />以下主要是參考<a href="http://www.eetop.cn/bbs/thread-57279-1-1.html">http://www.eetop.cn/bbs/thread-57279-1-1.html</a><br />後而寫出來覺得有用到的心得,就當做個記錄吧。<br /><br />一. 基本結構<br /> 1. Physical Bank<br /> 在CPU的Memory system中,為確保CPU的正常運作,讀寫時必須一次將整個data bus的位寬的data進行傳輸。也就是說Memory Chip與CPU之間必須以此位寬來進行傳輸,此位寬稱為Physical Bank的位寬。簡稱P-Bank或Rank。<br /><br /> 2. Chip bit width<br /> 由上文得知,Memory System必須組成一個P-Bank的位寬才能使CPU正常運作。加上Memory Chip也有自己的bit width,也就是每次傳輸所能提供的data量。所以在使用上會把數個Memory Chip組合成一個P-Bank的bit width來使用。<br /> 例如: CPU的data bus的bit width為64-bit,SDRAM為16-bit,所以需要4顆(4x16=64bit)。<br /> 當然,理論上可以實做出64-bit的bit width的SDRAM Chip,但因成本與實用性方面的考良,一般不太會這樣用。<br /><br />二. SDRAM的內部結構<br /> 1. Logical Bank與Chip bit width<br /> SDRAM內部是由儲存陣列所組成,這個儲存陣列就像一個表格(Table)一樣,先指定好行(Row),再指定列(Column),我們就可以準確地找到所需要的欄位(Field),這就是memory chip addressing的基本原理,這種Row-Column定址的方式稱為Multiplexing。對於Memory來說,這個Field我們稱為儲存單元(Cell),也有廠商稱之為Word,而這個儲存陣列就是Logical Bank,簡稱L-Bank或Bank。<br /> 由於技術與成本的原因,我們不可能只做一個全容量的Bank,而且由於SDRAM的工作原理限制,單一個Bank會造成嚴重的Addressing Collision,大幅降低效率。所以我們會在SDRAM內部分割成多個Bank,目前SDRAM規範是4個,而DDR-II的標準則是8個。<br /> 這樣在Addressing時就要先確定是哪個Bank,然後再這個選定的Bank中選擇對應的Row與Column。也就是說一次只能是一個Bank在運作,每次運作的data量就是Bank中一個Cell的容量。由前面我們得知,Memory Chip一次傳輸的data量即為Chip的bit width,也就是說Cell的大小也就是Chip的bit width。<br /><br /> 2. Memory Chip的容量<br /> 在瞭解SDRAM的內部結構後,我們知道Memory Chip的所有儲存容量就是所有Bank中儲存單元的容量總合。也就是 儲存容量 = L-Bank的數量 x 行數 x 列數 x Cell的大小。<br /> 一般在表示上會採用MxW或是BxMxW的方式來表示。<br /> 如"8M x 8",8M個Word,1個Word有8bit width,總共為64Mbit。<br /> 或"4-BANKS x 2,097,152-WORDS x 8-BITS",總共為64Mbit。<br /><br />三. SDRAM腳位說明<br /> CLK : Master Clock<br /> CKE : Clock Enable <br /> /CS : Chip Select <br /> /RAS : Row Address Strobe <br /> /CAS : Column Address Strobe <br /> /WE : Write Enable <br /> DQn : Data I/O <br /> DQM : Output Disable / Write Mask<br /> An : Address Input<br /> BAn : Bank Address<br /> Vdd : Power Supply<br /> VddQ : Power Supply for Output<br /> VSS : Ground<br /> VSSQ : Ground for Output<br /><br />四. SDRAM命令真值表<br /><table><tr><td>Command</td><td>Symbol</td><td>/CS</td><td>/RAS</td><td>/CAS</td><td>/WE</td><td>BAn</td><td>A10</td><td>An</td></tr><tr><td>Device deselect</td><td>DSL</td><td>H</td><td>X</td><td>X</td><td>X</td><td>X</td><td>X</td><td>X</td></tr><tr><td>No operation</td><td>NOP</td><td>L</td><td>H</td><td>H</td><td>H</td><td>X</td><td>X</td><td>X</td></tr><tr><td>Burst stop</td><td>BST</td><td>L</td><td>H</td><td>H</td><td>L</td><td>X</td><td>X</td><td>X</td></tr><tr><td>Read</td><td>RD</td><td>L</td><td>H</td><td>L</td><td>H</td><td>V</td><td>L</td><td>V</td></tr><tr><td>Read(with PRE)</td><td>RDA</td><td>L</td><td>H</td><td>L</td><td>H</td><td>V</td><td>H</td><td>V</td></tr><tr><td>Write</td><td>WR</td><td>L</td><td>H</td><td>L</td><td>L</td><td>V</td><td>L</td><td>V</td></tr><tr><td>Write(with PRE)</td><td>WRA</td><td>L</td><td>H</td><td>L</td><td>L</td><td>V</td><td>L</td><td>V</td></tr><tr><td>Bank activate</td><td>ACT</td><td>L</td><td>L</td><td>H</td><td>H</td><td>V</td><td>V</td><td>V</td></tr><tr><td>Precharge bank</td><td>PRE</td><td>L</td><td>L</td><td>H</td><td>L</td><td>V</td><td>L</td><td>X</td></tr><tr><td>Precharge all Bank</td><td>PALL</td><td>L</td><td>L</td><td>H</td><td>L</td><td>X</td><td>H</td><td>X</td></tr><tr><td>Mode register set</td><td>MRS</td><td>L</td><td>L</td><td>L</td><td>L</td><td>L</td><td>L</td><td>X</td></tr></table><br />(V=Valid, X=Don't Care, H=Logic High, L=Logic Low)<br /><br /><table><tr><td>Function</td><td>Symbol</td><td>CKE</td><td>/CS</td><td>/RAS</td><td>/CAS</td><td>/WE</td><td>/Address</td></tr><tr><td>Auto Refresh</td><td>REF</td><td>H</td><td>L</td><td>L</td><td>L</td><td>H</td><td>X</td></tr><tr><td>Self Refresh</td><td>SREF</td><td>L</td><td>L</td><td>L</td><td>L</td><td>H</td><td>X</td></tr></table><br />(V=Valid, X=Don't Care, H=Logic High, L=Logic Low)<br /><br />五. SDRAM的內部基本操作<br /> 1. Power-up與Initialization Sequence<br /> SDRAM在Power up時必須完成下列的步驟。<br /> -CLK, CKE, /CS, DQM和DQ腳位須維持在low直到供電穩定(Power stabilize)為止。<br /> -在Power stabilize後的100us內,chip的CLK必須有穩定的clock提供進來。<br /> -同時要將CKE和DQM驅動到high,直到100us後完成整個Power-up sequence。<br /> 在完成Power-up sequence後接著就是要做Initialization sequence。在SDRAM內部裡有一個Logical Control Unit,並有一個Mode Register(MR)為期提供控制參數。而設定MR也是Initialization sequence最主要的動作。其過程如下:(PALL和REF會在下面說明)<br /> -首先必須先等至少200us的clock輸入穩定期。<br /> -接著對所有的Bank進行Precharge命令(PALL)。<br /> -在等tRP時間後,做至少2次的Refresh命令(REF)。<br /> -最後配合An和BAn做Mode Register Set命令(MRS)將控制參數設置到SDRAM中。An和BAn的控制參數定義如下:A0~A2:Burst Length,A3:Burst Type,A4~A6:CAS Latency,Other:0。設定完MR後就開始進入正常的工作狀態。<br /><br /> 2. Bank Active (Row addressing)<br /> 在進行Read/Write操作前,對應的Bank和Row位址必須先透過Bank activate命令(ACT)來指定。在/CS和Bank定址的同時,RAS(Row Address Strobe)也處於有效的狀態。此時An位址線則發送Row Address。從An的位址線數量我們也可以知道該SDRAM具有多少個Row(取2的n+1次方)。<br /><br /> 3. Read/Write (Column addressing)<br /> 在Bank和Row Address確定後,就要進行Read/Write命令和Column addressing。此時除了/CS外,CAS(Column Address Strobe)也被處於是有效的狀態,不過此時用到的An位址線中,A10為特殊用途,用來指示Auto Precharge外,其餘的被拿來發送Column Address。這裡使用到的位址線數量我們可以得知該SDRAM具有多少Column。在這同時,Read和Write命令是透過/WE來分別的。<br /> 然而,在輸入read/write命令時必須要與ACT命令有一個間隔,這個間隔被定義為tRCD,即RAS to CAS Delay,這是根據chip內電子元件影響時間所制定的delay。tRCD是個重要的參數,在設定SDRAM Controller時必須特別注意。<br /><br /> 4. Data Output (Read)<br /> 在選定Column Address後,就已經確定了具體的Cell,剩下的就是等Data通過I/O通道(DQ)輸出到腳位上。但是在CAS發出之後仍要經過一定的時間才能有Data輸出,這段時間被定義為CL(Cas Latency)。由於CL只在讀取時出現,所以CL又被稱為Read Latency(RL)。<br /> 其實,CAS並不是在經過CL後才送到Cell裡的。實際上CAS和RAS一樣,都是瞬間送到的。但由於Chip體積的原因,Cell中的電容容量很小,所以信號要經過放大來保證其有效的識別性,這個放大/驅動的工作由S-AMP負責。但它要有一個準備時間才能保證信號發送強度,這也是需要CL的原因。<br /> <br /> 5. Data Input (Write)<br /> Data寫入的動作也是在tRCD之後進行的,不過此時沒有CL。由於Data Signal是由Controller發出,SDRAM只需將Data輸入到register中,然後再該Cell的儲存電容進行充電操作,因此Data可以與CAS同時發送,也就是說Write Delay為0。不過Data並不是即時地寫入儲存電容中,因為電容的充電都必須要有一段時間,所以Data的真正寫入需要一定的週期。為了保證Data的可靠寫入,都會留出足夠的tWR(Write Recovery Time)。tWR至少會佔用一個或一個以上的時間週期(頻率越高,佔用週期越多)。<br /><br /> 6. Burst Length<br /> Burst是指在同一Row中相鄰的Cell連續進行Data傳輸的方式,這樣連續傳輸所涉及到的Cell數量就是Burst Length(簡稱BL)。<br /> 因為就算連續的Read/Write命令可以讓Data的傳輸在I/O端是連續的,但它佔用了大量的Memory控制資源,在Data進行連續傳輸時無法輸入新的命令,效率很低。為此,開發了Burst傳輸技術,只要指定好起始的Column Address和BL,SDRAM就會依次地自動對後面相對應數量的Cell進行Read/Write操作,而不用再需要Controller提供Column Address。這樣除了第一筆Data傳輸需要tRCD+CL的Delay外,後面的每一個只需一個Clock即可獲得。<br /> 至於BL的數值,也不能隨便設或在要Read/Write前臨時決定。它是在一開始的Initialization Sequence時設定MRS時就設定好的。目前可用的選項有1、2、4、8、Full Page等,一般常見的是設為4或8。<br /><br /> 7. Precharge<br /> 由於SDRAM的Addressing具有獨佔性,所以在進行Read/Write操作後,如果要對同一個Bank的另一個Row進行Addressing,就要將原本有效(Working)的Row關閉,重新發送Row/Column Address。Bank關閉現有Working Row,準備打開新的Row的操作就是Precharge。Precharge可以通過命令控制,也可以通過輔助設定讓SDRAM在每次Read/Write後自動進行Precharge(Auto Precharge)。<br /> Precharge是一種對Working Row中所有的Cell進行Data重寫,並對Row Address進行回覆,同時釋放S-AMP,以準備新Row的工作。因為即使是沒有工作過的Cell也會因Row被選中而使Cell受到干擾,所以也需要S-AMP進行讀後回寫來保持Cell內電容的電壓,用以維持其邏輯值。邏輯值的判定,基本上是設定一個臨界值,一般是電容電量的1/2,超過它為邏輯1,S-AMP在回寫時會重寫;低於它為邏輯0,S-AMP不進行重寫(等於放電)。而釋放S-AMP就是重新加入比較電壓(即電容電壓的1/2),用以幫助S-AMP之後判斷讀取Data的邏輯電位。<br /> 上述提到的輔助控制即為An中的A10在Read/Write命令發送時,決定是否在Read/Write之後對當前的Bank進行Auto Precharge的動作。除了Auto Precharge功能外,在單獨的Precharge命令中,A10還控制著是否對單一Bank或全部的Bank做Precharge。在Precharge命令發出後,要經過一段時間才能允許發送ACT命令繼續新的Working Row,這個間隔被稱為tRP(Precharge command Period)。<br /><br /> 8. Refresh<br /> DRAM內部是許多電容所組成,它需要不斷的進行Refresh才能保持住Data,所以Refresh是DRAM中最重要的操作。Refresh和Precharge是一樣的,都是用S-AMP先讀後寫。但Precharge是對一個Bank或是所有Bank進行的不定期操作,所以還需要有固定週期依序對所有Row進行操作,以保持那些久久沒經歷重寫的Cell內的Data。<br /> 目前Cell中電容的Data有效保存上限公認的標準是64ms,也就是每一行的刷新循環週期是64ms。這樣刷新速度就是Row數量/64ms。在Data Sheet中,經常會看到4096 refresh cycles/64ms或8192 refresh cycles/64ms的標準,這裡4096或8192就代表這個SDRAM每個Bank中的Row數量。Refresh命令一次對一Row有效,所以發送間隔也是隨著Row數而變化,4096Row為15.625us,8192Row為7.8125us。<br /> Refresh命令分為2種:Auto Refresh(REF)和Self Refresh(SREF)。不管是哪種Refresh,都不需要外部提供Row Address,因為這是一個內部的自動操作。對於REF,SDRAM內有一個Row Address Generator(也稱Refresh Counter)用來自動依次生成Row Address。由於Refresh是對所有Bank操作,所以在Refresh時所有的Bank都停止工作,而每次Refresh所佔用的時間為9個clock(PC133標準),這個時間稱為tARFC,之後才可以進入正常的工作狀態。而對於SREF則是主要用於休眠模式下的Data保持,在發出REF命令時,將CKE=Low就進入了SREF模式。此時不再依靠CLK工作,而是根據內部的CLK進行Refresh操作。在SREF期間,除了CKE之外的外部signal都是無效的,只有重新使CKE=High才能退出SREF模式。<br /><br /> 9. Data Mask<br /> 上述提到Read/Write操作配合Burst Length可以一次傳送多筆Data。假設BL=4,也就是一次能傳送4x64bit的Data。但若我們只需比BL還少的Data時,,怎麼辦?此時就需要Data I/O Mask(DQM)技術。通過DQM,Controller可以控制I/O取消哪些Input或Output的Data。不過在Read時,被Mask掉的Data仍然會從SDRAM傳出,只是會被Mask Logic Unit處被Mask掉。DQM為了精確的Mask一個Bank位寬的每一個byte,每個DQM信號線針對一個byte。這樣對於4bit的Bank位寬的SDRAM,2個Chip共用一個DQM信號線,對於8bit的SDRAM,一個Chip佔用一個DQM信號線,而對於16bit的SDRAM,則需要2個DQM信號線。<br /> SDRAM官方規定,在Read時,DQM發出2個clock後生效。而在Write時DQM與WR一樣是立即生效的。Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com1tag:blogger.com,1999:blog-32842046.post-20532597047525544422010-08-03T22:55:00.003+08:002010-08-03T23:31:11.554+08:00[技術] 讓Linux支援Pentium-M 745 (含kernel compile)最近買了顆Intel Pentium-M 745 1.80G ES版的CPU來升級我的舊NB,T40。<br />但裝上後發現CPU只有跑到600Mhz,升級變成降級,囧rz~。<br />上網一查才發現,原來Linux Kernel裡的speedstep不支援我這顆CPU。<br />沒辦法,總不能一直跑在600Mhz吧,只好自己改Kernel source code支援它囉。<br /><br />在Pentium-M的CPU中,無論是Banias或Dothan系列,<br />都可以透過軟體來控制它的電壓和頻率(透過MSR Register)。<br />在現行的Linux 2.6.32中,<br />是透過cpufreq_frequency_table來正確的設定其電壓和頻率。<br />但Linux Kernel source code裡並沒有把所有的Pentium-M CPU都列進去,<br />這也導致我的745不能跑全速的原因。<br />所以我要做的目的就是在source code裡加入745的cpufreq_frequency_table,<br />讓它能正確的跑到1.80GHz。<br /><br />當然,解法不只一種,但幾乎都要Kernel,除了上述的方法外,有興趣的人可以參考以下的連結。<br />Ref: <a href="http://www.thinkwiki.org/wiki/Pentium_M_undervolting_and_underclocking">http://www.thinkwiki.org/wiki/Pentium_M_undervolting_and_underclocking</a><br />Ref: <a href="http://forum.thinkpads.com/viewtopic.php?p=296774">http://forum.thinkpads.com/viewtopic.php?p=296774</a><br /><br />以下則是我修改的過程與筆記。<br />PS: 由於我的環境是Ubuntu,所以以下的方法是以Ubuntu的為主。<br /><br />1. 因為要編kernel,所以先準備好以下工具。<pre class="prettyprint">apt-get install build-dep gcc<br />apt-get install kernel-package libncurses5-dev fakeroot wget bzip2</pre><br />然後把kernel-source抓回來放到/usr/src下。<br /><br />2. 把kernel source code解開,把 arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c 打開,<br />在適當位置定義要給745用的cpufreq_frequency_table,並把它設定到cpu_model models[]中。以下是diff檔。<pre class="prettyprint">227a228,240<br />> /* Intel Pentium M processor 745 / 1.80 GHz (Dothan) */<br />> static struct cpufreq_frequency_table sonoma_1800[] =<br />> {<br />> OPEX( 600, 100, 988, 988, 988, 988),<br />> OPEX( 800, 100, 1052, 1052, 1052, 1036),<br />> OPEX(1000, 100, 1116, 1100, 1100, 1084),<br />> OPEX(1200, 100, 1164, 1164, 1148, 1132),<br />> OPEX(1400, 100, 1228, 1212, 1212, 1180),<br />> OPEX(1600, 100, 1292, 1276, 1260, 1228),<br />> OPEX(1800, 100, 1340, 1324, 1308, 1276),<br />> { .frequency = CPUFREQ_TABLE_END }<br />> };<br />> <br />307a321<br />> SONOMA(&cpu_ids[CPU_DOTHAN_C0], 1800, 100, "1.80"),</pre><br /><br />3. 設定kernel/compile的configuration檔。<br />先把舊的config檔拿來用,至少不用改太多。<br />cp /boot/config-`uname -r` .config<br />make menuconfig<br />選"Load an Alternate Configuration File"把它載進來,再去修改設定。<br />這裡建議把Loacl version加進去,方便識別。<br />改完後存檔離開。<br /><br />4. 編出kernel deb檔。<br />make-kpkg clean<br />fakeroot make-kpkg --initrd kernel_image kernel_headers<br />(這裡就先去泡茶或找些別的事來做吧,因為要花點時間XD。)<br /><br />5. 安裝kernel deb檔。<br />編好後切回目錄/usr/src下,會看到多了2個linux-image-xxxx和linux-headers-xxx的deb檔。<br />dpkg -i linux-image-xxxx.deb<br />dpkg -i linux-headers-xxxx.deb<br />安裝完後,記得檢查一下/boot/grub/grub.cfg。<br /><br />6. 重開機測試。<br /># cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq<br />1800000<br />完成。Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-44821487751636285432010-07-08T16:57:00.002+08:002010-07-08T17:01:54.715+08:00[技術] SVN merge筆記以下是這次使用的心得:<br /><br />若有一個trunk,為了修一個 bug 建立另一個branches。<br />現在 bug 已經修正完畢,如何將修正後的 code 合併回trunk呢?<br /><br />solution:<br />1. 先switch回trunk.<br />2. 使用svn log查出branches的起始版號.<br />3. svn merge -r [起始版號]:HEAD [branches url].<br />4. svn commit.Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-82081276967357671452010-06-24T16:04:00.003+08:002010-06-24T16:54:03.497+08:00[技術] 各家Toolchains的比較一般而言,<br />在開發Embedded System時大都需要用到不同平台的cross-compiler與Toolchains。<br />而在elinux.org有一篇介紹各家Toolchains的文章,就轉來參考囉。<br /><br />Ref: <a href="http://elinux.org/Toolchains">http://elinux.org/Toolchains</a><br /><br />以下是常見的幾個Toolchains的說明:<br /><br />CodeSourcery<br />CodeSourcery develops Sourcery G++, an Eclipse based Integrated Development Environment (IDE) that incorporates the GNU Toolchain (gcc, gdb, etc.) for cross development for numerous target architectures. CodeSourcery provides a "lite" version for ARM, Coldfire, MIPS, SuperH and Power architectures. The toolchains are always very up to date. CodeSourcery contributes enhancements it makes to the GNU Toolchain upstream continually, making it the single largest (by patch count) corporate contributor.<br /><br />DENX ELDK<br />The DENX Embedded Linux Development Kit (ELDK) provides a complete and powerful software development environment for embedded and real-time systems. It is available for ARM, PowerPC and MIPS processors and consists of:<br />Cross Development Tools (Compiler, Assembler, Linker etc.) to develop software for the target system.<br />Native Tools (Shell, commands and libraries) which provide a standard Linux development environment that runs on the target system.<br />Firmware (U-Boot) that can be easily ported to new boards and processors.<br />Linux kernel including the complete source-code with all device drivers, board-support functions etc.<br />Xenomai - RTOS Emulation framework for systems requiring hard real-time responses.<br />SELF (Simple Embedded Linux Framework) as fundament to build your embedded systems on.<br />All components of the ELDK are available for free with complete source code under GPL and other Free Software Licenses. Also, detailed instructions to rebuild all the tools and packages from scratch are included.<br />The ELDK can be downloaded for free from several mirror sites or ordered on CD-ROM for a nominal charge (99 Euro). To order the CD please contact office@denx.de<br />Detailed information about the ELDK is available here.<br /><br />Buildroot<br />Buildroot is a complete build system based on the Linux Kernel configuration system and supports a wide range of target architectures. It generates root file system images ready to be written to flash. In addition to having a huge number of packages which can be compiled into the image, it also generates a cross toolchain to build those packages from source. Even if you don't want to use buildroot for your root filesystem, it is a useful tool for generating a toolchain. It should be noted however that it only supports uClibc. If you want to use glibc, you'll need something else.Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-33329086141807966352010-06-23T10:41:00.003+08:002010-06-23T11:39:29.099+08:00[技術] Linux下使用Minicon+Kermit這陣子接了新的板子的開發,由於H/W的關係,<br />加上JTAG數量有限,所以只能先用RS-232來傳image到板子上run。<br /><br />目前板子上的Loader為舊版本的u-boot,它只有支援Kermit protocol來傳輸。<br />說到Kermit,在Windows下有名的TeraTerm的檔案傳送功也有支援kermit protocol。<br />以下就是我在Linux下使用Minicom+Kermit的心得整理;<br /><br />1. 安裝minicom和ckermit<br />請先透過apt-get或Synaptic把minicom和ckermit裝起來。<br /><br />2. 配置ckermit的設定檔<br />將以下內容放在~/.kermrc裡.<br />set carrier-watch off<br />set prefixing all<br />set parity none<br />set stop-bits 1<br />set modem none<br />set file type bin<br />set file name lit<br />set flow-control none<br />set prompt "Linux Kermit> "<br /><br />3. 配置minicom<br />使用minicom -s,到"檔案傳輸協定"或"File Transfer protocols"裡的G和H,<br />G設定為/usr/bin/kermit -i -l %f -b %b -s Y U Y N N,<br />H設定為/usr/bin/kermit -i -l %f -b %b -r N D Y N N。<br /><br />4. 開始傳檔<br />執行Ctrl+A -> S,接著選完檔案後即可開始傳送檔案了。<br /><br />PS1: <br />以上minicom的設定,<br />可以使用Ctrl+A -> O裡的"儲存設定",<br />這樣就不用每次都重新設定了。<br /><br />PS2: <br />一般而言除了Kermit外,<br />常見的還有使用x-modem, y-modem或z-modem protocol來傳送。<br />而minicom都可以配合外掛程式來達到此功能。Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-5960422922259910252010-06-18T11:07:00.001+08:002010-06-18T11:08:56.114+08:00[企管] [轉錄]企業常用的縮寫From: http://wiki.planetoid.info/index.php/%E4%BC%81%E6%A5%AD%E5%B8%B8%E7%94%A8%E7%9A%84%E7%B8%AE%E5%AF%AB<br /><br />5S 5S管理<br />ABC 作業製成本制度 (Activity-Based Costing)<br />ABB 實施作業制預算制度 (Activity-Based Budgeting)<br />ABM 作業製成本管理 (Activity-Base Management) (see cost management)<br />APS 先進規畫與排程系統 (Advanced Planning and Scheduling)<br />ASP 應用程式服務供應商(Application Service Provider)<br />ATP 可承諾量 (Available To Promise)<br />AVL 認可的供應商清單(Approved Vendor List)<br />BOM 物料清單 (Bill Of Material)<br />BPR 企業流程再造 (Business Process Reengineering)<br />BSC 平衡記分卡 (Balanced ScoreCard)<br />BTF 計劃生產 (Build To Forecast)<br />BTO 訂單生產 (Build To Order)<br />CPM 要徑法 (Critical Path Method)<br />CPM 每一百萬個使用者會有幾次抱怨(Complaint per Million)<br />CRM 客戶關係管理 (Customer Relationship Management)<br />CRP 產能需求規劃 (Capacity Requirements Planning)<br />CTO 客製化生產 (Configuration To Order)<br />DBR 限制驅導式排程法 (Drum-Buffer-Rope)<br />DMT 成熟度驗證(Design Maturing Testing)<br />DVT 設計驗證(Design Verification Testing)<br />DRP 運銷資源計劃 (Distribution Resource Planning)<br />DSS 決策支援系統 (Decision Support System)<br />EC 設計變更/工程變更 (Engineer Change)<br />EC 電子商務 (Electronic Commerce)<br />ECM 企業內容管理(Enterprise content management)<br />ECRN 原件規格更改通知(Engineer Change Request Notice)<br />EDI 電子資料交換 (Electronic Data Interchange)<br />EIS 主管決策系統 (Executive Information System)<br />EMC 電磁相容(Electric Magnetic Capability)<br />EOQ 基本經濟訂購量 (Economic Order Quantity)<br />ERP 企業資源規劃 (Enterprise Resource Planning)<br />FAE 應用工程師(Field Application Engineer)<br />FCST 預估(Forecast)<br />FMS 彈性製造系統 (Flexible Manufacture System)<br />FQC 成品品質管制 (Finish or Final Quality Control)<br />IPQC 製程品質管制 (In-Process Quality Control)<br />IQC 進料品質管制 (Incoming Quality Control)<br />ISO 國際標準組織 (International Organization for Standardization)<br />ISAR 首批樣品認可(Initial Sample Approval Request)<br />JIT 即時管理 (Just In Time)<br />KM 知識管理 (Knowledge Management)<br />L4L 逐批訂購法 (Lot-for-Lot)<br />LTC 最小總成本法 (Least Total Cost)<br />LUC 最小單位成本 (Least Unit Cost)<br />MES 製造執行系統 (Manufacturing Execution System)<br />MO 製令(Manufacture Order)<br />MPS 主生產排程 (Master Production Schedule)<br />MRO 請修(購)單(Maintenance Repair Operation)<br />MRP 物料需求規劃 (Material Requirement Planning)<br />MRPII 製造資源計劃 (Manufacturing Resource Planning)<br />NFCF 更改預估量的通知(Notice for Changing Forecast)<br />OEM 委託代工 (Original Equipment Manufacture)<br />ODM 委託設計與製造 (Original Design & Manufacture)<br />OLAP 線上分析處理 (On-Line Analytical Processing)<br />OLTP 線上交易處理 (On-Line Transaction Processing)<br />OPT 最佳生產技術 (Optimized Production Technology)<br />OQC 出貨品質管制 (Out-going Quality Control)<br />PDCA PDCA管理循環 (Plan-Do-Check-Action)<br />PDM 產品資料管理系統 (Product Data Management)<br />PERT 計畫評核術 (Program Evaluation and Review Technique)<br />PO 訂單(Purchase Order)<br />POH 預估在手量 (Product on Hand)<br />PR 採購申請(Purchase Request)<br />QA 品質保證(Quality Assurance) see also Quality control<br />QC 品質管制(Quality Control)<br />QCC 品管圈 (Quality Control Circle)<br />QE 品質工程(Quality Engineering)<br />RCCP 粗略產能規劃 (Rough Cut Capacity Planning)<br />RMA 退貨驗收(Returned Material Approval)<br />ROP 再訂購點 (Re-Order Point)<br />SCM 供應鏈管理 (Supply Chain Management)<br />SFC 現場控制 (Shop Floor Control)<br />SIS 策略資訊系統 (Strategic Information System)<br />SO 訂單(Sales Order)<br />SOR 特殊訂單需求(Special Order Request)<br />SOW 工作說明書(Statement of work)<br />SPC 統計製程管制 (Statistic Process Control)<br />TCO 整體擁有成本(Total cost of ownership)<br />TOC 限制理論 (Theory of Constraints)<br />TPM 全面生產管理(Total Production Management)<br />TQC 全面品質管制 (Total Quality Control)<br />TQM 全面品質管理 (Total Quality Management)<br />WIP 在製品 (Work In Process)Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-52100859666250644632010-06-05T01:38:00.002+08:002010-06-18T11:07:07.847+08:00[技術] [轉錄]Android 內核的簡單分析From: http://www.cnmsdn.com/html/201002/1266986960ID865.html<br /><br />在kernel子目錄下存放的就是Android的Linux Kernel了, 通過和標準的Linux 2.6.25 Kernel的對比,我們可以發現,其主要增加了以下的內容:<br /><br /> 1. 基於ARM架構增加Gold-Fish平台,相應增加的目錄如下:<br /><br /> kernel/arch/arm/mach-goldfish<br /><br /> kernel/include/asm-arm/arch-goldfish<br /><br /> Gold-Fish平台採用的是ARM926T CPU作為BaseBand處理器, 該CPU主頻至少為200M HZ. 採用MSM7201A CPU(ARM 11)作為主CPU, 其主頻為528M HZ.<br /><br /> 2. 增加了yaffs2 FLASH文件系統,相應增加的目錄為:<br /><br /> kernel/fs/yaffs2<br /><br /> 實際上,Android包經過編譯後生成的system.img和ramdisk.img文件就是yaffs2格式的包.<br /><br /> 3. 增加了Android的相關Driver,相應目錄為:<br /><br /> kernel/drivers/android<br /><br /> 主要分為:<br /><br /> Android IPC系統: Binder<br /><br /> Android 日誌系統: Logger<br /><br /> Android 電源管理: Power<br /><br /> Android 鬧鐘管理: Alarm<br /><br /> Android 內存控制台: Ram_console<br /><br /> Android 時鐘控制的gpio: Timed_gpio<br /><br /> 4. 增加了switch處理, 相應的目錄為:<br /><br /> kernel/drivers/switch/<br /><br /> 5. 增加了一種新的共享內存處理方式, 相應增加的文件為:<br /><br /> kernel/mm/ashmem.c<br /><br /> 6. 其他為Linux-2.6.25內核所做的補丁等等,例如BlueTooth, 在此不做詳細分析<br /><br /> 另外GoldFish平台相關的驅動文件如下:<br /><br /> 1. 字符輸出設備:<br /><br /> kernel/drivers/char/goldfish_tty.c<br /><br /> 2. 圖像顯示設備: (Frame Buffer)<br /><br /> kernel/drivers/video/goldfishfb.c<br /><br /> 3. 鍵盤輸入設備:<br /><br /> kernel/drivers/input/keyboard/goldfish_events.c<br /><br /> 4. RTC設備: (Real Time Clock)<br /><br /> kernel/drivers/rtc/rtc-goldfish.c<br /><br /> . USB Device設備:<br /><br /> kernel/drivers/usb/gadget/android_adb.c<br /><br /> 6. SD卡設備:<br /><br /> kernel/drivers/mmc/host/goldfish.c<br /><br /> 7. FLASH設備:<br /><br /> kernel/drivers/mtd/devices/goldfish_nand.c<br /><br /> kernel/drivers/mtd/devices/goldfish_nand_reg.h<br /><br /> 8. LED設備:<br /><br /> kernel/drivers/leds/ledtrig-sleep.c<br /><br /> 9. 電源設備:<br /><br /> kernel/drivers/power/goldfish_battery.c<br /><br /> 10. 音頻設備:<br /><br /> kernel/arch/arm/mach-goldfish/audio.c<br /><br /> 11. 電源管理:<br /><br /> kernel/arch/arm/mach-goldfish/pm.c<br /><br /> 12. 時鐘管理:<br /><br /> kernel/arch/arm/mach-goldfish/timer.cYu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-45030415328721449202010-05-14T00:47:00.005+08:002010-05-14T16:42:59.102+08:00[技術] Milestone的鬧鐘問題Milestone從原本都很正常work的鬧鐘, <br />從我出差來泰國後, 沒有插著AC充睡覺就開始怪怪的.<br />後來花了點時間去trace, 才發現原來RTC的interrupt在2.1的firmware被改濫了.<br />還好有人把新版本的kernel從新的加拿大版的firmware取出來做成SBF.<br /><br />Ref From: <a href="http://and-developers.com/motorola_milestone:sbf">http://and-developers.com/motorola_milestone:sbf</a><br /><pre>2.1 kernel fix of scheduled CPU wake-ups<br /><br />This SBF file will flash only the boot.img (kernel+init) from SHOLS_U2_03.10.0: <a href="http://www.mediafire.com/?mlyneqhk1zl">mediafire</a>, <a href="http://rapidshare.com/files/378277372/2.1-03.10.0-kernel-only.rar">rapidshare</a><br /><br />It will fix the broken scheduling of Alarm/RTC interrupts on the SHOLS_U2_02.31 and <br />SHOLS_U2_02.34 systems (kernel problem - alarms delayed).</pre><br /><br />升級前先把Kernel的版號記錄一下:<br />2.6.29-omap1 a21146@ca25rhe74 #1<br /><br />透過上一篇提到的sbf_flash指令,把kernel更新後,版號變成如下:<br />2.6.29-omap1 rkg683@ca25rhe56 #1<br /><br />應該是有更新成功吧,就看這幾天鬧鐘正不正常囉。Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-62334579096318074012010-05-14T00:01:00.005+08:002010-05-14T00:23:00.843+08:00[技術] Milestone上SBF和RSD Lite說明之前在root Milestone時有使用到的SBF以及RSD Lite,<br />這陣子有把資料找全了,在這裡重新說明一下用以備忘。<br /><br />首先SBF是Single Binary File的縮寫,<br />它是包含了要燒錄的binary data和checksum資料等。<br />提供給RSD介面燒錄資料到device上。<br />除了Motorola官方提供的SBF可供燒錄外,<br />我們也可以透過SBF-Recalc自行產生出可燒錄的SBF檔。<br />Ref: <a href="http://and-developers.com/motorola_milestone:sbf">http://and-developers.com/motorola_milestone:sbf</a><br /><br />而講到RSD Lite就要先講一下RSD,<br />RSD是Remote Software Download的縮寫,<br />它是Motorola開發出來用來做為遠端燒錄flash的介面,<br />也就是說只有Motorola的device才會用到的東東。<br />而目前使用到RSD的軟體有:<br />RSD-NetConnected<br />RSD Lite<br />Motorola Software Updater<br />RSD-NPI<br /><br />目前RSD Lite只有Windows版本,若要在Linux下使用不太方便。<br />於是有網友[mbm]提供了一個Linux程式sbf_flash,有興趣可以到<a href="http://blog.opticaldelusion.org/2010_05_01_archive.html">這裡</a>看看。<br />Ref:<a href="http://and-developers.com/motorola_milestone:tools:rsd_lite">http://and-developers.com/motorola_milestone:tools:rsd_lite</a>Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com2tag:blogger.com,1999:blog-32842046.post-5363608222852657012010-05-03T16:45:00.003+08:002010-05-03T16:52:12.474+08:00[技術] Linux Kernel的schedule_timeout error今天在寫Code時,Kernel狂吐schedule_timeout: wrong timeout value fffffd85 from c01595ef。<br />查了一下Google才發現這是說schedule_timeout被傳了負數的value進去導致的錯誤。<br />到/proc/ksyms或System.map一查才發現原來是epoll所呼叫的。<br />比對了一下code才發現原來忘了對timeout variable進行initial與小於0的check,修正後即解決。Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-78457447870542586472010-04-29T13:09:00.004+08:002010-05-14T00:00:30.608+08:00[技術] Milestone上安裝Busybox最近在Milestone上玩起adb和Terminal,發現原有的shell真的難用到爆,<br />再加上一堆指令不內建,於是想自己編busybox來用用。<br /><br />首先先搞定Milestone的Cross-Compiler,不外乎以下幾種方法:<br />1. 自己手動抓binutil, gcc等回來自己慢慢編成target=ARM。(PS:會很慢)<br />2. 到Android Open Source Project的網站抓prebuilt.git裡編好的toolchain。<br />http://android.git.kernel.org/?p=platform/prebuilt.git;a=tree;f=linux-x86/toolchain/arm-eabi-4.4.0;<br />點選snapshot即可下載,大概是74mb左右.我是抓arm-eabi-4.4.0的。<br />3. 到CodeSourcery抓Sourcery G++ Lite Edition for ARM<br />http://www.codesourcery.com/sgpp/lite/arm點選Download。<br /><br />接著去抓busybox的原始碼回來,解開後先按make menuconfig進選單,<br />此時記得把cross-compiler的位置指定好,<br />同時把Build BusyBox as a static binary (no shared libs)勾選起來。<br />其實勾選static binary是比較花code size的,但沒辦法,<br />懶得hack busybox去配合Bionic Libc,要花太多effert。<br />所幸編出來的code size也不至於爆肥到哪去 XD。<br />接著把要編出來的applet選好,存好後敲make開始編囉。<br /><br />編出busybox後,由於Android內的/system預設是read-only的,<br />所以我們使用adb push的方式先將busybox丟到/data下。<br />./adb push busybox /data<br />接著使用adb shell操作把/system重新mount再把busybox丟過去。<br />./adb shell<br />$ su <- 變root<br /># mount -o rw,remount -t yaffs2 /dev/block/mtdblock6 /system<br /># cd /data<br /># chmod +x busybox<br /># ./busybox cp busybox /system/xbin <- 因為內建的cp難用<br /># cd /system/xbin<br /># ./busybox --install <- 安裝links<br /># cd /data<br /># rm busybox<br /># mount -o ro,remount -t yaffs2 /dev/block/mtdblock6 /system<br /># exit<br />$ exit<br /><br />接著就可以使用到busybox所提供強大的功能啦 :)Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-70320851575846687172010-04-29T10:10:00.007+08:002010-04-29T11:39:27.230+08:00Milestone 2.1 root心得其實拿到手機第二天就被我root了。 XD<br />只是我這陣子忙著弄rstp到現在才有空把這些資訊整理出來。<br /><br />首先Milestone的Boot Loader除了原本Loader的功能(Load Kernel & FS then Go)外,<br />還具有2個特別的功能:<br /> 1. Program SBF file。<br /> 這個功能是Loader提供了一個介面,讓安裝了RSD Lite的PC透過USB連接線,<br /> 直接將Image(SBF file)直接燒錄到Milestone的flash裡。<br /> 這裡有官方提供的SBF檔,請小心對應版本。<br /> <a href="http://and-developers.com/motorola_milestone:sbf">http://and-developers.com/motorola_milestone:sbf</a><br /><br /> 2. Recovery Mode.<br /> 這裡提供Apply sdcard:update.zip與factory reset等功能。<br /><br />而在2.0.1版本前取root的方法不外乎進Loader的Recovery Mode,<br />將su與Superuser.apk包成update.zip的方式更新到系統中。<br />但Motorola官方釋出了Milestone 2.1的更新版中的Recovery mode已經使用新的簽證,<br />所以無法再繼續使用以前的update.zip來騙過系統作假更新,<br />也就是不吃使用者自訂的update.zip,這導致無法透過此方法取得root。<br /><br />沒關係,山不轉路轉,既然新的Recovery Mode不能用,我們就把它更新回舊的。<br />網路上有人把2.0.1的Recovery Mode從2.0.1的更新檔中抽出來并包裝成SBF檔提供使用。<br />檔案在此:SHOLS_U2_01.14.0_recovery_only.zip (<a href="http://www.mediafire.com/?0mlannzemzz">mediafile</a>)或(<a href="http://www.badongo.com/file/21503762">bandongo</a>)。<br /><br />接著去下載Motorola工程師專用的RSD Lit軟件並安裝到Windows內,<br /><a href="http://www.multiupload.com/SIYSOH7VTU">http://www.multiupload.com/SIYSOH7VTU</a>。<br /><br />然後如果沒有安裝Motorola USB driver,<br />請先安裝: <a href="http://direct.motorola.com/hellomoto/Common/Drivers%20and%20Plug%20ins/USB_Drivers_32_bit_4.5.0.zip">Windows 32-bit Driver</a> / <a href="http://direct.motorola.com/hellomoto/Common/Drivers%20and%20Plug%20ins/USB_Drivers_64_bit_4.5.0.zip">Windows 64-bit Driver</a>。<br /><br />接著先把Milestone關機,接上USB連接線,把鍵盤推開,<br />按住"上"鍵不放再按電源鍵啟動Milestone。<br />等到出現Bootloader裡面後,在Windows裡開啟已安裝的Motorola RSD Lite。<br />接著在RSD Lite軟件上的Filename裡按 [...],指定剛下載的SBF檔案,<br />然後按[Start]開始還原,待還原程序完成100%時,手機就會自動重啟。<br />此時你的Milestone就會具有2.1的System與2.0.1的Recovery Mode。<br /><br />再來去下載milestone_root.zip到電腦裡,<a href="http://www.sendspace.com/file/5cvh9e">http://www.sendspace.com/file/5cvh9e</a><br />把檔名改為update.zip放到Micro SD Card的根目錄 / 內。<br />接著進到Recovey Mode,有2個方法:<br /> 1. 先關閉milestone電源,然後推開鍵盤,按住"上"鍵不放再按電源鍵啟動Milestone,<br /> 直到看見白色三角形標置。此時可放開按鈕,再長按"音量增大鍵"+"照相鍵"一下,<br /> 便進入了 Recovery Mode。<br /> 2. 使用Android Debuging Bridge Tool (adb tool),# adb reboot recovery。<br /><br />Recovey Mode用鍵盤的5方向鍵選到Apply SDcard: Update.zip按下去執行等到<br />"Install from sd card complete"字句出現。接著選擇"Reboot system now"重啟Milestone,<br />待開完機後檢查app裡有沒有"Superuser whitelist"存在即可知道有否root成功。Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-7414768098798805362010-04-14T09:15:00.001+08:002010-04-14T09:23:44.303+08:00[閒聊] 新玩具-Motorola Milestone哇哈哈,昨天去敗家了。<br />敗了一台Moto的Milestone回來,<br />Android機器人我來啦~。Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0tag:blogger.com,1999:blog-32842046.post-64175453655743501772010-03-16T11:39:00.003+08:002010-03-16T11:44:27.229+08:00[技術] 在Linux中透過ioctl來設定ARP Table一般我們在Linux上可以使用arp這個指令來顯示或設定ARP Table。<br />而在程式中如果要操作系統的ARP Table的話,除了用system()來呼叫<br />arp指令外,也可以透過socket fd所提供的ioctl命令來達成,共有3種,<br />分別是SIOCSARP(設定ARP mapping),SIOCDARP(刪除ARP mapping),<br />SIOCGARP(獲取ARP mapping)。在操作上需配合struct arpreq,<br />定義如下:<pre class="prettyprint">struct arpreq {<br /> struct sockaddr arp_pa; /* protocol address */<br /> struct sockaddr arp_ha; /* hardware address */<br /> int arp_flags; /* flags */<br /> struct sockaddr arp_netmask; /* netmask of protocol address */<br /> char arp_dev[16]; <br />};</pre><br /><br /> 其中,arp_pa必須是AF_INET的socket。而指定的network device<br />也必須填入arp_dev中。而arp_flag的value定義如下:<br />ATF_COM = Lookup complete<br />ATF_PERM = Permanent entry<br />ATF_PUBL = Publish entry<br />ATF_USETRAILERS = Trailers requested<br />ATF_NETMASK = Use a netmask<br />ATF_DONTPUB = Don't answer<br /><br /> 使用SIOCSARP命令時,需設定arpreq的arp_pa,arp_ha和arp_flags。<br />此時若ARP Table己經存在這筆IP位址,它會將它取出更新。若不存在,則新增。<br /><br /> 使用SIOCDARP命令時,只需設定arpreq中的arp_pa和arp_dev,kernel會<br />根據arp_pa的IP位址從ARP Table的hash中取出,並將其state更新為NUD_FAILED。<br />這樣在下一次ARP GC時就會被清掉。<br /><br /> 使用SIOCGARP命令時,只需要設定arpreq中的arp_pa即可。不過一般我們<br />不會透過SIOCGARP命令,而是使用/proc/net/arp直接讀取。<br /><br /> 以下是SIOCSARP的範例程式:<br /><pre class="prettyprint">#include <sys/ioctl.h> <br />#include <sys/socket.h> <br />#include <net/if.h> <br />#include <netinet/if_ether.h><br />#include <netinet/in.h></pre><br /><pre class="prettyprint">int set_arp(char * ip, char * mac, char * dev) {<br /> <br /> struct arpreq req;<br /> struct sockaddr_in addr;<br /> int sockfd, rc;<br /> unsigned int s_addr;<br /> <br /> sockfd = socket(AF_INET, SOCK_DGRAM, 0);<br /> if(sockfd < 0) {<br /> return 1;<br /> }<br /><br /> /* Inet sockaddr_in struct */<br /> memset(&addr, 0, sizeof(struct sockaddr_in));<br /> addr.sin_family = AF_INET;<br /> addr.sin_addr.s_addr = inet_addr(ip);<br /> <br /> /* ARP arpreq struct */<br /> memset(&req, 0, sizeof(req));<br /> memcpy(&req.arp_pa, &addr, sizeof(struct sockaddr));<br /> memcpy(req.arp_ha.sa_data, mac, 6);<br /> req.arp_flags = ATF_PERM | ATF_COM;<br /> strcpy(req.arp_dev, dev);<br /> <br /> rc = ioctl(sockfd, SIOCSARP, &req);<br /> close(sockfd);<br /> <br /> return rc;<br /> <br />}</pre>Yu Laihttp://www.blogger.com/profile/00845015153227920139noreply@blogger.com0