OpenBinder 2. - Google Project Hosting

Download Report

Transcript OpenBinder 2. - Google Project Hosting

Android Kernel Issues
Android Kernel Issues
Date
: Mar-13-2008, Thu (13:00 ~ )
Location : Seoul Samsung-Dong COEX(1floor Grand Volume)
Presentator :
- CTO - S/W Lab - Lim,GeunSik ([email protected])
CONTENTS
PART 1. Overview
PART 2. OpenBinder
PART 3. EABI
PART 4. Low Memory Killer
본 행사는 구글 안드로이드와 같은 오픈 모바일 플랫폼을 구현하기 위해 필요한 여러 기술과 적용 방안에 대해 알아보는 자리입니다.
실제 경험과 Know-how를 중심으로 구성된 본 행사는 모바일 비즈니스의 새로운 사업 모델을 창출하는 계기가 될 것입니다.
2008 Korea Android(www.kandroid.org)
1.
Overview
PART 1. Overview
PART 2. OpenBinder
PART 3. EABI
PART 4. Low Memory Killer
Part 1
Google & OpenSources ‘s Dinner for Open Mobile Platform
•What is Android’s License?
•Currently, Android Platform is open source completely. The Android mobile OS
will be released under Apache License. This means that anyone can customize
the android platform and then keep it proprietary.
Openbinder Core
Qemu
Sqlite3
D-BUS
SSL
Iland’s
Dalvik
Linux
OpenGL
BSD Libc
KHTML
Ant
Python
Openbinder System
zlib
Expat
OpenGL
SDL
Software Stack for mobile devices (Android)
OpenSource
2008 Korea
Android
License
Linux Kernel
GPL2
YAFFS2
GPL
QEMU
GPL
QEMU Accelerator
GPL2
Dalvik (JVM)
Google
(Apache)
OpenBinder (Core)
GPL2
SQLite
GPL2
Python
Python
ant
Apache
SDL
LGPL
OpenGL
SGI OpenGL
(BSD/MPL)
NetBSD C Library
BSD
Webkit
BSD (including
LGPL)
WebCore
LGPL
KJS
LGPL
KHTML
GPL+BSD
DBUS
GPL2
Expat
MIT
SGL
Google (Skia)
4/34
Android Kernel Features
Part 1
Kernel Feature
2008 Korea
Android
Option
ARM EABI ( Embedded ABI )
O
Frame Buffer (Device Driver)  /dev/fb0
O
OpenBinder ( For IPC between processes )  /dev/binder (251 ~ 253)
O
Touch-Screen Device drivers
△
Misc
Low Memory Killer ( To Manage process When Memory is low)
△
Android Log Driver (Android Log Subsystem to display log messages like logcat)
 /dev/log/{main:log:event}
△
Android USB Gadget ( Gadget based Android USB Driver)
 /dev/usb
△
Android RAM Buffer Console ( for goldfish's audio )
△
Android Power Driver( for power management of goldfish )
 /dev/android_power
△
Goldfish (Virtual Machine for QEMU based Emulator )
△
Panic Timeout ( To manage timout value when panic)
△
Android
Emulator
init ramfs source ( To run /init - Exectuable Liking Format )
△
O : Needed
△ : Option
Software Stack for mobile devices (Android)
5/34
Part 1
What is Cross Compiler to build Kernel?
2008 Korea
Android
Select Cross Compiler for ARM v6
Did you have Cross Compilr to Compile Android Kernel?
 Sourcery G++ Lite Edition (CodeSourcery's version of the GNU Toolchain)
 arm-2007q3-53-arm-none-eabi-i686-pc-linux-gnu.tar.bz2
 export PATH=$PATH :<cross_compiler_install_path>/bin/
 Android Kernel: http://android.googlecode.com/files/linux-2.6.23android-m3-rc20.tar.gz
How to get CodeSourcery’s Toolchain
 We need opensource for toolchain like Kernel, gcc, glibc, bintuils
http://www.codesourcery.com/gnu_toolchains/arm/download.html
 Download the ARM 2007q3 Release
 Select "ARM EABI, IA32 GNU /Linux Option (Radio Box)" and Download
- Target Platform: ARM EABI
- Host Platform: IA32 GNU/Linux
- Source Code: Unchecked
 Default Floating Point : Soft-Float
 If you are want to compile hard-float option to enable VFP Instruciton,
Use -mfpu=vfp -mfloat-abit=softfp
Software Stack for mobile devices (Android)
6/34
Part 1
How to build Kernel Source for Android Platform
2008 Korea
Android
Get default .config file from rootFS of anroid emulator.
fc6#> <android_sdk_install_path>/tools/emulator –console –debug-kernel –kernel kernel-qemu
fc6#> adb pull /proc/config.gz ./
fc6#> gunzip config.gz
fc6#> vi ./.config
Build 2.6 Kernel Source
fc6#> tar xzf linux-2.6.18-arm1136jf-s.armadillo-500.android.tar.gz
fc6#> cd linux-2.6.18-arm1136jf-s.armadillo-500
fc6#> cp ./arch/arm/configs/goldfish_defconfig ./.config (GoldFish Config File)
fc6#> make ARCH=arm CROSS_COMPILE=arm_none-linux-gnueabi- menuconfig
fc6#> make ARCH=arm CROSS_COMPILE=arm_none-linux-gnueabi- zImage
fc6#> make ARCH=arm CROSS_COMPILE=arm_none-linux-gnueabi- modules
fc6#> make ARCH=arm CROSS_COMPILE=arm_none-linux-gnueabi- modules_install
fc6#> cp ./arch/arm/boot/zImage /tftpboot/
fc6#> cp –rf /lib/modules/ linux-2.6.18-arm1136jf-s.armadillo-500
/tftpboot/target/lib/modules/
Software Stack for mobile devices (Android)
7/34
2.
OpenBinder
PART 1. Overview
PART 2. OpenBinder
PART 3. EABI
PART 4. Low Memory Killer
Part 2
What is OpenBinder?
2008 Korea
Android
OpenBinder is an open-source system component framework.
•A complete open-source solution supporting new kinds of
component-based system-level design.
• Resource management between processes.
• Binder is system oriented rather than application oriented.
• Support a new kind of component-based system-level development.
OHA
• Component/object representations of various basic system services.
• Binder itself does not impose a particular threading model.The Binder has been used
to implement a wide variety of commercial-quality system-level services.
Openbiner’s History
1998 Binder is developed by BeOS.
2001 Palm Company acquired BeOS.
2001 Palm’s Micro Kernel is consist of Binder.
2004 netBSD Cobalt Kernel http://www.netbsd.org/ports/cobalt/
2005 Contributed by Palm(OHA Member) ,
2005 Google used Openbinder for android.
(Not Opensource : graphics , user interface , multimedia ramework)
2007 Current BeOS (http://www.beosmax.org)
Software Stack for mobile devices (Android)
9/34
Part 2
Why OpenBinder?
2008 Korea
Android
These platforms were designed to run on small handheld or dedicated devices.
Hardware Scalability
• The mobile device world tends to have a much broader range of hardware capabilities
than is found on desktops.  size and battery life
• ability to run on anything from a 50MHz ARM 7 CPU (without memory protection) up to
a 400MHz ARM 9 CPU and beyond.  burden on system software
System Customization
• Both hardware manufacturers and phone carriers want to deeply customize their
behavior.
• it much easier to support this kind of customizability in a manageable way.
Robust Applications
• Usage of the screen can become a significant problem for more complicated
applications, such as web browsers.
• Binder helps address this issue by making it easy for one application to sandbox other
parts of itself.
Software Stack for mobile devices (Android)
10/34
Part 2
How to Use OpenBinder Driver in Kernel
2008 Korea
Android
make menuconfig & Device Node & Binding Example
•OpenBinder의 자체적인 통신은 Kernel의 Device Driver으로 통신할 수 있는 주어진 핸들에서 ioctl를 사용하여 수행.
…………………… Upper Omission…………………….
VFS: Mounted root (ext3 filesystem).
Freeing init memory: 120K
init: HOW ARE YOU GENTLEMEN
init: reading config file
init: device init
init: mtd partition -1,
init: mtd partition 0, "nor.bootl
init: mtd partition 1, "nor.kerne
init: mtd partition 2, "nor.userl
init: mtd partition 3, "nor.confi
init: mtd partition 4, "nand.ipl"
init: mtd partition 5, "nand.kern
init: mtd partition 6, "nand.user
init: mtd partition 7, "nand.free
sh: can't access tty; job control turned off
#
binder_open(c3be4438 c053b500) (pid 1593) got c2c81000
binder_open(c3be4438 c35291e0) (pid 1605) got c19b8000
binder_open(c3be4438 c06a35a0) (pid 1640) got c0cff000
binder_open(c3be4438 c06a3c80) (pid 1642) got c0db9000
binder_open(c3be4438 c3519e40) (pid 1601) got c099f000
binder_open(c3be4438 c09f4ee0) (pid 1654) got c0a9b000
…………………… Below Omission …………………
• Android 의 Process(Thread) 생성시마다 binder
라는 IPC Mechanism이 부착됨.
* Character Device is 251 ~ 253
* http://www.lanana.org/docs/device-list/
Software Stack for mobile devices (Android)
11/34
Part 2
Map info of Google Map Process
2008 Korea
Android
• What is IPC Mechenism of Android platform for Mobile ? Both Openbinder and D-bus.
<./dbus-daemon/bus/>
activation.c, bus.c, config-loader-expat.c
config-parser.c, connection.c, desktop-file.c,
dispatch.c, driver.c, expirelist.c,
bus/policy.c, services.c, signals.c
<ps information on android platform>
root
1657 1 100512 24852 ffffffff afe0d204 S /system/bin/runtime
bluetooth 1658 1 1224
776 c00a34e8 afe0d07c S /system/bin/dbus-daemon
•System for sending messages between applications.
(Systemwide message-bus service) http://www.freedesktop.org/software/dbus/
For example , Broadcast signal and System/Session Bus
D-BUS
Ver0.95
dd
OpenBinder
Ver 0.8
http://www.open-binder.org
•Don't worry about processes or IPC Because of distributed architecture.
•Provides resource management between processes.
•Handle on an object in another proces.
•Powerful facilities for doing multithreaded programming with the Binder.
Software Stack for mobile devices (Android)
12/34
Part 2
How to combine Openbinder and Udev in rootFS
Priority of Created Thread in
2008 Korea
Android
Android Kernel
• Do you want to use Dynamic User-space Device in your rootFS?
How to make udev rule
target#> cd /etc/udev/rules.d/
target#> vi binderdev.rules
KERNEL=="binder*", NAME="%k", MODE="0666"
target#> vi /etc/autobinder.sh
# you almost certainly want to run this with sudo
depmod
modprobe binderdev
echo lsmod | grep binder
lsmod | grep binder
ls /dev/binder
How to make static /dev/ rule
target#> insmod binderdev.ko
target#> lsmod
Module
Size
Used
binderdev
63152
0
target#> mknod /dev/binder c 253 0
target#> /bin/chmod -R a+rw /dev/binder
by Not tainted
- Live 0xbf000000
Software Stack for mobile devices (Android)
13/34
OpenBinder
Part 2
2008 Korea
Android
OpenBinder Ver 0.8 Package
Name
http://www.mozilla.org/MPL/
Description
build_system
Makefiles collection
commands
3way, bomber , bsh
components
Kits, services (MemoryDealer) , tools (BinderShell , commands)
docs
Quick Start Manual (doxgen)
headers
Header files ( app, dmprovider, pacakage ,pacakge_p , services , storage , support support_p , xml , xml_p )
interfaces
Interface Definition Language ( app , package , services, storage, support)
libraries
binder lib(arm,generic,x86) , binder_component_glue lib , binder_glue lib , dmprovider
lib(Schema)
modules
Core Openbinder system (Openbinder Kernel Module)
samples
Sample Code ( Binder Component , Binder Based System Service , Service Process , Binder Shell Script)
scripts
Script Collection ( boot, process_wrapper , setup_env )
servers
Binder Process(loop) , Custom Package Manager , Custom Package Manager
tools
make_strings [OPTIONS] strings.xml,
pidgen [flags] foo.idl  Google Web APIs
(ex:All binder libraries , PackageNamespace [org.openbinder.tools], PackageLeaf [BinderShell])
(http://api.google.com/search/beta2 SOAP RPC Router )
※ OpenBinder는 OS 설계를 위한 객체 지향적 접근 방식을 시도한 기존과는 다른 새로운 방식의 접근 방식으로, 전통적
인 Kernel에 의해 구성되는 객체 지향적 운영체제 환경을 제공함.
※ System의 가장 큰 힘은 Multi Process들로 작업이 수행될 때이며,Android에서는 Process들간의 상호작용 및 Object
참조를 효율적으로 관리하기 위하여 Core OpenBinder에 의해 사용되는 특별한 IPC Mechanism을 이용.
Software Stack for mobile devices (Android)
14/34
Part 2
OpenBinder Contributors
2008 Korea
Android
Main Role of Conrtibutor
Author
(Contributor)
Kenneth Albanowski
Trey Boudreau
John Dance
E-mail
[email protected]
m
[email protected]
[email protected]
Dianne Hackborn
[email protected]
Arve H j& oslash
[email protected]
George Hoffman
[email protected]
Role
Port of user-space code to Linux.
Linux Binder module, IMemory, Memory Dealer.
Marshalling and pidgen, BCatalogMirror
General design, support classes, SValue, SLocker and SAtom
debugging , data model, documentation
Binder kernel module (versions 2 and 4).
Initial design and implementation. especially of Ibinder /
BBinder, the Binder kernel module , gehnaphores
(lightweight locks), SAtom, SHandler
Eric Moon
[email protected]
SBuffer, SBufferChain, SBitstreamReader
Joe Onorato
[email protected]
General design, XML parser, BBinder, marshalling and pidgen.
[email protected]
Package manager, settings catalog, Binder Shell, data model,
port to Linux
Jason Parks
Jenny Tsai
[email protected]
Pidgen.
Software Stack for mobile devices (Android)
15/34
Core OpenBinder System
Part 2
File List in Kernel Space
File Name
Line
2008 Korea
Android
http://www.gnu.org/copyleft/gpl.html/
Description
binder.c
692
open, mmap , release , ioctl, unlocked ioctl
binder-defs.h
341
cmpxchg32 , compare_and_swap32
binder_node.c
141
Node Global, Node Init , Node AcquireHome, Node Send , Node Destroy
binder_node.h
71
binder_proc.c
2,216
binder_proc.h
227
Binder node’s Structure
Process init , Process Spawn Looper , Process wakeup timer , process idle timer ,
set_thread_priority , Process Stop , Process Destroy , Process Die , Process
AddThread , Process RemoteThread , Process Transact , Process FreeBuffter , Etc
Descriptor Sturcture , Reverse_mapping Structure, Local_mapping Structure,
Range_map Structure, Death_notification Structure, binder_proc Structure
Thread Cleanup , Thread WaitForReply , Thread WaitForRequest, Thread Return
Transaction, Thread init , Thread GloablCount , Thread Released , Thread Die ,
Thread AttachProcess, Thread Wakeup , Thread Sync, Thread Write, Thread Read ,
Etc
binder_thread.c
1,576
binder-thread.h
154
binder_thread Structure
binder_transaction.c
542
Transaction Init , Transaction Dtor , Transacton Debug Dump, Transaction Create,
Transaction Destroy, Transaction ReleaseTarget
binder.transaction.h
128
binder_transaction Structure
Iobuffer.c
112
Init, Read Raw, Write Raw, Drain, Remaining, Consumed, Remainder
Iobuffer.h
45
i/o buffer Structure
Software Stack for mobile devices (Android)
16/34
Part 2
Thread’s Priority binding to the OpenBinder
2008 Korea
Android
Priority of the Created Thread in Android Kernel
• Do you need Realtime Characterestics for Mobile?
• Why does nobody talked about the characteristics of real-time kernel androids not?
• We can use Preemptible Kernel in Kernel Space for Realtime, But UserSpace Realtime?
 We can Implement User-space Realtime Application with Locked Mutex Method (FUTEX)
(Ex: Priority Queuing , Priority Inheritance , Robust Mutex )
static void set_thread_priority(pid_t thread, int priority)
{// Android Kernel’s Scheduling is Dynamic Priority(=Normal Priority ) to schedule between threads.
int nice;
// The following must match SysThreadChangePriority in libbinder.
if( priority >= 80 )  Worse Priority or low priority ( map 80..100 to 0..19)
{ nice = priority - 80;
if(nice > 19)
nice = 19;
}
else
 Better priority or High Priority ( map 0..79 to -20..-1)
{ nice = priority-3 - 80;
nice /= 4;
}
//printk(“*invain’s DEBUG: set_thread_priority tid %d pri %d == nice %d\n", thread, priority, nice);
set_user_nice(find_task_by_pid(thread), nice);
}
Software Stack for mobile devices (Android)
17/34
3.
EABI (Embedded Application Binary Interface)
PART 1. Overview
PART 2. OpenBinder
PART 3. EABI
PART 4. Low Memory Killer
Part 3
What is EABI?
2008 Korea
Android
EABI(Embedded Application Binary Interface)
•It sets the standard for the interoperation between relocated files, as well as executable
files, for embedded architectures.
•the standard makes it possible to combine object files built using different toolchains if
both their compilers use EABI.
•GCC : CS-2005Q3 release is a modified version of gcc-3.4.4 from gcc-4.1.0
•The commercial ARM RealView C/C++ compiler was the first to support EABI (GCC4.1)
•Kernel: EABI is supported in the ARM Linux kernel from version 2.6.16.
•Glibc : Earlier glibcs (2.3.3) support EABI userspace but had old-style syscalls to work
with older kernels (2.6.0-2.6.15).
The effective features for arm-linux users with the use of EABI are
No
Features
1
Ability to mix soft and hardfloat code.
(EX: GCC 4.2’s Hard Floating  --with-fpu=vfp --with-float=softfp)
2
Better structure packing capabilities.
3
More compatibility with various development tools.
4
More efficient syscall convention. ( Ref1)
5
Compatability with ARMv5t processors and above (for GCC 4.2).
Ref 1) Experience showed that those syscall wrappers can not cover all the needed ABI mismatch since some of
them are simply hidden from the C library, especially with specialized applications like iptables for example.
ARM Information Center
- http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0036a/
Software Stack for mobile devices (Android)
19/34
Part 3
Extending the ARM Processor Portfolio
2008 Korea
Android
•Continued licensing of both mature and new technology
•Cortex-A9 Ecosystem  EDA, OS and Software companies supporting Cortex-A9
In Mobile Market
Android
년도
Software Stack for mobile devices (Android)
20/34
Part 3
Arch & CPU information of GCC about android
2008 Korea
Android
•http://gcc.gnu.org/svn/gcc/branches/gcc-4_3-branch/gcc/config/arm/arm.c
…………………………… Upper Omission …………………………
{"armv4t", arm7tdmi,
"4T", FL_CO_PROC |
FL_FOR_ARCH4T, NULL},
{"armv5",
arm10tdmi, "5",
FL_CO_PROC |
FL_FOR_ARCH5, NULL},
{"armv5t", arm10tdmi, "5T", FL_CO_PROC |
FL_FOR_ARCH5T, NULL},
{"armv5e", arm1026ejs, "5E", FL_CO_PROC |
FL_FOR_ARCH5E, NULL},
{"armv5te", arm1026ejs, "5TE", FL_CO_PROC |
FL_FOR_ARCH5TE, NULL},
{"armv6",
arm1136js, "6",
FL_CO_PROC |
FL_FOR_ARCH6, NULL},
{"armv6j", arm1136js, "6J", FL_CO_PROC |
FL_FOR_ARCH6J, NULL},
{"armv6k", mpcore,
"6K", FL_CO_PROC |
FL_FOR_ARCH6K, NULL},
{"armv6z", arm1176jzs, "6Z", FL_CO_PROC |
FL_FOR_ARCH6Z, NULL},
{"armv6zk", arm1176jzs, "6ZK", FL_CO_PROC |
FL_FOR_ARCH6ZK, NULL},
{"armv6t2", arm1156t2s, "6T2", FL_CO_PROC |
FL_FOR_ARCH6T2, NULL},
{"armv7",
cortexa8,
"7",
FL_CO_PROC |
FL_FOR_ARCH7, NULL},
{"armv7-a", cortexa8, "7A", FL_CO_PROC |
FL_FOR_ARCH7A, NULL},
{"armv7-r", cortexr4, "7R", FL_CO_PROC |
FL_FOR_ARCH7R, NULL},
{"armv7-m", cortexm3, "7M", FL_CO_PROC |
FL_FOR_ARCH7M, NULL},
{"ep9312", ep9312,
"4T", FL_LDSCHED | FL_CIRRUS | FL_FOR_ARCH4, NULL},
{"iwmmxt", iwmmxt,
"5TE", FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE | FL_IWMMXT , NULL},
{NULL, arm_none, NULL, 0 , NULL}
};
•http://sourceware.org/cgi-bin/cvsweb.cgi/src/gas/config/tc-arm.c?cvsroot=src
……………………………
{"arm10t",
{"arm10tdmi",
{"arm10e",
{"arm1020",
Upper Omission …………………………
ARM_ARCH_V5T,
FPU_ARCH_VFP_V1,
ARM_ARCH_V5T,
FPU_ARCH_VFP_V1,
ARM_ARCH_V5TE,
FPU_ARCH_VFP_V2,
ARM_ARCH_V5TE,
FPU_ARCH_VFP_V2,
NULL},
NULL},
NULL},
"ARM1020E"},
Software Stack for mobile devices (Android)
21/34
Part 3
Cross Compiler for EABI
2008 Korea
Android
ARM syscall entry convention
EABI user space binaries put the syscall number into r7 and use swi 0 to call the
kernel. Syscall register arguments are also expected to have EABI arrangements ,
that is, 64-bit arguments should be put in a pair of registers from an even register
number.
Example ARM sycall entry convention with long ftruncate64 (unsigned int fd, loff_t
length.
The common gcc command options that are available for EABI are
GCC Option
Description
-mabi=eabi
Generate code for the given ABI.
-mcall-sysv-eabi
Specify both -mcall-sysv and -meabi options.
-mcall-sysv-noeabi
Specify both -mcall-sysv and -mno-eabi options.
-mlibrary-pic
Generate position-independent EABI code.
-mlinked-fp
Follow the EABI requirement of always creating a frame pointer whenever
a stack frame is allocated. This option is enabled by default and can be
disabled with -mno-linked-fp.
Software Stack for mobile devices (Android)
22/34
Part 3
Legacy ABI vs. EABI
2008 Korea
Android
It is important to use 0 for the swi argument because backward compatibility with legacy
ABI userspace relies on this. The syscall macros in asm-arm/unistd.h were also updated to
support both ABIs and implement the right call method automatically.
Exectuable Binary
Compatibility
EABI
Legacy ABI
• put fd into r0
• put length into r1-r2
• use “swi #(0x900000 + 194)” to call the kernel
fc6#> arm_v5t_le-objdump -xlD vmlinux | less
private flags = 602: [APCS-32] [VFP float format] \
[software FP] [has entry point]
•
•
•
•
put fd into r0
put length into r2-r3 (skipping over r1)
put 194 into r7
use “swi 0" to call the kernel
fc6#> arm_v5t_le-objdump -xlD vmlinux | grep less
or arm_v5t_le-objdump -xlD /tftpboot/target/init | less
private flags = 4000002: [Version4 EABI] [has entry point]
./include/asm-arm/unistd.h
13
14
15
16
17
18
19
#ifndef __ASM_ARM_UNISTD_H
#define __ASM_ARM_UNISTD_H
#define __NR_OABI_SYSCALL_BASE 0x900000
#if defined(__thumb__) || defined(__ARM_EABI__)
#define __NR_SYSCALL_BASE
0
#else
#define __NR_SYSCALL_BASE
__NR_OABI_SYSCALL_BASE
20 #endif
EABI
Software Stack for mobile devices (Android)
23/34
If EABI is not supported in your kernel?
Part 3
2008 Korea
Android
For example, Your kernel is 2.6.15- . So You need EABI Feature.
•On any ARM toolchain (v5t_le, xscale_le), in the Processor Features area, the following new freatures need to
be set EABI.
1
use_mtune_arm1136j-s_for_ARMv6_targets
17
arm-eabi-kconfig
2
arm-remove-udivdi3-from-pxafb
18
arm-update-syscall-table
3
mmc-remove-ref-to-divdi3
19
arm-inotify-ioprio.syscalls
4
arm-remove-udivdi3-from-nwfpe
20
arm-mempolicy-syscalls
5
arm-remove-udivdi3-from-kernel
21
arm-oabi-statfs64
6
arm-optimized-libc-functions
22
arm-oabi-syscall-wrappers
7
slab-add-more-arch-override
23
arm-oabi-multi-abi
8
arm-fix-sys_sendto-and-sys_recvfrom-6-arg
24
arm-oabi-nwfpe
9
arm_mno-thumb-interwork
25
arm-oabi-kconfig
10
arm-eabi-relocs-for-modules
26
arm-eabi-sigreturn-fix
11
arm-eabi-slab-align-to-64bits
27
arm-nptl-compat-mb
12
arm-eabi-sp-align-1
28
arm-oabi-is-experimental
13
arm-eabi-sp-align-2
29
arm-oabi-struct-sockaddr_un
14
arm-eabi-helper-func-names
30
arm_mempolicy_syscalls_compat_hack
15
arm-eabi-syscalls
31
arm_eabi_syscalls_compat_hack
16
arm-eabi-syscall-adjstments
Software Stack for mobile devices (Android)
24/34
Part 3
Legacy ABI vs. EABI
2008 Korea
Android
Legacy ABI
Toolchain
&
Binary
• ABI flags passed to binutils: -mabi=apcs-gnu -mfpu=fpa
• gcc -dumpmachine: arm-unknown-linux
• objdump -x for compiled binary:
fc6.abi#>objdump -xlD vmlinux | less
private flags = 602: [APCS-32] [VFP float format] [software FP] [has entry point]
• "file" on compiled binary (Under Fedora Core 6)
ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.4.20,
dynamically linked (uses shared libs), for GNU/Linux 2.4.20, stripped
New EABI
Toolchain
&
Binary
•
•
•
•
ABI flags passed by gcc to binutils:
-mabi=aapcs-linux -mfloat-abi=soft -meabi=4
gcc -dumpmachine: arm-unknown-linux-gnueabi
objdump -x for compiled binary:
fc6.eabi#> objdump -xlD vmlinux | less
private flags = 4000002: [Version4 EABI] [has entry point]
• "file" on compiled binary (Under Fedora Core 6)
ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.18,
dymically linked(uses shared libs), for GNU/Linux 2.6.18, stripped
Software Stack for mobile devices (Android)
25/34
Part 3
Cross Compiler for EABI
2008 Korea
Android
Is it possible to run both EABI and non-EABI binaries on the same system?
Yes, it is possible. However, running a dual-ABI system requires care. If you have an old-ABI system, and
want to run EABI binaries, you have several choices. One option is to link your programs statically, using the
-static option. However, linking dynamically is generally a superior approach. Generally, toolchains use a
different dynamic loader (ld.so.3), so it is possible for old-ABI and EABI binaries to coexist. However, you will
have to ensure that when you install the EABI libraries you do not overwrite existing libraries, and you will have
to set LD_LIBRARY_PATH so that the dynamic loader can find them.
※ Support EABI Feature
“make menuconfig” – “Kernel Features” – “[*]Use the ARM EABI to compile the kernel”
EABI 관련하여 설명하고 있는 사이트.
Software Stack for mobile devices (Android)
26/34
4.
Low Memory Killer
PART 1. Overview
PART 2. OpenBinder
PART 3. EABI
PART 4. Low Memory Killer
Part 4
What is Low Memory Killer?
2008 Korea
Android
Why Google develop Low Memory Killer without OOM?
TargetBoard에서 사용가능한 Memory 공간이 고갈 상태에 이르렀을 때, OOM(Out Of Memory)을 발생시키는 방법을
사용하지 않고, Process들의 중요도에 따라 Group으로 나눈 후에 중요도가 낮은 Group에 있는 Process부터 하나씩
하나씩 Kill하여 Android의 전체적인 System의 운영을 유지시켜주는 Memory를 확보하는 방법이다.
EX) 메모리가 고갈 상태에 이르렀을 때, Low Memory Killer가 작동되면서 udev 프로세스를 Kill.
………………………… 윗부분 생략 ……………………………….
printk: 8 messages suppressed.
oom-killer: gfp_mask=0x201d2, order=0
Mem-info:
DMA per-cpu:
cpu 0 hot: high 18, batch 3 used:12
cpu 0 cold: high 6, batch 1 used:2
DMA32 per-cpu: empty
Normal per-cpu: empty
HighMem per-cpu: empty
Free pages:
1436kB (0kB HighMem)
Active:6717 inactive:1641 dirty:0 writeback:0 unstable:0 free:359 slab:1458 mapped:61 pagetables:1700
DMA free:1436kB min:1024kB low:1280kB high:1536kB active:26868kB inactive:6564kB present:65536kB pages_scanned:14954 all_unreclaimable? no
•“ lowmem_reserver” Region  ./kernel-2.6/mm/page_alloc.c File
의 show_free_areas( ) Func 안의 for_each_zone() Func에서 수행.
lowmem_reserve[]: 0 0 0 0
DMA32 free:0kB min:0kB low:0kB high:0kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0 0
Normal free:0kB min:0kB low:0kB high:0kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0 0
HighMem free:0kB min:128kB low:128kB high:128kB active:0kB inactive:0kB present:0kB pages_scanned:0
all_unreclaimable? no
lowmem_reserve[]: 0 0 0 0
DMA: 51*4kB 26*8kB 4*16kB 0*32kB 1*64kB 1*128kB 1*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB = 1436kB
DMA32: empty
Normal: empty
HighMem: empty
Swap cache: add 0, delete 0, find 0/0, race 0+0
Free swap = 0kB
Total swap = 0kB
Out of Memory: Kill process 908 (udevd) score 122 and children.
Out of memory: Killed process 1922 (udev).
Free swap:
0kB
16384 pages of RAM
2623 free pages
924 reserved pages
1458 slab pages
279 pages shared
0 pages swap cached
………………………… 아랫 부분 생략 ……………………………….
Software Stack for mobile devices (Android)
28/34
Part 4
OOM (Out of Memory ) Killer
Kenrel Messages When OOM
2008 Korea
Android
OOM Example
Case1) Program is allocating memory continually.
oom-killer: gfp_mask=0x201d2, order=0
[<c0144b11>] out_of_memory+0x25/0x144
[<c0145fa7>] __alloc_pages+0x1f5/0x275
[<c0147117>] __do_page_cache_readahead+0xc8/0x1e8
[<c01162e5>] __wake_up_common+0x2f/0x53
[<c0116755>] __wake_up+0x2a/0x3d
[<c014420e>] filemap_nopage+0x151/0x30b
[<c014c731>] __handle_mm_fault+0x24e/0x705
[<c01248a3>] do_gettimeofday+0x31/0xce
[<c011554e>] do_page_fault+0x18a/0x46c
[<c01153c4>] do_page_fault+0x0/0x46c
[<c01037d5>] error_code+0x39/0x40
Mem-info:
DMA per-cpu:
cpu 0 hot: high 0, batch 1 used:0
………… Middle Omission ……………
Free pages:
21472kB (340kB HighMem)
………… Below Omission ……………
※ Kernel Messages Analysis: This is caused by DMA
problem. Physical HDD’s Problem? In fact , This Memory
Allocation Policy Related Problem.
Guide for Embedded Memory Programming
• What Every Programmer Should Know About Memory
while (1) {
if (malloc(1<<50) == NULL) {
printf("malloc failure after %d MiB\n", n);
return 0; }
printf ("Got %d Mb\n", ++n);
}
Case2) Program allocate memory, and use memory
immediately.
while (1) {
if ((Temp = malloc(1<<50)) == NULL) {
printf("malloc failure after %d MiB\n", n);
return 0;}
memset (p, 0, (1<<50));
printf ("Got %d Mb\n", ++n);
}
Case3) Allocate needed memory using for(), Use
allocated memory using for().
for (n = 0; num < 50,000 ; n++) {
temp[num] = malloc(1<<50);
if (temp[num] == NULL)
break;
}
printf("malloc failure after %d MiB\n", n);
for (i = 0; i < num; i++) {
memset ( pp[i], 0, (1<<50) );
printf("Got %d Mb\n", i+1);
}
• Understanding The Linux Virtual Memory manager
• Understanding Virtual Memory in Red Hat Enterprise
Linux 4
Software Stack for mobile devices (Android)
29/34
Android Application ‘s Life Cycle 1/2
Part 4
2008 Korea
Android
How do we make Application’s life cycle in Mobile/Embedded?
Android의 중요하면서 보편적이지 않은 하나의 특징은 Application 프로세스의 생명주기가 해당 애플리케이션에 의
해 직접적으로 제어되지 않는 다는 것이다. 대신, Application이 사용자를 위해서 얼마나 중요한가? 그리고 시스템 전
체적으로 얼마나 많은 Memory가 유용한가라는 Application 실행과 관련된 시스템의 인식기반과 관련된
Application의 조합된 영역들에 의해 결정 남.
Highest
계층구조
Description
(Free Mem)
Foreground
(6M)
Visible
(8M)
Serivce
Importance
(16M)
Background
(64M)
Empty
(Unlimited)
Lowest
foreground 프로세스는 사용자와 상호작용을 하고 있는 스크린의 최상위에 있는 Activity나 현재 수행되고 있는
IntentReceiver를 점유하고 있는 Process이다. 시스템에는 매우 작은 수의 그러한 프로세스들이 존재할 뿐이며, 이런 프
로세스가 계속 실행 되기조차 어려운 최후의 메모리 부족 상태에서만 종료된다. 일반적으로 디바이스가 메모리 페이징 상
태에 도달하는 시점에, 사용자 인터페이스에 대한 응답을 처리하기 위해서 그러한 행위가 요구된다.
visible 프로세스는 사용자의 화면상에는 나타나지만 foreground 상태는 아닌 Activity를 점유하는 Process이다. 예를 들
어 foreground activity 다이얼로그 형태로 그 뒤에 이전에 보여졌던 activity를 허용하면서 표시될때 이러한 것은 발생하
게 된다. 그러한 프로세스는 극도록 중요하게 고려되며 더이상 그것을 수행하지 않을 때까지 종료되지 않으며, 모든
foreground 프로세스들을 실행 상태로 유지하는 것이 요구된다.
service 프로세스는 startService() 메쏘드를 가지고 시작된 Service를 점유하고 있는 Process이다. 이러한 프로세스는 사
용자에게 직접적으로 보여지는 않지만, 이것은 일반적으로 사용자와 관련된 어떤 일을 일반적으로 수행하며, 시스템이 모
든 foreground와 visibile 프로세스를 보유하기에 충분한 메모리가 존재하는 한, 시스템은 그러한 프로세스들은 항상 실행
상태로 유지할 것이다.
background 프로세스는 사용자에게는 현재 보여지지 않는 Activity를 점유하는 Process이다. 이러한 프로세스는 사용자
에게 어떤 것도 직접적으로 영향을 미치지 않는다. activity 생명주기를 정확하게 구현하기 위해서 마련된 것이며, 시스템
은 위의 3가지 프로세스 타입 중 한 가지를 위한 메모리 반환 요청이 있을 시에만 그러한 프로세스를 종료시킬 것이다. 일
반적으로 많은 수의 이런 프로세스가 실행되고 있으며, 해당 프로세스들은 메모리 결핍 시 사용자에게 가장 최근에 보여
진 것이 가장 마지막에 종료되는 절차를 확립하기 위해 LRU 리스트 상에서 유지된다.
empty 프로세스는 어떤 활성화 된 애플리케이션 컴포넌트도 점유하지 않는 Process이다. 이러한 프로세스를 유지하고
있는 유일한 이유는 다음 번에 해당 애플리케이션을 실행할 필요가 있을 때 시동(startup) 시간을 개선하기 위한 Cache로
써 사용하기 위함이다. 그런 이유로, 시스템은 이러한 Cache화된 empty 프로세스들과 기반에 있는 커널 Cache들 사이에
서 전반적인 시스템 균형을 유지하기 위해 이러한 프로세스들을 가끔 종료하게 된다.
http://code.google.com/android/intro/lifecycle.html
Software Stack for mobile devices (Android)
30/34
Part 4
Android Application ‘s Life Cycle 2/2
2008 Korea
Android
Why Application’s life cycle is important in android platform?
Application 개발자가 Application Process의 생명주기에 얼마나 다른 Application Component (특별히,
Activity, Service, IntentReceiver) 가 영향을 미치는가를 이해하는 것은 중요하다. 이러한 Component들을
정확하게 사용하지 않는다면, 시스템이 해당 Application이 중요한 작업을 수행 하는 동안 해당 Process를 종
료시키는 결과를 야기할 수 있다. Process 생명주기와 관련된 Bug중 일반적인 사례가 IntentReceiver가
onReceveIntent() Method내에서 Intent를 받을 때 Thread를 시작한 다음 해당 함수를 리턴하는 경우이다. 그
러한 리턴이 발생 하면, System은 IntentReceiver가 더이상 Active되어 있지 않다고 간주하고, 따라서 그
Hosting Process가 더이상 필요하지 않다고 간주한다. (단지, 다른 Application Component가 그 안에서
Active 되지 않는 한) 따라서, System은 메모리 반환요청이 있는 어떤 시점에선 해당 Process를 종료시킬 수
있다. 이 문제를 해결하기 위한 해법은 System이 해당 Process 내에서 행해지고 있는 Active화된 작업이 여
전히 존재한다는 것을 알도록 IntentReceiver로부터 Service를 시작시키는 것이다 .
Maps Service
Android는 Memory가 부족할 때, 어떤 Process들이 종료되어야 하는가를 결정하기 위해서, Android는
Process를 그것 안에서 실행되는 Component와 그러한 Component의 상태에 기반을 둔 "importance
hierarchy "에 추가함.
Software Stack for mobile devices (Android)
31/34
Part 4
Kernel Module for Low Memory Killer
2008 Korea
Android
Location of Low memory killer
•./kernel-2.6/misw/lowmemorykiller/
File Name
Makefile
Description
Make file to build Lowmemorykiller.ko kernel module
shrinker lowmem_shrinker Structure
.
lowmem_shrink()
lowmemorykiller
lowmem_print()
module_param_named()
module_param_array_named()
module_param_array_named()
module_param_named()
lowmem_init()
lowmem_exit()
•Process에 대한 분류방법을 결정할 때, System은 Process내에서 현재 활성화 된 모든 Component 중에서 가장
중요한 레벨을 얻어냄.
•Process의 모든 생명주기에 이러한 Activity, Service, IntentReceiver 같은 Component의 각각이 얼마나 영향을
미치는 지에 대해서는 각각에 대한 보다 자세한 문서를 http://code.google.com 을 통해서 열람.
Software Stack for mobile devices (Android)
32/34
Part 4
About Android’s low memory shrink task
• lowmem_shrink()
2008 Korea
Android
※Linux Cross Reference WebTool  http://lxr.linux.no/linux
if(nr_to_scan > 0)
lowmem_print(3, "lowmem_shrink %d, %x, ofree %d, ma %d\n", nr_to_scan, gfp_mask, other_free, min_adj);
read_lock(&tasklist_lock);
for_each_process(p) {
if(p->oomkilladj >= 0 && p->mm) {
tasksize = get_mm_rss(p->mm);
if(nr_to_scan > 0 && tasksize > 0 && p->oomkilladj >= min_adj) {
if(selected == NULL ||
p->oomkilladj > selected->oomkilladj ||
(p->oomkilladj == selected->oomkilladj &&
tasksize > selected_tasksize)) {
selected = p;
selected_tasksize = tasksize;
lowmem_print(2
adj %d,
size %d , to kill\n",
. , "select %d (%s),
p->pid,
p->comm, p->oomkilladj, tasksize);
}
}
rem += tasksize;
}
}
if(selected != NULL) {
lowmem_print(1, "send sigkill to %d (%s), adj %d, size %d\n",
selected->pid, selected->comm,
selected->oomkilladj, selected_tasksize);
force_sig(SIGKILL, selected);
rem -= selected_tasksize;
}
lowmem_print(4, "lowmem_shrink %d, %x, return %d\n", nr_to_scan, gfp_mask, rem);
read_unlock(&tasklist_lock);
return rem;
※ static size_t lowmem_minfree[6]={
3*512,
// 6MB = 3 x 5123 x 4
2*1024, // 8MB = 2 x 1024 x 4
4*1024, // 16MB= 4 x 1024 x 4
16*1024, // 64MB = 16x1024 x 4 };
※ Default lowmem_debug_level is 2.
 If you want to debug , use 3+ value.
Software Stack for mobile devices (Android)
33/34
2008 Korea
Android
Open Mind , Share Mind , This is Our Future!
Software Stack for mobile devices (Android)
34/34