SlideShare une entreprise Scribd logo
1  sur  10
Télécharger pour lire hors ligne
Tiny Linux Kernel Project: Section Garbage Collection Patchset

                                             Wu Zhangjin
                                       Tiny Lab - Embedded Geeks
                                            http://tinylab.org
                                         wuzhangjin@gmail.com

                                      Sheng Yong
           Distributed & Embedded System Lab, SISE, Lanzhou University, China
                       Tianshui South Road 222, Lanzhou, P.R.China
                                   shengy07@lzu.edu.cn



                                                    Abstract
         Linux is widely used in embedded systems which always have storage limitation and hence requires
     size optimization. In order to reduce the kernel size, based on the previous work of the “Section Garbage
     Collection Patchset”, This paper focuses on details its principle, presents some new ideas, documents the
     porting steps, reports the testing results on the top 4 popular architectures: ARM, MIPS, PowerPC, X86
     and at last proposes future works which may enhance or derive from this patchset.




1    Introduction                                                Our gc-sections subproject focuses on analyzes
                                                             its working mechanism, improves the patchset(e.g.
                                                             unique user defined sections), applies the ideas for
The size of Linux kernel source code increases               more architectures, tests them and explores potential
rapidly, while the memory and storage are limited            enhancement and derivation. The following sections
in embedded systems (e.g. in-vehicle driving safety          will present them respectively.
systems, data acquisition equipments etc.). This re-
quires small or even tiny kernel to lighten or even
eliminate the limitation and eventually expand the           2    Link time dead code remov-
potential applications.
                                                                  ing using section garbage col-
    Tiny Lab estimated the conventional tailoring
methods and found that the old Tiny-linux project is              lection
far from being finished and requires more work and
hence submitted a project proposal to CELF: “Work            Compiler puts all executable code produced by com-
on Tiny Linux Kernel” to improve the previous work           piling C codes into section called .text, r/o data into
and explore more ideas.                                      section called .rodata, r/w data into .data, and unini-
                                                             tialized data into .bss[2, 3]. Linker does not know
    “Section    garbage collection       patchset(gc-
                                                             which parts of sections are referenced and which ones
sections)” is a subproject of Tiny-linux, the initial
                                                             are not referenced. As a result, unused(or ‘dead’)
work is from Denys Vlasenko[9]. The existing patch-
                                                             function or data cannot be removed. In order to
set did make the basic support of section garbage
                                                             solve this issue, each function or data should has its
collection work on X86 platforms, but is still out-
                                                             own section.
side of the mainline for the limitation of the old
GNU toolchains and for there are some works to be                gcc    provides     -ffunction-sections      or
done(e.g. compatibility of the other kernel features).       -fdata-sections option to put each function or data


                                                         1
to its own section, for instance, there is a function         $ echo ’ unused (){} main (){} ’ | gcc -S -x c -o - - 
                                                                | grep . text
called unused func(), it goes to .text.unused func                     . text
section, Then, ld provides the --gc-sections op-
tion to check the references and determine which                  Or else, each function has its own section (indi-
dead function or data should be removed, and the              cated by the .section instruction of assembly):
--print-gc-sections option of ld can print the the            $ echo ’ unused (){} main (){} ’ 
function or data being removed, which is helpful to            | gcc - ffunction - sections -S -x c -o - - | grep . text
                                                                       . section         . text . unused , " ax " , @ p r o g b i t s
debugging.                                                             . section         . text . main , " ax " , @ p r o g b i t s
    The following two figures demonstrates the dif-
ferences between the typical object and the one with             As we can see, the prefix is the same .text, the
-ffunction-sections:                                          suffix is function name, this is the default section
                                                              naming rule of gcc.
                                                                  Expect -ffunction-sections, the section at-
                                                              tribute instruction of gcc can also indicate where
                                                              should a section of the funcion or data be put in,
                                                              and if it is used together with -ffunction-sections,
                                                              it has higher priority, for example:
                                                              $ echo ’ _ _ a t t r i b u t e _ _ (( _ _ s e c t i o n _ _( " . text . test " ))) unused (){} 
                                                                main (){} ’ | gcc - ffunction - sections -S -x c -o - - | grep . text
                                                                       . section                    . text . test , " ax " , @ p r o g b i t s
                                                                       . section                    . text . main , " ax " , @ p r o g b i t s


                                                                  .text.test is indicated instead of the default
                                                              .text.unused. In order to avoid function redefinition,
                                                              the function name in a source code file should be
                                                              unique, and if only with -ffunction-sections, every
   FIGURE 1: Typical Object                                   function has its own unique section, but if the same
                                                              section attribute applies on different functions, dif-
                                                              ferent functions may share the same section:
                                                              $ echo ’ _ _ a t t r i b u t e _ _ (( _ _ s e c t i o n _ _( " . text . test " ))) unused (){} 
                                                                _ _ a t t r i b u t e _ _ (( _ _ s e c t i o n _ _( " . text . test " ))) main (){} ’ 
                                                                | gcc - ffunction - sections -S -x c -o - - | grep . text
                                                                            . section                    . text . test , " ax " , @ p r o g b i t s


                                                                   Only one section is reserved, this breaks the core
                                                              rule of section garbage collection: before linking,
                                                              each function or data should has its own section, but
                                                              sometimes, for example, if want to call some func-
                                                              tions at the same time, section attribute instruction
                                                              is required to put these functions to the same section
                                                              and call them one by one, but how to meet these
                                                              two requirements? use the section attribute instruc-
   FIGURE         2: Object     with    -ffunction-            tion to put the functions to the section named with
   sections                                                   the same prefix but unique suffix, and at the linking
                                                              stage, merge the section which has the same prefix
    To learn more about the principle of section
                                                              to the same section, so, to linker, the sections are
garbage collection, the basic compiling, assebmling
                                                              unique and hence better for dead code elimination,
and linking procedure should be explained at first
                                                              but still be able to link the functions to the same
(Since the handling of data is similar to function,
                                                              section. The implementation will be explained in
will mainly present function below).
                                                              the coming sections.
                                                                  Based on the same rule, the usage of section at-
2.1    Compile: Translate source code                         tribute instruction should also follow the other two
       from C to assembly                                     rules:

If no -ffunction-sections for gcc, all functions are             1. The section for function should named with
put into .text section (indicated by the .text instruc-             .text prefix, then, the linker may be able to
tion of assembly):                                                  merge all of the .text sections. or else, will not

                                                          2
be able to or not conveniently merge the sec-                   Here is a basic linker script:
      tions and at last instead may increase the size           O U T P U T _ F O R M A T( " elf32 - i386 " , " elf32 - i386 " ,
      of executable for the accumulation of the sec-                                       " elf32 - i386 " )
                                                                O U T P U T _ A R C H( i386 )
      tion alignment.                                           ENTRY ( _start )
                                                                SECTIONS
   2. The section name for function should be pre-              {
                                                                    . text                     :
      fixed with .text. instead of the default .text                 {
      prefix used gcc and break the core rule.                           *(. text . stub . text .* . gnu . linkonce . t .*)
                                                                        ...
                                                                    }
                                                                    . data                       :
    And we must notice that: ‘You will not be able                  {
to use “gprof” on all systems if you specify this op-                   *(. data . data .* . gnu . linkonce . d .*)
                                                                        ...
tion and you may have problems with debugging if                    }
you specify both this option and -g.’ (gcc man page)                / DISCARD / : { *(. note . GNU - stack ) *(. gnu . lto_ *) }
                                                                }
$ echo ’ unused (){} main (){} ’ | 
   gcc - ffunction - sections -p -x c -o test -
< stdin >:1:0: warning : - ffunction - sections disabled ;         The first two commands tell the target architec-
          it makes p r o f i l i n g i m p o s s i b l e        ture and the ABI, the ENTRY command indicates
                                                                the entry of the executable and the SECTIONS com-
                                                                mand deals with sections.
2.2    Assemble:     Translate assembly                              The entry (above is start, the standard C entry,
       files to binary objects                                   defined in crt1.o) is the root of the whole executable,
                                                                all of the other symbols (function or data) referenced
In assembly file, it is still be possible to put the func-       (directly or indirectly) by the the entry must be kept
tion or data to an indicated section with the .sec-             in the executable to make ensure the executable run
tion instruction (.text equals .section “.text”). Since         without failure. Besides, the undefined symbols (de-
-ffunction-sections and -fdata-sections doesn’t                 fined in shared libraries) may also need to be kept
work for assembly files and they has no way to de-               with the EXTERN command. and note, the --entry
termine the function or data items, therefore, for the          and --undefined options of ld functions as the same
assembly files written from scratch (not translated              to the ENTRY and EXTERN commands of linker
from C language), .section instruction is required to           script respectively.
added before the function or data item manually, or
else the function or data will be put into the same                 --gc-sections will follow the above rule to deter-
.text or .data section and the section name indicated           mine which sections should be reserved and then pass
should also be unique to follow the core rule of sec-           them to the SECTIONS command to do left merg-
tion garbage collection.                                        ing and including. The above linker script merges all
                                                                section prefixed by .text, .stub and .gnu.linkonce.t
   The following commands change the section                    to the last .text section, the .data section merging is
name of the ‘unused’ function in the assembly file               similar. The left sections will not be merged and kept
and show that it does work.                                     as their own sections, some of them can be removed
$ echo ’ unused (){} main (){} ’                               by the /DISCARD/ instruction.
    | gcc - ffunction - sections -S -x c -o - - 
    | sed -e " s / unused / test / g "                               Let’s see how --gc-section work, firstly, without
    | gcc -c - x a s s e m b l e r - -o test
$ objdump -d test | grep . section                              it:
D i s a s s e m b l y of section . text . test :
                                                                $ echo ’ unused (){} main (){} ’ | gcc -x c -o test -
D i s a s s e m b l y of section . text . main :
                                                                $ size test
                                                                   text     data      bss       dec     hex filename
                                                                    800      252        8      1060     424 test

2.3    Link: Link binary objects to tar-                           Second, With --gc-sections (passed to ld with
       get executable                                           -Wl option of gcc):
                                                                $ echo ’ unused (){} main (){} ’ | gcc - ffunction - sections 
At the linking stage, based on a linker script, the               -Wl , - - gc - sections -x c -o test -
                                                                $ size test
linker should be able to determine which sections                  text          data     bss     dec    hex filename
should be merged and included to the last executa-                  794           244       8    1046    416 test
bles. When linking, the -T option of ld can be used
to indicate the path of the linker script, if no such               It shows, the size of the .text section is reduced
option used, a default linker script is called and can          and --print-gc-sections proves the dead ‘unused’
be printed with ld --verbose.                                   function is really removed:

                                                            3
$ echo ’unused(){} main(){}’ | gcc -ffunction-sections                       3.1    Basic support of                    gc-sections
-Wl,--gc-sections,--print-gc-sections -x c -o test -                                 patchset for Linux
/usr/bin/ld:   Removing unused section ’.rodata’ in file ’.../crt1.o’

/usr/bin/ld:   Removing unused section ’.data’ in file ’.../crt1.o’           The basic support of gc-sections patchset for Linux
/usr/bin/ld:   Removing unused section ’.data’ in file ’.../crtbegin.o’       includes:
/usr/bin/ld:   Removing unused section ’.text.unused’ in file ’/tmp/cclR3Mgp.o’

                                                                                  • Avoid naming duplication between the
    The above output also proves why the size of the                                magic sections defined by section attribute
.data section is also reduced.                                                      instruction and -ffunction-sections or
                                                                                    -fdata-sections
    But if a section is not referenced (directly or in-                             The kernel has already defined some sections
directly) by the entry, for instance, if want to put                                with the section attribute instruction of gcc,
a file into the executable for late accessing, the file                               the naming method is prefixing the sections
can be compressed and put into a .image section like                                with .text., as we have discussed in the above
this:
                                                                                    section, the name of the sections may be the
...                                                                                 same as the ones used by -ffunction-sections
SECTIONS
{                                                                                   or -fdata-sections and hence break the core
  ...                                                                               rule of section garbage collections.
  . data                       :
  {                                                                                 Therefore, several patches has been up-
     _ _ i m a g e _ s t a r t = .;
     *(. image )
                                                                                    streamed to rename the magic sections
     _ _ i m a g e _ e n d = .;                                                     from {.text.X, .data.X, .bss.X, .rodata.X}
     ...
  }
                                                                                    to {.text..X, .data..X, .bss..X, .rodata..X}
}                                                                                   and from {.text.X.Y, .data.X.Y, .bss.X.Y,
                                                                                    .rodata.X.Y} to {.text..X..Y, .data..X..Y,
    The file can be accessed through the point-                                      .bss..X..Y, .rodata..X..Y}, accordingly, the re-
ers: image start and image end, but the .image                                      lated headers files, c files, assembly files, linker
section itself is not referenced by anybody, then,                                  scripts which reference the sections should be
--gc-sections has no way to know the fact that .im-                                 changed to use the new section names.
age section is used and hence removes .image and as                                 As a result, the duplication between
a result, the executable runs without expected, In                                  the section attribute instruction and
order to solve this issue, another KEEP instruction                                 -ffunction-sections/-fdata-sections is elim-
of the linker script can give a help.                                               inated.
...
SECTIONS
                                                                                  • Allow linker scripts to merge the sec-
{                                                                                   tions generated by -ffunction-sections or
  ...
  . data                       :
                                                                                    -fdata-sections and prevent them from merg-
  {                                                                                 ing the magic sections
     _ _ i m a g e _ s t a r t = .;
     KEEP (*(. image ))                                                             In order to link the function or data sec-
     i m a g e _ e n d = .;                                                         tions generated by -ffunction-sections or
     ...
  }                                                                                 -fdata-sections to the last {.text, .data, .bss,
}                                                                                   .rodata}, the related linker scripts should be
                                                                                    changed to merge the corresponding {.text.*,
                                                                                    .data.*, .bss.*, .rodata.*} and to prevent the
                                                                                    linker from merging the magic sections(e.g.
3       Section garbage collection                                                  .data..page aligned), more restrictive patterns
        patchset for Linux                                                          like the following is preferred:
                                                                                    *(. text .[ A - Za - z0 -9 _$ ^]*)

The previous section garbage collection patchset is                                 A better pattern may be the following:
for the -rc version of 2.6.35, which did add the core                               *(. text .[^.]*)
support of section garbage collection for Linux but
                                                                                    Note, both of the above patterns are only sup-
it still has some limitations.
                                                                                    ported by the latest ld, please use the versions
    Now, Let’s analyze the basic support of section                                 newer than 2.21.0.20110327 or else, they don’t
garbage collection patchset for Linux and then list                                 work and will on the contrary to generate big-
the existing limitations.                                                           ger kernel image for ever such section will be

                                                                          4
linked to its own section in the last executable                 6. Didn’t pay enough attention to the the kernel
     and the size will be increased heavily for the                      modules, the kernel modules may also include
     required alignment of every section.                                dead symbols which should be removed
   • Support objects with more than 64k sections                      7. Only for X86 platform, not enough for the
     The variant type of section number(the                              other popular embedded platforms, such as
     e shnum member of elf{32,64} hdr) is u16,                           ARM, MIPS and PowerPC
     the max number is 65535, the old modpost
     tool (used to postprocess module symbol)                       In order to break through the above limita-
     can only handle an object which only has                   tions, improvement has been added in our gc-sections
     small than 64k sections and hence may fail                 project, see below section.
     to handle the kernel image compiled with
     huge kernel builds (allyesconfig, for exam-
                                                                3.2       Improvement of the previous gc-
     ple) with -ffunction-sections. Therefore, the
     modpost tool is fixed to support objects with                         sections patchset
     more than 64k sections by the document
     “IA-64 gABI Proposal 74: Section Indexes”:                 Our gc-sections project is also based on mainline
     http://www.codesourcery.com/public/cxx-                    2.6.35(exactly 2.6.35.13), it brings us with the fol-
     abi/abi/prop-74-sindex.html.                               lowing improvement:

   • Invocation of -ffunction-sections/-fdata-sections 1. Ensure the other kernel features work with gc-
     and --gc-sections                                    sections
     In order to have a working kernel with                             Ftrace requires the mcount loc section to
     -ffunction-sections and -fdata-sections:                           store the mcount calling sites; Kgcov requires
     $ make KCFLAGS = " - ffunction - sections - fdata - sections "     the .ctors section to do gcov initialization,
                                                                        these two sections are not referenced directly
     Then, in order to also garbage-collect the sec-                    and will be removed by --gc-sections and
     tions, added                                                       hence should be kept by the KEEP instruc-
     L D F L A G S _ v m l i n u x += --gc - sections                   tion explicitly. Besides, more sections listed
                                                                        in include/asm-generic/vmlinux.lds.h or the
     in the top-level Makefile.                                          other arch specific header files has the similar
                                                                        situation and should be kept explicitly too.
     The above support did make a working kernel                        /* include / asm - generic / vmlinux . lds . h */
                                                                        ...
with section garbage collection on X86 platforms, but                   -       *( _ _ m c o u n t _ l o c)        
still has the following limitations:                                    +       KEEP (*( _ _ m c o u n t _ l o c)) 
                                                                        ...
                                                                        -       *(. ctors )                        
                                                                        +       KEEP (*(. ctors ))                 
  1. Lack of test, and is not fully compatible with                     ...
     some main kernel features, such as Ftrace, Kg-
     cov                                                              2. The section name defined by section attribute
  2. The current usage of section attribute instruc-                     instruction should be unique
     tion itself still breaks the core rule of section                  The symbol name should be globally unique
     garbage collections for lots of functions or data                  (or else gcc will report symbol redefinition), in
     may be put into the same sections(e.g. init),                      order to keep every section name unique, it is
     which need to be fixed                                              possible to code the section name with the sym-
                                                                        bol name. FUNCTION (or func in Linux)
  3. Didn’t take care of assembly carefully and                         is available to get function name, but there is
     therefore, the dead sections in assembly may                       no way to get the variable name, which means
     also be reserved in the last kernel image                          there is no general method to get the symbol
  4. Didn’t focus on the support of compressed ker-                     name so instead, another method should be
     nel images, the dead sections in them may also                     used, that is coding the section name with line
     be reserved in the last compressed kernel image                    number and a file global counter. the combina-
                                                                        tion of these two will minimize the duplication
  5. The invocation of the gc-sections requires to                      of the section name (but may also exist dupli-
     pass the gcc options to ‘make’ through the en-                     cation) and also reduces total size cost of the
     vironment variables, which is not convenient                       section names.

                                                            5
gcc provides LINE and COUNTER to get                                           # define _ _ a s m _ s e c t i o n( S ) 
                                                                                    . section __us ( S .)
  the line number and counter respectively, so,
  the previous section() macro can be changed
                                                                                Then, every .section instruction used in the as-
  from:
                                                                                sembly files should be changed as following:
  # define _ _ s e c t i o n( S ) 
     _ _ a t t r i b u t e _ _ (( _ _ s e c t i o n _ _(# S )))                  /* include / linux / init . h */
                                                                                 -# define __HEAD . section                    " . head . text " ," ax "
                                                                                 +# define __HEAD _ _ a s m _ s e c t i o n(. head . text ) , " ax "
  to the following one:
  # define __concat (a , b ) a ## b
  # define _ _ u n i q u e _ i m p l(a , b ) __concat (a , b )                4. Simplify the invocation of the gc-sections
  # define __ui (a , b ) _ _ u n i q u e _ i m p l(a , b )
  # define _ _ u n i q u e _ c o u n t e r( a ) 
                                                                                In order to avoid passing -ffunction-sectoins,
     __ui (a , _ _ C O U N T E R _ _)                                           -fdata-sections to ‘make’ in every compiling,
  # define __uc ( a ) _ _ u n i q u e _ c o u n t e r( a )
  # define _ _ u n i q u e _ l i n e( a ) __ui (a , __LINE__ )                  both of these two options should be added
  # define __ul ( a ) _ _ u n i q u e _ l i n e( a )                            to the top-level Makefile or the arch spe-
  # define __unique ( a ) __uc ( __ui ( __ul ( a ) , l_c ))
  # define _ _ u n i q u e _ s t r i n g( a )                                  cific Makefile directly, and we also need to
     _ _ s t r i n g i f y( __unique ( a ))                                     disable -ffunction-sectoins explicitly when
  # define __us ( a ) _ _ u n i q u e _ s t r i n g( a )
                                                                                Ftrace is enabled for Ftrace requires the
  # define _ _ s e c t i o n( S )                                              -p option, which is not compatible with
     _ _ a t t r i b u t e _ _ (( _ _ s e c t i o n _ _( __us ( S .))))
                                                                                -ffunction-sectoins.
  Let’s use the init for an example to see the                                  Adding them to the Makefile directly may also
  effect, before, the section name is .init.text,                                be better to fix the other potential compatia-
  all of the functions marked with init will be                                 bilities, for example, -fdata-sections doesn’t
  put into that section. With the above change,                                 work on 32bit kernel, which can be fixed as fol-
  every function will be put into a unique sec-                                 lowing:
  tion like .text.init.13l c16 and make the linker                               # arch / mips / Makefile
  be able to determine which one should be re-                                   ifndef C O N F I G _ F U N C T I O N _ T R A C E R
                                                                                   cflags - y := - ffunction - sections
  moved.                                                                         endif
                                                                                 # FIXME : 32 bit doesn ’t work with - fdata - sections
  Similarly, the other macros used the section                                   ifdef C O N F I G _ 6 4 B I T
  attribute instruction should be revisited, e.g.                                  cflags - y += - fdata - sections
                                                                                 endif
   sched.
  In order to make the linker link the functions                                Note,          some        architectures          may        prefer
  marked with init to the last .init.text section,                              KBUILD CFLAGS than cflags-y, it depends.
  the linker scripts must be changed to merge                                   Besides, the --print-gc-sections option
  .init.text.* to .init.text. The same change need                              should be added for debugging, which can
  to be applied to the other sections.                                          help to show the effect of gc-sections or when
3. Ensure every section name indicated in assem-                                the kernel doesn’t boot with gc-sections, it can
   bly is unique                                                                help to find out which sections are wrongly
                                                                                removed and hence keep them explicitly.
  -ffunction-sections and -fdata-sections only
                                                                                 # Makefile
  works for C files, for assembly files, the .section                              ifeq ( $ ( K B U I L D _ V E R B O S E) ,1)
  instruction is used explicitly, by default, the                                L D F L A G S _ v m l i n u x += -- print - gc - sections
                                                                                 endif
  kernel uses the instruction like this: .section
  .text, which will break the core rule of section                              Then, make V=1 can invocate the linker to print
  garbage collection tool, therefore, every assem-                              which symbols are removed from the last the
  bly file should be revisited.                                                  executables.
  For the macros, like LEAF and NESTED used by                                  In the future, in order to make the whole
  MIPS, the section name can be uniqued with                                    gc-sections configurable, 4 new kernel config
  symbol name:                                                                  options may be required to reflect the selec-
  # define LEAF ( symbol )                                                     tion of -ffunction-sections, -fdata-sections,
  -        . section                        . text ;               
  +        . section                        . text . asm . symbol ;            --gc-sections and --print-gc-sections.

  But the other directly used .section instruc-                               5. Support compressed kernel image
  tions require a better solution, fortunately, we                              The compressed kernel image often include a
  can use the same method proposed above, that                                  compressed vmlinux and an extra bootstraper,
  is:                                                                           the bootstraper decompress the compressed

                                                                          6
kernel image and boot it. the bootstraper may                            The architecture and platform specific parts
  also include dead code, but for its Makefile does                         are small but need to follow some basic steps
  not inherit the make rules from either the top                           to minimize the time cost, the porting steps
  level Makefile or the Makefile of a specific ar-                            to a new platform will be covered in the next
  chitecture, therefore, this should be taken care                         section.
  of independently.
  Just like we mentioned in section 2.3,                             3.3    The steps of porting gc-sections
  the section stored the kernel image must
  be kept with the KEEP instruction, and
                                                                            patchset to a new platform
  the -ffunction-sectoins, -fdata-sections,
                                                                     In order to make gc-sections work on a new platform,
  --gc-sections and --print-gc-sections op-
                                                                     the following steps should be followed (use ARM as
  tions should also be added for the compiling
                                                                     an example).
  and linking of the bootstraper.

6. Take care of the kernel modules                                     1. Prepare the development and testing environ-
                                                                          ment, including real machine(e.g. dev board)
  Currently, all of the kernel modules share
                                                                          or emulator(e.g. qemu), cross-compiler, file
  a common linker script: scripts/module-
                                                                          system etc.
  common.lds, which is not friendly to
  --gc-sections for some architectures may re-                             For ARM, we choose qemu 0.14.50 as the emu-
  quires to discard some specific sections. there-                          lator and versatilepb as the test platform, the
  fore, a arch specific module linker script should                         corss-compiler (gcc 4.5.2, ld 2.21.0.20110327)
  be added to arch/ARCH/ and the following                                 is provided by ubuntu 11.04 and the filesys-
  lines should be added to the top-level Make-                             tem is installed by debootstrap, the ramfs
  file:                                                                     is available from http://d-i.debian.org/daily-
                                                                           images/armel/.
   # Makefile
   + LDS_MODULE                        = 
       -T $ ( srctree )/ arch / $ ( SRCARCH )/ module . lds            2. Check whether the GNU toolchains sup-
   + LDFLAGS_MODULE =                                                    port -ffunction-sections, -fdata-sections
       $ ( if $ ( wildcard arch / $ ( SRCARCH )/ module . lds ) ,
                   $ ( L D S _ M O D U L E))                              and --gc-sections, if no support, add the
   L D F L A G S _ M O D U L E +=                                        toolchains support at first
       -T $ ( srctree )/ scripts / module - common . lds
                                                                           The following command shows the GNU
  Then, every architecture can add the archi-                              toolchains of ARM does support gc-sections,
  tecture specific parts to its own module linker                           or else, there will be failure.
  script, for example:                                                     $ echo ’ unused (){} main (){} ’ | arm - linux - gnueabi - gcc 
                                                                             - ffunction - sections -Wl , - - gc - sections 
   # arch / mips / module . lds                                              -S -x c -o - - | grep . section
   SECTIONS {                                                                       . section         . text . unused , " ax " ,% progbits
     / DISCARD / : {                                                                . section         . text . main , " ax " ,% progbits
        *(. MIPS . options )
        ...
     }                                                                 3. Add -ffunction-sections, -fdata-sections, at
   }                                                                      proper place in arch or platform specific Make-
                                                                          file
  In order to remove the dead code in the kernel                           # arch / arm / Makefile
  modules, it may require to enhance the com-                              ifndef C O N F I G _ F U N C T I O N _ T R A C E R
                                                                           KBUILD_CFLAGS            += - ffunction - sections
  mon module linker script to keep the functions                           endif
  called by module init() and module exit(), for                           KBUILD_CFLAGS            += - fdata - sections
  these two are the init and exit entries of the
  modules. Besides, the other specific sections                         4. Fix the potential compatibility problem (e.g.
  (e.g. .modinfo, version) may need to be kept                            disable -ffunction-sections while requires
  explicitly. This idea is not implemented in our                         Ftrace)
  gc-sections project yet.                                                 The Ftrace compatiability problem is fixed
                                                                           above, no other compatibility has been found
7. Port to the other architectures based platforms
                                                                           up to now.
  Our gc-sections have added the gc-sections sup-
  port for the top 4 architectures (ARM, MIPS,                         5. Check if there are sections which are unrefer-
  PowerPC and X86) based platforms and all of                             enced but used, keep them
  them have been tested.                                                   The following three sections are kept for ARM:

                                                                 7
# arch / arm / kernel / vmlinux . lds . S                                 # arch / arm / module . lds . S
              ...                                                             ...
              KEEP (*(. proc . info . init *))                                SECTIONS {
              ...                                                                       / DISCARD / : {
              KEEP (*(. arch . info . init *))                                # ifndef C O N F I G _ M M U
              ...                                                                                      *(. fixup )
              KEEP (*(. taglist . init *))                                                             *( _ _ e x _ t a b l e)
                                                                              # endif
                                                                                        }
 6. Do basic build and boot test, if boot failure                             }
    happens, use make V=1 to find out the wrongly                              # arch / arm / Makefile
                                                                              extra - y := module . lds
    removed sections and keep them explicitly with
    the KEEP instruction
                                                                         11. Do full test: test build, boot with NFS root
    $ qemu - system - arm -M v e r s a t i l e p b -m 128 M 
      - kernel vmlinux - initrd initrd . gz                                 filesystem, the modules and so forth.
      - append " root =/ dev / ram init =/ bin / sh " 
                                                                              Enable the network bridge support between
    If the required sections can not be determined                            qemu and your host machine, open the NFS
    in the above step, it will be found at this step                          server on your host, config smc91c111 kernel
    for make V=1 will tell you which sections may                             driver, dhcp and NFS root client, then, boot
    be related to the boot failure.                                           your kernel with NFS root filesystem to do a
                                                                              full test.
 7. Add support for assembly files with the                                    $ qemu - system - arm - kernel / path / to / zImage 
     asm section() macro                                                        - append " init =/ bin / bash root =/ dev / nfs 
                                                                                nfsroot = $ n f s _ s e r v e r:/ path / to / rootfs ip = dhcp " 
    Using grep command to find out every .section                                -M v e r s a t i l e p b -m 128 M - net 
                                                                                nic , model = s m c 9 1 c 1 1 1 - net tap
    place and replace it with the asm section()
    macro, for example:
    # arch / arm / mm / proc - arm926 . S
    -         . section " . rodata "
    +         _ _ a s m _ s e c t i o n(. rodata )                      4     Testing results
 8. Follow the above steps to add support for com-                      Test has been run on all of the top 4 architectures,
    pressed kernel                                                      including basic boot with ramfs, full boot with NFS
    Enable gc-sections in the Makefile of com-                           root filesystem and the main kernel features (e.g.
    pressed kernel:                                                     Ftrace, Kgcov, Perf and Oprofile).
    # arch / arm / boot / c o m p r e s s e d/ Makefile
    E X T R A _ C F L A G S+= - ffunction - sections - fdata - sections     The host machine is thinkpad SL400 with In-
    ...                                                                 tel(R) Core(TM)2 Duo CPU T5670, the host sytem
    L D F L A G S _ v m l i n u x := --gc - sections
    ifeq ( $ ( K B U I L D _ V E R B O S E) ,1)                         is ubuntu 11.04.
    L D F L A G S _ v m l i n u x += -- print - gc - sections
    endif                                                                   The qemu version and the cross compiler for
    ...                                                                 ARM is the same as above section, the cross com-
    And then, keep the required sections in the                         piler for MIPS is compiled from buildroot, the cross
    linker script of the compressed kernel:                             compiler for PowerPC is downloaded from emde-
                                                                        bian.org/debian/, the details are below:
    # arch / arm / boot / c o m p r e s s e d/ vmlinux . lds . in
    KEEP (*(. start ))
    KEEP (*(. text ))
    KEEP (*(. text . c a l l _ k e r n e l))                                arch      board           net              gcc       ld
                                                                            ARM       versatilepb     smc91c111        4.5.2     2.21.0.20110327

 9. Make sure the main kernel features (e.g.                                MIPS      malta           pcnet            4.5.2     2.21
    Ftrace, Kgcov, Perf and Oprofile) work nor-                              PPC       g3beige         pcnet            4.4.5     2.20.1.20100303

    mally with gc-sections                                                  X86       pc-0.14         ne2k pci         4.5.2     2.21.0.20110327


    Validated Ftrace, Kgcov, Perf and Oprofile on
    ARM platform and found they worked well.                                TABLE 1: Testing environment

10. Add architecture or platform specific mod-                                Note:
    ule.lds to remove unwanted sections for the ker-
    nel modules                                                             • In order to boot qemu-system-ppc on ubuntu
    In order to eliminate the unneeded sections(e.g.                          11.04, the openbios-ppc must be downloaded
    .fixup, ex table) for modules while no CON-                                from debian repository and installed, then use
    FIG MMU, a new module.lds.S is added for                                  the -bios option of qemu-system-ppc to indi-
    ARM:                                                                      cate the path of the openbios.

                                                                    8
• Due to the regular experssion pattern bug                                      5     Conclusions
         of ld <2.20 described in section 3, In or-
         der to make the gc-sections features work                                      The testing result shows that gc-sections does elim-
         with 2.20.1.20100303, the linker script of pow-                                inate some dead code and reduces the size of the
         erpc is changed through using the pattern                                      kernel image by about 1˜3%, which is useful to some
         .text.*, .data.*, .bss.*, .sbss.*, but to avoid                                size critical embedded applications.
         wrongly merging the kernel magic sections (e.g.
         .data..page aligned) to the .data section, the                                      Besides, this brings Linux kernel with link time
         magic sections are moved before the merging                                    dead code elimination, more dead code can be further
         of .data, then it works well because of the the                                eliminated in some specific applications (e.g. only
         .data..page aligned will be linked at first, then,                              parts of the kernel system calls are required by the
         it will not match .data.* and then will not go                                 target system, finding out the system calls really not
         to the .data section. Due to the unconvenience                                 used may guide the kernel to eliminate those system
         of this method, the real solution will be forcing                              calls and their callees), and for safety critical sys-
         the users to use ld >= 2.21, or else, will dis-                                tems, dead code elimination may help to reduce the
         able this gc-sections feature to avoid generating                              code validations and reduce the possibinity of execu-
         bigger kernel image.                                                           tion on unexpected code. And also, it may be possi-
         SECTIONS
                                                                                        ble to scan the kernel modules(‘make export report’
         {                                                                              does help this) and determine which exported kernel
                    ...
                    . data .. p a g e _ a l i g n e d : ... {
                                                                                        symbols are really required, keep them and recom-
                                P A G E _ A L I G N E D _ D A T A( P A G E _ S I Z E)   pile the kernel may help to only export the required
                    }
                    ...
                                                                                        symbols.
                    . data : AT ( ADDR (. data ) - L O A D _ O F F S E T) {
                                DATA_DATA                                                   Next step is working on the above ideas and
                                *(. data .*)                                            firstly will work on application guide system call op-
                                ...
                                *(. sdata .*)                                           timization, which is based on this project and maybe
                                ...                                                     eliminate more dead code.
                    }
                    ...
         }
                                                                                            And at the same time, do more test, clean up
                                                                                        the existing patchset, rebase it to the latest stable
                                                                                        kernel, then, upstream them.
     The following table shows the size information of                                      Everything in this work is open and free, the
 the vanilla kernel image(vmlinux, .orig) and the ker-                                  homepage is tinylab.org/index.php/projects/tinylinux,
 nel with gc-sections(.gc), both of them are stripped                                   the project repository is gitorious.org/tinylab/tinylinux.
 through strip -x (or even strip s) because of gc-
 sections may introduce more symbols (especially,
 non-global symbols) which are not required for run-
 ning on the embedded platforms.                                                        References
     The kernel config is gc sections defconfig placed
 under arch/ARCH/configs/, it is based on the ver-                                       [1] Tiny Lab, http://www.tinylab.org
 satile defconfig, malta defconfig, pmac32 defconfig
 and i386 defconfig respectively, extra config options                                    [2] Link      time     dead   code   and      data
 only include the DHCP, net driver, NFS client and                                          elimination      using     GNU      toolchain,
 NFS root file system.                                                                       http://elinux.org/images/2/2d/ELC2010-gc-
                                                                                            sections Denys Vlasenko.pdf, Denys Vlasenko
arch     text           data            bss              total             save   [3] Executable      and       Linkable      Format,
ARM      3062975        137504          198940           3650762                      http://www.skyfree.org/linux/references/
         3034990        137120          198688           3608866           -1.14%     ELF Format.pdf
MIPS     3952132        220664          134400           4610028
         3899224        217560          123224           4545436           -1.40% [4] GNU                   Linker                 ld,
PPC      5945289        310362          153188           6671729                      http://sourceware.org/binutils/docs-2.19/ld/
         5849879        309326          152920           6560912           -1.66%
X86      2320279        317220          1086632          3668580                        [5] A Whirlwind Tutorial on Creating Re-
         2206804        311292          498916           3572700           -2.61%           ally Teensy ELF Executables for Linux,
                                                                                                                      ˜
                                                                                            http://www.muppetlabs.com/breadbox/software/
       TABLE 2: Testing results                                                             tiny/teensy.html

                                                                                    9
[6] Understanding ELF using readelf and obj-                 https://www.ibm.com/developerworks/cn/linux/l-
    dump,     http://www.linuxforums.org/articles/           excutff/
    understanding-elf-using-readelf-and-
    objdump 125.html                                      [9] Section      garbage     collection     patchset,
                                                              https://patchwork.kernel.org/project/linux-
[7] ELF:         From       The     Programmers               parisc/list/?submitter=Denys+Vlasenko, Denys
    Perspective,                http://www.ru.j-              Vlasenko
    npcs.org/usoft/WWW/www debian.org/
    Documentation/elf/elf.html                            [10] Work       on     Tiny     Linux     Kernel,
                                                              http://elinux.org/Work on Tiny Linux Kernel,
[8] UNIX/LINUX                                   ,            Wu Zhangjin




                                                     10

Contenu connexe

Tendances

Language-agnostic data analysis workflows and reproducible research
Language-agnostic data analysis workflows and reproducible researchLanguage-agnostic data analysis workflows and reproducible research
Language-agnostic data analysis workflows and reproducible researchAndrew Lowe
 
Non-equilibrium molecular dynamics with LAMMPS
Non-equilibrium molecular dynamics with LAMMPSNon-equilibrium molecular dynamics with LAMMPS
Non-equilibrium molecular dynamics with LAMMPSAndrea Benassi
 
Hadoop源码分析 mapreduce部分
Hadoop源码分析 mapreduce部分Hadoop源码分析 mapreduce部分
Hadoop源码分析 mapreduce部分sg7879
 
Sedna XML Database System: Internal Representation
Sedna XML Database System: Internal RepresentationSedna XML Database System: Internal Representation
Sedna XML Database System: Internal RepresentationIvan Shcheklein
 
C++ tokens and expressions
C++ tokens and expressionsC++ tokens and expressions
C++ tokens and expressionsNabeelaNousheen
 
Understanding Layering and Ethernet
Understanding Layering and EthernetUnderstanding Layering and Ethernet
Understanding Layering and EthernetNicole Gaehle, MSIST
 
r,rstats,r language,r packages
r,rstats,r language,r packagesr,rstats,r language,r packages
r,rstats,r language,r packagesAjay Ohri
 
Ekeko Technology Showdown at SoTeSoLa 2012
Ekeko Technology Showdown at SoTeSoLa 2012Ekeko Technology Showdown at SoTeSoLa 2012
Ekeko Technology Showdown at SoTeSoLa 2012Coen De Roover
 

Tendances (13)

Programming Assignment Help
Programming Assignment HelpProgramming Assignment Help
Programming Assignment Help
 
Gur1009
Gur1009Gur1009
Gur1009
 
Language-agnostic data analysis workflows and reproducible research
Language-agnostic data analysis workflows and reproducible researchLanguage-agnostic data analysis workflows and reproducible research
Language-agnostic data analysis workflows and reproducible research
 
Non-equilibrium molecular dynamics with LAMMPS
Non-equilibrium molecular dynamics with LAMMPSNon-equilibrium molecular dynamics with LAMMPS
Non-equilibrium molecular dynamics with LAMMPS
 
Hadoop源码分析 mapreduce部分
Hadoop源码分析 mapreduce部分Hadoop源码分析 mapreduce部分
Hadoop源码分析 mapreduce部分
 
Operating System Assignment Help
Operating System Assignment HelpOperating System Assignment Help
Operating System Assignment Help
 
Computer Science Assignment Help
Computer Science Assignment HelpComputer Science Assignment Help
Computer Science Assignment Help
 
Sedna XML Database System: Internal Representation
Sedna XML Database System: Internal RepresentationSedna XML Database System: Internal Representation
Sedna XML Database System: Internal Representation
 
C++ tokens and expressions
C++ tokens and expressionsC++ tokens and expressions
C++ tokens and expressions
 
Understanding Layering and Ethernet
Understanding Layering and EthernetUnderstanding Layering and Ethernet
Understanding Layering and Ethernet
 
r,rstats,r language,r packages
r,rstats,r language,r packagesr,rstats,r language,r packages
r,rstats,r language,r packages
 
Computer Science Homework Help
Computer Science Homework HelpComputer Science Homework Help
Computer Science Homework Help
 
Ekeko Technology Showdown at SoTeSoLa 2012
Ekeko Technology Showdown at SoTeSoLa 2012Ekeko Technology Showdown at SoTeSoLa 2012
Ekeko Technology Showdown at SoTeSoLa 2012
 

En vedette

Hr мафия третья игра
Hr мафия третья играHr мафия третья игра
Hr мафия третья играBusiness Connection
 
The current panama brochure
The current panama brochureThe current panama brochure
The current panama brochureTiff412
 
Подъем и спад демократической волны
Подъем и спад демократической волныПодъем и спад демократической волны
Подъем и спад демократической волныProznanie.ru
 
Общественная мысль эпохи просвещения. Просвещенный абсолютизм
Общественная мысль эпохи просвещения. Просвещенный абсолютизмОбщественная мысль эпохи просвещения. Просвещенный абсолютизм
Общественная мысль эпохи просвещения. Просвещенный абсолютизмProznanie.ru
 
русская культура Xvii в.
русская культура Xvii в.русская культура Xvii в.
русская культура Xvii в.Proznanie.ru
 
Литература Древней Руси
Литература Древней РусиЛитература Древней Руси
Литература Древней РусиProznanie.ru
 
Cardionics Belgium ECG systems for CRO
Cardionics Belgium ECG systems for CROCardionics Belgium ECG systems for CRO
Cardionics Belgium ECG systems for CROCARDIONICS BELGIUM
 
Angliyskaya revolutsia
Angliyskaya revolutsiaAngliyskaya revolutsia
Angliyskaya revolutsiaProznanie.ru
 
Angliyskaya revolutsia
Angliyskaya revolutsiaAngliyskaya revolutsia
Angliyskaya revolutsiaProznanie.ru
 
BCPVPAconnecting leaders oct 22 2010 site
BCPVPAconnecting leaders oct 22 2010 siteBCPVPAconnecting leaders oct 22 2010 site
BCPVPAconnecting leaders oct 22 2010 siteslater_45
 
QR Codes in Education
QR Codes in EducationQR Codes in Education
QR Codes in EducationAl Tucker
 
S3エコシステムのメリット (Cloudian Summit 2012)
S3エコシステムのメリット (Cloudian Summit 2012)S3エコシステムのメリット (Cloudian Summit 2012)
S3エコシステムのメリット (Cloudian Summit 2012)CLOUDIAN KK
 
Перезентация сайта www.Proznanie.ru
Перезентация сайта www.Proznanie.ruПерезентация сайта www.Proznanie.ru
Перезентация сайта www.Proznanie.ruProznanie.ru
 

En vedette (20)

Hr мафия третья игра
Hr мафия третья играHr мафия третья игра
Hr мафия третья игра
 
ALS passers
ALS passersALS passers
ALS passers
 
The current panama brochure
The current panama brochureThe current panama brochure
The current panama brochure
 
Подъем и спад демократической волны
Подъем и спад демократической волныПодъем и спад демократической волны
Подъем и спад демократической волны
 
Общественная мысль эпохи просвещения. Просвещенный абсолютизм
Общественная мысль эпохи просвещения. Просвещенный абсолютизмОбщественная мысль эпохи просвещения. Просвещенный абсолютизм
Общественная мысль эпохи просвещения. Просвещенный абсолютизм
 
русская культура Xvii в.
русская культура Xvii в.русская культура Xvii в.
русская культура Xvii в.
 
Turgenev
TurgenevTurgenev
Turgenev
 
Taller7 sol
Taller7 solTaller7 sol
Taller7 sol
 
Russia xvii vek
Russia xvii vekRussia xvii vek
Russia xvii vek
 
Nature Walk
Nature WalkNature Walk
Nature Walk
 
Литература Древней Руси
Литература Древней РусиЛитература Древней Руси
Литература Древней Руси
 
Cardionics Belgium ECG systems for CRO
Cardionics Belgium ECG systems for CROCardionics Belgium ECG systems for CRO
Cardionics Belgium ECG systems for CRO
 
Vice President Education
Vice President EducationVice President Education
Vice President Education
 
Angliyskaya revolutsia
Angliyskaya revolutsiaAngliyskaya revolutsia
Angliyskaya revolutsia
 
Angliyskaya revolutsia
Angliyskaya revolutsiaAngliyskaya revolutsia
Angliyskaya revolutsia
 
BCPVPAconnecting leaders oct 22 2010 site
BCPVPAconnecting leaders oct 22 2010 siteBCPVPAconnecting leaders oct 22 2010 site
BCPVPAconnecting leaders oct 22 2010 site
 
1
11
1
 
QR Codes in Education
QR Codes in EducationQR Codes in Education
QR Codes in Education
 
S3エコシステムのメリット (Cloudian Summit 2012)
S3エコシステムのメリット (Cloudian Summit 2012)S3エコシステムのメリット (Cloudian Summit 2012)
S3エコシステムのメリット (Cloudian Summit 2012)
 
Перезентация сайта www.Proznanie.ru
Перезентация сайта www.Proznanie.ruПерезентация сайта www.Proznanie.ru
Перезентация сайта www.Proznanie.ru
 

Similaire à Tiny Linux Kernel Project: Section Garbage Collection Patchset

C, C++ Interview Questions Part - 1
C, C++ Interview Questions Part - 1C, C++ Interview Questions Part - 1
C, C++ Interview Questions Part - 1ReKruiTIn.com
 
These questions will be a bit advanced level 2
These questions will be a bit advanced level 2These questions will be a bit advanced level 2
These questions will be a bit advanced level 2sadhana312471
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdfHiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdfHiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdfHiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdfHiroshi Ono
 
What's New In Python 2.4
What's New In Python 2.4What's New In Python 2.4
What's New In Python 2.4Richard Jones
 
Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009Martin Odersky
 
1 of 9 CSCE 3600 Systems Programming Major Assignm.docx
  1 of 9 CSCE 3600 Systems Programming  Major Assignm.docx  1 of 9 CSCE 3600 Systems Programming  Major Assignm.docx
1 of 9 CSCE 3600 Systems Programming Major Assignm.docxShiraPrater50
 
Java 7 Features and Enhancements
Java 7 Features and EnhancementsJava 7 Features and Enhancements
Java 7 Features and EnhancementsGagan Agrawal
 
A Domain-Specific Embedded Language for Programming Parallel Architectures.
A Domain-Specific Embedded Language for Programming Parallel Architectures.A Domain-Specific Embedded Language for Programming Parallel Architectures.
A Domain-Specific Embedded Language for Programming Parallel Architectures.Jason Hearne-McGuiness
 
Patterns in Python
Patterns in PythonPatterns in Python
Patterns in Pythondn
 
1183 c-interview-questions-and-answers
1183 c-interview-questions-and-answers1183 c-interview-questions-and-answers
1183 c-interview-questions-and-answersAkash Gawali
 
Sedna XML Database: Query Parser & Optimizing Rewriter
Sedna XML Database: Query Parser & Optimizing RewriterSedna XML Database: Query Parser & Optimizing Rewriter
Sedna XML Database: Query Parser & Optimizing RewriterIvan Shcheklein
 
Lotusphere 2007 BP301 Advanced Object Oriented Programming for LotusScript
Lotusphere 2007 BP301 Advanced Object Oriented Programming for LotusScriptLotusphere 2007 BP301 Advanced Object Oriented Programming for LotusScript
Lotusphere 2007 BP301 Advanced Object Oriented Programming for LotusScriptBill Buchan
 

Similaire à Tiny Linux Kernel Project: Section Garbage Collection Patchset (20)

C, C++ Interview Questions Part - 1
C, C++ Interview Questions Part - 1C, C++ Interview Questions Part - 1
C, C++ Interview Questions Part - 1
 
These questions will be a bit advanced level 2
These questions will be a bit advanced level 2These questions will be a bit advanced level 2
These questions will be a bit advanced level 2
 
Java mcq
Java mcqJava mcq
Java mcq
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
 
What's New In Python 2.4
What's New In Python 2.4What's New In Python 2.4
What's New In Python 2.4
 
Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009
 
1 of 9 CSCE 3600 Systems Programming Major Assignm.docx
  1 of 9 CSCE 3600 Systems Programming  Major Assignm.docx  1 of 9 CSCE 3600 Systems Programming  Major Assignm.docx
1 of 9 CSCE 3600 Systems Programming Major Assignm.docx
 
Java 7 Features and Enhancements
Java 7 Features and EnhancementsJava 7 Features and Enhancements
Java 7 Features and Enhancements
 
A Domain-Specific Embedded Language for Programming Parallel Architectures.
A Domain-Specific Embedded Language for Programming Parallel Architectures.A Domain-Specific Embedded Language for Programming Parallel Architectures.
A Domain-Specific Embedded Language for Programming Parallel Architectures.
 
Patterns in Python
Patterns in PythonPatterns in Python
Patterns in Python
 
1183 c-interview-questions-and-answers
1183 c-interview-questions-and-answers1183 c-interview-questions-and-answers
1183 c-interview-questions-and-answers
 
Sedna XML Database: Query Parser & Optimizing Rewriter
Sedna XML Database: Query Parser & Optimizing RewriterSedna XML Database: Query Parser & Optimizing Rewriter
Sedna XML Database: Query Parser & Optimizing Rewriter
 
cheat-sheets.pdf
cheat-sheets.pdfcheat-sheets.pdf
cheat-sheets.pdf
 
Technical Interview
Technical InterviewTechnical Interview
Technical Interview
 
My c++
My c++My c++
My c++
 
Python and You Series
Python and You SeriesPython and You Series
Python and You Series
 
Lotusphere 2007 BP301 Advanced Object Oriented Programming for LotusScript
Lotusphere 2007 BP301 Advanced Object Oriented Programming for LotusScriptLotusphere 2007 BP301 Advanced Object Oriented Programming for LotusScript
Lotusphere 2007 BP301 Advanced Object Oriented Programming for LotusScript
 

Dernier

Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)eniolaolutunde
 
Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17Celine George
 
Employee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxEmployee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxNirmalaLoungPoorunde1
 
URLs and Routing in the Odoo 17 Website App
URLs and Routing in the Odoo 17 Website AppURLs and Routing in the Odoo 17 Website App
URLs and Routing in the Odoo 17 Website AppCeline George
 
Web & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdfWeb & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdfJayanti Pande
 
Z Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphZ Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphThiyagu K
 
Introduction to ArtificiaI Intelligence in Higher Education
Introduction to ArtificiaI Intelligence in Higher EducationIntroduction to ArtificiaI Intelligence in Higher Education
Introduction to ArtificiaI Intelligence in Higher Educationpboyjonauth
 
Hybridoma Technology ( Production , Purification , and Application )
Hybridoma Technology  ( Production , Purification , and Application  ) Hybridoma Technology  ( Production , Purification , and Application  )
Hybridoma Technology ( Production , Purification , and Application ) Sakshi Ghasle
 
1029-Danh muc Sach Giao Khoa khoi 6.pdf
1029-Danh muc Sach Giao Khoa khoi  6.pdf1029-Danh muc Sach Giao Khoa khoi  6.pdf
1029-Danh muc Sach Giao Khoa khoi 6.pdfQucHHunhnh
 
Separation of Lanthanides/ Lanthanides and Actinides
Separation of Lanthanides/ Lanthanides and ActinidesSeparation of Lanthanides/ Lanthanides and Actinides
Separation of Lanthanides/ Lanthanides and ActinidesFatimaKhan178732
 
Activity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfActivity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfciinovamais
 
Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...
Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...
Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...RKavithamani
 
Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991
Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991
Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991RKavithamani
 
Interactive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationInteractive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationnomboosow
 
CARE OF CHILD IN INCUBATOR..........pptx
CARE OF CHILD IN INCUBATOR..........pptxCARE OF CHILD IN INCUBATOR..........pptx
CARE OF CHILD IN INCUBATOR..........pptxGaneshChakor2
 
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdfssuser54595a
 
Student login on Anyboli platform.helpin
Student login on Anyboli platform.helpinStudent login on Anyboli platform.helpin
Student login on Anyboli platform.helpinRaunakKeshri1
 

Dernier (20)

Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)
 
Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17
 
Employee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxEmployee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptx
 
URLs and Routing in the Odoo 17 Website App
URLs and Routing in the Odoo 17 Website AppURLs and Routing in the Odoo 17 Website App
URLs and Routing in the Odoo 17 Website App
 
Web & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdfWeb & Social Media Analytics Previous Year Question Paper.pdf
Web & Social Media Analytics Previous Year Question Paper.pdf
 
Z Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot GraphZ Score,T Score, Percential Rank and Box Plot Graph
Z Score,T Score, Percential Rank and Box Plot Graph
 
TataKelola dan KamSiber Kecerdasan Buatan v022.pdf
TataKelola dan KamSiber Kecerdasan Buatan v022.pdfTataKelola dan KamSiber Kecerdasan Buatan v022.pdf
TataKelola dan KamSiber Kecerdasan Buatan v022.pdf
 
Código Creativo y Arte de Software | Unidad 1
Código Creativo y Arte de Software | Unidad 1Código Creativo y Arte de Software | Unidad 1
Código Creativo y Arte de Software | Unidad 1
 
Introduction to ArtificiaI Intelligence in Higher Education
Introduction to ArtificiaI Intelligence in Higher EducationIntroduction to ArtificiaI Intelligence in Higher Education
Introduction to ArtificiaI Intelligence in Higher Education
 
Hybridoma Technology ( Production , Purification , and Application )
Hybridoma Technology  ( Production , Purification , and Application  ) Hybridoma Technology  ( Production , Purification , and Application  )
Hybridoma Technology ( Production , Purification , and Application )
 
1029-Danh muc Sach Giao Khoa khoi 6.pdf
1029-Danh muc Sach Giao Khoa khoi  6.pdf1029-Danh muc Sach Giao Khoa khoi  6.pdf
1029-Danh muc Sach Giao Khoa khoi 6.pdf
 
Separation of Lanthanides/ Lanthanides and Actinides
Separation of Lanthanides/ Lanthanides and ActinidesSeparation of Lanthanides/ Lanthanides and Actinides
Separation of Lanthanides/ Lanthanides and Actinides
 
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptxINDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
INDIA QUIZ 2024 RLAC DELHI UNIVERSITY.pptx
 
Activity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfActivity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdf
 
Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...
Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...
Privatization and Disinvestment - Meaning, Objectives, Advantages and Disadva...
 
Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991
Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991
Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991
 
Interactive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communicationInteractive Powerpoint_How to Master effective communication
Interactive Powerpoint_How to Master effective communication
 
CARE OF CHILD IN INCUBATOR..........pptx
CARE OF CHILD IN INCUBATOR..........pptxCARE OF CHILD IN INCUBATOR..........pptx
CARE OF CHILD IN INCUBATOR..........pptx
 
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
 
Student login on Anyboli platform.helpin
Student login on Anyboli platform.helpinStudent login on Anyboli platform.helpin
Student login on Anyboli platform.helpin
 

Tiny Linux Kernel Project: Section Garbage Collection Patchset

  • 1. Tiny Linux Kernel Project: Section Garbage Collection Patchset Wu Zhangjin Tiny Lab - Embedded Geeks http://tinylab.org wuzhangjin@gmail.com Sheng Yong Distributed & Embedded System Lab, SISE, Lanzhou University, China Tianshui South Road 222, Lanzhou, P.R.China shengy07@lzu.edu.cn Abstract Linux is widely used in embedded systems which always have storage limitation and hence requires size optimization. In order to reduce the kernel size, based on the previous work of the “Section Garbage Collection Patchset”, This paper focuses on details its principle, presents some new ideas, documents the porting steps, reports the testing results on the top 4 popular architectures: ARM, MIPS, PowerPC, X86 and at last proposes future works which may enhance or derive from this patchset. 1 Introduction Our gc-sections subproject focuses on analyzes its working mechanism, improves the patchset(e.g. unique user defined sections), applies the ideas for The size of Linux kernel source code increases more architectures, tests them and explores potential rapidly, while the memory and storage are limited enhancement and derivation. The following sections in embedded systems (e.g. in-vehicle driving safety will present them respectively. systems, data acquisition equipments etc.). This re- quires small or even tiny kernel to lighten or even eliminate the limitation and eventually expand the 2 Link time dead code remov- potential applications. ing using section garbage col- Tiny Lab estimated the conventional tailoring methods and found that the old Tiny-linux project is lection far from being finished and requires more work and hence submitted a project proposal to CELF: “Work Compiler puts all executable code produced by com- on Tiny Linux Kernel” to improve the previous work piling C codes into section called .text, r/o data into and explore more ideas. section called .rodata, r/w data into .data, and unini- tialized data into .bss[2, 3]. Linker does not know “Section garbage collection patchset(gc- which parts of sections are referenced and which ones sections)” is a subproject of Tiny-linux, the initial are not referenced. As a result, unused(or ‘dead’) work is from Denys Vlasenko[9]. The existing patch- function or data cannot be removed. In order to set did make the basic support of section garbage solve this issue, each function or data should has its collection work on X86 platforms, but is still out- own section. side of the mainline for the limitation of the old GNU toolchains and for there are some works to be gcc provides -ffunction-sections or done(e.g. compatibility of the other kernel features). -fdata-sections option to put each function or data 1
  • 2. to its own section, for instance, there is a function $ echo ’ unused (){} main (){} ’ | gcc -S -x c -o - - | grep . text called unused func(), it goes to .text.unused func . text section, Then, ld provides the --gc-sections op- tion to check the references and determine which Or else, each function has its own section (indi- dead function or data should be removed, and the cated by the .section instruction of assembly): --print-gc-sections option of ld can print the the $ echo ’ unused (){} main (){} ’ function or data being removed, which is helpful to | gcc - ffunction - sections -S -x c -o - - | grep . text . section . text . unused , " ax " , @ p r o g b i t s debugging. . section . text . main , " ax " , @ p r o g b i t s The following two figures demonstrates the dif- ferences between the typical object and the one with As we can see, the prefix is the same .text, the -ffunction-sections: suffix is function name, this is the default section naming rule of gcc. Expect -ffunction-sections, the section at- tribute instruction of gcc can also indicate where should a section of the funcion or data be put in, and if it is used together with -ffunction-sections, it has higher priority, for example: $ echo ’ _ _ a t t r i b u t e _ _ (( _ _ s e c t i o n _ _( " . text . test " ))) unused (){} main (){} ’ | gcc - ffunction - sections -S -x c -o - - | grep . text . section . text . test , " ax " , @ p r o g b i t s . section . text . main , " ax " , @ p r o g b i t s .text.test is indicated instead of the default .text.unused. In order to avoid function redefinition, the function name in a source code file should be unique, and if only with -ffunction-sections, every FIGURE 1: Typical Object function has its own unique section, but if the same section attribute applies on different functions, dif- ferent functions may share the same section: $ echo ’ _ _ a t t r i b u t e _ _ (( _ _ s e c t i o n _ _( " . text . test " ))) unused (){} _ _ a t t r i b u t e _ _ (( _ _ s e c t i o n _ _( " . text . test " ))) main (){} ’ | gcc - ffunction - sections -S -x c -o - - | grep . text . section . text . test , " ax " , @ p r o g b i t s Only one section is reserved, this breaks the core rule of section garbage collection: before linking, each function or data should has its own section, but sometimes, for example, if want to call some func- tions at the same time, section attribute instruction is required to put these functions to the same section and call them one by one, but how to meet these two requirements? use the section attribute instruc- FIGURE 2: Object with -ffunction- tion to put the functions to the section named with sections the same prefix but unique suffix, and at the linking stage, merge the section which has the same prefix To learn more about the principle of section to the same section, so, to linker, the sections are garbage collection, the basic compiling, assebmling unique and hence better for dead code elimination, and linking procedure should be explained at first but still be able to link the functions to the same (Since the handling of data is similar to function, section. The implementation will be explained in will mainly present function below). the coming sections. Based on the same rule, the usage of section at- 2.1 Compile: Translate source code tribute instruction should also follow the other two from C to assembly rules: If no -ffunction-sections for gcc, all functions are 1. The section for function should named with put into .text section (indicated by the .text instruc- .text prefix, then, the linker may be able to tion of assembly): merge all of the .text sections. or else, will not 2
  • 3. be able to or not conveniently merge the sec- Here is a basic linker script: tions and at last instead may increase the size O U T P U T _ F O R M A T( " elf32 - i386 " , " elf32 - i386 " , of executable for the accumulation of the sec- " elf32 - i386 " ) O U T P U T _ A R C H( i386 ) tion alignment. ENTRY ( _start ) SECTIONS 2. The section name for function should be pre- { . text : fixed with .text. instead of the default .text { prefix used gcc and break the core rule. *(. text . stub . text .* . gnu . linkonce . t .*) ... } . data : And we must notice that: ‘You will not be able { to use “gprof” on all systems if you specify this op- *(. data . data .* . gnu . linkonce . d .*) ... tion and you may have problems with debugging if } you specify both this option and -g.’ (gcc man page) / DISCARD / : { *(. note . GNU - stack ) *(. gnu . lto_ *) } } $ echo ’ unused (){} main (){} ’ | gcc - ffunction - sections -p -x c -o test - < stdin >:1:0: warning : - ffunction - sections disabled ; The first two commands tell the target architec- it makes p r o f i l i n g i m p o s s i b l e ture and the ABI, the ENTRY command indicates the entry of the executable and the SECTIONS com- mand deals with sections. 2.2 Assemble: Translate assembly The entry (above is start, the standard C entry, files to binary objects defined in crt1.o) is the root of the whole executable, all of the other symbols (function or data) referenced In assembly file, it is still be possible to put the func- (directly or indirectly) by the the entry must be kept tion or data to an indicated section with the .sec- in the executable to make ensure the executable run tion instruction (.text equals .section “.text”). Since without failure. Besides, the undefined symbols (de- -ffunction-sections and -fdata-sections doesn’t fined in shared libraries) may also need to be kept work for assembly files and they has no way to de- with the EXTERN command. and note, the --entry termine the function or data items, therefore, for the and --undefined options of ld functions as the same assembly files written from scratch (not translated to the ENTRY and EXTERN commands of linker from C language), .section instruction is required to script respectively. added before the function or data item manually, or else the function or data will be put into the same --gc-sections will follow the above rule to deter- .text or .data section and the section name indicated mine which sections should be reserved and then pass should also be unique to follow the core rule of sec- them to the SECTIONS command to do left merg- tion garbage collection. ing and including. The above linker script merges all section prefixed by .text, .stub and .gnu.linkonce.t The following commands change the section to the last .text section, the .data section merging is name of the ‘unused’ function in the assembly file similar. The left sections will not be merged and kept and show that it does work. as their own sections, some of them can be removed $ echo ’ unused (){} main (){} ’ by the /DISCARD/ instruction. | gcc - ffunction - sections -S -x c -o - - | sed -e " s / unused / test / g " Let’s see how --gc-section work, firstly, without | gcc -c - x a s s e m b l e r - -o test $ objdump -d test | grep . section it: D i s a s s e m b l y of section . text . test : $ echo ’ unused (){} main (){} ’ | gcc -x c -o test - D i s a s s e m b l y of section . text . main : $ size test text data bss dec hex filename 800 252 8 1060 424 test 2.3 Link: Link binary objects to tar- Second, With --gc-sections (passed to ld with get executable -Wl option of gcc): $ echo ’ unused (){} main (){} ’ | gcc - ffunction - sections At the linking stage, based on a linker script, the -Wl , - - gc - sections -x c -o test - $ size test linker should be able to determine which sections text data bss dec hex filename should be merged and included to the last executa- 794 244 8 1046 416 test bles. When linking, the -T option of ld can be used to indicate the path of the linker script, if no such It shows, the size of the .text section is reduced option used, a default linker script is called and can and --print-gc-sections proves the dead ‘unused’ be printed with ld --verbose. function is really removed: 3
  • 4. $ echo ’unused(){} main(){}’ | gcc -ffunction-sections 3.1 Basic support of gc-sections -Wl,--gc-sections,--print-gc-sections -x c -o test - patchset for Linux /usr/bin/ld: Removing unused section ’.rodata’ in file ’.../crt1.o’ /usr/bin/ld: Removing unused section ’.data’ in file ’.../crt1.o’ The basic support of gc-sections patchset for Linux /usr/bin/ld: Removing unused section ’.data’ in file ’.../crtbegin.o’ includes: /usr/bin/ld: Removing unused section ’.text.unused’ in file ’/tmp/cclR3Mgp.o’ • Avoid naming duplication between the The above output also proves why the size of the magic sections defined by section attribute .data section is also reduced. instruction and -ffunction-sections or -fdata-sections But if a section is not referenced (directly or in- The kernel has already defined some sections directly) by the entry, for instance, if want to put with the section attribute instruction of gcc, a file into the executable for late accessing, the file the naming method is prefixing the sections can be compressed and put into a .image section like with .text., as we have discussed in the above this: section, the name of the sections may be the ... same as the ones used by -ffunction-sections SECTIONS { or -fdata-sections and hence break the core ... rule of section garbage collections. . data : { Therefore, several patches has been up- _ _ i m a g e _ s t a r t = .; *(. image ) streamed to rename the magic sections _ _ i m a g e _ e n d = .; from {.text.X, .data.X, .bss.X, .rodata.X} ... } to {.text..X, .data..X, .bss..X, .rodata..X} } and from {.text.X.Y, .data.X.Y, .bss.X.Y, .rodata.X.Y} to {.text..X..Y, .data..X..Y, The file can be accessed through the point- .bss..X..Y, .rodata..X..Y}, accordingly, the re- ers: image start and image end, but the .image lated headers files, c files, assembly files, linker section itself is not referenced by anybody, then, scripts which reference the sections should be --gc-sections has no way to know the fact that .im- changed to use the new section names. age section is used and hence removes .image and as As a result, the duplication between a result, the executable runs without expected, In the section attribute instruction and order to solve this issue, another KEEP instruction -ffunction-sections/-fdata-sections is elim- of the linker script can give a help. inated. ... SECTIONS • Allow linker scripts to merge the sec- { tions generated by -ffunction-sections or ... . data : -fdata-sections and prevent them from merg- { ing the magic sections _ _ i m a g e _ s t a r t = .; KEEP (*(. image )) In order to link the function or data sec- i m a g e _ e n d = .; tions generated by -ffunction-sections or ... } -fdata-sections to the last {.text, .data, .bss, } .rodata}, the related linker scripts should be changed to merge the corresponding {.text.*, .data.*, .bss.*, .rodata.*} and to prevent the linker from merging the magic sections(e.g. 3 Section garbage collection .data..page aligned), more restrictive patterns patchset for Linux like the following is preferred: *(. text .[ A - Za - z0 -9 _$ ^]*) The previous section garbage collection patchset is A better pattern may be the following: for the -rc version of 2.6.35, which did add the core *(. text .[^.]*) support of section garbage collection for Linux but Note, both of the above patterns are only sup- it still has some limitations. ported by the latest ld, please use the versions Now, Let’s analyze the basic support of section newer than 2.21.0.20110327 or else, they don’t garbage collection patchset for Linux and then list work and will on the contrary to generate big- the existing limitations. ger kernel image for ever such section will be 4
  • 5. linked to its own section in the last executable 6. Didn’t pay enough attention to the the kernel and the size will be increased heavily for the modules, the kernel modules may also include required alignment of every section. dead symbols which should be removed • Support objects with more than 64k sections 7. Only for X86 platform, not enough for the The variant type of section number(the other popular embedded platforms, such as e shnum member of elf{32,64} hdr) is u16, ARM, MIPS and PowerPC the max number is 65535, the old modpost tool (used to postprocess module symbol) In order to break through the above limita- can only handle an object which only has tions, improvement has been added in our gc-sections small than 64k sections and hence may fail project, see below section. to handle the kernel image compiled with huge kernel builds (allyesconfig, for exam- 3.2 Improvement of the previous gc- ple) with -ffunction-sections. Therefore, the modpost tool is fixed to support objects with sections patchset more than 64k sections by the document “IA-64 gABI Proposal 74: Section Indexes”: Our gc-sections project is also based on mainline http://www.codesourcery.com/public/cxx- 2.6.35(exactly 2.6.35.13), it brings us with the fol- abi/abi/prop-74-sindex.html. lowing improvement: • Invocation of -ffunction-sections/-fdata-sections 1. Ensure the other kernel features work with gc- and --gc-sections sections In order to have a working kernel with Ftrace requires the mcount loc section to -ffunction-sections and -fdata-sections: store the mcount calling sites; Kgcov requires $ make KCFLAGS = " - ffunction - sections - fdata - sections " the .ctors section to do gcov initialization, these two sections are not referenced directly Then, in order to also garbage-collect the sec- and will be removed by --gc-sections and tions, added hence should be kept by the KEEP instruc- L D F L A G S _ v m l i n u x += --gc - sections tion explicitly. Besides, more sections listed in include/asm-generic/vmlinux.lds.h or the in the top-level Makefile. other arch specific header files has the similar situation and should be kept explicitly too. The above support did make a working kernel /* include / asm - generic / vmlinux . lds . h */ ... with section garbage collection on X86 platforms, but - *( _ _ m c o u n t _ l o c) still has the following limitations: + KEEP (*( _ _ m c o u n t _ l o c)) ... - *(. ctors ) + KEEP (*(. ctors )) 1. Lack of test, and is not fully compatible with ... some main kernel features, such as Ftrace, Kg- cov 2. The section name defined by section attribute 2. The current usage of section attribute instruc- instruction should be unique tion itself still breaks the core rule of section The symbol name should be globally unique garbage collections for lots of functions or data (or else gcc will report symbol redefinition), in may be put into the same sections(e.g. init), order to keep every section name unique, it is which need to be fixed possible to code the section name with the sym- bol name. FUNCTION (or func in Linux) 3. Didn’t take care of assembly carefully and is available to get function name, but there is therefore, the dead sections in assembly may no way to get the variable name, which means also be reserved in the last kernel image there is no general method to get the symbol 4. Didn’t focus on the support of compressed ker- name so instead, another method should be nel images, the dead sections in them may also used, that is coding the section name with line be reserved in the last compressed kernel image number and a file global counter. the combina- tion of these two will minimize the duplication 5. The invocation of the gc-sections requires to of the section name (but may also exist dupli- pass the gcc options to ‘make’ through the en- cation) and also reduces total size cost of the vironment variables, which is not convenient section names. 5
  • 6. gcc provides LINE and COUNTER to get # define _ _ a s m _ s e c t i o n( S ) . section __us ( S .) the line number and counter respectively, so, the previous section() macro can be changed Then, every .section instruction used in the as- from: sembly files should be changed as following: # define _ _ s e c t i o n( S ) _ _ a t t r i b u t e _ _ (( _ _ s e c t i o n _ _(# S ))) /* include / linux / init . h */ -# define __HEAD . section " . head . text " ," ax " +# define __HEAD _ _ a s m _ s e c t i o n(. head . text ) , " ax " to the following one: # define __concat (a , b ) a ## b # define _ _ u n i q u e _ i m p l(a , b ) __concat (a , b ) 4. Simplify the invocation of the gc-sections # define __ui (a , b ) _ _ u n i q u e _ i m p l(a , b ) # define _ _ u n i q u e _ c o u n t e r( a ) In order to avoid passing -ffunction-sectoins, __ui (a , _ _ C O U N T E R _ _) -fdata-sections to ‘make’ in every compiling, # define __uc ( a ) _ _ u n i q u e _ c o u n t e r( a ) # define _ _ u n i q u e _ l i n e( a ) __ui (a , __LINE__ ) both of these two options should be added # define __ul ( a ) _ _ u n i q u e _ l i n e( a ) to the top-level Makefile or the arch spe- # define __unique ( a ) __uc ( __ui ( __ul ( a ) , l_c )) # define _ _ u n i q u e _ s t r i n g( a ) cific Makefile directly, and we also need to _ _ s t r i n g i f y( __unique ( a )) disable -ffunction-sectoins explicitly when # define __us ( a ) _ _ u n i q u e _ s t r i n g( a ) Ftrace is enabled for Ftrace requires the # define _ _ s e c t i o n( S ) -p option, which is not compatible with _ _ a t t r i b u t e _ _ (( _ _ s e c t i o n _ _( __us ( S .)))) -ffunction-sectoins. Let’s use the init for an example to see the Adding them to the Makefile directly may also effect, before, the section name is .init.text, be better to fix the other potential compatia- all of the functions marked with init will be bilities, for example, -fdata-sections doesn’t put into that section. With the above change, work on 32bit kernel, which can be fixed as fol- every function will be put into a unique sec- lowing: tion like .text.init.13l c16 and make the linker # arch / mips / Makefile be able to determine which one should be re- ifndef C O N F I G _ F U N C T I O N _ T R A C E R cflags - y := - ffunction - sections moved. endif # FIXME : 32 bit doesn ’t work with - fdata - sections Similarly, the other macros used the section ifdef C O N F I G _ 6 4 B I T attribute instruction should be revisited, e.g. cflags - y += - fdata - sections endif sched. In order to make the linker link the functions Note, some architectures may prefer marked with init to the last .init.text section, KBUILD CFLAGS than cflags-y, it depends. the linker scripts must be changed to merge Besides, the --print-gc-sections option .init.text.* to .init.text. The same change need should be added for debugging, which can to be applied to the other sections. help to show the effect of gc-sections or when 3. Ensure every section name indicated in assem- the kernel doesn’t boot with gc-sections, it can bly is unique help to find out which sections are wrongly removed and hence keep them explicitly. -ffunction-sections and -fdata-sections only # Makefile works for C files, for assembly files, the .section ifeq ( $ ( K B U I L D _ V E R B O S E) ,1) instruction is used explicitly, by default, the L D F L A G S _ v m l i n u x += -- print - gc - sections endif kernel uses the instruction like this: .section .text, which will break the core rule of section Then, make V=1 can invocate the linker to print garbage collection tool, therefore, every assem- which symbols are removed from the last the bly file should be revisited. executables. For the macros, like LEAF and NESTED used by In the future, in order to make the whole MIPS, the section name can be uniqued with gc-sections configurable, 4 new kernel config symbol name: options may be required to reflect the selec- # define LEAF ( symbol ) tion of -ffunction-sections, -fdata-sections, - . section . text ; + . section . text . asm . symbol ; --gc-sections and --print-gc-sections. But the other directly used .section instruc- 5. Support compressed kernel image tions require a better solution, fortunately, we The compressed kernel image often include a can use the same method proposed above, that compressed vmlinux and an extra bootstraper, is: the bootstraper decompress the compressed 6
  • 7. kernel image and boot it. the bootstraper may The architecture and platform specific parts also include dead code, but for its Makefile does are small but need to follow some basic steps not inherit the make rules from either the top to minimize the time cost, the porting steps level Makefile or the Makefile of a specific ar- to a new platform will be covered in the next chitecture, therefore, this should be taken care section. of independently. Just like we mentioned in section 2.3, 3.3 The steps of porting gc-sections the section stored the kernel image must be kept with the KEEP instruction, and patchset to a new platform the -ffunction-sectoins, -fdata-sections, In order to make gc-sections work on a new platform, --gc-sections and --print-gc-sections op- the following steps should be followed (use ARM as tions should also be added for the compiling an example). and linking of the bootstraper. 6. Take care of the kernel modules 1. Prepare the development and testing environ- ment, including real machine(e.g. dev board) Currently, all of the kernel modules share or emulator(e.g. qemu), cross-compiler, file a common linker script: scripts/module- system etc. common.lds, which is not friendly to --gc-sections for some architectures may re- For ARM, we choose qemu 0.14.50 as the emu- quires to discard some specific sections. there- lator and versatilepb as the test platform, the fore, a arch specific module linker script should corss-compiler (gcc 4.5.2, ld 2.21.0.20110327) be added to arch/ARCH/ and the following is provided by ubuntu 11.04 and the filesys- lines should be added to the top-level Make- tem is installed by debootstrap, the ramfs file: is available from http://d-i.debian.org/daily- images/armel/. # Makefile + LDS_MODULE = -T $ ( srctree )/ arch / $ ( SRCARCH )/ module . lds 2. Check whether the GNU toolchains sup- + LDFLAGS_MODULE = port -ffunction-sections, -fdata-sections $ ( if $ ( wildcard arch / $ ( SRCARCH )/ module . lds ) , $ ( L D S _ M O D U L E)) and --gc-sections, if no support, add the L D F L A G S _ M O D U L E += toolchains support at first -T $ ( srctree )/ scripts / module - common . lds The following command shows the GNU Then, every architecture can add the archi- toolchains of ARM does support gc-sections, tecture specific parts to its own module linker or else, there will be failure. script, for example: $ echo ’ unused (){} main (){} ’ | arm - linux - gnueabi - gcc - ffunction - sections -Wl , - - gc - sections # arch / mips / module . lds -S -x c -o - - | grep . section SECTIONS { . section . text . unused , " ax " ,% progbits / DISCARD / : { . section . text . main , " ax " ,% progbits *(. MIPS . options ) ... } 3. Add -ffunction-sections, -fdata-sections, at } proper place in arch or platform specific Make- file In order to remove the dead code in the kernel # arch / arm / Makefile modules, it may require to enhance the com- ifndef C O N F I G _ F U N C T I O N _ T R A C E R KBUILD_CFLAGS += - ffunction - sections mon module linker script to keep the functions endif called by module init() and module exit(), for KBUILD_CFLAGS += - fdata - sections these two are the init and exit entries of the modules. Besides, the other specific sections 4. Fix the potential compatibility problem (e.g. (e.g. .modinfo, version) may need to be kept disable -ffunction-sections while requires explicitly. This idea is not implemented in our Ftrace) gc-sections project yet. The Ftrace compatiability problem is fixed above, no other compatibility has been found 7. Port to the other architectures based platforms up to now. Our gc-sections have added the gc-sections sup- port for the top 4 architectures (ARM, MIPS, 5. Check if there are sections which are unrefer- PowerPC and X86) based platforms and all of enced but used, keep them them have been tested. The following three sections are kept for ARM: 7
  • 8. # arch / arm / kernel / vmlinux . lds . S # arch / arm / module . lds . S ... ... KEEP (*(. proc . info . init *)) SECTIONS { ... / DISCARD / : { KEEP (*(. arch . info . init *)) # ifndef C O N F I G _ M M U ... *(. fixup ) KEEP (*(. taglist . init *)) *( _ _ e x _ t a b l e) # endif } 6. Do basic build and boot test, if boot failure } happens, use make V=1 to find out the wrongly # arch / arm / Makefile extra - y := module . lds removed sections and keep them explicitly with the KEEP instruction 11. Do full test: test build, boot with NFS root $ qemu - system - arm -M v e r s a t i l e p b -m 128 M - kernel vmlinux - initrd initrd . gz filesystem, the modules and so forth. - append " root =/ dev / ram init =/ bin / sh " Enable the network bridge support between If the required sections can not be determined qemu and your host machine, open the NFS in the above step, it will be found at this step server on your host, config smc91c111 kernel for make V=1 will tell you which sections may driver, dhcp and NFS root client, then, boot be related to the boot failure. your kernel with NFS root filesystem to do a full test. 7. Add support for assembly files with the $ qemu - system - arm - kernel / path / to / zImage asm section() macro - append " init =/ bin / bash root =/ dev / nfs nfsroot = $ n f s _ s e r v e r:/ path / to / rootfs ip = dhcp " Using grep command to find out every .section -M v e r s a t i l e p b -m 128 M - net nic , model = s m c 9 1 c 1 1 1 - net tap place and replace it with the asm section() macro, for example: # arch / arm / mm / proc - arm926 . S - . section " . rodata " + _ _ a s m _ s e c t i o n(. rodata ) 4 Testing results 8. Follow the above steps to add support for com- Test has been run on all of the top 4 architectures, pressed kernel including basic boot with ramfs, full boot with NFS Enable gc-sections in the Makefile of com- root filesystem and the main kernel features (e.g. pressed kernel: Ftrace, Kgcov, Perf and Oprofile). # arch / arm / boot / c o m p r e s s e d/ Makefile E X T R A _ C F L A G S+= - ffunction - sections - fdata - sections The host machine is thinkpad SL400 with In- ... tel(R) Core(TM)2 Duo CPU T5670, the host sytem L D F L A G S _ v m l i n u x := --gc - sections ifeq ( $ ( K B U I L D _ V E R B O S E) ,1) is ubuntu 11.04. L D F L A G S _ v m l i n u x += -- print - gc - sections endif The qemu version and the cross compiler for ... ARM is the same as above section, the cross com- And then, keep the required sections in the piler for MIPS is compiled from buildroot, the cross linker script of the compressed kernel: compiler for PowerPC is downloaded from emde- bian.org/debian/, the details are below: # arch / arm / boot / c o m p r e s s e d/ vmlinux . lds . in KEEP (*(. start )) KEEP (*(. text )) KEEP (*(. text . c a l l _ k e r n e l)) arch board net gcc ld ARM versatilepb smc91c111 4.5.2 2.21.0.20110327 9. Make sure the main kernel features (e.g. MIPS malta pcnet 4.5.2 2.21 Ftrace, Kgcov, Perf and Oprofile) work nor- PPC g3beige pcnet 4.4.5 2.20.1.20100303 mally with gc-sections X86 pc-0.14 ne2k pci 4.5.2 2.21.0.20110327 Validated Ftrace, Kgcov, Perf and Oprofile on ARM platform and found they worked well. TABLE 1: Testing environment 10. Add architecture or platform specific mod- Note: ule.lds to remove unwanted sections for the ker- nel modules • In order to boot qemu-system-ppc on ubuntu In order to eliminate the unneeded sections(e.g. 11.04, the openbios-ppc must be downloaded .fixup, ex table) for modules while no CON- from debian repository and installed, then use FIG MMU, a new module.lds.S is added for the -bios option of qemu-system-ppc to indi- ARM: cate the path of the openbios. 8
  • 9. • Due to the regular experssion pattern bug 5 Conclusions of ld <2.20 described in section 3, In or- der to make the gc-sections features work The testing result shows that gc-sections does elim- with 2.20.1.20100303, the linker script of pow- inate some dead code and reduces the size of the erpc is changed through using the pattern kernel image by about 1˜3%, which is useful to some .text.*, .data.*, .bss.*, .sbss.*, but to avoid size critical embedded applications. wrongly merging the kernel magic sections (e.g. .data..page aligned) to the .data section, the Besides, this brings Linux kernel with link time magic sections are moved before the merging dead code elimination, more dead code can be further of .data, then it works well because of the the eliminated in some specific applications (e.g. only .data..page aligned will be linked at first, then, parts of the kernel system calls are required by the it will not match .data.* and then will not go target system, finding out the system calls really not to the .data section. Due to the unconvenience used may guide the kernel to eliminate those system of this method, the real solution will be forcing calls and their callees), and for safety critical sys- the users to use ld >= 2.21, or else, will dis- tems, dead code elimination may help to reduce the able this gc-sections feature to avoid generating code validations and reduce the possibinity of execu- bigger kernel image. tion on unexpected code. And also, it may be possi- SECTIONS ble to scan the kernel modules(‘make export report’ { does help this) and determine which exported kernel ... . data .. p a g e _ a l i g n e d : ... { symbols are really required, keep them and recom- P A G E _ A L I G N E D _ D A T A( P A G E _ S I Z E) pile the kernel may help to only export the required } ... symbols. . data : AT ( ADDR (. data ) - L O A D _ O F F S E T) { DATA_DATA Next step is working on the above ideas and *(. data .*) firstly will work on application guide system call op- ... *(. sdata .*) timization, which is based on this project and maybe ... eliminate more dead code. } ... } And at the same time, do more test, clean up the existing patchset, rebase it to the latest stable kernel, then, upstream them. The following table shows the size information of Everything in this work is open and free, the the vanilla kernel image(vmlinux, .orig) and the ker- homepage is tinylab.org/index.php/projects/tinylinux, nel with gc-sections(.gc), both of them are stripped the project repository is gitorious.org/tinylab/tinylinux. through strip -x (or even strip s) because of gc- sections may introduce more symbols (especially, non-global symbols) which are not required for run- ning on the embedded platforms. References The kernel config is gc sections defconfig placed under arch/ARCH/configs/, it is based on the ver- [1] Tiny Lab, http://www.tinylab.org satile defconfig, malta defconfig, pmac32 defconfig and i386 defconfig respectively, extra config options [2] Link time dead code and data only include the DHCP, net driver, NFS client and elimination using GNU toolchain, NFS root file system. http://elinux.org/images/2/2d/ELC2010-gc- sections Denys Vlasenko.pdf, Denys Vlasenko arch text data bss total save [3] Executable and Linkable Format, ARM 3062975 137504 198940 3650762 http://www.skyfree.org/linux/references/ 3034990 137120 198688 3608866 -1.14% ELF Format.pdf MIPS 3952132 220664 134400 4610028 3899224 217560 123224 4545436 -1.40% [4] GNU Linker ld, PPC 5945289 310362 153188 6671729 http://sourceware.org/binutils/docs-2.19/ld/ 5849879 309326 152920 6560912 -1.66% X86 2320279 317220 1086632 3668580 [5] A Whirlwind Tutorial on Creating Re- 2206804 311292 498916 3572700 -2.61% ally Teensy ELF Executables for Linux, ˜ http://www.muppetlabs.com/breadbox/software/ TABLE 2: Testing results tiny/teensy.html 9
  • 10. [6] Understanding ELF using readelf and obj- https://www.ibm.com/developerworks/cn/linux/l- dump, http://www.linuxforums.org/articles/ excutff/ understanding-elf-using-readelf-and- objdump 125.html [9] Section garbage collection patchset, https://patchwork.kernel.org/project/linux- [7] ELF: From The Programmers parisc/list/?submitter=Denys+Vlasenko, Denys Perspective, http://www.ru.j- Vlasenko npcs.org/usoft/WWW/www debian.org/ Documentation/elf/elf.html [10] Work on Tiny Linux Kernel, http://elinux.org/Work on Tiny Linux Kernel, [8] UNIX/LINUX , Wu Zhangjin 10