作者 主題: 關於嵌入式的linux,問幾個小問題  (閱讀 15370 次)

0 會員 與 1 訪客 正在閱讀本文。

nra65dr

  • 懷疑的國中生
  • **
  • 文章數: 85
    • 檢視個人資料
關於嵌入式的linux,問幾個小問題
« 於: 2007-05-17 22:06 »
雖然我有很多問題...剛接觸
但是就簡單問幾個問題..

版子:新華_PXA-270

問題1:bootloader  (我用U-BOOT)
只要是U-BOOT就可以了嗎?還是要針對不同的版子去調U-BOOT?

問題2:kernrl (uImage)
我以前在用cf開機時有編過的kernel。那現在我可以拿它直接轉uImage來使用嗎?

問題3:rootfilesystem
只要是rootfs就行了嗎?會跟前面兩個有影響嗎?

其實主要是想問這三個之間的關係、影響。至於如何實作,我想各位高手也很忙吧...

有人願意回我這些鳥問題,我就很感激了~~

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
Re: 關於嵌入式的linux,問幾個小問題
« 回覆 #1 於: 2007-05-18 09:58 »
引述: "nra65dr"
雖然我有很多問題...剛接觸
但是就簡單問幾個問題..

版子:新華_PXA-270

問題1:bootloader  (我用U-BOOT)
只要是U-BOOT就可以了嗎?還是要針對不同的版子去調U-BOOT?

問題2:kernrl (uImage)
我以前在用cf開機時有編過的kernel。那現在我可以拿它直接轉uImage來使用嗎?

問題3:rootfilesystem
只要是rootfs就行了嗎?會跟前面兩個有影響嗎?

其實主要是想問這三個之間的關係、影響。至於如何實作,我想各位高手也很忙吧...

有人願意回我這些鳥問題,我就很感激了~~


由你的問題來看,你對 Linux 系統跟本不熟,
我建議先把基本功夫練好,再來研究會比較好。

你的問題真得很難回答 ;p
這三者之間的關係及顯響並不是三言兩語可以道盡的,我只能簡單的說一下,
一般來說(特殊情況不考慮),bootloader先啟動後,會載入 kernel 及
及 initrd,然後把執行權交給 kernel,kernel 跑好後,會再呼叫 initrd,
來跑程式,而在 Embedded 中,通常這個 initrd 就是你的 rootfilesystem。

jserv

  • 榮譽學長
  • 憂鬱的高中生
  • ***
  • 文章數: 161
  • 性別: 男
    • 檢視個人資料
    • jserv's homepage
Re: 關於嵌入式的linux,問幾個小問題
« 回覆 #2 於: 2007-05-20 22:46 »
引述: "thyme"

這三者之間的關係及顯響並不是三言兩語可以道盡的,我只能簡單的說一下,
一般來說(特殊情況不考慮),bootloader先啟動後,會載入 kernel 及
及 initrd,然後把執行權交給 kernel,kernel 跑好後,會再呼叫 initrd,
來跑程式,而在 Embedded 中,通常這個 initrd 就是你的 rootfilesystem。


就算要簡單解釋,還是不能說「在 Embedded 中,通常這個 initrd 就是你的 rootfilesystem」,此陳述可能會造成更大的誤解。

initrd 的設計是克服 "first userspace" 的需求,所以應該說「initrd 是開機啟動程序的暫時性檔案系統」。另外,竊以為特別標注「在 Embedded 中」也可能會造成誤導,事實上,只要依循 GPL 授權,我們可進行任何修改,當然包含上述機制,沒有固定不變的流程。

延伸閱讀:
. Introducing initramfs, a new model for initial RAM disks
  http://www.linuxdevices.com/articles/AT4017834659.html
. http://en.wikipedia.org/wiki/Initrd

Regards,
-jserv

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
Re: 關於嵌入式的linux,問幾個小問題
« 回覆 #3 於: 2007-05-21 17:24 »
引述: "jserv"
引述: "thyme"

這三者之間的關係及顯響並不是三言兩語可以道盡的,我只能簡單的說一下,
一般來說(特殊情況不考慮),bootloader先啟動後,會載入 kernel 及
及 initrd,然後把執行權交給 kernel,kernel 跑好後,會再呼叫 initrd,
來跑程式,而在 Embedded 中,通常這個 initrd 就是你的 rootfilesystem。


就算要簡單解釋,還是不能說「在 Embedded 中,通常這個 initrd 就是你的 rootfilesystem」,此陳述可能會造成更大的誤解。

initrd 的設計是克服 "first userspace" 的需求,所以應該說「initrd 是開機啟動程序的暫時性檔案系統」。另外,竊以為特別標注「在 Embedded 中」也可能會造成誤導,事實上,只要依循 GPL 授權,我們可進行任何修改,當然包含上述機制,沒有固定不變的流程。


你說的沒錯,我這麼說會造成誤解 ;>

jserv

  • 榮譽學長
  • 憂鬱的高中生
  • ***
  • 文章數: 161
  • 性別: 男
    • 檢視個人資料
    • jserv's homepage
回覆: Re: 關於嵌入式的linux,問幾個小問題
« 回覆 #4 於: 2008-01-21 09:45 »
initrd 的設計是克服 "first userspace" 的需求,所以應該說「initrd 是開機啟動程序的暫時性檔案系統」。另外,竊以為特別標注「在 Embedded 中」也可能會造成誤導,事實上,只要依循 GPL 授權,我們可進行任何修改,當然包含上述機制,沒有固定不變的流程。

昨天整理一份筆記「深入理解 Linux 2.6 的 initramfs 機制」:
http://blog.linux.org.tw/~jserv/archives/001954.html

花了些篇幅探討 initramfs 與 initrd,希望對觀念建立有幫助。
-jserv

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17464
    • 檢視個人資料
    • http://www.study-area.org
回覆: 關於嵌入式的linux,問幾個小問題
« 回覆 #5 於: 2008-01-21 12:14 »
好文章!

不過,想請問一下 jserv 大:
第一次執行 qemu
$ qemu -kernel arch/i386/boot/bzImage -hda /dev/zero
沒有指定 initrd ,為甚麼後來可以看到  Hello World ?
是內建如此的嗎?

感謝解惑哦~~~  ^_^

jserv

  • 榮譽學長
  • 憂鬱的高中生
  • ***
  • 文章數: 161
  • 性別: 男
    • 檢視個人資料
    • jserv's homepage
回覆: 關於嵌入式的linux,問幾個小問題
« 回覆 #6 於: 2008-01-21 12:20 »
好文章!

不過,想請問一下 jserv 大:
第一次執行 qemu
$ qemu -kernel arch/i386/boot/bzImage -hda /dev/zero
沒有指定 initrd ,為甚麼後來可以看到  Hello World ?
是內建如此的嗎?

感謝指教!

是的,啟動 initramfs 後,新的 kernel image 實際上就是 kernel code + initramfs (cpio+gzip),對 boot loader 來說,就只有一個 image,但是一旦執行權交給 kernel 後,會將 cpio+gzip 那段解開並建立 tmpfs,這也就是 initramfs。

詳細的實做細節會在下集分曉 :-)

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17464
    • 檢視個人資料
    • http://www.study-area.org
回覆: 關於嵌入式的linux,問幾個小問題
« 回覆 #7 於: 2008-01-21 12:28 »
哦,那期待下集哦~~~

還以為啥也不用改,官方 kernel 編完就如此呢...  ^_^

jserv

  • 榮譽學長
  • 憂鬱的高中生
  • ***
  • 文章數: 161
  • 性別: 男
    • 檢視個人資料
    • jserv's homepage
回覆: 關於嵌入式的linux,問幾個小問題
« 回覆 #8 於: 2008-01-21 14:34 »
哦,那期待下集哦~~~

還以為啥也不用改,官方 kernel 編完就如此呢...  ^_^

預設就該如此的 :-)

可以試試看。

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17464
    • 檢視個人資料
    • http://www.study-area.org
回覆: 關於嵌入式的linux,問幾個小問題
« 回覆 #9 於: 2008-01-21 14:41 »
是哦?
不好意思,還沒動手呢。

那個 hello word 就是用前面自己編的 init 跑出來的嗎?
我看不到在哪個地方指定。官方 kernel 應該不至於那麼“聰明”吧?

感謝 jserv 大的解答哦!


jserv

  • 榮譽學長
  • 憂鬱的高中生
  • ***
  • 文章數: 161
  • 性別: 男
    • 檢視個人資料
    • jserv's homepage
回覆: 關於嵌入式的linux,問幾個小問題
« 回覆 #10 於: 2008-01-21 14:48 »
那個 hello word 就是用前面自己編的 init 跑出來的嗎?
我看不到在哪個地方指定。官方 kernel 應該不至於那麼“聰明”吧?

我有提到「要注意的是,需將 "General setup" 的子項目 "Initial RAM filesystem and RAM disk (initramfs/initrd) suppot" 打開,並在下方提示 "INITRAMFS_SOURCE" 的畫面輸入我們期望的 initramfs 的來源目錄,也就是 "/home/jserv/initramfs-workspace/hello-initramfs"」

可能寫得不是很明顯 :)

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17464
    • 檢視個人資料
    • http://www.study-area.org
回覆: 關於嵌入式的linux,問幾個小問題
« 回覆 #11 於: 2008-01-21 14:54 »
啊,sorry,真的沒看見呢.... 不好意思~~  >_<
(還看了兩次!)

nienfeng

  • 可愛的小學生
  • *
  • 文章數: 17
    • 檢視個人資料
回覆: 關於嵌入式的linux,問幾個小問題
« 回覆 #12 於: 2008-08-25 20:46 »
請問各位
我照著 jserv 這篇  以 cpio+gzip 的方式製作 ramdisk 是可行的。但有些地方有疑惑,還請各位解惑。

我以相同的內容,但以 ext2+gzip 的方式製作 ramdisk,再用 qemu 執行時卻發現有不同的狀況。
mkdir initrd
dd if=/dev/zero of=busybox.initrd.img bs=1k count=8192
mke2fs -F -v -m0 busybox.initrd.img
sudo mount -o loop busybox.initrd.img initrd
cp -av busybox-initramfs/* initrd
sudo umount initrd
gzip -9 busybox.initrd.img
qemu -kernel arch/i386/boot/bzImage -initrd ../busybox.initrd.img.gz -hda /dev/zero -append "root=/dev/ram0"

#可以看見 kernel 有偵測到 initramfs
[xx..xx] checking if image is initramfs...it isn't (no cpio magic); looks like an initrd
#但無法啟動,卡在
[xx..xx] Warning: unable to open an initial console.
#依上個 warning,猜測缺少 console device,自行建立。
gzip -d busybox.initrd.img.gz
sudo mount -o loop busybox.initrd.img initrd/
cd initrd/
mkdir dev
sudo mknod -m 600 dev/console c 5 1
cd ..
sudo umount initrd
gzip busybox.initrd.img
qemu -kernel arch/i386/boot/bzImage -initrd ../busybox.initrd.img.gz -hda /dev/zero -append "root=/dev/ram0"
#成功了。

但問題來了,在使用 cpio+gzip 時,開機後會自行建立 /dev/console
但在使用 ext2+gzip,卻沒有這動作,必需手動自行建立
請問為何會有如此的差異呢?

nienfeng

  • 可愛的小學生
  • *
  • 文章數: 17
    • 檢視個人資料
回覆: 關於嵌入式的linux,問幾個小問題
« 回覆 #13 於: 2008-08-25 21:11 »
我有發現以  cpio+gzip 方式,開機時執行的是 /init
但以 ext2+gzip 方式時,開機時執行的是 /bin/init,而非/init
所以我用以下方式修正
qemu -kernel arch/i386/boot/bzImage -initrd ../busybox.initrd.img.gz -hda /dev/zero -append "root=/dev/ram0 init=/init"
確定開機時是執行/init了
但問題仍在,為啥 cpio+gzip 方式時,會自行建立 /dev/console,而 ext2+gzip時,卻必需手動建呢?

jserv

  • 榮譽學長
  • 憂鬱的高中生
  • ***
  • 文章數: 161
  • 性別: 男
    • 檢視個人資料
    • jserv's homepage
回覆: 關於嵌入式的linux,問幾個小問題
« 回覆 #14 於: 2008-12-05 13:48 »
我有發現以  cpio+gzip 方式,開機時執行的是 /init
但以 ext2+gzip 方式時,開機時執行的是 /bin/init,而非/init
所以我用以下方式修正
qemu -kernel arch/i386/boot/bzImage -initrd ../busybox.initrd.img.gz -hda /dev/zero -append "root=/dev/ram0 init=/init"
確定開機時是執行/init了
但問題仍在,為啥 cpio+gzip 方式時,會自行建立 /dev/console,而 ext2+gzip時,卻必需手動建呢?

這是 initramfs 與 initrd 開機程序的差異,詳情可參考 Linux Kernel 原始程式碼 init/ 目錄。

Regards,
-jserv