Android Kernel Issues

Android Kernel Issues
2008 Korea Android(www.kandroid.org)
CONTENTS
PART 1. Overview
PART 2. OpenBinder
PART 3. EABI
PART 4. Low Memory Killer
Date · Mar~13~2008, Thu (13·00 ~ 18·00)
Location · SeouI Samsung~Dong COEX(1fIoor Grand VoIume)
Presentator · - CTO - S/W Lab - Lim,GeunSik (geunsik.lim@samsung.com)
본 행사는 구글 안드로이드와 같은 오픈 모바일 플랫폼을 구현하기 위해 필요한 여러 기술과 적용 방안에 대해 알아보는 자리입니다.
실제 경험과 Know-how를 중심으로 구성된 본 행사는 모바일 비즈니스의 새로운 사업 모델을 창출하는 계기가 될 것입니다.
Overview 1.
PART 1. Overview
PART 2. OpenBinder
PART 3. EABI
PART 4. Low Memory Killer
4/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 1
License Related Android & OpenSource
Linux IIand’s
DaIvik
Qemu
Openbinder Core
Ant
BSD Libc
OpenGL
OpenGL
SDL
KHTML
Expat
Python
SqIite3
D~BUS
SSL
zIib
Openbinder System
Google (Skia) SGL
MIT Expat
GPL2 DBUS
GPL+BSD KHTML
LGPL KJS
LGPL WebCore
BSD (including
LGPL)
Webkit
BSD NetBSD C Library
SGI OpenGL
(BSD/MPL)
OpenGL
LGPL SDL
Apache ant
Python Python
GPL2 SQLite
GPL2 OpenBinder (Core)
Google
(Apache)
Dalvik (JVM)
GPL2 QEMU Accelerator
GPL QEMU
GPL YAFFS2
GPL2 Linux Kernel
License OpenSource
•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.
5/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 1
Andr oi d Ker nel Feat ur es
O · Needed
䧘 · Option
△ init ramfs source ( To run /init - Exectuable Liking Format )
△ Panic Timeout ( To manage timout value when panic)
△ Goldfish (Virtual Machine for QEMU based Emulator )
Emulator

Android Power Driver( for power management of goldfish )
Æ /dev/android_power
△ Android RAM Buffer Console ( for goldfish's audio )

Android USB Gadget ( Gadget based Android USB Driver)
Æ /dev/usb

Android Log Driver (Android Log Subsystem to display log messages like logcat)
Æ /dev/log/{main:log:event}
Android
△ Low Memory KiIIer ( To Manage process When Memory is low) Misc
△ Touch-Screen Device drivers
O OpenBinder ( For IPC between processes ) Æ /dev/binder (251 ~ 253)
O Frame Buffer (Device Driver) Æ /dev/fb0
O ARM EABI ( Embedded ABI )
Option KerneI Feature
6/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 1
What i s Cr oss Compi l er t o bui l d Ker nel ?
Select Cross Compiler for ARM v6
Cross CompiIr for Android KerneI
ƒ 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.23-
android-m3-rc20.tar.gz
ƒ 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
How to get CodeSource Toolchain
7/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 1
How t o bui l d Ker nel Sour ce f or Andr oi d Pl at f or m
Get default .config file from rootFS of anroid emulator.
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/
Build 2.6 Kernel Source
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
OpenBinder 2.
PART 1. Overview
PART 2. OpenBinder
PART 3. EABI
PART 4. Low Memory Killer
9/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 2
What i s OpenBi nder ?
OpenBinder?
•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.
• 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
OHA
OHA
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)
10/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 2
Why OpenBi nder ?
Hardware Scalability
System Customization
Robust Applications
These platforms were designed to run on small handheld or dedicated devices,
• 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
• 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.
• 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.
11/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 2
How t o Use OpenBi nder Dr i ver i n Ker nel
make menuconfig & Device Node & Binding Example
…………………… 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 …………………
•OpenBinder의 자체적인 통신은 커널 Device Driver으로 통신할 수 있는 주어진 핸들에서 ioctl를 사용하여 수행.
· Character Device is 251 ~ 253
· http·//www.Ianana.org/docs/device~Iist/
• Android 의 Process(Thread) 생성시마다 binder라
는 IPC Mechanism이 부착됨.
F
o
r

I
P
C
12/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 2
Map i nf o of Googl e Map Pr ocess
dd
• What is IPC Mechenism of Android pIatform for MobiIe ? Both Openbinder and D~bus.
D~BUS
Ver0.95
OpenBinder
Ver 0.8
•System for sending messages between applications.
(Systemwide message-bus service) http://www.freedesktop.org/software/dbus/
•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.
http://www.open-binder.org
<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
<./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
13/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 2
How t o combi ne Openbi nder and Udev i n r oot FS
Priority of Created Thread in Android Kernel
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
• Do you want to use Dynamic User~space Device in your rootFS?
How to make udev ruIe
target#> insmod binderdev.ko
target#> lsmod
Module Size Used by Not tainted
binderdev 63152 0 - Live 0xbf000000
target#> mknod /dev/binder c 253 0
target#> /bin/chmod -R a+rw /dev/binder
How to make static /dev/ ruIe
14/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 2
OpenBi nder
OpenBinder Ver 0.8 Package
make_strings [OPTIONS] strings.xml,
pidgen [flags] foo.idl Æ Google Web APIs (http://api.google.com/search/beta2 SOAP RPC Router )
tools
Binder Process(loop) , Custom Package Manager , Custom Package Manager servers
Script Collection ( boot, process_wrapper , setup_env ) scripts
Sample Code ( Binder Component , Binder Based System Service , Service Process , Binder Shell Script) samples
Core Openbinder system (Openbinder Kernel Module) moduIes
binder lib(arm,generic,x86) , binder_component_glue lib , binder_glue lib , dmprovider
lib(Schema)
libraries
Interface Definition Language ( app , package , services, storage, support) interfaces
Header files ( app, dmprovider, pacakage ,pacakge_p , services , storage , support support_p , xml , xml_p ) headers
Quick Start Manual (doxgen) docs
Kits, services (MemoryDealer) , tools (BinderShell , commands) components
3way, bomber , bsh commands
Makefiles collection
(ex:All binder libraries , PackageNamespace [org.openbinder.tools], PackageLeaf [BinderShell])
build_system
Description Name
http://www.mozilla.org/MPL/
※ OpenBinder는 OS 설계를 위한 객체 지향적 접근 방식을 시도한 기존과는 다른 새로운 방식의 접근 방식으로, 전통적
인 Kernel에 의해 구성되는 객체 지향적 운영체제 환경을 제공함.
※ 시스템의 가장 큰 힘은 다중 프로세스들로 작업이 수행될 때이며, Kernel Module로 Build되는 OpenBinder는 프로세스
들간의 상호작용 및 오브젝트 참조를 효율적으로 관리하기 위하여 Binder에 의해 사용되는 특별한 IPC 메커니즘을 이용.
15/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 2
OpenBi nder Cont r i but or s
Main Role of Conrtibutor
Pi dgen.
j i t sai @al umni . uchi cago. edu
Jenny Tsai
Package manager , set t i ngs cat al og, Bi nder Shel l , dat a model ,
por t t o Li nux
j ason. par ks@pal msour ce. com
Jason Par ks
Gener al desi gn, XML par ser , BBi nder , mar shal l i ng and pi dgen.
j oeo@onor at o. or g
Joe Onor at o
SBuf f er , SBuf f er Chai n, SBi t st r eamReader
em@gl i t chpop. net
Er i c Moon
Ini t i al desi gn and i mpl ement at i on. especi al l y of Ibi nder /
BBi nder , t he Bi nder kernel modul e , gehnaphor es
(l i ght wei ght l ocks), SAt om, SHandl er
geh@geor geandj ul i a. com
Geor ge Hof f man
Bi nder kernel modul e (ver si ons 2 and 4).
ar ve. hj onnevag@pal msour ce. com
Ar ve H j & osl ash
Gener al desi gn, suppor t cl asses, SVal ue, SLocker and SAt om
debuggi ng , dat a model , document at i on
hackbod@angr yr edpl anet . com
Di anne Hackbor n
Mar shal l i ng and pi dgen, BCat al ogMi r r or
dance@acm. or g
John Dance
Li nux Bi nder modul e, IMemor y, Memor y Deal er .
t r ey. boudr ea@pal msour ce. com
Tr ey Boudr eau
Por t of user -space code t o Li nux.
kennet h. al banowski @pal msour ce. co
m
Kennet h Al banowski
Rol e E-mai l Aut hor
(Cont r i but or )
16/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 2
Cor e OpenBi nder Syst em
File List
i/o buffer Structure 45 Iobuf f er . h
Init, Read Raw, Write Raw, Drain, Remaining, Consumed, Remainder 112 Iobuf f er . c
binder_transaction Structure 128 bi nder . t r ansact i on. h
Transaction Init , Transaction Dtor , Transacton Debug Dump, Transaction Create,
Transaction Destroy, Transaction ReleaseTarget
542 bi nder _t r ansact i on. c
binder_thread Structure 154 bi nder-t hread. h
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
1, 576 bi nder_t hread. c
Descriptor Sturcture , Reverse_mapping Structure, Local_mapping Structure,
Range_map Structure, Death_notification Structure, binder_proc Structure
227 bi nder _pr oc. h
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
2, 216 bi nder _pr oc. c
Binder node’s Structure
71 bi nder _node. h
Node Global, Node Init , Node AcquireHome, Node Send , Node Destroy 141 bi nder _node. c
cmpxchg32 , compare_and_swap32 341 bi nder -def s. h
open, mmap , release , ioctl, unlocked ioctl 692 bi nder . c
Description Li ne Fi l e Name
http://www.gnu.org/copyleft/gpl.html/
17/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 2
Thr ead’ s Pr i or i t y bi ndi ng t o t he OpenBi nder
Priority of Created Thread in Android Kernel
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);
}
• Do you need ReaItime Characterestics for MobiIe?
• Why does nobody taIked about the characteristics of reaI~time kerneI androids not?
• We can use PreemptibIe KerneI for ReaItime in KerneI Space, But UserSpace ReaItime?
Æ We Implement Userspace Realtime Application with Locked Mutex Method (FUTEX)
(Ex: Priority Queuing , Priority Inheritance , Robust Mutex )
A
p
p

s

L
a
t
e
n
c
y
A
p
p

s

T
h
r
o
u
g
h
p
u
t
EABI (Embedded Application Binary Interface) 3.
PART 1. Overview
PART 2. OpenBinder
PART 3. EABI
PART 4. Low Memory Killer
19/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 3
What i s EABI?
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.8-2.6.15).
Compatability with ARMv5t processors and above (for GCC 4.2). 5
More efficient syscall convention. ( Ref1) 4
More compatibility with various development tools. 3
Better structure packing capabilities. 2
Ability to mix soft and hardfloat code. (GCC 4.2: --with-fpu=vfp --with-float=softfp) 1
Features No
- http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0036a/
ARM Information Center
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.
The effective features for arm-linux users with the use of EABI are
20/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 3
Ext endi ng t he ARM Pr ocessor Por t f ol i o
Android
•Continued licensing of both mature and new technology
•Cortex-A9 Ecosystem Æ EDA, OS and Software companies supporting Cortex-A9
21/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 3
Ar ch & CPU i nf or mat i on of GCC about andr oi d
…………………………… 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}
};
…………………………… Upper Omission …………………………
{"arm10t", ARM_ARCH_V5T, FPU_ARCH_VFP_V1, NULL},
{"arm10tdmi", ARM_ARCH_V5T, FPU_ARCH_VFP_V1, NULL},
{"arm10e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
{"arm1020", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, "ARM1020E"},
•http://gcc.gnu.org/svn/gcc/branches/gcc-4_3-branch/gcc/config/arm/arm.c
•http://sourceware.org/cgi-bin/cvsweb.cgi/src/gas/config/tc-arm.c?cvsroot=src
22/ 34
software stack for mobile devices (Android)
2008 Korea
Android
The common gcc command options that are available for EABI are
Part 3
Cr oss Compi l er f or EABI
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.
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.
-mlinked-fp
Generate position-independent EABI code. -mlibrary-pic
Specify both -mcall-sysv and -mno-eabi options. -mcall-sysv-noeabi
Specify both -mcall-sysv and -meabi options. -mcall-sysv-eabi
Generate code for the given ABI. -mabi=eabi
Description GCC Option
23/ 34
software stack for mobile devices (Android)
2008 Korea
Android
• put fd into r0
• put length into r1-r2
• use “swi #(0x900000 + 194)” to call the kernel
Legacy ABI
EABI
Compatibility
Part 3
Legacy ABI vs. EABI
ExectuabIe Binary
EABI
• put fd into r0
• put length into r2-r3 (skipping over r1)
• put 194 into r7
• use “swi 0" to call the kernel
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.
13 #ifndef __ASM_ARM_UNISTD_H
14 #define __ASM_ARM_UNISTD_H
15 #define __NR_OABI_SYSCALL_BASE 0x900000
16 #if defined(__thumb__) || defined(__ARM_EABI__)
17 #define __NR_SYSCALL_BASE 0
18 #else
19 #define __NR_SYSCALL_BASE
__NR_OABI_SYSCALL_BASE
20 #endif
./include/asm-arm/unistd.h
fc6#> arm_v5t_le-objdump -xlD vmlinux | less
private flags = 602: [APCS-32] [VFP float format] ₩
[software FP] [has entry point]
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]
24/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 3
Legacy ABI vs. EABI
* ABI flags passed to binutils: -mabi=apcs-gnu -mfpu=fpa
* gcc -dumpmachine: arm-unknown-linux
* objdump -x for compiled binary:
abi #>obj dump - xl D vml i nux | l ess
pr i vat e f l ags = 602: [ APCS- 32] [ VFP f l oat f or mat ] [ sof t war e FP] [ has ent r y poi nt ]
* "file" on compiled Fedora binary
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
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:
eabi #> obj dump - xl D vml i nux | gr ep l ess
pr i vat e f l ags = 4000002: [ Ver si on4 EABI] [ has ent r y poi nt ]
* "file" on compiled binary (under Fedora)
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
Toolchain
&
Binary
Legacy ABI
New EABI
25/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 3
Cr oss Compi l er f or EABI
Is it possible to run both EABI and non-EABI binaries on the same system?
EABI 관련하여 설명하고 있는 사이트.
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”
26/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 3
If EABI i s not suppor t ed i n your ker nel ?
For example, Your kernel is 2.6.15- . So You need EABI Feature.
32 arm-eabi-syscall-adjstments 16
arm_eabi_syscalls_compat_hack 31 arm-eabi-syscalls 15
arm_mempolicy_syscalls_compat_hack 30 arm-eabi-helper-func-names 14
arm-oabi-struct-sockaddr_un 29 arm-eabi-sp-align-2 13
arm-oabi-is-experimental 28 arm-eabi-sp-align-1 12
arm-nptl-compat-mb 27 arm-eabi-slab-align-to-64bits 11
arm-eabi-sigreturn-fix 26 arm-eabi-relocs-for-modules 10
arm-oabi-kconfig 25 arm_mno-thumb-interwork 9
arm-oabi-nwfpe 24 arm-fix-sys_sendto-and-sys_recvfrom-6-arg 8
arm-oabi-multi-abi 23 slab-add-more-arch-override 7
arm-oabi-syscall-wrappers 22 arm-optimized-libc-functions 6
arm-oabi-statfs64 21 arm-remove-udivdi3-from-kernel 5
arm-mempolicy-syscalls 20 arm-remove-udivdi3-from-nwfpe 4
arm-inotify-ioprio.syscalls 19 mmc-remove-ref-to-divdi3 3
arm-update-syscall-table 18 arm-remove-udivdi3-from-pxafb 2
arm-eabi-kconfig 17 use_mtune_arm1136j-s_for_ARMv6_targets 1
•On any ARM toolchain (v5t_le, xscale_le), in the Processor Features area, the following new freatures need to
be set EABI.
Low Memory Killer 4.
PART 1. Overview
PART 2. OpenBinder
PART 3. EABI
PART 4. Low Memory Killer
28/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 4
What i s Low Memor y Ki l l er ?
Why Google develop Low Memory Killer without OOM?
TargetBoard에서 사용가능한 메모리 공간이 고갈 상태에 이르렀을 때, OOM(Out Of Memory)을 발생시키는 방법을 사
용하지 않고, 프로세스들의 중요도에 따라 그룹으로 나눈 후에 중요도가 낮은 그룹에 있는 Process부터 하나씩 하나
씩 Kill하여 Android의 전체적인 시스템의 운영을 유지시켜주는 메모리를 확보하는 방법이다.
아래는 메모리가 고갈 상태에 이르렀을 때 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_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
………………………… 아랫 부분 생략 ……………………………….
•“ lowmem_reserver” 부분 Æ kernel-2.6/mm/page_alloc.c 파일의
show_free_areas( ) 함수 안의 for_each_zone() 함수에서 담당
29/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 4
OOM ( Out of Memor y ) Ki l l er
oom~kiIIer: 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
…………. Below Omission …………….
Free pages: 21472kB (340kB HighMem)
…………. Below Omission …………….
OOM Example
※ Kernel Messages Analysis: This is caused by DMA
problem. Physical HDD’s Problem? In fact , This Memory
Allocation Policy Related Problem.
Case1) Program is allocating memory continually.
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);
}
Kenrle Messages When OOM
I
f

f
a
i
I

m
e
m
a
I
I
o
c
a
t
i
o
n
,

p
r
o
g
r
a
m

e
x
i
t
.
I
f

f
a
i
I

m
e
m
a
I
I
o
c
a
t
i
o
n
,

p
r
o
g
r
a
m

e
x
i
t
.

C
a
s
e
3


O
O
M
k
ille
r는
in
it를











P
ro
c
e
s
s




Æ
M
e
m
o
ry
U
s
a
g
e



S
c
o
re


Æ


s
u
p
e
ru
s
e
r
P
ro
c
e
s
s

H
a
rd
w
a
re

A
c
c
e
s
s


P
ro
c
e
s
s




1
/4



Æ
S
c
o
re





P
ro
c
e
s
s

K
ill함
.
Guide for Embedded Memory Programming
• What Every Programmer Should Know About Memory
• Understanding The Linux Virtual Memory manager
• Understanding Virtual Memory in Red Hat Enterprise
Linux 4
30/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 4
Andr oi d Appl i cat i on ‘ s Li f e Cycl e 1/ 2
How do we make Application’s life cycle in Mobile/Embedded?
안드로이드의 중요하면서 보편적이지 않은 하나의 특징은 애플리케이션 프로세스의 생명주기가 해당 애플리케이션
에 의해 직접적으로 제어되지 않는 다는 것이다. 대신, 애플리케이션이 사용자를 위해서 얼마나 중요한가? 그리고 시
스템 전체적으로 얼마나 많은 메모리가 유용한가라는 애플리케이션 실행과 관련된 시스템의 인식기반과 관련된 애플
리케이션의 조합된 영역들에 의해 결정난다.
empty 프로세스는 어떤 활성화 된 애플리케이션 컴포넌트도 점유하지 않는 프로세스이다. 이러한 프로세스를 유지하고
있는 유일한 이유는 다음번에 해당 애플리케이션을 실행할 필요가 있을 때 시동(startup) 시간을 개선하기 위한 캐쉬로써
사용하기 위함이다. 그런 이유로, 시스템은 이러한 캐쉬화된 empty 프로세스들과 기반에 있는 커널 캐쉬들 사이에서 전반
적인 시스템 균형을 유지하기 위해 이러한 프로세스들을 가끔 종료하게 된다.
Empty
(Unlimited)
background 프로세스는 사용자에게는 현재 보여지지 않는 Activity를 점유하는 프로세스이다. 이러한 프로세스는 사용자
에게 어떤 것도 직접적으로 영향을 미치지 않는다. activity 생명주기를 정확하게 구현하기 위해서 마련된 것이며, 시스템
은 위의 3가지 프로세스 타입 중 한 가지를 위한 메모리 반환 요청이 있을 시에만 그러한 프로세스를 종료시킬 것이다. 일
반적으로 많은 수의 이런 프로세스가 실행되고 있으며, 해당 프로세스들은 메모리 결핍 시 사용자에게 가장 최근에 보여
진 것이 가장 마지막에 종료되는 절차를 확립하기 위해 LRU 리스트 상에서 유지된다.
Background
(64M)
service 프로세스는 startService() 메쏘드를 가지고 시작된 Service를 점유하고 있는 프로세스 이다. 이러한 프로세스는
사용자에게 직접적으로 보여지는 않지만, 이것은 일반적으로 사용자와 관련된 어떤 일을 일반적으로 수행하며, 시스템이
모든 foreground와 visibile 프로세스를 보유하기에 충분한 메모리가 존재하는 한, 시스템은 그러한 프로세스들은 항상 실
행상태로 유지할 것이다.
Serivce
(16M)
visible 프로세스는 사용자의 화면상에는 나타나지만 foreground 상태는 아닌 Activity를 점유하는 프로세스이다. 예를 들
어 foreground activity 다이얼로그 형태로 그 뒤에 이전에 보여졌던 activity를 허용하면서 표시될때 이러한 것은 발생하
게 된다. 그러한 프로세스는 극도록 중요하게 고려되며 더이상 그것을 수행하지 않을 때까지 종료되지 않으며, 모든
foreground 프로세스들을 실행 상태로 유지하는 것이 요구된다.
Visible
(8M)
foreground 프로세스는 사용자와 상호작용을 하고 있는 스크린의 최상위에 있는 Activity나 현재 수행되고 있는
IntentReceiver를 점유하고 있는 프로세스이다. 시스템에는 매우 작은 수의 그러한 프로세스들이 존재할 뿐이며, 이런 프
로세스가 계속 실행 되기조차 어려운 최후의 메모리 부족 상태에서만 종료된다. 일반적으로 디바이스가 메모리 페이징 상
태에 도달하는 시점에, 사용자 인터페이스에 대한 응답을 처리하기 위해서 그러한 행위가 요구된다.
Foreground
(6M)
Description
계층구조
(Free Mem)
http://code.google.com/android/intro/lifecycle.html
Higher
Lower
31/ 34
software stack for mobile devices (Android)
2008 Korea
Android
Part 4
Andr oi d Appl i cat i on ‘ s Li f e Cycl e 2/ 2
Why Application’s life cycle is important in android platform?
애플리케이션 개발자가 애플리케이션 프로세스의 생명주기에 얼마나 다른 애플리케이션 컴포넌트 (특별히,
Activity, Service, 그리고 IntentReceiver) 가 영향을 미치는가를 이해하는 것은 중요하다. 이러한 컴포넌트들
을 정확하게 사용하지 않는다면, 시스템이 해당 애플리케이션이 중요한 작업을 수행 하는 동안 해당 프로세스
를 종료시키는 결과를 야기할 수 있다. 프로세스 생명주기와 관련된 버그중 일반적인 예가 IntentReceiver가
onReceveIntent() 메쏘드내에서 Intent를 받을 때 쓰레드를 시작한 다음 해당 함수를 리턴하는 경우이다. 그
러한 리턴이 발생 하면, 시스템은 IntentReceiver가 더이상 활성화되어 있지 않다고 간주하고, 따라서 그 호스
팅 프로세스가 더이상 필요하지 않다고 간주한다. (단지, 다른 애플리케이션 컴포넌트가 그 안에서 활성화 되
지 않는 한) 따라서, 시스템은 메모리 반환요청이 있는 어떤 시점에선 해당 프로세스를 종료시킬 수 있다. 이
문제를 해결하기 위한 해법은 시스템이 해당 프로세스 내에서 행해지고 있는 활성화된 작업이 여전히 존재한
다는 것을 알도록 IntentReceiver로 부터 Service를 시작시키는 것이다 .
Maps Service
메모리가 부족할 때, 어떤 프로세스들이 종료되어야 하는가를 결정하기 위해서, Android는 프로세스를 그것
안에서 실행되는 컴포넌트와 그러한 컴포넌트의 상태에 기반을 둔 "중요성 계층구조"에 추가함.
32/ 34
software stack for mobile devices (Android)
2008 Korea
Android
.
Part 4
Ker nel Modul e f or Low Memor y Ki l l er
Location of Low memory killer
•./kernel-2.6/misw/lowmemorykiller/
Iowmem¿shrink()
lowmem_print()
module_param_named()
module_param_array_named()
module_param_array_named()
module_param_named()
lowmem_init()
lowmem_exit()
shrinker lowmem_shrinker Structure
lowmemorykiller.c
Make file to build Lowmemorykiller.ko kernel module Makefile
Description File Name
•Process에 대한 분류방법을 결정할 때, 시스템은 Process내에서 현재 활성화 된 모든 컴포넌트 중에서 가장 중
요한 레벨을 얻어낸다.
•Process의 모든 생명주기에 이러한 Activity, Service, 그리고 IntentReceiver 같은 컴포넌트의 각각이 얼마나 영
향을 미치는 지에 대해서는 각각에 대한 보다 자세한 문서를 code.google.com을 통해서 열람 가능함.
33/ 34
software stack for mobile devices (Android)
2008 Korea
Android
.
Part 4
About Andr oi d’ s l ow memor y shr i nk t ask
• Iowmem¿shrink()
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, "select %d (%s), adj %d, size %d , to kill₩n",
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, seIected)·
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
※Linux Cross Reference WebTool Æ http://lxr.linux.no/linux
34/ 34
software stack for mobile devices (Android)
2008 Korea
Android

Android Kernel Issues
- CTO - S/W Lab - Lim,GeunSik (geunsik.lim@samsung.com)

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

This means that anyone can customize the android platform and then keep it proprietary. Android Platform is open source completely. Linux Kernel YAFFS2 QEMU QEMU Accelerator Dalvik (JVM) OpenBinder (Core) SQLite Python GPL2 GPL GPL GPL2 Google (Apache) GPL2 GPL2 Python Apache LGPL SGI OpenGL (BSD/MPL) BSD BSD (including LGPL) LGPL LGPL GPL+BSD GPL2 MIT Google (Skia) ’ ant SDL OpenGL NetBSD C Library Webkit WebCore KJS KHTML DBUS Expat SGL software stack for mobile devices (Android) 4/34 .Part 1 License Related Android & OpenSource 2008 Korea Android •What is Android’s License? •Currently. The Android mobile OS will be released under Apache License.

Part 1 Android Kernel Features 2008 Korea Android ( Embedded ABI ) Frame Buffer (Device Driver) /dev/fb0 /dev/binder (251 ~ 253) O O O △ ( To Manage process When Memory is low) △ △ ( For IPC between processes ) Touch-Screen Device drivers Misc Android Log Driver (Android Log Subsystem to display log messages like logcat) /dev/log/{main:log:event} Android 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 ) Emulator Panic Timeout ( To manage timout value when panic) init ramfs source ( To run /init .Exectuable Liking Format ) △ △ △ △ △ △ software stack for mobile devices (Android) 5/34 .

Target Platform: ARM EABI . gcc.tar. Use -mfpu=vfp -mfloat-abit=softfp software stack for mobile devices (Android) 6/34 .com/gnu_toolchains/arm/download.6. IA32 GNU /Linux Option (Radio Box)" and Download .com/files/linux-2.googlecode.codesourcery.Host Platform: IA32 GNU/Linux .23android-m3-rc20.html Download the ARM 2007q3 Release Select "ARM EABI.bz2 export PATH=$PATH :<cross_compiler_install_path>/bin/ Android Kernel: http://android.Part 1 What is Cross Compiler to build Kernel? Select Cross Compiler for ARM v6 2008 Korea Android Sourcery G++ Lite Edition (CodeSourcery's version of the GNU Toolchain) arm-2007q3-53-arm-none-eabi-i686-pc-linux-gnu. bintuils http://www.tar.Source Code: Unchecked Default Floating Point : Soft-Float If you are want to compile hard-float option to enable VFP Instruciton.gz How to get CodeSource Toolchain We need opensource for toolchain like Kernel. glibc.

android./ fc6#> gunzip config. 2008 Korea Android fc6#> <android_sdk_install_path>/tools/emulator –console –debug-kernel –kernel kernel-qemu fc6#> adb pull /proc/config.6.18-arm1136jf-s.6.Part 1 How to build Kernel Source for Android Platform Get default .18-arm1136jf-s.config (GoldFish Config File) fc6#> make ARCH=arm CROSS_COMPILE=arm_none-linux-gnueabi.modules_install fc6#> cp .modules fc6#> make ARCH=arm CROSS_COMPILE=arm_none-linux-gnueabi.armadillo-500 fc6#> cp .6 Kernel Source fc6#> tar xzf linux-2.config Build 2.gz fc6#> vi .menuconfig fc6#> make ARCH=arm CROSS_COMPILE=arm_none-linux-gnueabi.armadillo-500 /tftpboot/target/lib/modules/ software stack for mobile devices (Android) 7/34 .config file from rootFS of anroid emulator.armadillo-500.zImage fc6#> make ARCH=arm CROSS_COMPILE=arm_none-linux-gnueabi.tar.gz ././.18-arm1136jf-s.gz fc6#> cd linux-2.6./arch/arm/boot/zImage /tftpboot/ fc6#> cp –rf /lib/modules/ linux-2./arch/arm/configs/goldfish_defconfig .

EABI PART 4. OpenBinder PART 1. Overview PART 2.2. Low Memory Killer . OpenBinder PART 3.

org) 9/34 software stack for mobile devices (Android) . 2001 Palm Company acquired BeOS. 2001 Palm’s Micro Kernel is consist of Binder.org/ports/cobalt/ 2005 Contributed by Palm(OHA Member) . (Not Opensource : graphics .netbsd. 2004 netBSD Cobalt Kernel http://www. • Binder is system oriented rather than application oriented.beosmax. • The Binder has been used to implement a wide variety of commercial-quality systemlevel services. 2005 Google used Openbinder for android.Part 2 What is OpenBinder? OpenBinder? 2008 Korea Android •A complete open-source solution supporting new kinds of component-based system-level design. user interface . • Binder itself does not impose a particular threading model. OHA OHA • Component/object representations of various basic system services. • Support a new kind of component-based system-level development. • Resource management between processes. Openbiner’s History 1998 Binder is developed by BeOS. multimedia ramework) 2007 Current BeOS (http://www.

burden on system software ystem Customization • Both hardware manufacturers and phone carriers want to deeply customize their behavior. 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. ardware Scalability 2008 Korea Android • The mobile device world tends to have a much broader range of hardware capabilities than is found on desktops.Part 2 Why OpenBinder? These platforms were designed to run on small handheld or dedicated devices. obust Applications • Usage of the screen can become a significant problem for more complicated applications. • Binder helps address this issue by making it easy for one application to sandbox other parts of itself. • it much easier to support this kind of customizability in a manageable way. software stack for mobile devices (Android) 10/34 . such as web browsers.

init: mtd partition 0.userl init: mtd partition 3.kern init: mtd partition 6. "nor. "nand. software stack for mobile devices (Android) 11/34 .confi init: mtd partition 4. VFS: Mounted root (ext3 filesystem). "nand.ipl" init: mtd partition 5. 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이 부착됨. "nor. "nand.user init: mtd partition 7.free sh: can't access tty.bootl init: mtd partition 1. "nor. Freeing init memory: 120K init: HOW ARE YOU GENTLEMEN init: reading config file init: device init init: mtd partition -1. "nand.kerne init: mtd partition 2.Part 2 How to Use OpenBinder Driver in Kernel make menuconfig & Device Node & Binding Example 2008 Korea Android •OpenBinder의 자체적인 통신은 커널 Device Driver으로 통신할 수 있는 주어진 핸들에서 ioctl를 사용하여 수행. "nor. …………………… Upper Omission…………………….

c.c. •Handle on an object in another proces. services. •Powerful facilities for doing multithreaded programming with the Binder. config-loader-expat. connection.c 2008 Korea Android • <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.c.org/software/dbus/ dd http://www. bus/policy./dbus-daemon/bus/> activation.c. expirelist.c.c.Part 2 Map info of Google Map Process <.c config-parser. signals. bus.c. software stack for mobile devices (Android) 12/34 .freedesktop. driver. desktop-file.c. (Systemwide message-bus service) http://www. •Provides resource management between processes.c.org •Don't worry about processes or IPC Because of distributed architecture.c.open-binder. dispatch.

Live 0xbf000000 software stack for mobile devices (Android) 13/34 .sh # you almost certainly want to run this with sudo depmod modprobe binderdev echo lsmod | grep binder lsmod | grep binder ls /dev/binder 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 .d/ target#> vi binderdev. MODE="0666" target#> vi /etc/autobinder.Part 2 How to combine Openbinder and Udev in rootFS Android Kernel 2008 Korea Android Priority of Created Thread in • target#> cd /etc/udev/rules.rules KERNEL=="binder*". NAME="%k".

xml_p ) Interface Definition Language ( app . dmprovider lib(Schema) Core Openbinder system (Openbinder Kernel Module) samples scripts servers tools Sample Code ( Binder Component . Service Process . tools (BinderShell . support) binder lib(arm.org/MPL/ build_system commands components docs headers interfaces libraries 3way. package . services.openbinder. Binder Based System Service . pidgen [flags] foo. 전통적 인 Kernel에 의해 구성되는 객체 지향적 운영체제 환경을 제공함. setup_env ) Binder Process(loop) . bomber . software stack for mobile devices (Android) 14/34 . PackageNamespace [org. process_wrapper . binder_glue lib .tools]. Binder Shell Script) Script Collection ( boot. PackageLeaf [BinderShell]) 2008 Korea Android OpenBinder Ver 0. binder_component_glue lib . ※ 시스템의 가장 큰 힘은 다중 프로세스들로 작업이 수행될 때이며.google.pacakge_p . services . dmprovider. services (MemoryDealer) . storage .com/search/beta2 SOAP RPC Router ) ※ OpenBinder는 OS 설계를 위한 객체 지향적 접근 방식을 시도한 기존과는 다른 새로운 방식의 접근 방식으로. pacakage . Custom Package Manager make_strings [OPTIONS] strings. bsh Kits. xml . support support_p .idl Google Web APIs (http://api.xml.mozilla.generic. Kernel Module로 Build되는 OpenBinder는 프로세스 들간의 상호작용 및 오브젝트 참조를 효율적으로 관리하기 위하여 Binder에 의해 사용되는 특별한 IPC 메커니즘을 이용. Custom Package Manager . storage.8 Package Name http://www. commands) Quick Start Manual (doxgen) Header files ( app.x86) .Part 2 OpenBinder Description Makefiles collection (ex:All binder libraries .

BBinder. SBufferChain.com 2008 Korea Android Author (Contributor) Kenneth Albanowski Trey Boudreau John Dance Dianne Hackborn Arve H j& oslash George Hoffman Role Port of user-space code to Linux.albanowski@palmsource. settings catalog. data model. support classes.parks@palmsource. IMemory.uchicago. SBitstreamReader General design. especially of Ibinder / BBinder. marshalling and pidgen. BCatalogMirror General design. arve. Binder Shell. Initial design and implementation.org jason.co m trey.org hackbod@angryredplanet.com Eric Moon Joe Onorato Jason Parks Jenny Tsai em@glitchpop. Marshalling and pidgen. Memory Dealer. SAtom.com geh@georgeandjulia. Package manager. documentation Binder kernel module (versions 2 and 4).Part 2 OpenBinder Contributors Main Role of Conrtibutor E-mail kenneth.boudrea@palmsource. SHandler SBuffer.hjonnevag@palmsource. gehnaphores (lightweight locks). XML parser. SValue. the Binder kernel module . Linux Binder module. port to Linux Pidgen. data model. SLocker and SAtom debugging .com jitsai@alumni.edu software stack for mobile devices (Android) 15/34 .com dance@acm.net joeo@onorato.

Process Spawn Looper .html/ Line Description open. Thread Sync. Transaction Destroy. Thread Wakeup . compare_and_swap32 Node Global. Thread Read . Remainder i/o buffer Structure software stack for mobile devices (Android) File Name binder.h binder_transaction. Drain. Local_mapping Structure. Process Transact . Node Init . Node AcquireHome. release . unlocked ioctl cmpxchg32 .h Iobuffer. set_thread_priority .c binder. Process RemoteThread .c binder_proc. Process Stop .transaction. Read Raw.h binder_proc. Thread AttachProcess.h 692 341 141 71 2. Process wakeup timer . mmap . Process AddThread .h binder_node. binder_proc Structure Thread Cleanup . ioctl. Node Destroy Binder node’s Structure Process init . Thread Released .576 154 542 128 112 45 16/34 . Remaining. Consumed. Etc binder_thread Structure Transaction Init .h binder_thread. Process Destroy . Range_map Structure. Thread WaitForRequest.c binder_node. Thread GloablCount .c binder-thread. Transaction ReleaseTarget binder_transaction Structure Init. process idle timer . Death_notification Structure. Reverse_mapping Structure. Etc Descriptor Sturcture . Process Die .c Iobuffer. Thread Write. Thread init . Transaction Create.c binder-defs. Transaction Dtor .gnu. Node Send . Thread Die .Part 2 Core OpenBinder System File List 2008 Korea Android http://www.216 227 1. Transacton Debug Dump. Thread WaitForReply .org/copyleft/gpl. Thread Return Transaction. Write Raw. Process FreeBuffter .

if(priority >= 80) Worse Priority or low priority ( map 80. // The following must match SysThreadChangePriority in libbinder.100 to 0.19) { nice = priority .Part 2 Thread’s Priority binding to the OpenBinder Android Kernel 2008 Korea Android Priority of Created Thread in • • • We Implement Userspace Realtime Application with Locked Mutex Method (FUTEX) (Ex: Priority Queuing .-1) { nice = priority-3 . nice). int priority) {// Android Kernel’s Scheduling is Dynamic Priority(=Normal Priority ) to schedule between threads.79 to -20. Robust Mutex ) ’ ’ static void (pid_t thread. } else Better priority or High Priority ( map 0. nice /= 4. set_user_nice(find_task_by_pid(thread). Priority Inheritance .80.. priority.80. nice). if(nice > 19) nice = 19. } //printk(“*invain’s DEBUG: set_thread_priority tid %d pri %d == nice %d₩n".. thread. int nice.. } software stack for mobile devices (Android) 17/34 ..

EABI PART 4. EABI (Embedded Application Binary Interface) PART 1.3. Overview PART 2. Low Memory Killer . OpenBinder PART 3.

•the standard makes it possible to combine object files built using different toolchains if both their compilers use EABI. More efficient syscall convention. ( Ref1) Compatability with ARMv5t processors and above (for GCC 4.arm.16.2: --with-fpu=vfp --with-float=softfp) Better structure packing capabilities.6.2). for embedded architectures.Part 3 What is EABI? EABI(Embedded Application Binary Interface) 2008 Korea Android •It sets the standard for the interoperation between relocated files. (GCC 4. •GCC : CS-2005Q3 release is a modified version of gcc-3. as well as executable files. ARM Information Center . especially with specialized applications like iptables for example.4.com/help/index. 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.doc.0 •The commercial ARM RealView C/C++ compiler was the first to support EABI (GCC4.15).6.6.jsp?topic=/com.4 from gcc-4.ihi0036a/ software stack for mobile devices (Android) 19/34 . •Glibc : Earlier glibcs (2.http://infocenter. More compatibility with various development tools.1) •Kernel: EABI is supported in the ARM Linux kernel from version 2.1.3. The effective features for arm-linux users with the use of EABI are No 1 2 3 4 5 Features Ability to mix soft and hardfloat code.3) support EABI userspace but had old-style syscalls to work with older kernels (2.8-2.arm.

Part 3 Extending the ARM Processor Portfolio EDA. OS and Software companies supporting Cortex-A9 2008 Korea Android •Continued licensing of both mature and new technology •Cortex-A9 Ecosystem software stack for mobile devices (Android) 20/34 .

arm1026ejs. {"armv5te". NULL}. {"iwmmxt". FL_CO_PROC | FL_FOR_ARCH6Z. {"arm10e". 21/34 software stack for mobile devices (Android) . FL_CO_PROC | FL_FOR_ARCH5. {"armv5e". {"armv6t2". {"armv6zk". {"armv7". "5". {"armv5". 0 . NULL}. arm1026ejs. cortexa8. "ARM1020E"}. cortexm3. arm10tdmi. FL_CO_PROC | FL_FOR_ARCH6J. NULL}. {"arm10tdmi". "7A". FPU_ARCH_VFP_V1.org/svn/gcc/branches/gcc-4_3-branch/gcc/config/arm/arm.gnu. NULL}. NULL}. arm1156t2s. NULL}. "6T2". NULL}. cortexr4. cortexa8. NULL}. ep9312. •http://sourceware. "7". "4T". "5T". ARM_ARCH_V5T. "6K". NULL}. "4T". NULL}. "6ZK". NULL}. FL_CO_PROC | FL_FOR_ARCH5TE. "6Z". iwmmxt. NULL}. mpcore. arm10tdmi. FPU_ARCH_VFP_V2. NULL}. NULL. FL_CO_PROC | FL_FOR_ARCH5E. arm1136js. FL_CO_PROC | FL_FOR_ARCH7A. "5E". {"armv6j". "5TE". {"arm1020". FL_CO_PROC | FL_FOR_ARCH6ZK. FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE | FL_IWMMXT .c …………………………… Upper Omission ………………………… {"armv4t". NULL}. FL_CO_PROC | FL_FOR_ARCH6T2. arm1176jzs. NULL}. FL_LDSCHED | FL_CIRRUS | FL_FOR_ARCH4. FPU_ARCH_VFP_V1. FL_CO_PROC | FL_FOR_ARCH4T.cgi/src/gas/config/tc-arm. "5TE". {"armv6". FL_CO_PROC | FL_FOR_ARCH6K. NULL}. {"ep9312". NULL}. "7R". FL_CO_PROC | FL_FOR_ARCH5T. FPU_ARCH_VFP_V2. {NULL. NULL}. {"armv7-r". "6". {"armv5t". FL_CO_PROC | FL_FOR_ARCH7.org/cgi-bin/cvsweb. {"armv6k". arm1176jzs. NULL}. "6J".Part 3 Arch & CPU information of GCC about android 2008 Korea Android •http://gcc. NULL} }. arm7tdmi. "7M". arm_none. {"armv6z". ARM_ARCH_V5TE. {"armv7-a". Upper Omission ………………………… ARM_ARCH_V5T. FL_CO_PROC | FL_FOR_ARCH7M. {"armv7-m". ARM_ARCH_V5TE. arm1136js.c?cvsroot=src …………………………… {"arm10t". FL_CO_PROC | FL_FOR_ARCH7R. NULL}. FL_CO_PROC | FL_FOR_ARCH6.

Specify both -mcall-sysv and -mno-eabi options. loff_t length. This option is enabled by default and can be disabled with -mno-linked-fp. Follow the EABI requirement of always creating a frame pointer whenever a stack frame is allocated. Generate position-independent EABI code. Syscall register arguments are also expected to have EABI arrangements .Part 3 Cross Compiler for EABI ARM syscall entry convention 2008 Korea Android EABI user space binaries put the syscall number into r7 and use swi 0 to call the kernel. Example ARM sycall entry convention with long ftruncate64 (unsigned int fd. that is. -mlinked-fp software stack for mobile devices (Android) 22/34 . 64bit arguments should be put in a pair of registers from an even register number. Specify both -mcall-sysv and -meabi options. The common gcc command options that are available for EABI are GCC Option -mabi=eabi -mcall-sysv-eabi -mcall-sysv-noeabi -mlibrary-pic Description Generate code for the given ABI.

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 . EABI 2008 Korea Android It is important to use 0 for the swi argument because backward compatibility with legacy ABI userspace relies on this./include/asm-arm/unistd.h were also updated to support both ABIs and implement the right call method automatically.Part 3 Legacy ABI vs. The syscall macros in asm-arm/unistd. Compatibility • 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] .

18.18. dymically linked(uses shared libs).6. for GNU/Linux 2. for GNU/Linux 2.Part 3 Legacy ABI vs.4. 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: eabi#> objdump -xlD vmlinux | grep less private flags = 4000002: [Version4 EABI] [has entry point] * "file" on compiled binary (under Fedora) ELF 32-bit LSB executable. for GNU/Linux 2.4. version 1 (SYSV).20. dynamically linked (uses shared libs). version 1 (ARM). for GNU/Linux 2. ARM.6. stripped software stack for mobile devices (Android) 24/34 . EABI Legacy ABI 2008 Korea Android Toolchain & Binary * ABI flags passed to binutils: -mabi=apcs-gnu -mfpu=fpa * gcc -dumpmachine: arm-unknown-linux * objdump -x for compiled binary: abi#>objdump -xlD vmlinux | less private flags = 602: [APCS-32] [VFP float format] [software FP] [has entry point] * "file" on compiled Fedora binary ELF 32-bit LSB executable.20. ARM.

using the -static option. One option is to link your programs statically. linking dynamically is generally a superior approach. you will have to ensure that when you install the EABI libraries you do not overwrite existing libraries.3). it is possible. However. and want to run EABI binaries. you have several choices. If you have an old-ABI system. so it is possible for old-ABI and EABI binaries to coexist. running a dual-ABI system requires care. and you will have to set LD_LIBRARY_PATH so that the dynamic loader can find them. Generally.so.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. However. ※ Support EABI Feature “make menuconfig” – “Kernel Features” – “[*]Use the ARM EABI to compile the kernel” EABI 관련하여 설명하고 있는 사이트. software stack for mobile devices (Android) 25/34 . However. toolchains use a different dynamic loader (ld.

15. So You need EABI Feature. in the Processor Features area. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 use_mtune_arm1136j-s_for_ARMv6_targets arm-remove-udivdi3-from-pxafb mmc-remove-ref-to-divdi3 arm-remove-udivdi3-from-nwfpe arm-remove-udivdi3-from-kernel arm-optimized-libc-functions slab-add-more-arch-override arm-fix-sys_sendto-and-sys_recvfrom-6-arg arm_mno-thumb-interwork arm-eabi-relocs-for-modules arm-eabi-slab-align-to-64bits arm-eabi-sp-align-1 arm-eabi-sp-align-2 arm-eabi-helper-func-names arm-eabi-syscalls arm-eabi-syscall-adjstments 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 arm-eabi-kconfig arm-update-syscall-table arm-inotify-ioprio. •On any ARM toolchain (v5t_le. the following new freatures need to be set EABI.syscalls arm-mempolicy-syscalls arm-oabi-statfs64 arm-oabi-syscall-wrappers arm-oabi-multi-abi arm-oabi-nwfpe arm-oabi-kconfig arm-eabi-sigreturn-fix arm-nptl-compat-mb arm-oabi-is-experimental arm-oabi-struct-sockaddr_un arm_mempolicy_syscalls_compat_hack arm_eabi_syscalls_compat_hack software stack for mobile devices (Android) 26/34 .Part 3 If EABI is not supported in your kernel? 2008 Korea Android For example.6. xscale_le).. Your kernel is 2.

OpenBinder PART 3. Overview PART 2. Low Memory Killer PART 1.4. Low Memory Killer . EABI PART 4.

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” 부분 kernel-2. find 0/0. race 0+0 Free swap = 0kB Total swap = 0kB Out of Memory: Kill process 908 (udevd) score 122 and children. ………………………… 윗부분 생략 ………………………………. order=0 Mem-info: DMA per-cpu: cpu 0 hot: high 18. Free swap: 0kB 16384 pages of RAM 2623 free pages 924 reserved pages 1458 slab pages 279 pages shared 0 pages swap cached ………………………… 아랫 부분 생략 ……………………………….c 파일의 show_free_areas( ) 함수 안의 for_each_zone() 함수에서 담당 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. 프로세스들의 중요도에 따라 그룹으로 나눈 후에 중요도가 낮은 그룹에 있는 Process부터 하나씩 하나 씩 Kill하여 Android의 전체적인 시스템의 운영을 유지시켜주는 메모리를 확보하는 방법이다. batch 3 used:12 cpu 0 cold: high 6. Out of memory: Killed process 1922 (udev). OOM(Out Of Memory)을 발생시키는 방법을 사 용하지 않고.6/mm/page_alloc. delete 0. printk: 8 messages suppressed. oom-killer: gfp_mask=0x201d2. 아래는 메모리가 고갈 상태에 이르렀을 때 Low Memory Killer가 작동되면서 udev 프로세스를 Kill하는 것을 보여주고 있다. software stack for mobile devices (Android) 28/34 .Part 4 What is Low Memory Killer? 2008 Korea Android Why Google develop Low Memory Killer without OOM? TargetBoard에서 사용가능한 메모리 공간이 고갈 상태에 이르렀을 때.

0. n).Part 4 OOM (Out of Memory ) Killer OOM Example 2008 Korea Android Kenrle Messages When OOM : 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 ………….000 . Below Omission ……………. n). Guide for Embedded Memory Programming • What Every Programmer Should Know About Memory r는 in 는 점수 따라 S M kille ry Usage에 rocess P O • Understanding The Linux Virtual Memory manager 에서 O ess중인 . while (1) { if ((Temp = malloc(1<<50)) == NULL) { printf("malloc failure after %d MiB₩n". } Allocate needed memory using for(). Memo Case 3 를 Acc cess를 Kill함 사 ※ re s들을 검 ss나 Hardwa 많은 Pro • Understanding Virtual Memory in Red Hat Enterprise Proces e er Proc Score가 가장 Linux 4 uperus 삭감 s 가 1/4로 29/34 software stack for mobile devices (Android) Program is allocating memory continually. if (temp[num] == NULL) break. for (n = 0. i < num. Physical HDD’s Problem? In fact . } Program allocate memory. ※ Kernel Messages Analysis: This is caused by DMA problem. (1<<50)). 든 중인 모 때 printf("Got %d Mb₩n". printf ("Got %d Mb₩n". and use memory immediately. 이 재 실행 여 한현 } core 부 it를 제외 . num < 50. i+1). ++n). Use allocated memory using for(). (1<<50) ). Below Omission ……………. 0.} memset (p. } printf ("Got %d Mb₩n". return 0. } printf("malloc failure after %d MiB₩n". i++) { memset ( pp[i]. Free pages: 21472kB (340kB HighMem) …………. while (1) { if (malloc(1<<50) == NULL) { printf("malloc failure after %d MiB₩n". ++n). n). return 0. for (i = 0. This Memory Allocation Policy Related Problem. n++) { temp[num] = malloc(1<<50).

visible 프로세스는 사용자의 화면상에는 나타나지만 foreground 상태는 아닌 Activity를 점유하는 프로세스이다. activity 생명주기를 정확하게 구현하기 위해서 마련된 것이며. 시스템은 이러한 캐쉬화된 empty 프로세스들과 기반에 있는 커널 캐쉬들 사이에서 전반 적인 시스템 균형을 유지하기 위해 이러한 프로세스들을 가끔 종료하게 된다. 이것은 일반적으로 사용자와 관련된 어떤 일을 일반적으로 수행하며.google. 일반적으로 디바이스가 메모리 페이징 상 태에 도달하는 시점에. 이러한 프로세스는 사용자에게 직접적으로 보여지는 않지만. 모든 foreground 프로세스들을 실행 상태로 유지하는 것이 요구된다. 사용자 인터페이스에 대한 응답을 처리하기 위해서 그러한 행위가 요구된다. 시스템은 그러한 프로세스들은 항상 실 행상태로 유지할 것이다. service 프로세스는 startService() 메쏘드를 가지고 시작된 Service를 점유하고 있는 프로세스 이다. 시스템 은 위의 3가지 프로세스 타입 중 한 가지를 위한 메모리 반환 요청이 있을 시에만 그러한 프로세스를 종료시킬 것이다. 그러한 프로세스는 극도록 중요하게 고려되며 더이상 그것을 수행하지 않을 때까지 종료되지 않으며. Higher 계층구조 (Free Mem) Foreground (6M) Description foreground 프로세스는 사용자와 상호작용을 하고 있는 스크린의 최상위에 있는 Activity나 현재 수행되고 있는 IntentReceiver를 점유하고 있는 프로세스이다. 애플리케이션이 사용자를 위해서 얼마나 중요한가? 그리고 시 스템 전체적으로 얼마나 많은 메모리가 유용한가라는 애플리케이션 실행과 관련된 시스템의 인식기반과 관련된 애플 리케이션의 조합된 영역들에 의해 결정난다. empty 프로세스는 어떤 활성화 된 애플리케이션 컴포넌트도 점유하지 않는 프로세스이다. 대신. 이러한 프로세스를 유지하고 있는 유일한 이유는 다음번에 해당 애플리케이션을 실행할 필요가 있을 때 시동(startup) 시간을 개선하기 위한 캐쉬로써 사용하기 위함이다. 이런 프 로세스가 계속 실행 되기조차 어려운 최후의 메모리 부족 상태에서만 종료된다. background 프로세스는 사용자에게는 현재 보여지지 않는 Activity를 점유하는 프로세스이다. 일 반적으로 많은 수의 이런 프로세스가 실행되고 있으며. 시스템에는 매우 작은 수의 그러한 프로세스들이 존재할 뿐이며.Part 4 Android Application ‘s Life Cycle 1/2 2008 Korea Android How do we make Application’s life cycle in Mobile/Embedded? 안드로이드의 중요하면서 보편적이지 않은 하나의 특징은 애플리케이션 프로세스의 생명주기가 해당 애플리케이션 에 의해 직접적으로 제어되지 않는 다는 것이다. 그런 이유로. 해당 프로세스들은 메모리 결핍 시 사용자에게 가장 최근에 보여 진 것이 가장 마지막에 종료되는 절차를 확립하기 위해 LRU 리스트 상에서 유지된다. Visible (8M) Serivce (16M) Background (64M) Empty (Unlimited) Lower http://code.html software stack for mobile devices (Android) 30/34 . 이러한 프로세스는 사용자 에게 어떤 것도 직접적으로 영향을 미치지 않는다. 예를 들 어 foreground activity 다이얼로그 형태로 그 뒤에 이전에 보여졌던 activity를 허용하면서 표시될때 이러한 것은 발생하 게 된다. 시스템이 모든 foreground와 visibile 프로세스를 보유하기에 충분한 메모리가 존재하는 한.com/android/intro/lifecycle.

메모리가 부족할 때. 다른 애플리케이션 컴포넌트가 그 안에서 활성화 되 지 않는 한) 따라서. 따라서 그 호스 팅 프로세스가 더이상 필요하지 않다고 간주한다. 그 러한 리턴이 발생 하면. 어떤 프로세스들이 종료되어야 하는가를 결정하기 위해서. Android는 프로세스를 그것 안에서 실행되는 컴포넌트와 그러한 컴포넌트의 상태에 기반을 둔 "중요성 계층구조"에 추가함. 이 문제를 해결하기 위한 해법은 시스템이 해당 프로세스 내에서 행해지고 있는 활성화된 작업이 여전히 존재한 다는 것을 알도록 IntentReceiver로 부터 Service를 시작시키는 것이다 . 시스템은 메모리 반환요청이 있는 어떤 시점에선 해당 프로세스를 종료시킬 수 있다. 시스템은 IntentReceiver가 더이상 활성화되어 있지 않다고 간주하고. 그리고 IntentReceiver) 가 영향을 미치는가를 이해하는 것은 중요하다. Activity. 시스템이 해당 애플리케이션이 중요한 작업을 수행 하는 동안 해당 프로세스 를 종료시키는 결과를 야기할 수 있다. 31/34 software stack for mobile devices (Android) . (단지. 프로세스 생명주기와 관련된 버그중 일반적인 예가 IntentReceiver가 onReceveIntent() 메쏘드내에서 Intent를 받을 때 쓰레드를 시작한 다음 해당 함수를 리턴하는 경우이다.Part 4 Android Application ‘s Life Cycle 2/2 2008 Korea Android Why Application’s life cycle is important in android platform? 애플리케이션 개발자가 애플리케이션 프로세스의 생명주기에 얼마나 다른 애플리케이션 컴포넌트 (특별히. Service. 이러한 컴포넌트들 을 정확하게 사용하지 않는다면.

6/misw/lowmemorykiller/ File Name Makefile Description Make file to build Lowmemorykiller. 그리고 IntentReceiver 같은 컴포넌트의 각각이 얼마나 영 향을 미치는 지에 대해서는 각각에 대한 보다 자세한 문서를 code.ko kernel module shrinker lowmem_shrinker Structure ./kernel-2.com을 통해서 열람 가능함. 시스템은 Process내에서 현재 활성화 된 모든 컴포넌트 중에서 가장 중 요한 레벨을 얻어낸다.Part 4 Kernel Module for Low Memory Killer 2008 Korea Android Location of Low memory killer •.c lowmem_print() module_param_named() module_param_array_named() module_param_array_named() module_param_named() lowmem_init() lowmem_exit() •Process에 대한 분류방법을 결정할 때. software stack for mobile devices (Android) 32/34 . Service. •Process의 모든 생명주기에 이러한 Activity.google. lowmemorykiller.

read_lock(&tasklist_lock). nr_to_scan.no/linux lowmem_print(3. min_adj). other_free. p->oomkilladj. adj %d. ma %d₩n". "send sigkill to %d (%s). size %d₩n". "lowmem_shrink %d. // 64MB = 16x1024 x 4 }. "lowmem_shrink %d. lowmem_print(2.linux. selected->comm. selected->oomkilladj. nr_to_scan. selected_tasksize = tasksize. // 16MB= 4 x 1024 x 4 16*1024. p->pid. selected->pid. // 8MB = 2 x 1024 x 4 4*1024. p->comm. * Default lowmem_debug_level is 2. rem -= selected_tasksize. } lowmem_print(4.Part 4 About Android’s low memory shrink task ※Linux Cross Reference WebTool 2008 Korea Android • if(nr_to_scan > 0) http://lxr. %x. adj %d. "select %d (%s). 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. return rem. { if(p->oomkilladj >= 0 && p->mm) { tasksize = get_mm_rss(p->mm). . use 3+ value software stack for mobile devices (Android) 33/34 . tasksize). size %d . ofree %d. rem). // 6MB = 3 x 5123 x 4 2*1024. } } rem += tasksize. %x. If you want to debug . gfp_mask. * static size_t lowmem_minfree[6]={ 3*512. gfp_mask. selected_tasksize). read_unlock(&tasklist_lock). return %d₩n". } } if(selected != NULL) { lowmem_print(1. to kill₩n".

2008 Korea Android software stack for mobile devices (Android) 34/34 .