發表文章

目前顯示的是 1月, 2010的文章

GM8181 kernel & file system 掛載的方法

前一陣子試作了 8181 的開機方法。 Kernel 比較沒問題,用 TFTP 讀到 ram 上就可以了 File system 有兩種方式:1. NFS, 2. RAMDISK, 3. ROMFS 當然,都是用 UBOOT 來引導開機。 下面說明 NFS & RAMDISK, bootargs 的設定。 1. NFS bootargs 'mem=128M console=uart,shift,2,io,0xF9830000,38400 root=/dev/nfs rw nfsroot=10.1.2.198:/mnt/rootfs_H8 ip=10.1.2.243:10.1.2.198::255.255.255.0::eth0:none ' 2. RAMDISK bootargs 'mem=128M console=uart,shift,2,io,0xF9830000,38400 root=/dev/ram0 rw ' PS:(1) 在 kernel 下,make 時, ramdsisk 的大小要調整。避免有問題。 (2) bootm 0xXXXXXXXX 0xXXXXXXXX --& gt; 第一個是 kernel 的位址,第二個是 RAMDISK 的位址 (3) RAMDISK 的方法,請參考 建立 ext2 & jffs2 file system 3. ROMFS 這部份是將 file system 燒在 flash 裡,用 MT D 方式 mount 起來。 bootargs 'mem=128M $(console) mtdparts=nand_mtd:0x1300000@0x500000(kernel),0x6800000@0x1800000(rootfs),0x140000@0x0(Loader)ro,0x280000@0x140000(burnin)ro,0x140000@0x3c0000(uboot)ro root=/dev/mtdblock1 rw' 但在這個平台上,會不動作,不清楚問題在哪??帶釐清。 錯誤訊息:"Kernel panic

GIT 使用

公司要求要做 version controll 很久了。 也導入了 GIT ,但嫌麻煩,一直沒用。不過,還是逃不了。 當然,它是很不錯的工具。會用是一件好事,可以增長見識。 不免俗的介紹一下何謂:GIT Git 是 Linus Torvalds 寫的, 也就是寫企鵝系統 Linux 的那個。 你可以看看他 介紹 Git 的影片。 裡面一直說用 Subversion 的人很笨,所以他聽起來有點沒水準。 世上的人不可能每個人都像他那麼聰明吧? Linux 的版本管理就是用 Git 的喔, 所以 Git 也很適合超大型的檔案版本管理。 Git 很快也很省空間。 它利用分散式的管理方法, 也就是說每個人下載的版本裡有包含有史以來更改過的紀錄。 沒有一個人的版本是主要的版本, 你喜歡把自己的版本怎麼改就怎麼改, 那你喜歡接受任何人的更改就接受人和人的更改。 這樣來說,不就天下大亂? Linus 說不會, 因為他只接收他信任的人的修改, 不會隨便去跟阿貓阿狗的程式碼合併。 而他信任的人也同樣的只會接受他們信任的人的修改, 依此類推。 GIT 功能太多,我也不想那麼瞭解。夠用就好。先貼一下 command 介紹。 $ git init # 開始用 Git 來管理 $ git add . # 把所有檔案加入 Git $ git commit -a # 做成一個版本 $ git commit -a -m "your message here" # commit 時直接寫訊息, 不用到下個螢幕上寫 $ git tag v0.02 # 本版別名取為 v0.02 $ git tag v0.03 40e3e # 把版本 40e3e 取名為 v0.03; $ git status # 查詢從上個版本到現在哪些檔案被修改 $ git diff # 查詢從上個版本到現在哪幾行被修改 $ git diff v0.01 v0.03 # 查詢兩個版本間的差異 $ git diff v0.01:story.txt v0.03:story.txt # 查詢兩個版本間某個檔案的差異 $ git log # 查詢

C語言中資料結構(struct)的大小

C語言中資料結構(struct)的大小 通常在PC上寫程式時,很少會去管struct會佔掉多少記憶體。 當要使用到時,也不會想去用手算到底佔掉多少,大多是直接使用sizeof來做計算。 然而sizeof計算出來的值往往不會如我們想的一樣。因為compiler為了效能考量,會自動地為我們 做最佳化,也就是資料對齊。為了這個目的,compiler會為struct多準備一些記憶體。 我們可以看以下的code: struct ABC { int index; char name[6]; int score; }; struct DEF{ int att; char name[3]; }; int main(void) { printf("sizeof(ABC) = %d\n", sizeof(struct ABC)); printf("sizeof(DEF) = %d\n", sizeof(struct DEF)); return 0; } 說明: 1. 若我們直接去計算struct ABC和strcut DEF時, struct ABC = 4 + 6 + 4 = 14 (struct ABC用掉14個byte) strcut DEF = 4 + 3 = 7 (struct DEF用掉7個byte) 2. 但真的是這樣嗎?程式執行出來的結果卻是, sizeof(ABC) = 16 sizeof(DEF) = 8 3. 這就是compiler為我們做了對齊的最佳化,將這二個的struct都調整成2的次方。這樣有利於運算。 這樣的做法在PC上通常沒有問題,但若是在嵌入式系統上,記憶體必需要錙珠必較時 ,我們就必須要考量到使用struct所佔掉的記憶體空間,上次和Tick討論Linux kernel 裡的List結構時,遇到了這個問題。他告訴我可以使用__attribute__((packed));這個關鍵字, 它的作用在於叫compiler不要為我們做對齊的最佳化,因此,計算的結果就會如同我們所想的一樣了。 struct ABC { int index; char name[6]; int score; } __attribute__((packed));; struct DEF{ int att; c

建立 ext2 & jffs2 file system

建立ext2 file system Ext2是GNU/LINUX系統中標準的檔案系統, 其特點在於存取檔案的效能極好,對於中小型的檔案尤佳.這是因為其資料區塊快取層的優良設計. 其 單一檔案大小和檔案系統本身的容量上限與檔案系統本身的資料區塊大小有關,在一般常見的x86系統中, 資料的區塊大小是4 KB, 則單一檔案大小的上限為2048GB,而檔案系統的容量上限為16348GB. 但以kernel 2.4來說, 其所使用的單一分割區最大只有1048GB, 因此實際上檔案系統能使用的分割區最大也是2048GB. 如何建立一個ext2的Root FileSystem, 以下的過程全部在Linux Host上進行 1,建立一個空的ext2檔案系統 我們將建立一個檔名為rootfs.ext2的檔案, 且其內容8192KB左右大小的檔案.如下: dd if=/dev/zero of=rootfs.ext2 bs=1k count=8192 (1), dd這個指令是用來轉換檔案並且copy用的. (2), if 指的是要被轉換的輸入檔案格式/dev/zero, 可由man zero 來查看其內容. (3), of 指的是輸出的檔案, 我們將之輸出到rootfs.ext2這個檔案. (4), bs指的是一個磁區佔用幾個kb. (5), count指的是要使用多少個bs, 所以最後的容量為 bs*count = 1k*8192 mke2fs -F -m0 -i 4000 rootfs.ext2 (1), mke2fs 指令是用來將碟磁格式化為LINUX檔案系統. (2), 我們將rootfs.ext2格式化為ext2格式. (3), -i 選項是指要建立的inode數, 這裡建立了4000個. (5), 此步驟是建立的個空的ext2檔案系統, 我們必須先將之掛載後才能新增檔案. 2, 將空的ext2檔案系統掛載起來 mount -w -o loop rootfs.ext2 /mnt/tmp (1), 將rootfs.ext2檔案系統掛載到/mnt/tmp下, 其中-w的選項, 是設定其為read/write模式, 若設為-r則是read only唯讀模式. 3, 新增檔案至檔案系統 現在我們巳經把檔案系統掛載起來, 接著將所需要的檔案加入/mnt/tmp中.

使用 udhcpc ...

要在 busybox 使用 udhcpc ...步驟如下: 1. Kernel : make menuconfig --> Packet socke --> IP: DHCP support 關鍵: 2. 將 busybox 裡的 examples/udhcp/*.* 複製到 /usr/share/udhcpc/*.* 3. 將 /usr/share/udhcpc/simple.script 更名為 /usr/share/udhcpc/default.script 4. mkdir /etc/udhcpc/ --> 存放 DHCP server 回覆的 address。 當然,要在 bosybox 下,先 make udhcpc.

將 Kernel 與 Initramfs 分開 build

圖片
拿到 GM8185 的公版。它附的 SDK ,將 Kernel 與 Initramfs 包在一起。 要將他們分開。 Menuconfuig General setup ---> Initramfs source file(s) 取消。就可以了

將 driver 寫成 kernel 的一部分

若想要將 driver 編成 kernel 的一部分,在開機時就直接掛載到 Linux 上,要先將 driver 程式放在 kernel source 裡,並將 Makefile 作一些調整使編譯 kernrl 時能夠將 driver 囊括進去。 3.2.1 編輯 driver source 請將 driver source code 放到 /driver/char/ 目錄中,這裡放的是 linux character device driver 的程式碼。 3.2.2 調整 Kconfig 接下來,我們要調整 Kconfig 使 make menuconfig 時出現 demo driver 的選項。 /driver/char/Kconfig 是定義 menuconfig 的檔案,請跳到最後一行,並在 endmenu 前加入 config DEMO tristate "DEMO driver for OPENCSL" default n 其中 config DEMO 是宣告一個新的選項叫做 DEMO ,它的說明為 DEMO driver for OPENCSL , menuconfig 的預設是沒有選取。 3.2.3 調整 Makefile 再來是調整 Makefile ,使 driver 能夠在編譯時被包含到 kernel 中。在 /driver/char/Makefile 這個關於 character device driver 的 Makefile 中找到 obj-$(CONFIG_TCG_TPM) += tpm/ 並在其下一行加入 obj-$(CONFIG_DEMO) += demo.o 即可。 3.2.4 重新編譯 kernel 最後,使用 cross-compiler 重新編譯 kernel ,即可產生包含 DEMO driver 的 kernel image 。 Reference: http://opencsl.openfoundry.org/Lab08_device_driver.rst.html