2009年7月31日 星期五

trace fiasco bootstrap code part 2

接下來繼續看fiasco的bootstrap
正在努力看懂crt0.S
首先遇到一個macro就是REALMODE_LOADING
雖然說我知道這個macro在Makefile中有 但是看不出來有沒有有沒有用
我就用readelf這個工具 將以已經編好的bootstrap執行檔讀出來
指令是 readelf -a (build directory)/bin/x86-586/bootstrap
在symbol table欄中 可以看到很多在crt0.S出現的label 但是沒有_stack_seg這個label
因為這個label是在有定義REALMODE_LOADING的時候才會編譯的
好 因此我知道 現在REALMODE_LOADING這個macro沒有define

為了看懂crt0.S 我跑去看elf的格式 我發現了.init是重要的section
他跟我想的一樣 是為了在執行main之前執行的function
但是目前我不知道程式是從bootstrap的哪裡開始執行 我猜是第一個instruction
這樣很合理 但是我不知道怎麼看出來

-----------------------
跳離主題 製作fiasco的iso檔
我以前都不知道在用grub做iso檔的時候的資料夾 會當作iso檔的內容
然後還傻傻的放在我tudos的top資料夾下 他就全部放進iso檔中 真像個笨蛋....
-----------------------

為了知道grub怎麼跳到fiasco 我跑去看grub了
發現現在有grub 跟grub 2
他們的分法是grub最新的是0.97 而之後的版本是grub2的 並沒明確的編號上的不同
我現在用的grub是0.97也就是grub的最後一版
所以說我看的doc是grub 0.97的manual
其實grub本來就有支援multiboot也就是一次除了load kernel外 還有load其他的module
我也發現grub跟u-boot一樣可以用command line只是我都不想用而已
現在的重點是我要了解grub跟fiasco的相關指令
主要是kernel跟module這兩個指令 其實應該還有root這個指令 不過我現在是在做iso檔 就先不理了
kernel就是要指定kernel的名稱 這裡並不是要指定fiasco 而是要指定bootstrap 由bootstrap當作假的kernel
是要用來load fiasco
command是這樣打的 kernel (directory)/bootstrap
其實還要加上 --type=multiboot 在kernel後面 這樣才是要讀多個module
雖然說command是照上面這樣打 但是還可以在 command接東西 這樣接的東西 會傳到bootstrap
在bootstrap中有很多處理這些選項的程式碼
module就是另外要load的module名稱
(這是grub原本就有的功能另我很驚訝 我猜是因為MACH所以才會有 manual中另外還有提到 可以參考fiasco的使用 超酷的)
command是這樣打的module (directory)/(moudle name)
這也是一樣後面接者給他的選項

其實我還是沒找到他怎麼執行bootstrap的東西.....

trace fiasco bootstrap code part 1

繼續trace fiasco的bootstrap
我發現她用了很多奇怪的macro
不過沒關係 我現在用google desktop search來作搜尋
我找了EXTERN_C_BEGIN 跟 EXTERN_C_END 及 EXTERN_C這些的定義
他們是定義在l4/pkg/l4/sys/include/compiler.h裡面
他做的工作很簡單 就是用來取代我們常常看到的 extern "C" { 跟 }
她會根據__cplusplus這個macro來作決定要不要讓這個macro有實質
__cplusplus是c++ compiler裡面原本就會有的macro 來辨別說這是不是一個c++ compiler

那為什麼要用extern "C" 的原因是因為在一個有c也有c++ code的程式中
因為對於c++來說 c算是另種language 有些地方會不一樣 所以說會要說這是另一種language
他們在編譯的時候c跟c++對function name的編譯是不一樣的 可能會造成link error

接下來trace bootstrap的startup.h的code
這邊有一個function have_hercules() 這個function好像是只有在amd64底下才有用到 其他我都沒看到又在用
另外這邊有一個變數 _mod_end我看了看 我沒發現有人用他 不知道是怎麼回事
在這裡還有一個struct是boot_info_t 他主要用的地方是在init_kip的部份 其他就沒看到了
這個startup.h大概就是這樣

接下來是看crt0.S這個檔 這是很重要的檔
根據我現在的理解 這個檔本來在compile那端就會自動產生這個檔
這裡不知道為什麼要自己寫一份
這主要是做一個c程式在開始前的startup 跟結束後的finish code
目前我看的code是在/l4/pkg/bootstrap/server/src/ARCH-x86/crt0.S
這是x86的專屬code 每個arch都有自己對應的一份
目前我知道他會跳到__main的function中
而這個function目前是定義在 l4/pkg/bootstrap/server/src/libc_support+.cc裡面
他會跳到startup這個function
目前先看到這裡 其實中間的細節是很重要的 之後再看

2009年7月30日 星期四

desktop search的小研究

今天本來想要去 trace fiasco中的bootstrap的package
但是又遇到了一個就是好多部份都定義了一些macro 然後又不知道去哪裡找這些東西
以前的方法是用grep
就是grep -R "要尋找的字串" .
以上的就是我要搜某個字串 從現在這個資料夾開始 而且是遞迴下去搜尋
但是我覺得很這樣很麻煩要打一堆字 而且出來的字也沒有format好
我後來就看看google desktop好像還不錯 就用看看

剛剛試了他search的速度還不錯 但是她建index好慢我居然要建3個多小時才ok
不過找的速度蠻快是真的
這個時候重點就來了
她佔的空間大不大
我發現在他是存在$(home)/.google/desktop底下
我的感覺是還好 不會佔太多

但是用一用感覺沒有說很好用 檔案名太長她都會自動省略 但是那是我要看的 怎麼可以省略
不過上網看了看 我發現google desktop好像也不是最好 desktop search的軟體

其實網路上有很多的desktop search的軟體
像Copernic 這原本是我覺得還不錯的軟體 他是專門作來搜尋程式碼的
不過很抱歉的是他只提供windows的版本 而且他還會綁IDE的樣子

Regain 這也是一套不錯的軟體 但是她沒有在ubuntu的package裡我就不想用了 而且我本來想用 但是他的java居然是不能執行的
接下來的三套是在linux中蠻有名的
beagle 這其實是用c#寫得程式 但是跑再mono上面 我不怎麼想裝mono 好像是gnome目前預設的桌面搜尋(但是不一定會安裝) 裝了感覺google的還是比較好用
strigi 這感覺不錯 雖然好像是要用KDE跑會比較好 不過這好像有ubuntu的官方維護 但是好像是一定要裝KDE才能用 雖然有個deskbar applet的版本 但是不知道要怎麼用 我怎覺得為了個search用另一個桌布很不值得
recoll 看別的地方的介紹說 這是一個成熟的project 我就覺得奇怪 真的有這個成熟的專案 那其他家desktop search在做什麼 後來用了之後 我懂了 他的search是對一個一個詞作search 也就是說如果說我的程式是這樣寫的 int goodThing(int i) 那麼我搜尋goodThing是搜尋不到這個goodThing的函式 那我想這樣我要找的東西應該大部分都找不到吧

在試的過程是我發現台灣的ubuntu mirror好像掛了 我就用國外的站 方法是
在synaptic中 設定->套件庫->下載自
在這裡可以設定成主要伺服器 就可以先用國外的了

用了這麼多 最後還是覺得用google desktop search
那關於檔名自動隱藏的部份 可以按開啟資料夾的連結 這樣就可以看到完整的路徑
雖然好像還是很不方便 但是就將就點

qemu的小練習

最近在練習使用qemu 但是我懶得自己編就用ubuntu上可以用的package
為了要測試arm的部分是不是要能跑 我就去官網上下載arm-test來測試
不過其中要執行qemu時候的一個option 我不太懂
就是要給一個-append "console=ttyAMA0"

我沒有看過這個serial port
我就上網找 居然都是有關qemu的文章 我就懷疑這是他自己設的
我就開始看看tty的東西 後來可到一篇不錯的文章 連結不見了...
他說可以用/sbin/getty -L ttyAMA0 9600 vt100 來開tty
所以這樣我就懂了 難怪會有奇怪的tty

順便記一下
跳出qemu可以用ctrl + a 在按x

2009年7月29日 星期三

練習latex的建立目錄及各章節

因為要作網站的相關文件 所以動手開始學latex
先前已經知道該如何設定中文的問題 現在要開始建立基本的目錄結構
這部份不太困難
我的作法是用\title\author來寫首頁的部份
除了這兩部份以外還要加上\maketitle才可以真正建立起title來
在這裡 因為我需要中文 我是將以上的三個command寫在\begin{CJK}裡面
不知道能不能寫在外面 感覺是不行的
接下來是寫每個chapter跟scetion的內容 這邊不難
後來要建立目錄 這裡的關鍵是command要寫在\maketitle的後面才可以 不然會有奇怪的結果
command是\tableofcontents
這裡的話要看到目錄的結果要commpile兩次
第一次是compile目錄 第二次才會放進文件中

大致上重要的東西就是這些
我又測過ubuntu上是正確的 放在windows上也沒問題 真是太好了

2009年7月27日 星期一

porting ffmpeg to davinci

現在先看看ldd是什麼 這是一個可以看出有什麼share library的工具
用在ffmpeg上 就可以看到她用了什麼share library
現在有看到6個 就將這6個複製過去吧 不過看起來好像有重複耶
紀錄一下好了
libz.so.1 這個是裡面原本就有的東西
libbz2.so.1.0 這是裡面原本就有的東西
libm.so.6 有缺後面6的
libdl.so.2 有缺後面2的
libc.so.6 有缺後面6的
ld-linux.so.3 完全沒有相似的
這些東西都是在/usr/lib中對應的情形
不過其實還有另一個放lib的地方 就是/lib底下 而上面列的東西 沒在/usr/lib底下就有在/lib
這個的意思是說 我們不需要在加其他的object到現在的file system 就可以正常執行ffmpeg了
真是一件好事

所以就直接將ffmpeg跟要decode的檔案用nfs丟到板子上進行decode
一開始不知道跟編成什麼東西就將h.264編成.yuv檔 檔案大到爆炸 90M的檔案編成2G多
重點是還不能驗證到底對不對 我實在不知道要怎麼驗證YUV檔
現在的重點是驗證ffmpeg是不是可以用 就先將h.264的檔案轉檔成wmv檔來試看看
我照做了 而且可以播放影片 很好但是轉檔花的時間有點長 2分9秒的 片子轉檔花了87分鐘
有點太誇張了 不過後來想想
我為什麼要在nfs上面作當然會慢到不行了??不過也有可能是process bound

接下來必須要尋找好了測試速度的方法
目前來看似乎是直接放在LCD上跑最合理 overhead最小
今天的重點是ffmpeg真的可以跑

2009年7月26日 星期日

研究ffmpeg放到davinci上面

一開始是研究ffmpeg的版本 最新版是0.5是今年出來的
還很新 上一版已經是兩年前的事情了 所以我應該是要用這一版

網路上主要的文件有兩份
一份是專門作給davinci的 不過這份的話他有要用到ffplay也就是他要播放影片 但是我沒有要用

另一份是講compile ffmpeg的大方法這份的話有x86也有arm的教學
但是原則上這兩份都不夠新 因為最新的應該是今年度出來的document
我將兩份的文件綜來用 設出來自己的configure
以下是我的configure
../configure --arch=armv5 --cross-prefix=arm_v5t_le- --enable-cross-compile --prefix=/home/liuin/ffmpeg/install/ --enable-static --disable-shared --enable-gpl --disable-stripping --disable-network --disable-ipv6 --enable-small --disable-parsers --disable-debug --disable-ffplay
我想我就一項一項的講好了
第一項的arch是沒有用的參數但還是要給 這是我遇到的最大的bug
這裡正常應該是要打arm或是armv[45679]*l才可以

這樣打 她才會知道我們的arch是arm 但是這是目前這個版本的bug
如果真的讓她知道我們的ARCH她會用arm的code來compile

在(ffmpeg source)/libavcodec/arm/asm.S中會有一個eabi_attribute的macro
但是不知道為什麼 compiler就是不認識

這個問題目前是無解的
為什麼我會這麼確定勒 因為我去翻過ffmpeg的bug tracker
https://roundup.ffmpeg.org/roundup/ffmpeg/issue950
這是因為我用的是原本付的tool-chain 他的assembler可能太舊了 就不能用了
(當然可以用其他的tool-chain 但是很多東西要重做....)
所以我只好用generic的ARCH

--cross-prefix是compiler前面的prefix 這個要注意最後還有一個減號
--enable-cross-compile 我不知道這是作什麼的 加就對了
--prefix結果要放在哪裡
--enable-static --disable-shared這兩個目前不知道有什麼用 有人加就跟者加
--enable-gpl聽說程式會變比較快
--disable-stripping執行檔跟object不會分開??
--disable-network --disable-ipv6會少compile一些東西
--enable-small --disable-parsers --disable-debug好像是最佳化的東西
--disable-ffplay這似乎需要其他的套件 (ex.SDL)

2009年7月23日 星期四

安裝davinci的完整tool-chain到ubuntu 9.04

現在正在練習灌davinici的tool-chain
雖然說學長說了一堆 但是跟的他說的似乎不太一樣
不過沒關係 在cd3的那片光碟中有灌的說明文件
我就看得文件上的灌 應該是不會又錯的
目前是灌前三片光碟的.bin的安裝 安裝完是三個.tar檔
都將他們放在/opt底下 (照doc做的最不會有錯)
還有一個是放在自己的home directory底下的資料夾
現在正在研究這些tool-chain要怎麼用

不過在這之前我必須線想起來要怎麼架設nfs才可以
隨便查了一下就看到了 只要灌以下的兩個套件就可以了
nfs-commonnfs-kernel-server 應該是這樣 不過之後要在試試
照文件上的說明其實要開一個nfs的filesys在上面 我開了
也照文件上的說明做了nfs的設定 不過好像是nfs有新的設定
就是有多了subtree_check這個option

現在先不要管好了 有錯再說
因為我現在灌的是ubuntu的nfs-kernel-server
所以說nfs的重開是用/etc/init.d/nfs-kernel-server restart

不是doc上面寫得/sbin/service nfs restart
以上應該是算設定完nfs的部份 沒測過

現在要來尋找可用的超級終端機了..
其實根本就不用尋找了 就是用以前用的minicom 還算堪用 而且我發現其實他在去年還有更新
不過我尋找了很久 還是不知道要怎麼在virtualbox中使用minicom來連接板子
後來就算了 我最後就破例灌在實機的ubuntu上
不過其實還好說minicom只有一個binary而已 我就接受了

一開始當然是要設定configure的檔案 我的設法很簡單
sudo minicom -s 這邊要注意minicom要用super user的權限執行
在設定serial device的時候要設定/dev/ttyUSB0或/dev/ttyUSB1
(這是當/dev/ttyUSB0被鎖住的時候 可能是沒關好minicom)

接下來設定 115200 8N1 我不清楚這是什麼 設了就對了
最後是將設定檔output出來 我是output成first.min
以後執行的時候就打 sudo minicom on first.min
就可以了

這是測試一下
發現minicom是可以用的 但是沒有辦法開啟linux 好像是因為裡面沒有uImage的樣子
我原本想照doc上面的作法 就是用u-boot來掛nfs但是我懶的研究
我就用學長的方式 先用tftp傳linux的uImage檔過去 開機過後在掛nfs

好所以說現在最重要的就是在我的virtualbox中的ubuntu中安裝tftp
我就看看該灌哪一種tftp 我看了一下
就灌tftpd-hpatftp-hpa 理論上應該只要灌tftpd-hpa但是怕麻煩就都灌

還有另外一個原因就是 我希望板子可以找到我的virtualbox中的ubuntu 所以說virtualbox就不應該用nat的網路
應該要用bridge adapter才可以(這樣才可以設定自己的ip 給板子看) 不過後來想想 就給這個ubuntu兩張網卡就好...
好灌好之後就是要設定tftp的時候 不過我懶的設定就用tftp中的預設
就是資料是在/var/lib/tftpboot/底下的才能傳

然後權限全開 就是這樣

最後就是測試我早上用davinci的tool-chain編的hello world有沒有問題
要先將虛擬的ubuntu的ip換成192.168.48.244用ifconfig eth0 192.168.48.244
我從板子上傳官方光碟的uImage到板子上
u-boot中打tftp 0x85000000 uImage 位址的話打 0x80000000到 0x90000000都可以 但是儘量不要打0x81000000以下 可能會出問題
接下來打bootm就可以了
最後就可以登入了 打root就可以了
好現在可以來掛nfs了 但是這裡要注意就是不知道為什麼 ip被換掉了(好像是bootarg的問題)要改回192.168.48.243這是在u-boot的時候的ip
這個時候就可以在/底下打mount -t nfs 192.168.48.244:/home/liuin/fm/filesys /mnt 就可以成功掛到/mnt底下了
在將編好的hello world拿來就發現 是可以跑的 今天的工作就到此結束

2009年7月16日 星期四

灌qt的開發環境

今天開始設定qt的開發環境 當然不用懷疑 我當然是又開了一個virtualbox來用
因為我實在不知道要怎麼灌比較好 一開始我本來想照netbeans官方網頁上寫的做
但是依照我優良的習慣 我一向是先看看在ubuntu的package裡面有沒有我要的package
幸好我有看 ubuntu裡面原本就有了
不過這是我第一次看到ubuntu的package中有這麼新的package

居然跟現在最新的qt同樣版本 可見qt現在有多紅

我就直接用ubuntu的package來用了 我實在懶的自己編了
package很簡單是qt4-dev-tools基本上就這個就可以了
就全部都有了 試一試qmake -v會有版本資訊就是對的了
接下來我就照netbeans官方網站上的練習照做了
他寫得不錯 我都沒遇到什麼問題 這樣做完也算完成qt書的第一章了

我還有設定一個在assembla的account 是專門用來練習的寫程式用的
其中就有一個qt的資料夾 是我以後寫qt程式的練習

2009年7月13日 星期一

安裝latex的開發環境

今天聽到師大老師說以後要我打一些文件
我就想說我可以稱這個機會來練習latex
我就開始研究latex要怎麼寫

首先研究要怎麼灌出開發的環境來
我研究很久看了很多別人寫的文章
本來感覺說寫中文一定很困難
但是其實ubuntu 9.04(不確定是不是從這版開始的 好像不是)已經把他弄的很好寫了
主要灌texlivelatex-cjk-all套件
這樣就可以寫中文再latex中了

我看了許多的latex IDE有兩套看起來不錯
lyxtexmaker 我選了texmaker
為什麼??純粹看起來爽 用熟了改天再試用另一套

以下是最簡單的latex
\documentclass{article}
\usepackage{CJK}
\begin{document}
\begin{CJK}{UTF8}{bkai}
大家好
\end{CJK}
\end{document}

大家好是會顯示出來的內容
再這裡重要的是bkai(楷體) 這個是我選用的字型
其他還有bsmi(明體) gdsn gkai(不知道是什麼體)
我想有這些應該就可以開始動手寫了

2009年7月5日 星期日

安裝web page的開發環境

今天下午重灌了一個ubuntu作為用來開發web的project用的
我是要將他灌在virtualbox 3.0里 但是一直失敗 後來才發現好像是預設的網卡device壞掉了
換一張網卡的device問題就解決了 害我花了一個多小時


灌完之後 就開始灌php mysql apache等的 當然啦 這些都不會有問題的 灌了不知道多少遍了
接下來是要安裝aptana的部份 我灌的是aptana 1.2.7 後面的版本不知道有沒有這個問題
之前一直在linux上都安裝不起來 但是這次我找到了一些有用的文章

http://forums.aptana.com/viewtopic.php?f=37&t=7147
他說主要的問題是在xulrunner上面一定要用1.8.1.3才可以 其他版本都不行
這樣弄之後 還真的可以執行 目前來看沒什麼問題

再來是將之前的svn弄回去 基本上就是用svnadmin load就可以了
這次我多設定了websvn 他沒有辦法設帳號密碼來限制觀看
不過因為我是在vitualbox裡面也就沒差了

所以說svn的reposity是在/var/lib/svn/底下 是配合websvn來作設定

之後要設定是的是apache的userdir來用
我的印象中 好像只要設symbolic link就可以
沒錯我將mods-enabled中新增 兩個symbolic link到mods-aviliable 都是跟userdir有關的
這樣就做完了 新增資料夾public_html到使用者的home directory底下里面就是我們的網頁了