[工具] E-Mail圖示產生器
Written on 11:07 上午 by Yu Lai
就是我右邊E-mail那個圖示的產生器囉,
在寫了前三篇後才發現忘了把這個Tool寫個Note啦。
http://services.nexodyne.com/email/
就是我右邊E-mail那個圖示的產生器囉,
在寫了前三篇後才發現忘了把這個Tool寫個Note啦。
http://services.nexodyne.com/email/
PocketMod 網站提供了一項非常有趣且特殊的服務,
您可以在線上設計自己的口袋型記事本,包含封面、
封底一共八頁,僅需使用一張 A4 的紙就可以完成。
http://www.pocketmod.com/app/index.html
Stripe Generator 為一款很有趣的線上工具,
它能夠讓你在線上產生條紋樣式的背景。
可以設定的選項非常多,包含寬度、顏色、樣式、背景顏色、條紋方向等等。
http://www.stripegenerator.com/
就像我blogger右邊Link那邊E-mail的圖示一樣,
這個可以產生Domain Name的圖示。
http://phorum.com.tw/Generator.aspx
原文出處:http://blogs.myoops.org/lucifer.php/2007/04/04/p54
作者:朱學恆
你知道嗎?
請先看完這段影片吧!
2006年,位在科羅拉多州的一所默默無聞的公立高中Arapahoe剛結束暑假;新學期開始的時候,校長請該校科技中心的負責人Karl Fisch為老師們解說一下目前教育界的技術發展和趨勢。正好Arapahoe高中獲得了一筆基金會的贊助,幫學校換了兩百多台的電腦,於是Karl就決定以讓老師瞭解未來趨勢的角度來製作一套投影片,希望他們可以知道自己面對的是什麼樣的挑戰,並且進而能夠讓高中生們面對這樣的改變。Karl從書籍、網路、政府資料中整理出了一些數據,並且用淺顯易懂的比喻加入投影片中。(這些數據來自於「世界是平的」作者、教育界的知名人士、美國前教育部長、美國勞工部、麻省理工學院等等……)
在做好影片,配上音樂之後,他把這個影片取名為「Did you know?」;在校內老師面前第一次播放的時候,他還覺得忐忑不安,但幸好底下老師的反應很不錯,讓他覺得這影片似乎達成了他想要傳達的效果。
不過,他錯了。這達成的效果比他想像的還要大。
過了幾天之後,他把這段投影片放到自己的Blog上面供大家觀看。
立即有來自各地的使用者對這投影片感興趣,要求授權讓他們使用在不同的地方。熱心的使用者將檔案改編,重整,上傳到Youtube上和提供各種不同的格式。其他人則是轉寄、上課時播放給自己的學生看,研討會時拿來作引言……
到了現在,這個影片光是在Youtube上就有超過十種版本,將近兩千人把它加為最愛,三百多則對這個內容感到震撼的留言,全部瀏覽人次超過五十萬人以上。(這還不包括在網路以外的地方觀看的人數)
而我看到這影片的時候是在美國休士頓的Rice大學,現場聚集了全美知名學府的研究者,還有許多來自世界各地的學術界人士;掌握上億美金基金會教育經費的計畫負責人在會議一開始的時候一句話也不說的直接開始播放這個影片。
我們必須教導現在的學生,畢業後投入目前還不存在的工作...
使用根本還沒發明的科技...
解決我們從未想像過的問題。
影片播放完之後,現場一片寂靜,而她繼續接道:「轉變,正在發生。各位,我們所推廣的開放教育就是在為了這個趨勢作準備……」
當天,我就把這個影片重新翻譯成中文,請台灣的義工進行轉檔和影片製作,傳上了Youtube。
http://www.youtube.com/watch?v=xj9Wt9G--JY
(來看看吧!)
這個影片之所以讓人感到震撼,並不是因為它使用了華麗的特效或擁有超級大明星的陣容。它的震撼之處在於其中所引述的都是事實。它讓現在是世界第一強國的美國中教育界的佼佼者感到震撼,更讓環境、資源遠遜於美國的我感到震撼,我更覺得「我們」(父母、師長、教育家、政策決定者、立法行政官員)都應該一樣感到震撼。
美國前教育部長Richard Riley認為...
2010年最迫切需要的十種工作,在2004年時根本不存在。
因為這世界演變的快速已經遠超過我們的想像,我們本來應該要引導、協助新的世代面對這個劇烈變動的世局。但我們武器配備落後、訓練薄弱,更有各種各樣的強大的敵人虎視眈眈……我們和這些新的世代真的做好準備了嗎?
任天堂光是在2002年就投資一億四千萬美金進行研發。
美國聯邦政府花在教育研發上的經費還不到一半。
確實,驚天動地,以十倍速爆炸成長的事件正在發生。傳統的學習與教育系統都面對了最嚴苛的挑戰,對企業的忠誠度降低、對科技的依賴度增加,科技的進步又讓不會使用科技的人更加弱勢和絕望……
根據估計,《紐約時報》一週所包含的資訊量...
比十八世紀一個人一生可能接觸到的資訊量還要多。
這是一段真實的故事:紐約時報在2007年4月2號的科技版用不小的篇幅報導了我們進行的開放式課程翻譯計畫。而這個記者是在Youtube上面看到台灣一家虛擬媒體製作公司對我們訪談的影片,因此而對我產生興趣,這才找上我的。
隨即,新聞登出第二天我收到一封請求我幫忙的信件,寄信者是在看到報導之後在網路上找到我的Email而寄信過來請我幫忙翻譯麻省理工的一個網路廣告相關計畫。
這個人叫做Andreas Ramos,他是矽谷一家新創公司Position2的執行長。這家公司的工作是網路廣告代理搜尋最佳化。(聽起來很繞口對吧!)他的工作是把客戶所購買的搜尋引擎廣告效果最佳化。Google贊助了麻省理工價值四十五萬美金的網路廣告,但關鍵字和必須由他們自行管理。所以,麻省理工找上了Andreas Ramos,而他額外替麻省理工編寫了48,548個額外的關鍵字,並且透過演算法和網路行銷的技巧進行全球化的推廣。
結果呢?這些廣告每天的點閱次數從52次增加到17,650次,每次點閱所花費的廣告費用降為十分之一……
這個故事完全是真實的,但不過三到四年前,這裡面的技術、工作和機會,幾乎是完全不存在的。
所以,如果你的孩子不想當醫生、不想當太空人,而告訴你他們想要當網路廣告搜尋最佳化工程師的時候,你該怎麼辦?
對於這樣劇烈的跳躍和變化,我認為,知識的自由分享和創意是最重要的解決方案。(也因此我才要投入自己的時間和金錢進行開放式課程的推廣與分享)
唯有知識可以自由分享,人類才能夠創造出更多的知識,解決更多的問題,作出更正確的選擇。想想看,如果這個社會上的階級區分成「有錢」接受教育和「沒錢」接受教育這兩種;這還有什麼平等可言?
唯有跳躍性思考的創意才能夠迎接十倍速變化的世界。孩子們擁有結合包容和遠見的創意,才能看穿下一個世代的循環。線性按部就班的思考模式已經趕不上整個世界局勢的變化,唯有跳躍、不受傳統規則束縛、激烈變革,直接得出結論的創意訓練才能夠及時提出解決方案。
在中國,智商排名前四分之一的人...
比北美洲的總人口還要多。
對全世界老師的意義:他們的優秀學生,比我們所有的學生還要多。
這些驚天動地的轉變正在發生,你已經知道了,然後呢?
(本文歡迎隨處轉貼、轉寄,僅需註明出處和作者即可)
http://script.aculo.us/
這裡有許多現成的JavaScript Library,有需要的話還蠻實用的啦。
Posted in 技術, JavaScript | 0 意見
這是在 Hemidemi 看到的,原文在: Top 20 replies by Programmers to Testers when their programs don't work。翻譯如下:
第 20 名:這很奇怪喔。
第 19 名:以前從來不會這樣啊!
第 18 名:昨天明明會動的啊!
第 17 名:怎麼可能~
第 16 名:這一定是機器的問題。
第 15 名:你到底是打了什麼才讓程式當掉的?
第 14 名:一定是你的資料有問題。
第 13 名:我已經好幾個禮拜沒碰那一段程式了。
第 12 名:你一定是用到舊版了。
第 11 名:一定是巧合!為什麼這種壞運氣只讓你碰上。
第 10 名:我不可能什麼功能都測試到吧,有 bug 是正常的!
第 9 名:這個不可能是那個的原始碼!
第 8 名:這程式應該是會動的,只是我寫好後還沒做測試。
第 7 名:可惡!一定有人改了我的程式。
第 6 名:你有檢查過你的電腦有沒有病毒嗎?
第 5 名:儘管這功能還不能動啦,你覺得他如何?
第 4 名:在你的系統不能用那一個版本的程式啦!
第 3 名:你幹嘛要那樣操作,都是你的問題。
第 2 名:程式發生問題時你在哪裡?
第 1 名:在我的機器明明就可以動啊!
所以說嘛!可以做人,幹嘛來寫程式呢?
最近工作較忙,久久未更新內容。
今天剛好拿到公司發的新NB,是T60唷(爽~!)。
再來應該會比較常上來更新啦,希望希望(遠目)。
今天Intel正式授權FreeBSD可以使用旗下Wireless Chipset的Firmware.
包含: Intel 2100, 2200BG, 2225BG, 2915ABG, and the 3945ABG devices
這是一大福音阿, 尤其嘉惠要在FreeBSD上面做無線網路研究的人,
以前notebook上面跑FreeBSD都得要望centrino興嘆 (不然就是得用
其他方式啟動, 而且不太穩定) 現在有了官方的直接support, 實在太棒了 :D
有網頁有真相: http://www.prweb.com/releases/2007/03/prweb509818.htm
在去年有一篇英文的數字單位,今天在整理時順便找到了中文的數字單位,以下就是參考wikipedia的內容所整理出來的。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
註:
最近本來很低調的FTP因為流量越來越大導致不怎麼低調了。
所以只好去Survey了幾個低調的做法。考慮了許多effort因素
最後採用的就是使用Round Robin DNS技術將流量打散在許多
IP上,也是目前蠻常見的低成本負載平衡。至於成效目前還未知
,但我想應該是還不錯的啦。
以下是在Bind上設定Round Robin DNS的一些notes:
;Dynamic FTP by Round Robin DNS
dynftp 0 IN A 192.168.123.101
dynftp 0 IN A 192.168.123.102
dynftp 0 IN A 192.168.123.103
...
今天在搞net-snmp所提供的mib2c tool,
用起來說實在的實在有點難用。
大概是我對它還不太熟的關係吧。
以下是今天弄的一些心得:
(因為開發需求,所以設定prefix為/opt/net-snmp。)
1.
首先,在安裝net-snmp時,需在configure時加入以下參數
$ ./configure --prefix=/opt/net-snmp/ --enable-embedded-perl --enable-shared --with-perl-modules
$ make
$ make test
# make install (should be root)
# echo /opt/net-snmp/lib > /etc/ld.so.conf.d/net-snmp.conf
# ldconfig -v
mib2c [-h] -c CONFIGFILE [-I PATH] [-f OUTNAME] [-i][q][-S VAR=VAL] MIBNODE
export MIBS=+NET-SNMP-TUTORIAL-MIB
mib2c -c mib2c.scalar.conf MIBNODE
mib2c -c mib2c.int_watch.conf MIBNODE
mib2c -c mib2c.mfd.conf MIBNODE
mib2c -c mib2c.iterate.conf MIBNODE
mib2c -c mib2c.create-dataset.conf MIBNODE
mib2c -c mib2c.array-user.conf MIBNODE
mib2c -c mib2c.column_defines.conf MIBNODE
mib2c -c mib2c.column_enums.conf MIBNODE
本文出處: www.jollen.org
已取得原作者授權使用
《Jollen的Root Filesystem建置技術系列》
製作ARM9的Bootstrap Root Filesystem
作者/陳俊宏
http://www.jollen.org
更新日期:2007/1/23
在「完整註明出處」的前提下(註明方式說明),您能立即擁有轉貼與引用的授權,且毋需知會作者。
目的
製作 bootstrap root filesystem(base root filesystem)以提供一個最簡單、陽春且可開機的環境;製作完成的系統可開機到shell模式,並可使用 busybox 提供的指令。
準備工作
首先,您必須準備一台 host 開發環境,並安裝好 cross toolchain;接著,由於本文是做實機測試,因此,如果您沒有 ARM9 開發板,可以考慮使用 Qemu 來做模擬測試。
以下的操作示範,只節錄重點指令片段,您可能必須根據自己的整體實作流程,來微調指令的順序,或是參數等。
Step 1:建立工作目錄
建立一個專用的工作目錄,命名為 arm9.so-busybox/:
# mkdir arm9.so-busybox/
# cd arm9.so-busybox/
接著在 arm9.so-busybox/ 目錄下建立 4 個子目錄:
# mkdir src/ install/ mnt/ pub/ build/
實際進行 root filesystem 實作時,我們應該養成將檔案分類擺放的好習慣。以本專案為例,build/ 目錄用來編譯程式,src/ 目錄用來存放原始程式碼,install/ 目錄則用來擺放我們最後的 root filesystem。
Step 2:建立目錄架構
根據 FHS 的目錄架構標準,在 root filesystem 目錄下(install/)建立目錄階層架構:
# cd install/
# mkdir bin/ dev/ etc/ mnt/ proc/ sbin/ usr/
另外還有二個必要的目錄:/var 與 /tmp,由於這二個目錄都需要具備寫入權限,所以在這裡我們是以 ramdisk 的做法來 mount 這二個目錄。
Step 3:建立裝置檔
在 root filesystem 的 dev/ 目錄下建立必要的裝置檔:
crw------- 1 root root 5, 1 1月 1 1970 console
crw------- 1 root root 29, 0 1月 1 1970 fb0
crw------- 1 root root 1, 3 1月 1 1970 null
brw------- 1 root root 1, 0 1月 1 1970 ram0
crw------- 1 root root 5, 0 1月 1 1970 tty
crw------- 1 root root 4, 0 1月 1 1970 tty0
此階段使用 mknod 指令來完成。請先切換到 root filesystem 的 dev/ 目錄下,接著執行以下指令:
# mknod console c 5 1
# mknod fb0 c 29 0
# mknod null c 1 3
# mknod ram0 1 0
# mknod tty c 5 0
# mknod tty0 c 4 0
對於需要產生大量 device file 的場合來說,可以改用 genext2fs 的 ‘-D’ 參數來製作。詳見 Jollen’s Blog:[使用 genext2fs 的 '-D'(device file table)來建立 root filesystem]。
Step 4:加入Busybox
編譯並安裝 Busybox(動態程式庫方式)。將取得的Busybox原始碼解壓縮至 project 目錄裡的 src/ 子目錄下,以下是幾個注意事項:
本教學文件使用 Busybox 1.3.1
Busybox 1.3.0 開始,使用 Linux Kernel 的 Makefile(因為開始支援 CONFIG_DESKTOP)。Cross compile 時,需要修改 Makefile 如下:
ARCH ?= arm
CROSS_COMPILE ?= /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-
CROSS_COMPILE 的設定是 cross toolchain 的「PREFIX」,視您的 toolchain 而定。您可由 http://www.jollen.org/kit/ 下載本文所使用的 GCC 3.4.1 ARM9 toolchain,以使用與本文完全相同的修改。
Busybox 整合了常用的指令與工具,我們可以設定 Busybox,以勾選我們需要的功能選項。進入 Busybox 的設定選單:
# make menuconfig
請注意,init 與 shell 是必選的項目,請檢查是否有勾選這二個功能。同時,也別忘了設定 Busybox 的安裝路徑,將安裝路徑指到我們 root filesystem 目錄下。
接著直接進行編譯(cross compile):
# make
編譯完成後,將 Busybox 安裝至我們的 root filesystem 目錄(即 Step 2 的 install/ 目錄):
# make install
此時,您應該可以在 root filesystem 目錄下看到 Busybox 所安裝的檔案。
Step 5:加入動態程式庫
編譯完成的 Busybox 已經是給 ARM9 執行的格式了,但我們的編譯設定是將Busybox 編譯成 shared library 架構,因此 Busybox 執行時需要以下的檔案:
˙ libc.so.6:C library標準程式庫。
˙ ld-linux.so.2:Native dynamic loader。
請由 toolchain 將以上二個檔案複製至 root filesystem 的 lib/ 目錄下:
# cd ../../install (切換至root filesystem根目錄)
# cp /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/ld-linux.so.2 lib/ (複制native dynamic loader。以上命令請勿斷行)
# cp /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libc.so.6 lib/ (複製C library。以上命令請勿斷行)
Busybox 會因版本與功能選項設定的差異,而需要更多的程式庫。請使用 cross toolchain 的 objdump 指令來檢查 Busybox 的程式庫相依問題(無法使用 ldd 指令),並將所需的程式庫由 toolchain 複製到 root filesystem 的 lib/ 目錄下。
Step 6:加入系統檔案
加入2個重要的系統檔案於 etc/ 目錄下:
˙ fstab:mount table。
˙ inittab:系統初始表(init table)。
etc/fstab內容如下:
/dev/ram0 / ext2 defaults 1 1
none /proc proc defaults 0 0
/dev/ram1 /tmp ramfs defaults 0 0
/dev/ram2 /var ramfs defaults 0 0
fstab 第一行設定,目的在將 /dev/ram0 重新附掛成 ‘/’(root),此動作用意在於重新指定 ‘/’ 的檔案系統為 ext2。最後二行的目的是為了以 ramfs 來 mount 重要的二個目錄:/var 與 /tmp;如此一來,就算開機沒做 remount root(詳見後文說明),也能對 /tmp 與 /var 目錄做寫入的動作
etc/inittab內容如下:
:0:sysinit:/etc/rc.d/rc.init
:0:respawn:/bin/sh
根據這個 inittab 設定,當系統開機後便會進入 run level 0,在 run level 0 模式下,init process會執行2個動作:(1) 執行 /etc/rc.d/rc.init,此即「init script」;(2) 執行 /bin/sh,即進入 shell 模式。
在此我們並沒有參照 LSB 的標準來設定 run level,而且也沒有使用 getty 來讓使用者登入(多使用者模式)。
Step 7:編寫 Initial Script
根據 inittab 的設定,我們 root filesystem 的 init script 位於 /etc/rc.d/rc.init。以下提供一個供 Embedded Linux 使用的 init script 範本:
#!/bin/sh
# automount (/etc/fstab)
mount -a
# remount root
mount -o remount rw /
#
mkdir /var/lock
mkdir /var/lock/subsys
mkdir /var/run
# start other applications (Running application automatically during
# booting up.
# eg. /bin/thttpd –p 80 –d /var/www
當我們執行「mount –a」後,mount 便會去讀取前一步驟所設定的 fstab,並根據此表格的內容來做 mount 的動作。另外,這裡有一個 remount 的動作:
# mount -o remount rw /
此動作的目的是將 root(’/’)重新 mount 成可讀寫,此動作是選擇性的,若省略不做,請務必保持 /var 與 /tmp 目錄是能寫入的(建議以 ramdisk 方式實作為佳)。
若 root filesystem 未包含 inittab 設定檔,則 Busybox 會使用以下的內建設定:
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
::restart:/sbin/init
不過,還是建議編寫自己的 inittab 設定檔。
Step 8:製作 Root Filesystem 映像檔(Image File)
截至目前為止,我們的檔案系統已經擁有基本的系統指令與工具。接下來,我們即可將建置完成的 root filesystem 製作成 ext2 格式的映像檔。
以下提供二種 ext2fs image file 的製作方式:(1) 土方法;(2) 使用 genext2fs 工具。
先說明傳統的土方法。首先,先利用dd指令做出一個空白的檔案,大小為 4M(bytes):
# dd if=/dev/zero of=ext2fs bs=1k count=4096
我們將檔案命名為 ext2fs,接著再將 ext2fs 製作成 ext2 格式的檔案系統:
# mkfs.ext2 ext2fs
mke2fs 1.32(09-Nov-2002)
ext2fs is not a block special device.
Proceed anyway?(y,n)y
選擇y後出現以下畫面:
Filesystem label=
OS type: Linux
Block size=1024(log=0)
Fragment size=1024(log=0)
128 inodes, 1024 blocks
51 blocks(4.98%)reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
128 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
到這裡我們已經做好一個檔案格式為 ext2 的空白映像檔,再來只要將先前做好的 root filesystem 全部複製到 ext2fs 映像檔「裡面」即可。
先將 ext2fs 附掛至任一空目錄,例如 mnt/:
# mkdir mnt/
# mount -t ext2 -o loop ext2fs mnt/ (指定檔案系統為 ext2)
複製檔案系統時,我們不使用 cp 指令,而是利用 tar 來完成:
# cd install/
# tar cz * > ../install.tar.gz (將檔案系統做成tarball,同時也備份 root filesystem。)
# cd ..
# cd mnt/
# tar zxvf ../install.tar.gz (再將tarball解至映像檔)
接著將映像檔 umount 並壓縮即可:
# cd ..
# umount mnt/
# gzip -9c ext2fs > pub/ext2fs.gz
最後得到的 ext2fs.gz 即是完成品。請注意,若不使用 tar 來說,也應該使用 cpio 來複製檔案,避免使用 cp 指令。
使用 genext2fs
genext2fs 是一個 ext2 filesystem image file 的製作工具,可以讓我們很方便地將 root filesystem 製作成 image 檔。請由 genext2fs 的官方網站下載原始碼套件:
http://genext2fs.sourceforge.net/
編譯後可以取得 genext2fs 檔案,以下是將 install/ 目錄製作成 ext2fs image 檔的指令:
# genext2fs -b 8192 -i 1024 -d install/ ext2fs
執行後,會得到檔名為 ext2fs 的 image 檔,大小為 8 MB(透過 ‘-b’ 參數指定 image file 大小);接著同樣再用 gzip 將 ext2fs 檔壓縮即可。
Step 9:在 Target 端做測試
本步驟以 Jollen-Kit! 為例,Jollen-Kit! 是由 www.jollen.org 所推出的 ARM9 training board,詳細介紹請參考 [http://www.jollen.org/kit/]。請注意,本階段的操作,視 target device 的不同而不同,因此以下示範只適用於 Jollen-Kit! 或是其他的 SMDK2410 平臺。
步驟 8 所得到的 ext2.gz 必須再包裝成 U-Boot 的格式,才能透過 U-Boot 載入到 RAM,以成為 kernel 的 initial ramdisk(initrd):
# mkimage -A arm -O linux -T ramdisk -C none -a 0x30800000 -e 0x30800000 -n ramdisk -d ext2fs.gz urootfs.img
執行後可得到 urootfs.img 檔案,在測試階段為了方便起見,我們可以直接將 urootfs.img 載到 RAM 做測試;U-Boot 指令如下:
jollen.org # tftpboot 32000000 urootfs.img; tftpboot 30F00000 uimage.img; bootm 30F00000 32000000
urootfs.img 是我們製作的 root filesystem,uimage.img 則是給 Jollen-Kit! 使用的 Linux kernel(pre-built)。
[轉自Experiences of Code (http://blog.csdn.net/zblue78)]
學習使用SkyEye仿真
--------------------------------------------------------------------------------
SkyEye是一個可以運行嵌入式操作系統的硬件仿真工具,這樣就可以在沒有硬件條件下來進行嵌入式系統的開發。
以下操作均在Fedora Core 1.0里通過。
Skyeye項目資源列表
http://gro.clinux.org/projects/skyeye/
文檔摘要:
1、什麼是SkyEye?
2、SkyEye可以做什麼事情?
3、安裝SkyEye
4、安裝arm-elf交叉編譯器
5、測試你的arm-elf-gcc編譯器
6、執行你的hello程序
7、編譯並運行uClinux-dist-20030909.tar.gz
8、加入網絡功能
9、安裝完成SkyEye後,下一步將做什麼?
1、什麼是SkyEye?
SkyEye是開源軟件的一個項目,SkyEye的目標是在Linux和Windows操作系統裡提供一個完全的仿真環境。SkyEye仿真環境相當於一個嵌入式計算機系統,你可以在SkyEye裡運行一些嵌入式Linux操作系統,如ARMLinux,uClinux,uc/OS-II(ucos-ii)等,並能分析和調試它們的源代碼。
如果你想知道關於SkyEye和嵌入式系統更詳細的信息,請訪問下面的站點:
www.SkyEye.org
http://www.skyeye.org/index_cn.html
通過SkyEye能仿真下面的硬件:
CPU核心:ARM7TDMI, ARM720T, ARM9, StrongARM, XScale
CPU: Atmel AT91/X40, Cirrus CIRRUS LOGIC EP7312, Intel SA1100/SA1110, Intel XScale PXA 250/255, CS89712, samsung 4510B, samsung 44B0(還不全)
內存: RAM, ROM, Flash
周邊設備: Timer, UART, ne2k網絡芯片, LCD, 觸摸屏等
目前能在SkyEye上運行下面的操作系統和系統軟件:
uC/OSII-2.5.x(支持網絡)
uClinux(基於Linux2.4.x內核, 支持網絡)
ARM Linux 2.4.x/2.6.x
lwIP on uC/OSII
基於uC/OSII, uClinux, ARM Linux的應用程序
2.SkyEye可以做什麼事情?
1. 通過SkyEye可以幫助促進嵌入式系統的學習,在不需要額外硬件的情況下學習和分析uclinux操作系統和其它嵌入式操作系統,如ucosII等。
2. SkyEye可用於嵌入式系統的教學。
3. 希望通過skyeye促進操作系統的研究,如ucosII,uclinux+RTAI,uclinux2.5.x等。
4. 可以基於SkyEye進行仿真特定硬件模塊的研究。
5. SkyEye可以作為嵌入式集成開發環境開發嵌入式系統(當然需要對SkyEye做大量的工作)。
註:引自陳渝《SkyEye Project FAQ》
3、安裝SkyEye
到http://gro.clinux.org/projects/skyeye/下載skyeye-0.7.0.tar.bz2包:
tar jxvf skyeye-v0.7.0.tar.bz2
進入解壓後的skyeye目錄,如果SkyEye的版本低於0.6.0,則運行下面的命令:
./configure --target=arm-elf --prefix=/usr/local --without-gtk-prefix --without-gtk-exec-prefix --disable-gtktest
如果SkyEye的版本高於0.6.0,則運行下面的命令:
./configure --target=arm-elf --prefix=/usr/local
接下來執行:
make
make install
安裝完成後執行skyeye
注意:
a.如果你使用的是Mandrake Linux發行版,那麼你在編譯SkyEye時遇到錯誤,並且錯誤與readline, ncurse, termcap等有關,你可以試試下面的方法:
ln -s /usr/include/ncurses/termcap.h /usr/local/include/termcap.h
接著再make和make install看能否成功!
b.如果你的Linux發行版是Debian Linux,那麼不要使用gcc 2.95或是gcc 3.0,請使用gcc 3.2+
c.gcc的版本要在2.96或以上
d.如果SkyEye的版本大於0.6.0,那麼使用LCD仿真需要在Linux系統裡安裝GTK軟件。
4、安裝arm-elf交叉編譯器
下載arm-elf-tools-20030314.sh
ftp://166.111.68.183/pub/embed/uclinux/soft/tools/arm
或到
ftp://166.111.8.229/OS/Embeded
執行:
chmod a+x arm-elf-tools-20030314.sh
然後:
./arm-elf-tools-20030314.sh
ls /usr/local/bin/
你應能看到以arm-elf開頭的可執行文件,其中arm-elf-gcc就是用來編譯你目標平台的編譯器的,當然還有一些小工具,後面將一一講來。
5、測試你的arm-elf-gcc編譯器
先寫一個小程序hello.c
#include
int main(void)
{
int i;
for(i = 0; i < 6; i++){
printf("i = %d ",i);
printf("Hello, embedded linux!\n");
}
return 0;
}
# begin
CC = arm-elf-gcc
CFLAGS = -D__PIC__ -fpic -msingle-pic-base -O2 -pipe -Wall -g
LDFLAGS = -Wl,-elf2flt
LIBS =
OBJS = hello.o
all: hello
hello: $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) -o hello $(OBJS) $(LIBS)
clean:
rm -rf *.o *.elf *.gdb hello
# end
[轉自Experiences of Code (http://blog.csdn.net/zblue78)]
一步一步教你在skyeye上運行uboot
by faif
1. 簡介
skyeye是一個很好的,基於各種ARM系列CPU的,SOC和主板級的模擬器。uboot是一個可以在各種cpu(arm,mips,powerpc)的主板上運行的引導程序,相當於PC機的BIOS但是又遠遠的強於普通的BIOS,比如支持網絡引導,引導各種內核,甚至一個簡單的shell,等等。他們兩個都是基於GPL的開源自由軟件。
這篇文章教你怎樣在最少量的修改代碼的情況下,用skyeye模擬EP7312並在上面運行uboot,給接觸嵌入系統的新手一個感性的認識。
2. 建立開發環境
2.1 skyeye模擬器的安裝
開發環境是建立在Linux上的。首先下載安裝skyeyes-0.8.5.1的源代碼包,解壓,按照裡面的readme安裝,注意你的linux要有gtk的支持。安裝的時候要以root的身份。在各種linux發行版下的安裝注意事項參照論壇的相關帖子。安裝成功以後,把skyeye的目標目錄加入你的路徑,這樣你就可以在任何目錄下執行skyeye模擬器了。
2.2 交叉編譯器的安裝
交叉編譯器是運行在主機上編譯另外一種體系結構的編譯器。比如,我的主機是linux在x86上,我現在要編譯基於ARM的代碼,所以我就不能用普通的編譯器而需要交叉編譯器。我曾經試過自己從gcc的源代碼構建交叉編譯器,很麻煩和耗時。uboot的作者同樣也開發了一個很好的交叉編譯器叫ELDK(Embedded linux development kit)。我就使用這個,當然你也可以使用其他嵌入式公司提供的。你可以從以下的網址查看提供ELDK的鏡像:
ELDK Availability: http://www.denx.de/twiki/bin/view/DULG/ELDKAvailability
ELDK有三個版本分別編譯MIPS,PPC和ARM。我從下面的鏡像下載了基於ARM的交叉編譯器:
http://sunsite.utk.edu/ftp/pub/linux/eldk/3.1/arm-linux-x86/iso/
文件為"arm-2004-11-09.iso",它支持ARM7, ARM9, XScale, AT91RM9200 and other ARM based systems。
安裝交叉編譯器,我將交叉編譯器安裝到自己的目錄「/opt/x86-arm/」裡面:
/mnt/cdrom/install -d /opt/x86-arm/
等待安裝結束以後設置好用戶環境:
export PATH="${PATH}:/opt/x86-arm/usr/bin:/opt/x86-arm/bin"
export CROSS_COMPILE=arm-linux-
arm-linux-gcc -o testarm test.c
file testarm
testarm: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped.
找到
#define CONFIG_DRIVER_CS8900 1
改為
#define CONFIG_DRIVER_CS8900 0
找到
#define CONFIG_COMMANDS (CONFIG_CMD_DFL | CFG_CMD_JFFS2)
改為
#define CONFIG_COMMANDS (CONFIG_CMD_DFL) /*Skyeye doesn't have jffs2*/
make ep7312_config
make all
mkdir board01
#skyeye config file for uboot
cpu: arm720t
mach: ep7312
mem_bank: map=I, type=RW, addr=0x80000000, size=0x00010000
#skyeye for uboot flash 16M bank 1
mem_bank: map=M, type=RW, addr=0x00000000, size=0x01000000, file=./u-boot.bin,boot=yes
#skyeye for uboot sdram 16m bank 1
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x01000000
target sim
run
[轉自Experiences of Code (http://blog.csdn.net/zblue78)]
為大家學習的方便,我把這篇文章從基礎版貼過來了。裡面的東西滿有趣的,大家可以試試!
以下是我初次學習嵌入式linux的筆記和體會,製作了軟盤minicom應用,在此基礎上也清楚了軟盤Linux的實現,並利用busybox實際製作了軟盤上的Linux系統。希望能給新手一些幫助和啟發,同時也請高手批評指正。
yihui, eazi@163.com 2004年2月12日
一個典型的桌面Linux系統包括3個主要的軟件層---linux內核、C庫和應用程序代碼。
內核是唯一可以完全控制硬件的層,內核驅動程序代表應用程序與硬件之間進行會話。內核之上是C庫,負責把POSIX API轉換為內核可以識別的形式,然後調用內核,從應用程序向內核傳遞參數。應用程序依靠驅動內核來完成特定的任務。
在設計嵌入式應用的時候,可以不按照這種層次,應用程序越過C庫直接和內核會話,或者把應用和內核捆綁在一起,甚至可以把應用寫為內核的一個線程,在內核中運行,雖然這樣在移植上帶來了困難,但考慮嵌入式系統對尺寸要求小的特點,是完全可行的。不過我們使用三層軟件結構的模式來學習嵌入式linux將會是我們認識更清晰,簡單可行並使應用具有彈性。
快速入門,最簡單的建立嵌入式Linux應用的方法就是從我們使用的桌面Linux入手,安裝一個喜愛的版本,把我們的某個應用作為初始化的一部分,框架就算完成了。當然,嵌入式linux應用遠比我們的桌面版本功能簡單專一,它也許就是一個用於足彩的終端機,或是一個數碼音頻播放器,這些系統除了使用嵌入式CPU外,僅僅再需要一個串口,網口等少量的輸入輸出接口就可以完成它們特定的應用了。在軟件上,它可以按照三層的概念由內核裝載器,定制的內核和較少的為特定任務設計的靜態連接的應用程序組成。之所以使用靜態連接的應用程序,是因為少量的靜態連接程序所要的存儲空間,比同樣數量的動態連接的程序所佔的空間小,這個平衡點需要我們在實際開發中去獲取。也許你正在設計的是個PDA,它的應用程序較多,那麼你很可能就要使用動態連接程序來減少存儲空間。在你的/bin或者/sbin目錄下,用廠列表看看bash,ifconfig,vi...,也許只用幾十K,當你運行 ldd /bin/bash 時,你會看到它們都和好幾個庫文件相連。好了,這樣看來,我們得把PC想像成一個嵌入式硬件平台,再重新製作一個特定功能的嵌入式linux。
再進行實際操作之前,先來搞清楚幾個基礎知識。
內核裝載器Loader,它的作用是把內核從外部存儲器,移動到內存中。它只作這個事情,一旦完成了調入內核的工作,Loader就跳轉到內核位置開始執行。不同架構有不同的Loader,在x86結構的PC上,通常使用的loader有LILO,GRUB,syslinux,syslinux在嵌入式linux中也同樣工作。其他非x86架構的應用中,你必須使用專門的loader,或者自己編寫loader來裝入內核。也有不使用loader的情況,系統加電以後,內核直接從燒錄有映像的Flash上開始執行。
內核,一旦內核開始執行,它將通過驅動程序初始化所有硬件,這可以從我們的pc機監視器的輸出看出來,每個驅動程序都打印一些有關它的信息。初始化完成後,計算機就準備運行嵌入式應用。也許一個,也許是多個應用程序組成了嵌入式應用,但通常首先調用的是init(通過loader 向核心傳入init=/program 可以定制首先運行的程序)。桌面linux中,init會讀取/etc/inittab文件,來決定執行級別和哪些腳本和命令。嵌入式應用中,可以根據實際的情況決定是否使用標準的init執行方式,也許這個init是個靜態程序,它能夠完成我們的嵌入應用的特定任務,那完全不用考慮inittab了。
initrd文件系統,initrd以一種把內核從存儲介質裝入到內存的相同的機制來裝入一個小型文件系統。這個文件系統最好是以壓縮的方式存儲在介質上的,解壓縮到RAM盤上。通過使用initrd,包含有核心驅動和啟動腳本的小文件系統,就可以直接從介質上和內核一起啟動起來,內核屆壓縮這個文件系統,並執行這個文件系統上叫做/linuxrc的腳本文件,這個腳本通常會把啟動過程中所需要的驅動程序裝入。腳本退出以後,initrd文件系統也卸下了,啟動過程進入真正初始化過程。對於嵌入式來講,可以將需要的應用軟件都運行在這個initrd文件系統上,只要/linxrc文件不結束,內核啟動過程的其他部分就不會繼續。
做個試驗:
可以看到裡面執行了加載了兩個模塊的操作,你在啟動linxu的時候會看見屏幕打印信息。
cp /boot/initrd-2.4.20.img /tmp
cd /tmp
mv initrd-2.4.2-.img initrd.img.gz
gunzip initrd.img.gz
mount -o loop initrd.img /mnt
cd /mnt
ls
cat linuxrc
cd
mkdir -p project/minilinux
cd project/minilinux
tar zxvf minicom-xx.src.tar.gz
tar zxvf syslinux-xx.tar.gz
cd /usr/src/linux
make mrproper
make xconfig
make dep && make bzImage
cd minicom-xx/src
vi Makefile
修改下面這行
minicom: $(minicom_OBJECTS) $(minicom_DEPENDENCIES)
rm -f minicom 下面的行加上 -static,連接為靜態程序
(LINK) -static $(minicom_LDFLAGS) $(minicom_OBJECTS) $(minicom_LDADD) $(LIBS)
vi minicom.c
找到 if (real_uid==0 && dosetup==0 ) 刪除這個判斷條件語句,主要是用於權限判斷的,因為這個嵌入應用不關注權限問題,否則會出錯。
make
得到可執行程序,用ldd 檢查一下是不是靜態程序。
dd if=/dev/zero of=image bs=1k count=4096
losetup /dev/loop0 image
mke2fs -m 0 /dev/loop0
mounmt -t ext2 /dev/loop0 /mnt/
mkdir -p /mnt/dev
mkdir -p /mnt/usr/share/terminfo/l/
cd /dev
cp -a consle null tty tty0 zero mem /mnt/dev
cp -P /usr/share/terminfo/l/linux /mnt/usr/share/terminfo/l/linux
cp ~/project/minilinux/mincom/src/minicom /mnt/linuxrc
umount /mnt
losetup -d /dev/loop0
sync
gzip -9 image
fdformat /dev/fd0
mke2fs /dev/fd0
mount /mnt/fd0 /mnt/floppy
mkdir -p /mnt/floppy/boot/grub
cp /boot/grub/stage1 /boot/grub/stage2 /mnt/floppy/boot/grub
執行 grub,在軟盤上創建引導
grub > root (fd0)
grub > setup (fd0)
grub > quit
cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy
cp ~/porject/minilinux/image.gz /mnt/floppy
編輯 /mnt/floppy/boot/grub/grub.conf
default =0
timeout-=10
title minilinux
root (fd0)
kernel /bzImage
initrd /image.gz
卸下軟盤
umount /mnt/floppy
fdformat /dev/fd0
mkfs.msdos /dev/fd0
mount -t msdos /dev/fd0 /mnt/floppy
cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy
cp ~/porject/minilinux/image.gz /mnt/floppy
cp syslinux-xx/ldlinxu.sys /mnt/floppy
cat > /mnt/floppy/syslinux.cfg
LABEL linux
KERNEL bzimage
APPEND initrd=image.gz
umont /mnt/floppy
syslinux-xx/syslinux /dev/fd0
sync
結束了為期十二周的國防役新訓,
這中間的過程有歡笑也有衝突。
但無論怎樣都過去了,
該是拿起行李走向下一階段囉。
這一周本來是有時間上來寫寫這十二周的心得的,
但光是忙著把球感練回來就沒時間了。
至於心得嘛,過陣子有心情&時間再來寫吧。
明天要開始上班了,
公司那邊之前也去過一個月了,
所以應該不會有什麼適應上的問題,
而這個blog也會開始繼續有文章囉。
http://tfanalysis.zooserver.net/jotting/acknowledge.php
哎呀,好物啊~當初在寫論文時怎麼沒有這種東西可以用啊?
Copyright © 2008 lazyf's den : A Personal Weblog | Designed by Nicola D Trento and Jacky Supit