Submitted by admin on Fri, 02/05/2010 - 15:54
qemu เป็นโปรแกรมในลักษณะที่เรียกว่า Virtual Mahine คือเป็นเครืองเทียมที่เราสามารถใช้จำลองระบบฮาร์แวร์ เพื่อใช้ในงานพัฒนาโปรแกรมโดยไม่จำเป็นต้องมีฮาร์แวร์จริง บทความนี้จะแสดงวิธีการจำลองระบบ mini2440 ด้วย qemu

ภาพตัวอย่าง fluidlauncher วิ่งบน qemu + lcd 7 "
ขั้นตอนการติดตั้งจะเป็นดังนี้ครับ
1. เตรียม Host Machine
Host ที่ใช้สาธิตจะวิ่ง OS Ubuntu 9.10 ภายใต้ user ที่มีชื่อว่า mini2440
ให้ติดตั้งโปรแกรมที่จำเป็นต่อการคอมไพล์ดังนี้
$ sudo apt-get update |
2. สร้าง qemu-system-arm สำหรับ mini2440
$ mkdir ~/qemu |
เราจะได้โปรแกรมที่ใช้ในการรันอยู่ที่ ~/qemu/mini2440/arm-softmmu/qemu-system-arm
และ script สำหรับการรันอยู่ที่ ~/qemu/mini2440/mini2440/mini2440_start.sh
ให้สร้างไฟล์ start.sh ภายใต้ directory ~/qemu/mini2440/mini2440 เป็นดังนี้ (ให้ใช้คำสั่ง chmod 755 mini2440/start.sh เพื่อกำหนดให้ไฟล์สามารถ execute ได้ด้วย)
|
|
3. เตรียมระบบ network ของ Host เพื่อให้เชื่อมต่อกับ network ภายใน qemu
ติดตั้ง utilities สองตัวดังนี้
$ sudo apt-get install bridge-utils |
สร้าง script ชื่อ network.sh ภายใต้ direcotry mini2440 เป็นดังนี้ (ให้ใช้คำสั่ง chmod 755 mini2440/network.sh เพื่อกำหนดให้ไฟล์สามารถ execute ได้ด้วย)
#!/bin/sh |
network.sh จะทำการ
- สร้าง Bridge Device br0
- ปลด eth0 จากเน็กเวิร์คหลัก
- เชื่อม eth0 ผ่าน br0
- ขอ ip address จาก dhcp server ให้กับ br0
- สร้าง Device tap1
หมายเหตุ โปรดระวังเครื่องหมายหน้าและหลังคำสั่ง whoami
4. สร้างscript ที่ชื่อ /etc/qemu-ifup เพื่อทำการเชื่อมต่อ tap1 เข้ากับ bridge br0 ดังข้อความนี้
qemu-ifup จะถูกเรียกใช้เมื่อวิ่ง start.sh
#!/bin/sh |
กำหนดให้สามารถ execute ได้ดังนี้
$ sudo chmod 755 /etc/qemu-ifup |
5. กำหนดให้ user mini2440 สามารถวิ่งบางคำสั่งที่ต้องการ root acess โดย แก้ไขไฟล์ /etc/sudoers ด้วยคำสั่ง
$ sudo visudo |
เพิ่มบรรทัดที่แสดงด้วยสีดังนี้
|
|
6. ในกรณีที่ไม่มี device tun ให้สร้างดังนี้
$ sudo mknod /dev/net/tun c 10 200 |
มาถึงจุดนี้ระบบเราพร้อมที่จะใช้งานแล้วครับ
7. รู้จักระบบ qemu-system-arm
จากระบบตัวอย่างของเราไฟล์ต่างๆจะเป็นดังนี้
- directory ที่เราจะรันอยู่ที่ ~/qemu/mini2440
- โปรแกรม qemu-system-arm อยู่ที่ ~/qemu/mini2440/arm-softmmu
- script ที่ใช้เรียกโปรแกรมอยู่ที่ ~/qemu/mini2440/mini2440/start.sh
- script ที่ใช้เซ็ท network อยู่ที่ ~/qemu/mini2440/mini2440/network.sh
- script ที่ใช้เซ็ท network อีกตัวที่จะเรียกโดย start.sh อยู่ที่ /etc/qemu-ifup
นอกจาก script ที่กล่าวมาข้างต้นแล้ว ยังมีไฟล์อีกสามตัวที่จำเป็นต่อการใช้งานจำลอง mini2440 นั่นก็คือ
- ไฟล์ชื่อ u-boot.bin (ต้องเป็นชื่อนี้เท่านั้น) ซึ่งไฟล์นี้จะทำหน้าที่เป็น bootloader และจะถูกเรียกใช้งานทุกครั้งที่เริ่มโปรแกรม โดยจะต้องอยู่ใน directory ~/qemu/mini2440/mini2440 (ดูเรื่องการสร้าง uboot ได้จาก http://project4fun.com/node/12)
- ไฟล์ชื่อ mini2440_nand.bin ที่จะทำหน้าที่คล้ายๆ nand flash ไฟล์นี้จะถูกสร้างขึ้นอัตโนมัติในกรณีที่ไม่มีมาก่อน
- ไฟล์ชื่อ sd.img จะทำหน้าที่คล้ายๆ sd card ของระบบ
ไฟล์ sd.img ซึ่งเป็นไฟล์จำลอง sd card สามารถสร้างได้สองวิธีดังนี้
- สร้างไฟล์ตามนี้ http://code.google.com/p/mini2440/wiki/QEmuSDCardImage
- สร้างจาก sd card จริง วิธีนี้ค่อนข้างจะมีประโยชน์มากเนื่องจากไฟล์จะมีขนาดเท่ากับ sd card จริงทำให้การ copy ไปมาทำระหว่างไฟล์เทียมกับไฟล์จริงเป็นไปด้วยความง่ายดาย
- ให้เตรียม sd card ให้พร้อมสำหรับที่จะวิ่งบน mini2440 โดยการแบ่ง partition และ copy file ต่างๆให้เรียบร้อย
- เสียบ sd card เข้ากับระบบและใช้คำสั่ง sudo fdisk -l เพื่อค้นหาว่าเป็น device อะไร (สมมติว่าเป็น /dev/sdb)
- ใช้คำสั่ง sudo dd if=/dev/sdb of=sd.img แล้วสามารถที่จะเอาไฟล์ sd.img ไปใช้งานได้ทันที
|
|
ให้ copy ไฟล์ u-boot.bin และ sd.img(ที่มี linux file system พร้อมสำหรับใช้งานแล้ว) ไปไว้ที่ ~/qemu/mini2440/mini2440
8. เริ่มการใช้งาน qemu
เบื้องต้นให้ทดสอบดูระบบ network ก่อน จะเห็นว่า eth0 จะเป็นอุปกรณ์หลักของระบบในการต่อเข้ากับ network
|
|
สร้าง bridge network ด้วยคำสั่ง ./mini2440/network.sh
|
|
ตรวจสอบอีกครั้งจะเห็นว่าคราวนี้ br0 จะเป็นตัวที่ต่อกับเครือข่ายหลัก โดยมี eth0 เป็นตัวลูก
หมายเหตุ ถ้า br0 ไม่สามารถร้องขอ ip address จาก dhcp ได้ ให้ลองใช้คำสั่ง
$ sudo /etc/init.d/networking restart
แล้วตามด้วย ./mini2440/network.sh อีกครั้งหนึ่ง
|
|
ทำการรัน qemu ด้วยคำสั่ง ./mini2440/start.sh ก็จะเห็น window เปิดขึ้นมาอีกอัน ซึ่งอันนั้นเปรียบเสมือนจอ LCD ส่วน window เดิมจะทำหน้าที่แสดงข้อความที่ออกมาจาก serial port ของ qemu (เนื่องจากเรากำหนด option ให้ -serial stdio)
โปรดสังเกตุ *** Warning - bad CRC or NAND, using default environment เนื่องจากตอนนี้ flash file ของเราไม่ได้ถูก format นั่นเอง ลำดับจากนี้ไปก็สามารถทำตามขั้นตอนปกติเหมือนเครื่องจริงได้เลยครับ
|
|
ทำการเคียร์ข้อมูลทุกอย่างบน nand ด้วยคำสั่ง nand scrub
|
|
สร้าง bad block table ด้วยคำสั่ง nand createbbt
|
|
สร้างที่เก็บข้อมูล environment ของ uboot
|
|
|
|
จะเห็นว่าเมื่อ reset แล้ว error *** Warning - bad CRC or NAND, using default environment จะหายไป
|
U-Boot 1.3.2-moko12 (Jun 26 2009 - 18:16:16) I2C: ready |
มาถึงจุดนี้ระบบเราก็พร้อมที่จะทดสอบแล้วครับ เราจะลองทดสอบการใช้ sd card ซึ่งแบ่งเป็นสาม partion คือ
- parition 1 type FAT เก็บ uImage
- parition 2 type ext3 เก็บ linux file system
- parition 3 type swap
ทำการค้นหาชื่อไฟล์ และกำหนด bootcmd ให้โหลดจาก sd card
|
|
กำหนดให้ bootargs เพื่อ Mount file system บน partition 2 ของ sd card หลังจากนั้นบันทึก environment และ ทำการ reset ระบบ
|
|
ท่านก็จะได้เห็นภาพคุ้นๆของเพนกวิน และจากตัวอย่างจะเป็น Linux Angstrom



ข้อควรรู้บางอย่างเมื่อใช้งาน qemu
- ในการใช้งาน Qt ควรเปลี่ยนจากจอ touch screen เป็น mouse ด้วยคำสั่ง export QWS_MOUSE_PROTO=MouseMan:/dev/psaux ก่อนการรัน application
- ถ้ากด ctrl-c บน console ที่ใช้ launch qemu จะทำให้ qemu หยุดทำงาน ดังนั้นควรจะเปิดหน้าต่าง console อีกอันแล้วใช้คำสั่ง ssh -l username ipaddress เพื่อ putty เข้าไปใช้งานควบคุมแทนการใช้ copnsole ที่ launch qemu โดยตรง
- ถ้าผ่าน mini2440-1tb ไปยัง bootargs ดังนี้ setenv bootargs 'noinitrd rootdelay=3 root=/dev/mmcblk0p2 console=ttySAC0,115200 rootwait mini2440=1tb' จะทำให้จอ lcd ของระบบ mini2440 เปลี่ยนไปเป็น 7 นิ้วเหมือนระบบจริง
- เมื่อคลิ๊กเข้าไปใช้งานบนจอ lcd ของ qemu แล้ว หากจะออกจากระบบ qemu กลับเข้ามายัง console ต้องกดปุ่ม ctrl-alt ก่อนถึงจะสามารถออกจากระบบ qemu ได้
- ใน script start.sh ที่ใช้วิ่ง qemu หากเปลี่ยน -sd ไปเป็น device จริงเช่นถ้า sd card ต่อกับระบบ linux เป็น /dev/sdb เราสามารถใช้ option -sd /dev/sdb ก็จะสามารถใช้งาน sd card ได้โดยตรง
หวังว่าคงสนุกกับการใช้งาน mini2440 จำลองนะครับ
images ที่ใช้ทดสอบระบบ qemu ในบทความสามารถดาวน์โหลดได้จาก ที่นี่ครับ
อ้างอิง
http://repo.or.cz/w/qemu/mini2440.git
http://compsoc.dur.ac.uk/~djw/qemu.html
https://help.ubuntu.com/community/WindowsXPUnderQemuHowTo
http://ubuntuforums.org/archive/index.php/t-593577.html
http://www.aurel32.net/info/debian_arm_qemu.php
http://code.google.com/p/mini2440/wiki/QEmuSDCardImage