'dev/mobile'에 해당되는 글 6건

  1. 2015/02/17 scott [Android] boot.img 조작
  2. 2011/09/09 scott [GDB] GDB Insight를 arm용으로 compile
  3. 2010/09/27 scott [QEMU] #3. qemu + gdb 디버깅하기
  4. 2010/09/27 scott [QEMU] #2. qemu + rootfs(Busybox SHELL)

[Android] boot.img 조작

dev/mobile RSS Icon ATOM Icon 2015/02/17 08:47 scott
사용자 삽입 이미지

Android boot.img는 kernel + ramdisk입니다.
이 boot.img를 변경 적용하는 방법입니다.


$split_bootimg.pl boot.img 하면
kernel image와 ramdisk 이미지가 분리되면서, 아래와 같이 size와 cmdline 정보를 볼 수 있습니다.
Page size: 2048 (0x00000800)
Kernel size: 7115952 (0x006c94b0)
Ramdisk size: 4083551 (0x003e4f5f)
Board name:
Command line: console=ttyHSL0,115200,n8 user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3 androidboot.hardware=xxx .....
Writing boot.img-kernel ... complete.
Writing boot.img-ramdisk.gz ... complete


kernel base address를 확인해 놓습니다. 다시 압축할 때 필요하겠죠.
$unpackbootimg -i boot.img

ramdisk를 압축해제 합니다.
ramdisk는 루트파일 시스템으로 init script, mount를 위한 directory 구조를 가지고 있는 ram 파일 시스템입니다.
$gzip -d boot.img-ramdisk.gz
cpio를 이용해 ramdisk를 풀어줍니다.
디렉토리를 만들어 압축을 풀어야 나중에 편합니다.
$mkdir ramdisk && mv boot.img-ramdisk ramdisk/ && cd ramdisk
$cpio -i -F boot.img-ramdisk

이제 boot.img에 포함된 ramdisk를 확인&수정할 수 있습니다.
수정하고자 하는 내용 변경 후,
$find . | cpio -o -H newc -O ../ramdisk
$cd .. && gzip ramdisk


만들어진 ramdisk와 kernel 이미지를 합칩니다.
$mkbootimg --cmdline "기존 cmdline" --base "unpackbootimg에서 확인한 base address" --pagesize (split에서 나온 page size) --kernel boot.img-kernel --ramdisk ramdisk.gz -o new-boot.img

완성되었으니 디바이스에 밀어넣으면 됩니다.
$fastboot flash boot new-boot.img





2015/02/17 08:47 2015/02/17 08:47
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.semanogic.com/blog/tc/scott/rss/response/91

댓글+트랙백 ATOM :: http://www.semanogic.com/blog/tc/scott/atom/response/91

GDB를 GUI와 함께 사용하기 위한 tool 중, GDB Insight를 arm용으로 컴파일하기.

http://sourceware.org/insight/

w get ftp://sourceware.org/pub/insight/releases/insight-6.8-1a.tar.bz2

[compile]
./configure --target=arm-elf-linux --disable-werror
make
make install (/usr/local/bin)

(tcl8.4, tk8.4가 설치되어 있어야 함)
sudo apt-get install tcl8.4 tk8.4

[실행]
// gdb 서버, tcp 포트 포워딩 등 설정 후,
arm-elf-linux-insight

gdb를 내장하고 있음.
2011/09/09 10:15 2011/09/09 10:15
TAG ,
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.semanogic.com/blog/tc/scott/rss/response/73

댓글+트랙백 ATOM :: http://www.semanogic.com/blog/tc/scott/atom/response/73

======================================================================
BUILD 시스템 build_root 설정
export XTARGET=arm-linux  or  export XTARGET=arm-unknown-linux-gnueabi
export XBUILDSRC=path/to/src/root ($HOME/workspace/x-tool/src)
export XBUILDROOT=path/to/build-install/root ($HOME/workspace/x-tool/usr)
=========================================================

// gdb download
// BUILD GDB (host executable)
$ cd $XTARGETSRC
$ w get http://ftp.gnu.org/gnu/gdb/gdb-7.2.tar.gz
$ tar xzvf gdb-7.2.tar.gz
$ cd gdb-7.2
$ mkdir buildgdb & mkdir buildgdbserver
$ cd buildgdb
$ ../configure --target=$XTARGET --prefix=$XTARGETBIN
$ make && make install

// BUILD GDBSERVER (target executable)
$ cd ../buildgdbserver
$ CC=arm-unknown-linux-gnueabi-gcc ../gdb/gdbserver/configure --host=arm-unknown-linux-gnueabi --prefix=$XTARGETBIN
$ make && make install
(make에서 libinproctrace.so 관련 에러 참조)

// Debug Sample (GNU Hello)
$ w get http://ftp.gnu.org/gnu/hello/hello-2.6.tar.gz
$ tar xzvf hello-2.6.tar.gz
$ cd hello-2.6
$ configure --host=arm-unknown-linux-gnueabi
$ make

gdbserver, hello는 연관된 so 파일들과 함께 target의 root file system 생성에 포함 (/usr/bin/, /lib)
$ readelf -a gdbserver | grep lib

gdb는 host에서 tcp connection을 이용해서 디버깅한다.

// tcp connection을 이용해 디버깅하기 위해 target system의 network을 동작 시켜야 한다 (target의 /etc/init.d/rcS 파일을 아래와 같이 수정한다)
--------------------------------------------------------------------
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
ifconfig lo up
ifconfig eth0 10.0.2.15 netmask 255.255.255.0
route add default gw 10.0.2.1
--------------------------------------------------------------------

// debugging
$ qemu-system-arm -M versatilepb -m 128M -kernel linux-2.6.35.6/arch/arm/boot/zImage -initrd rootfs.img.gz -append "root=/dev/ram rdinit=/sbin/init" -redir tcp:1234::1234
// on target system
library path가 잡혀있지 않으므로 환경변수를 먼저설정한다
$ export LD_LIBRARY_PATH=/lib
$ gdbserver --multi 10.0.2.15:1234

// on host system
$ ddd --debugger arm-unknown-linux-gnueabi-gdb
: set solib-absolute-prefix nonexistantpath
: set solib-search-path $XBUILDROOT/lib/
: file hello-2.6/src/hello
: target extended-remote localhost:1234
: set remote exec-file /usr/bin/hello
: break main
: run



2010/09/27 13:30 2010/09/27 13:30
TAG ,
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.semanogic.com/blog/tc/scott/rss/response/68

댓글+트랙백 ATOM :: http://www.semanogic.com/blog/tc/scott/atom/response/68


// busybox source
$ w get http://www.busybox.net/downloads/busybox-1.17.2.tar.bz2
$ tar xvjf busybox-1.17.2.tar.bz2
$ cd busybox-1.17.2
$ make menuconfig
==> build option의 static executable, build prefix를 eabi toolchain의 prefix로 맞춰준다
$ make & make install

make install에 의해 _install 폴더에 설치된 busybox를 root file system으로 변환
$ cd _install

/sbin/init을 이용하여 초기화하기
$ mkdir proc sys dev etc etc/init.d
$ vi etc/init.d/rcS
---------------------------------------------
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
---------------------------------------------

rootfs 생성
$ find . | cpio -o --format=newc > ../rootfs.img
$ cd ..
$ gzip -c rootfs.img > rootfs.img.gz
$ cd ..


$ qemu-system-arm -M versatilepb -m 128M -kernel linux-2.6.35.6/arch/arm/boot/zImage -initrd busybox-1.17.2/rootfs.img.gz -append "root=/dev/ram rdinit=/bin/sh"

or

$ qemu-system-arm -M versatilepb -m 128M -kernel linux-2.6.35.6/arch/arm/boot/zImage -initrd busybox-1.17.2/rootfs.img.gz -append "root=/dev/ram rdinit=/sbin/init"


2010/09/27 11:14 2010/09/27 11:14
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.semanogic.com/blog/tc/scott/rss/response/67

댓글+트랙백 ATOM :: http://www.semanogic.com/blog/tc/scott/atom/response/67