<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Towards eCos Autoconfiguration by Static Application Analysis</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Horst Schirmeier</string-name>
          <email>horst.schirmeier@tu-dortmund.de</email>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Matthias Bahne</string-name>
          <email>matthias.bahne@tu-dortmund.de</email>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Jochen Streicher</string-name>
          <email>jochen.streicher@tu-dortmund.de</email>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Olaf Spinczyk Computer Science</string-name>
          <email>olaf.spinczyk@tu-dortmund.de</email>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>- Embedded System Software</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Embedded Configurable Operating System</institution>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Technische Universität Dortmund</institution>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2010</year>
      </pub-date>
      <fpage>35</fpage>
      <lpage>44</lpage>
      <abstract>
        <p>-System software product lines such as the embedded real-time operating system eCos are a state-of-the-art solution for application scenarios with a very low hardware resource profile. Being highly configurable at compile time, eCos can be tailored to the application in terms of inclusion or exclusion of fine-grained operating system features. The mandatory manual feature selection is carried out by the developer who knows the functionality essential for the application. This process requires profound knowledge of the feature semantics, is very time-consuming, and, in particular, error-prone - most probably resulting in a resource suboptimal or even dysfunctional operating system variant. The contribution of this article is an approach to automate the eCos configuration process to a major degree, therefore reducing the outlined disadvantages significantly. A thorough examination of configurable eCos features exhibits four feature categories of varying complexity: By applying standard model checking techniques and static analysis of the application source code, we show that for at least two feature categories the configuration decisions can be taken automatically. Complementing the approach with configlets - highly eCos specific analysis code - a third category is shown to be also coverable. Index Terms-eCos, Automatic Configuration, Static Analysis, Model Checking, CTL, Software Product Lines</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>I. INTRODUCTION</p>
      <p>
        There exist various reasons for specializing software systems
for a specific application scenario or a particular customer. In
the embedded systems domain, the primary motivation is to
minimize resource consumption: Resources such as energy,
memory or CPU cycles are scarce, and keeping the software
stack’s resource profile low directly impacts the system’s
hardware costs and therefore its competitiveness on the market.
Tailorable system software has been a focus of our research
group for several years, in particular embedded operating
systems (OS) [
        <xref ref-type="bibr" rid="ref11">14</xref>
        ], [
        <xref ref-type="bibr" rid="ref12">15</xref>
        ], [
        <xref ref-type="bibr" rid="ref15">18</xref>
        ], embedded application product
lines [
        <xref ref-type="bibr" rid="ref13">16</xref>
        ], and embedded databases [23], [24].
      </p>
      <p>
        This article describes a case study conducted with the
opensource, real-time embedded OS eCos1, a highly configurable
software platform, which can be tailored for the specific needs
of the application. eCos is very widespread, because of it
being freely available and its comfortable configuration process:
Guided by a GUI configuration tool, the application developer
decides from a so-called feature model [
        <xref ref-type="bibr" rid="ref3">6</xref>
        ], [
        <xref ref-type="bibr" rid="ref6">9</xref>
        ] which OS
functionality the application mandatorily needs and therefore
must be included in the eCos variant deployed on the device.
Afterwards, an automated product generation process results
in an OS library the application can be linked against. This
state-of-the-art procedure has proven to be very effective in
practice, but also entails a non-negligible problem: In the case
of eCos, the sheer number of more than 1.500 configurable
features2 makes the configuration process extremely complex
and time-consuming.
      </p>
      <p>Our contribution to the automated configuration and tailoring
community is an approach to at least partially automate the
process by applying standard static analysis and model checking
techniques to application source code. We conducted a detailed
examination of parts of the eCos 3.0 OS documentation and
API in order to determine which conditions hold within an
application model if it needs or does not need certain OS
features. These conditions, still formulated in plain English,
pose a set of requirements for static analysis and model
checking. First experiments with our analysis tool prototype
seem promising, but also raise new research questions.</p>
      <p>The remainder of this paper is structured as follows:
Section II gives a more detailed overview of the motivating
context and our approach. Section III describes our manual
examination of eCos features and examples for the resulting
feature categories. Section IV outlines the steps necessary for
automatic feature need derivation: application analysis, model
checking, and result interpretation. Section V revisits the results
from the manual feature examination, and summarizes the
current state of our analysis tool prototype and preliminary
results with eCos test programs. We conclude with a discussion
of related work, a summary and an outlook on future work in
sections VI and VII.</p>
    </sec>
    <sec id="sec-2">
      <title>II. MOTIVATION AND APPROACH</title>
      <sec id="sec-2-1">
        <title>A. eCos is an Infrastructure Software Product Line</title>
        <p>Infrastructure software, unlike application software, is in a
unidirectional usage relationship with other software layers, and
typically depicted in a hierarchy level above the infrastructure.
Database software, middleware or standard C libraries, or
operating systems such as eCos are typical representatives.</p>
        <p>
          The categorization of eCos as a software product line (SPL)
is a bit more debatable: The SPL community defines these
not only by technical aspects like configurability and code
2eCos release 3.0; platform specific HAL and device driver features not
counted in
reuse among product line variants, but also by the engineering
process that accompanies the development [
          <xref ref-type="bibr" rid="ref2">5</xref>
          ]. Nevertheless,
we believe we can safely consider eCos a SPL, because it has
all properties relevant to this study:
        </p>
        <p>
          Variability Management: Similar to the Linux
kernel [
          <xref ref-type="bibr" rid="ref21">25</xref>
          ], eCos supports about a dozen different embedded
hardware architectures (with countless subarchitectures),
but clearly separates the platform specific variation points
from platform independent ones. The configuration tree,
separating problem space (configurable features relevant
for the application developer) and solution space (the
actual implementation behind these features), is organized
hierarchically in subsystems (Kernel, Hardware
Abstraction Layer, Standard Libraries, I/O, and other optional
subsystems) and several levels of nested components (e.g.,
Serial Device Drivers, ISO C Library String Functions),
cf. Figure 2. On the configuration tree’s leaves exist three
different types of configuration options: binary options
(on/off), one-from-many selections (e.g., allowing the
selection of one from three different scheduling
algorithms), and value options (e.g., a maximum number of
concurrent threads, an integer number within an interval).
Additionally, constraints restrict the configuration space
to prevent impossible configurations. [
          <xref ref-type="bibr" rid="ref24">28</xref>
          ]
Product Configuration: eCos comes with a comfortable
GUI configuration tool that allows creating a specific
configuration by assembling components and configuring
the contained options (cf. Figure 2). Feature constraints
like dependencies or mutually excluding features are
automatically enforced.
        </p>
        <p>Product Generation: The GUI tool is also capable of
automatically generating the actual eCos variant from the
configuration (cf. Figure 3). This process generates a new
source code tree: The chosen values for the configuration</p>
        <p>options are written as C preprocessor macro definitions
in generated header files, which in turn have effects on
the OS C/C++ code that is finally compiled and linked to
the application.</p>
        <p>
          In this so-called feature-driven product line derivation
process [
          <xref ref-type="bibr" rid="ref23">27</xref>
          ], the application developer has to make all
configuration decisions manually in order to tailor the underlying
infrastructure product line for his application’s needs. With
highly configurable, real-world product lines such as eCos,
the configuration effort – although guided by a GUI tool
with automatic inter-feature dependency resolution and textual
descriptions of all configuration options – easily exceeds
acceptable limits. Moreover, a vast configuration space promotes
chances for human mistakes, leading to a resource suboptimal
(if too much functionality was configured) or insufficient
(essential functionality missing) infrastructure variant. Even
worse, this process needs to be iterated once the application
evolves. Consequently, (at least partial) automation of the
process and tool support is desirable.
        </p>
      </sec>
      <sec id="sec-2-2">
        <title>B. API Usage Patterns and Model Checking</title>
        <p>
          In earlier work [24] we showed that infrastructure API usage
patterns within an application allow to deduce feature need
or non-need. Ranging from the simple existence of certain
API calls to complex API call patterns and involvement
of actual parameter values, different levels of complexity
have been observed for real-world infrastructure features. In
this case study, we take a closer look at the eCos API and
its characteristics related to application analysis and feature
relevant API usage patterns. Motivated by our earlier results,
we evaluate the temporal logic CTL (computation tree logic [
          <xref ref-type="bibr" rid="ref1">4</xref>
          ])
as a language for formulating feature conditions to be checked
within an application model.
        </p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>III. EXAMINING THE ECOS OPERATING SYSTEM</title>
      <p>For our approach, the first step towards automatic
configuration comprises establishing a relationship between
infrastructure features on the one hand, and properties of the
application on the other hand. We conducted a thorough manual
examination of the configurable features in the eCos kernel
components “Kernel schedulers”, “Thread-related options”
and “Synchronization primitives” in order to gain experience
with real-world OS features and to study the implications for
application analysis.</p>
      <p>This manual infrastructure feature examination must not be
confused with the automated analysis steps described later in
this article:</p>
      <p>This examination must be carried out only once, whereas
its results can be reused in all infrastructure deployments.
Therefore, an infrastructure expert (e.g., a member of
its development team, outfitted with in-depth knowledge
of the API semantics) can (and should) be the person
conducting this analysis.</p>
      <p>In contrast, the automated analysis steps take place later
at the application developer’s site.</p>
      <sec id="sec-3-1">
        <title>A. Manual examination</title>
        <p>The aim of the manual examination of the eCos 3.0 source
code and documentation was to ascertain what exact effect
each configurable feature has on actual OS functionality, and
especially the OS API. We show that an application, containing
calls to this API, fulfills certain conditions that indicate its need
for OS features. The results, including these feature conditions,
were diverse and are presented in the following in terms of
four feature categories, each accompanied by examples.</p>
        <p>1) Simple API call usage: One very common case of API
usage observed is the simple existence of certain API calls.</p>
      </sec>
      <sec id="sec-3-2">
        <title>For example, enabling “Message box blocking put support”</title>
        <p>(located in the “Synchronization primitives” component)
defines a preprocessor macro, which in turn adds the functions
cyg_mbox_put(...) and cyg_mbox_timed_put(...) to the kernel
API. Knowing this direct relationship from feature selection
to the API, and being able to assure these API calls are not
additionally related to other features, one can pose a simple,
definitive condition on the application code:
c l a s s C y g _ T h r e a d {
/ * . . . * /
# i f d e f CYGVAR_KERNEL_THREADS_NAME
p r i v a t e :
/ / An o p t i o n a l t h r e a d name s t r i n g ,
/ / f o r humans t o r e a d
c h a r * name ;
p u b l i c :
/ / f u n c t i o n t o g e t t h e name s t r i n g
c h a r * g e t _ n a m e ( ) ;
# e n d i f
/ * . . . * /</p>
        <p>Iff there exist (reachable) calls to
cyg_mbox_put(...) or cyg_mbox_timed_put(...), then
the feature “Message box blocking put support” is
needed.</p>
      </sec>
      <sec id="sec-3-3">
        <title>2) API call patterns and actual parameters: Another pattern</title>
        <p>can be illustrated by the example of the feature “Support
optional name for each thread”, located in the “Thread-related
options” component. This option enables applications to assign
a name (a C character string) to each thread, and to read that
name from an arbitrary, given thread.</p>
        <p>Once this option is enabled, the kernel’s internal thread
abstraction data structure (a C++ class named Cyg_Thread) is
extended by a name element (again by means of preprocessor
macros, cf. Figure 4), thus saving memory (and OS code, in
other parts of eCos) if this functionality is not needed.</p>
        <p>Nevertheless, the kernel’s C API is not affected at all:
Regardless of how the application developer configures eCos,
the API function cyg_thread_create(...) always takes a name
parameter (which is ignored if the kernel cannot store thread
names), and the API function cyg_thread_get_info(...) always
fills a data structure (struct cyg_thread_info) which has a name
element. An application developer who does not want to give a
thread a name simply passes NULL instead of a character string.
If the kernel does not know a thread’s name, or is not capable
of storing thread names, cyg_thread_get_info(...) returns NULL
in the name element of cyg_thread_info.</p>
        <p>This API definition allows to concentrate on an application’s
usage of cyg_thread_create(...) and cyg_thread_get_info(...) for
automatic configuration of this feature:</p>
      </sec>
      <sec id="sec-3-4">
        <title>Iff the application passes a non-NULL parameter</title>
        <p>value to cyg_thread_create(...)’s name parameter, and
calls cyg_thread_get_info(...) and reads the name
element of its return value, the feature “Support
optional name for each thread” is needed.</p>
        <p>This condition is not completely conclusive, though: An
application developer may create threads with names just
for self-documenting purposes without needing the kernel to
store this information. An application may even read the name
element and expect it to be NULL. Nevertheless there is a
strong indication that the feature is needed, so the configuration
tool could give the application developer a hint to enable it.</p>
      </sec>
      <sec id="sec-3-5">
        <title>3) Domain specific patterns: Some options exhibit an</title>
        <p>inherent complexity, and are, due to their interrelation with
concurrency and synchronization aspects, highly OS specific.</p>
      </sec>
      <sec id="sec-3-6">
        <title>An extreme example is the option “Priority inversion protection</title>
        <p>
          protocols” in the “Synchronization primitives” component: It
controls whether synchronization primitives should be protected
against priority inversion [
          <xref ref-type="bibr" rid="ref8">11</xref>
          ].
        </p>
        <p>As this feature comes with quite some cost (program memory,
CPU cycles at runtime), it should only be enabled if priority
inversion is a problem in the application at all:</p>
      </sec>
      <sec id="sec-3-7">
        <title>Iff the application is structured in a way that</title>
        <p>priority inversion can occur, the feature “Priority
inversion protection protocols” is needed.</p>
        <p>Unfortunately, detecting this property in an application is not
trivial and can only be approached with an approximation:</p>
      </sec>
      <sec id="sec-3-8">
        <title>Iff at least two threads with different priority</title>
        <p>levels share a common mutex, and a thread with a
priority level between these two exists, the feature
“Priority inversion protection protocols” is needed.
There are several reasons why an application developer still
may not need this feature: The application may be designed in
a way that priority inversion is prevented by other means, or
the occurrence of this effect may even be intended. So, again,
the configuration tool should only give a hint.</p>
        <p>4) Not derivable: For the remaining features we were unable
to pose feature conditions, for different reasons. A detailed
analysis of this category follows in section V.</p>
      </sec>
      <sec id="sec-3-9">
        <title>B. Implications for Static Analysis and Model Checking</title>
        <p>The eCos features we examined and the resulting feature
conditions imply several requirements on the application
analysis:</p>
        <p>Feature conditions that relate only to the existence of
certain API calls, the least complex category identified in
the previous subsection, could more or less be checked
by simple text search utilities like grep. The capabilities
missing (and essential for well-founded automatic
configuration decisions) are a deeper understanding of C syntax
and semantics – for example to differentiate between an
API function mentioned in a source code comment, and
real API usage – and control flow properties that indicate
whether the API calls are reachable at all.</p>
        <p>Patterns as observed in the “Support optional name for
each thread” example also demand for control flow
information (connecting a cyg_thread_get_info(...) call to
a subsequent use of its return value) and actual parameter
values, implying the need for static analysis techniques like
constant folding, constant propagation, inter-procedural
reaching definitions analysis [21], or interval analysis.
Highly OS domain specific feature patterns concerning
thread concurrency and synchronization aspects call for a
very specialized program analysis technique which may
not be possible to generalize further. Our first attempt to
deal with these is described in subsection IV-D.</p>
        <p>IV. STATIC APPLICATION ANALYSIS AND DETERMINATION</p>
        <p>OF FEATURE NEED</p>
      </sec>
      <sec id="sec-3-10">
        <title>A. Static Analysis of eCos Applications</title>
        <p>The first step in statically deriving information from
application source code is transforming it into a model suitable
for the subsequent analysis steps – suitable in a way that
the transformation does not lose information relevant for the
problem space, leading to incorrect configuration decisions.
Our examination of eCos features suggests that a
C-statementlevel control flow graph (CFG) fulfills our requirements, as it
maintains temporal interrelations between API calls and return
value usage, and allows for reachability analysis. A CFG can
also be subject to further data flow analysis and transformation
steps that propagate actual values to nodes where they are
passed through the OS API. Additionally, a CFG is generic
enough that it still holds enough program information for the
highly OS specific analyses sketched in subsection III-A3.</p>
      </sec>
      <sec id="sec-3-11">
        <title>B. Formalizing Feature Conditions and Model Checking</title>
        <p>
          Motivated by our own earlier results [24] and promising
achievements in other projects applying model checking to
identify patterns in application code (such as [
          <xref ref-type="bibr" rid="ref7">10</xref>
          ]), we decided
to use the temporal logic CTL as a language to formalize
feature conditions. CTL can express temporal relationships,
and there exist efficient model checking algorithms [
          <xref ref-type="bibr" rid="ref1">4</xref>
          ], [
          <xref ref-type="bibr" rid="ref7">10</xref>
          ]
for this logic.
        </p>
        <p>
          We model the CFG of the application program as a Kripke
structure [
          <xref ref-type="bibr" rid="ref1">4</xref>
          ] M = (S; S0; R; L) over atomic propositions P ,
where S is a (finite) set of states (representing statement-level
CFG nodes), S0 is a set of initial states, R S S is a total
transition relation, and L : S ! 2P is a labeling function
that associates a subset of P to each state. A proposition p
holds in a state s, if p is contained in the label of s, i.e.,
p 2 L(s). A path , starting at state s, is a sequence of states
= s0s1s2s3 : : : with s0 = s and R(si; si+1) for all i 0.
        </p>
        <p>
          CTL formulas allow to specify temporal properties of Kripke
structures by extending classical predicate logic by temporal
connectives which establish a relationship to future states:
Every atomic proposition p 2 P is a CTL formula.
If p and q are CTL formulas, :p; p ^ q; p _
q; AX p; EX p; AG p; EG p; A[p U q] and E[p U q] are
valid formulas, too. X is the nexttime operator: AX p (resp.
EX p) means that p holds in every (in some) immediate
successor state. G is the global operator: AG p (resp.
EG p) states that p holds in all (in some) future states.
U is the until operator: A[p U q] (resp. E[p U q], cf.
Subfigure 5a) expresses that for every (for some) path starting
with the current state, there exists an initial prefix of this
path such that q holds at the last state of this prefix, and
p holds in all other states of the prefix [
          <xref ref-type="bibr" rid="ref20">3</xref>
          ].
        </p>
        <p>The finally operators AF and EF can be seen as an
abbreviated form of the until operators with p = true
(a) E p U q
(b) EF p
(c) AF p
(cf. Sub-figures 5b and 5c): They mean that on all (on
some) paths the operand will hold sometime in the future
(AF q , A[true U q]).</p>
        <p>Figure 5 and the examples later in this subsection may help
gaining a more intuitive understanding of CTL.</p>
        <p>For the feature conditions identified in subsection III-A we
additionally define an elementary set of atomic propositions:
The trivial proposition [true] holds in every, [false] in no
state.
[call :somefunction(: : :)] holds in every state that
contains a call to somefunction, ignoring its actual
parameters. [call :somefunction(?; 4; ?)] holds if the
second actual parameter is equal to 4.</p>
        <p>Now we can formulate a subset of the feature conditions from
section III-A in CTL. The condition informally introduced in
subsection III-A1 can be expressed as follows:</p>
        <p>EF ( [call :cyg_mbox_put(: : :)] _
[call :cyg_mbox_timed_put(: : :)] )</p>
      </sec>
      <sec id="sec-3-12">
        <title>For now ignoring the “. . . and reads the name element of its</title>
        <p>return value, . . . ” part of the condition, we can also express
the condition from subsection III-A2:</p>
        <sec id="sec-3-12-1">
          <title>EF ( [call :cyg_thread_create(: : :)]</title>
          <p>:[call :cyg_thread_create(?; ?; ?; 0; ?; ?; ?; ?)]</p>
        </sec>
        <sec id="sec-3-12-2">
          <title>EX EF [call :cyg_thread_get_info(: : :)] )</title>
          <p>In order to formulate this condition completely, we would
need another atomic proposition for data structure access and a
means to express the connection between the variable returned
by cyg_thread_get_info(...) and the point where its member
name is accessed. (See the discussion in subsection IV-D for
a solution to this problem.)</p>
          <p>
            A model checking algorithm can now check whether the
application’s Kripke structure is a model for a CTL formula –
iff this is the case, the feature condition is fulfilled. Starting
with the atomic propositions used in the CTL formula, and
recursively continuing with more and more complex
subformulas, each Kripke node is labeled with the sub-formulas
holding for this particular node. This procedure is iterated
until it can be determined whether the complete formula holds
in a starting node. For more details on the model checking
algorithm we refer to Clarke’s original publication [
            <xref ref-type="bibr" rid="ref20">3</xref>
            ].
^
^
          </p>
        </sec>
      </sec>
      <sec id="sec-3-13">
        <title>C. Inferring Feature Need</title>
        <p>Although not accounted for in section III-A, our examination
of eCos features showed that often multiple feature conditions
are necessary to exhaustively describe the possible API usage
patterns that signify an application’s need or non-need for a
certain feature. Some conditions only help deciding for or
against feature need, not both: Once a single necessary (in
the mathematical sense) condition is not fulfilled, the feature
this condition belongs to is not needed; once a single sufficient
condition is fulfilled, the feature is definitely needed. In both
cases, the respective converse decision cannot be taken: The
fulfillment of a necessary condition does not allow a statement
on feature need.</p>
        <p>Another orthogonal condition property is weakness: If a
condition should only be used to give the user a configuration
hint instead of making a fully automated configuration decision,
it is called a weak condition (examples are the conditions in
subsections III-A2 and III-A3), or else a definite condition.</p>
        <p>The model checking results for all conditions of a certain
feature can be combined to a resulting statement on whether
the feature should be enabled or disabled. Figure 6 assembles
the following propositions:</p>
        <p>N
n
S
s
,
,
,
all definite, necessary conditions are fulfilled
(or none exists).
all weak, necessary conditions are fulfilled
(or none exists).
some definite, sufficient condition is fulfilled.</p>
        <p>some weak, sufficient condition is fulfilled.</p>
        <p>One remaining case still needs to be dealt with: If a condition
cannot be successfully checked (e.g., because data flow analysis
fails, and therefore the possible value(s) of an actual parameter
cannot be determined), we can safely proceed pretending
this condition did not exist in the first place, as evidently
the resulting statement is not falsified by that measure. The
user should still be informed about the omission of a feature
condition, as a simple code change may make the analysis
possible again.</p>
        <p>Finally, the internal dependency and restriction constraints
in the eCos configuration tree need to be taken into account
– a feature not directly needed by the application may still
be mandatory because another feature depends on it. This
S
:S ^ :s
:S ^ s</p>
        <p>:N</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Conditions or</title>
      <p>application source
code ill-formed
N ^ n
N ^ :n</p>
    </sec>
    <sec id="sec-5">
      <title>Yes, feature definitely</title>
      <p>needed</p>
    </sec>
    <sec id="sec-6">
      <title>Yes, feature definitely</title>
      <p>needed</p>
    </sec>
    <sec id="sec-7">
      <title>No, feature definitely</title>
      <p>not needed</p>
    </sec>
    <sec id="sec-8">
      <title>Maybe, no definite</title>
      <p>decision possible</p>
    </sec>
    <sec id="sec-9">
      <title>Hint: No, probably not</title>
      <p>needed</p>
    </sec>
    <sec id="sec-10">
      <title>No, feature definitely</title>
      <p>not needed</p>
    </sec>
    <sec id="sec-11">
      <title>Hint: Yes, probably</title>
      <p>needed</p>
    </sec>
    <sec id="sec-12">
      <title>Maybe, no definite</title>
      <p>decision possible
dependency resolution can already be conducted by the eCos</p>
      <sec id="sec-12-1">
        <title>Configtool, though.</title>
      </sec>
      <sec id="sec-12-2">
        <title>D. Discussion</title>
        <p>
          The quality of results obtained from model checking can only
be as good as the model being checked, which in the case of
control and data flow graphs (at least for real-world code input)
may not yield all necessary information (e.g., failing to trace
actual parameters to the place they are defined, or not being
able to determine the number of iterations a loop can make).
Static code analysis is well-known to be limited in theory and
practice [
          <xref ref-type="bibr" rid="ref7">10</xref>
          ], [
          <xref ref-type="bibr" rid="ref9">12</xref>
          ], [
          <xref ref-type="bibr" rid="ref16">19</xref>
          ], [21], but nevertheless we believe that
these limits are not pivotal for our approach: Even if some
configuration decisions cannot be automated because static
analysis fails, and the application developer has to configure
the respective features manually, the overall configuration effort
is still significantly reduced. Additionally, this problem could
be tackled by trying to reduce the complexity of static analysis.
An interesting research question in this context would be: What
modifications to an infrastructure’s API might be adequate to
facilitate static analysis and therefore improve the quality of
automatic configuration decisions?
        </p>
        <p>
          Another related open question is what API the application
should be initially written against: As the API may be affected
by configuration decisions, a circular dependency exists. In
principle, a “full” API encompassing all possible configurations
(something Fröhlich [
          <xref ref-type="bibr" rid="ref4">7</xref>
          ] calls an inflated interface) needs to
be generated. This may not be possible if two API variants
conflict (e.g., a function cannot have two different signatures
in the C programming language), although this was not the
case for eCos: We were able to manually create a set of header
files valid for all possible variants.
        </p>
        <p>
          The additional expressiveness demanded in subsection IV-B
– CTL’s lack of a means to connect several usage points of a
single variable – could be handled by a CTL extension: With
CTPL, Kinder et al. [
          <xref ref-type="bibr" rid="ref7">10</xref>
          ] proposed such an extension to CTL
that allows for expressing such connections by introducing
free variables (placeholders). Their modified model checking
algorithm was shown to be still efficient.
        </p>
        <p>Unfortunately, neither CTL nor CTPL are expressive enough
to cover complex feature conditions such as described in
subsection III-A3. Our first attempt to deal with these highly
OS domain specific conditions is to encapsulate them in small
plug-ins, so-called configlets, written in C++ against an analysis
API giving direct access to the underlying CFG (cf. Figure 7).
A configlet can be used in place of a CTL formula, its output
is processed the same way (cf. Figure 6). We are still unsure
about what the interface between a configlet and the remaining
analysis tool interface should look like, and are trying to find
an adequate balance between a complex API with complete
access to the Kripke model, and a minimal, easier to use API
which still is generic enough to deal with new use cases.</p>
      </sec>
    </sec>
    <sec id="sec-13">
      <title>V. RESULTS</title>
      <sec id="sec-13-1">
        <title>A. eCos examination</title>
        <p>The manual examination of 39 eCos features (cf.
subsection III-A) resulted in a categorization into four feature
categories, bearing various levels of complexity for automatic
analysis. Table I lists all features, their type, their feature
category, and the types of feature conditions we formulated.
7 out of 39 features were categorized into “Simple API
call usage”.</p>
      </sec>
      <sec id="sec-13-2">
        <title>5 features fall in the “API call patterns and actual pa</title>
        <p>rameters” category: Two of these need the CTL extension
mentioned in subsection IV-D.
6 features are highly OS specific and belong to the
“Domain specific patterns” category. We were able to
formulate conditions for these features, but CTL (and
CTPL) turned out to be insufficient.
19 features were categorized to be not derivable from an
application’s source code, for different reasons:</p>
        <p>The largest group (13) are configurable non-functional
properties that have an effect on code size (e.g., explicit</p>
      </sec>
      <sec id="sec-13-3">
        <title>B. Implementation and preliminary evaluation</title>
        <p>Among these 19 features, 6 were additionally identified to be
of interest only for the development process and/or debugging
purposes. For example, “Output stack usage on thread exit”
creates debugging output once a thread terminates – a feature
the developer, despite being eager for automatic configuration,
still would want to configure manually due to its purpose in
the development process context.</p>
        <p>The remaining two features even seem only to be there
for self-documentation reasons, as they are tightly coupled
with other features by dependency relationships and cannot
be directly configured by the user anyways (e.g., “Idle thread
must always yield” is automatically enabled once there is only
a single priority level configured).</p>
        <p>Altogether, we were able to pose feature conditions for about
half of the examined features (18 out of 37 “real” features).</p>
        <p>The prototype implementation of the described analysis and
model checking steps is still very preliminary and has not yet
been thoroughly tested with real-world code input. Nevertheless,
our test runs with simple CTL formulas and a suite of eCos
test programs (shipped with eCos 3.0), cloned and adapted for
testing specific units of the prototype, are promising and will
soon be extended to a full-scale evaluation.</p>
        <p>
          The analysis tool prototype is based on clang, an LLVM [
          <xref ref-type="bibr" rid="ref10">13</xref>
          ]
compiler front-end for the C, C++ and Objective-C languages.
        </p>
        <p>
          The complete static analysis phase (scanning and parsing
the application’s C code, performing constant folding and
propagation) is externalized to clang. The resulting CFG is
then transformed to a Kripke structure. A C++ implementation
of Clarke’s CTL model checking algorithm [
          <xref ref-type="bibr" rid="ref1">4</xref>
          ] is currently
capable of checking single CTL formulas and combining the
results for a configuration decision. Besides the sub-condition
requiring a CTL extension (cf. subsection IV-D), all feature
conditions categorized in subsections III-A1 and III-A2 can
already be checked. A prototype configlet for the example
condition in subsection III-A3 is under development.
        </p>
        <p>
          code inlining), timing/throughput behavior, stack sizes, or Evaluating their JiM (Just-in-time middleware) paradigm,
runtime safety checks (e.g., stack canaries). Zhang et al. [
          <xref ref-type="bibr" rid="ref25">29</xref>
          ] tailor the middleware product line Abacus
4 features could not be examined in detail due to their (a CORBA middleware implementation) according to the
unclear semantics. application’s needs. In contrast to the focus of our work,
they completely ignore the task of derivation of feature need
from the application. Source code annotations are added
to the application code to make the feature requirements
explicit; the difference to manual infrastructure configuration
is marginal and debatable. In their customizable embedded
DREAMS OS, Böke, Chivukula et al. [
          <xref ref-type="bibr" rid="ref18">1</xref>
          ], [
          <xref ref-type="bibr" rid="ref19">2</xref>
          ] also achieve
infrastructure tailoring by supplying an explicit requirements
specification. The specification is on a lower abstraction level
than in the Abacus case, though: The system calls and their
properties (precedence relation, number of calls, etc.) made
by each process are explicitly listed. The DREAMS tailoring
approach also benefits from the OS being explicitly designed
for automatic configuration.
        </p>
        <p>Focusing mostly on functional infrastructure properties, the
aforementioned projects insufficiently deal with non-functional
properties (such as code size, memory usage at runtime, timing
behavior etc.). These properties have an emergent nature and
therefore often cannot be directly configured, nevertheless some
research work exists in this field. Pu, Massala et al. developed
the research operating system Synthesis [22] which adapts to
and self-optimizes for the application’s API usage patterns
at runtime. Supplied by a just-in-time compiler, often used
code paths are partially evaluated and tuned to high throughput.</p>
        <p>
          Sincero, Hofer et al. [
          <xref ref-type="bibr" rid="ref5">8</xref>
          ], [
          <xref ref-type="bibr" rid="ref22">26</xref>
          ] are developing feedback approach
which systematically collects information on emerging
nonfunctional properties in the CiAO [
          <xref ref-type="bibr" rid="ref11">14</xref>
          ] operating system to be
able to make educated predictions for unknown configurations.
        </p>
        <p>This information could be used to automatically (based on a
user-defined non-functional optimization goal) select one of
several variants which are functionally equivalent but exhibit
different non-functional properties, therefore complementing
our approach.</p>
        <p>
          Outside the context of infrastructure software tailoring, there
exist many other research projects that apply static analysis
and model checking to problems in their domain. For example,
Padioleau, Lawall et al. [
          <xref ref-type="bibr" rid="ref17">20</xref>
          ] utilize CTL for matching and
replacing code in order to deal with collateral evolutions
in the Linux kernel. The SmPL language can be used to
define so-called semantic patches which can automatically
VI. RELATED WORK be transformed into CTL formulas. Another example comes
from the systems security domain: Kinder et al. [
          <xref ref-type="bibr" rid="ref7">10</xref>
          ] formidably
show the applicability of static analysis model checking to the
generic detection of malicious code.
        </p>
      </sec>
    </sec>
    <sec id="sec-14">
      <title>VII. CONCLUSIONS AND FUTURE WORK</title>
      <p>Our examination of a subset of eCos features showed
that for about half of these we can, at least informally,
define feature conditions which allow deducing feature need
from an application’s source code. Aiming at automating
the evaluation of these conditions, we identified control flow
graphs, transformed to a Kripke structure, as an adequate model
which carries enough information for subsequent analysis steps.</p>
      <p>
        There exist numerous research projects engaging in
application-driven tailoring of infrastructure software. The
concept of Application-Oriented System Design was introduced
by Fröhlich [
        <xref ref-type="bibr" rid="ref4">7</xref>
        ] in the EPOS operating system. Here the set
of infrastructure symbols (i.e., a temporally unordered list of
API calls) referenced by the application determines which
product line variant is needed. If multiple variants fulfill the
requirements, the least resource expensive one (in a fixed,
manually defined cost ordering of variants) is chosen. Apart
from the comparably simple static analysis the main difference
to our approach is the lack of logical isolation between analysis
and configuration, established by a feature model.
The branching-time logic CTL was attested to be expressive
enough for many but not all feature conditions we found: For
a few cases it needs to be extended with free variables, or
even supplemented by configlets, specialized analysis
plugins written in a normal programming language. The first
preliminary evaluation results with our analysis tool prototype
are promising, although we cannot already draw conclusions
regarding the scalability of our approach.
      </p>
      <p>
        Although the configuration automation of about 50% of
the examined features may not seem exceedingly successful,
extrapolating this to all configurable eCos features3 we could
still save the application developer about 750 configuration
decisions. For parts of the remaining half, especially the features
dealing with non-functional properties, the feedback approach
of Sincero et al. [
        <xref ref-type="bibr" rid="ref5">8</xref>
        ], [
        <xref ref-type="bibr" rid="ref22">26</xref>
        ] could offer other means of automatic
configuration.
      </p>
      <p>Our results are comparable to an earlier case study we
conducted with a modified version of the Berkeley DB [24], an
embedded DBMS for which we could automate an even larger
portion of configuration decisions – mostly due to simpler API
usage patterns and a lower quantity of features dealing with
non-functional properties.</p>
      <p>
        More future work includes examining additional eCos
features in order to gain more confidence on the general
soundness of our approach. We also intend to evaluate the
outlined extension to CTL, to compare it to other (potentially
more powerful) temporal logics, and to integrate the analysis
results in the eCos Configtool. In order to alleviate the
infrastructure developer’s task to describe feature conditions,
we are also going to look into simpler description languages that
can be automatically transformed into temporal logic formulas;
Kinder et al. [
        <xref ref-type="bibr" rid="ref7">10</xref>
        ] suggest using macro shortcuts for the most
commonly used patterns, which may prove to suffice.
      </p>
      <p>Beyond these enhancements and a thorough evaluation of the
outlined approach, we are looking into the research question
what modifications to the infrastructure API are necessary to
simplify the analysis task such that a vast majority of features
can be automatically configured. Ideally, only a tiny fraction
consisting of development time (debugging) and non-functional
(runtime safety checks, stack sizes, runtime/code size
tradeoffs) configuration decisions remains, and we believe this could
be achieved by designing the API with this ambition in mind.</p>
      <p>3(which may be, due to the small feature sample we examined, not perfectly
valid)</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [4]
          <string-name>
            <surname>Edmund</surname>
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Clarke</surname>
          </string-name>
          , Orna Grumberg, and
          <string-name>
            <surname>Doron</surname>
            <given-names>A. Pele. Model</given-names>
          </string-name>
          <string-name>
            <surname>Checking</surname>
          </string-name>
          . The MIT Press, Cambridge, Massachusetts and London, England,
          <volume>3</volume>
          <fpage>edition</fpage>
          ,
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>Paul</given-names>
            <surname>Clements</surname>
          </string-name>
          and
          <string-name>
            <given-names>Linda</given-names>
            <surname>Northrop</surname>
          </string-name>
          .
          <source>Software Product Lines: Practices and Patterns. Addison-Wesley</source>
          ,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>Krysztof</given-names>
            <surname>Czarnecki</surname>
          </string-name>
          and
          <string-name>
            <given-names>Ulrich W. Eisenecker. Generative</given-names>
            <surname>Programming</surname>
          </string-name>
          .
          <source>Methods, Tools and Applications</source>
          . Addison-Wesley, May
          <year>2000</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>A.</given-names>
            <surname>Fröhlich</surname>
          </string-name>
          .
          <article-title>Application-Oriented Operating Systems</article-title>
          . Number 17 in GMD Research Series. GMD - Forschungszentrum
          <string-name>
            <surname>Informationstechnik</surname>
          </string-name>
          , Sankt Augustin,
          <year>August 2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>Wanja</given-names>
            <surname>Hofer</surname>
          </string-name>
          , Julio Sincero, Daniel Lohmann, and Wolfgang SchröderPreikschat.
          <article-title>Configuration of Non-Functional Properties in Embedded Operating Systems: The CiAO Approach</article-title>
          .
          <article-title>Methodologies for NonFunctional Requirements in Service Oriented Architecture</article-title>
          .
          <source>IGI Global</source>
          , Hershey, PA, USA,
          <year>2010</year>
          . (To Appear).
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>K.</given-names>
            <surname>Kang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Cohen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Hess</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Novak</surname>
          </string-name>
          , and
          <string-name>
            <given-names>S.</given-names>
            <surname>Peterson</surname>
          </string-name>
          .
          <article-title>Featureoriented domain analysis (FODA) feasibility study</article-title>
          .
          <source>Technical report</source>
          , Carnegie Mellon University, Software Engineering Institute, Pittsburgh, PA,
          <year>November 1990</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [10]
          <string-name>
            <surname>Johannes</surname>
            <given-names>Kinder</given-names>
          </string-name>
          , Stefan Katzenbeisser,
          <string-name>
            <given-names>Christian</given-names>
            <surname>Schallhart</surname>
          </string-name>
          , and
          <string-name>
            <given-names>Helmut</given-names>
            <surname>Veith</surname>
          </string-name>
          .
          <article-title>Detecting malicious code by model checking</article-title>
          .
          <source>In Klaus Julisch and Christopher Krügel</source>
          , editors,
          <source>GI SIG SIDAR Conference on Detection of Intrusions and Malware &amp; Vulnerability Assessment (DIMVA</source>
          <year>2005</year>
          ), volume
          <volume>3548</volume>
          of Lecture Notes in Computer Science, pages
          <fpage>174</fpage>
          -
          <lpage>187</lpage>
          . Springer-Verlag,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [11]
          <string-name>
            <surname>Butler</surname>
            <given-names>W.</given-names>
          </string-name>
          <string-name>
            <surname>Lampson</surname>
            and
            <given-names>David D.</given-names>
          </string-name>
          <string-name>
            <surname>Redell</surname>
          </string-name>
          .
          <article-title>Experience with processes and monitors in mesa</article-title>
          .
          <source>Communications of the ACM</source>
          ,
          <volume>23</volume>
          (
          <issue>2</issue>
          ):
          <fpage>105</fpage>
          -
          <lpage>117</lpage>
          ,
          <year>1980</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>William</given-names>
            <surname>Landi</surname>
          </string-name>
          .
          <article-title>Undecidability of static analysis</article-title>
          .
          <source>ACM Letters on Programming Languages and Systems</source>
          ,
          <volume>1</volume>
          (
          <issue>4</issue>
          ):
          <fpage>323</fpage>
          -
          <lpage>337</lpage>
          ,
          <year>1992</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [13]
          <article-title>LLVM homepage</article-title>
          . http://www.llvm.org/.
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>Daniel</given-names>
            <surname>Lohmann</surname>
          </string-name>
          , Wanja Hofer, Wolfgang Schröder-Preikschat,
          <string-name>
            <given-names>Jochen</given-names>
            <surname>Streicher</surname>
          </string-name>
          , and Olaf Spinczyk.
          <article-title>CiAO: An aspect-oriented operating-system family for resource-constrained embedded systems</article-title>
          .
          <source>In Proceedings of the 2009 USENIX Annual Technical Conference</source>
          , pages
          <fpage>215</fpage>
          -
          <lpage>228</lpage>
          , Berkeley, CA, USA,
          <year>June 2009</year>
          . USENIX Association.
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>Daniel</given-names>
            <surname>Lohmann</surname>
          </string-name>
          , Fabian Scheler, Reinhard Tartler, Olaf Spinczyk, and
          <string-name>
            <surname>Wolfgang</surname>
          </string-name>
          Schröder-Preikschat.
          <article-title>A quantitative analysis of aspects in the eCos kernel</article-title>
          .
          <source>In Proceedings of the EuroSys 2006 Conference (EuroSys '06)</source>
          , pages
          <fpage>191</fpage>
          -
          <lpage>204</lpage>
          , New York, NY, USA,
          <year>April 2006</year>
          . ACM Press.
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>Daniel</given-names>
            <surname>Lohmann</surname>
          </string-name>
          , Olaf Spinczyk, and
          <string-name>
            <surname>Wolfgang</surname>
          </string-name>
          Schröder-Preikschat.
          <article-title>Lean and efficient system software product lines: Where aspects beat objects</article-title>
          .
          <source>In Awais Rashid and Mehmet Aksit</source>
          , editors,
          <source>Transactions on AOSD II, number 4242 in Lecture Notes in Computer Science</source>
          , pages
          <fpage>227</fpage>
          -
          <lpage>255</lpage>
          . Springer-Verlag,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>Anthony</given-names>
            <surname>Massa</surname>
          </string-name>
          .
          <article-title>Embedded Software Development with eCos</article-title>
          .
          <source>Prentice Hall Professional Technical Reference</source>
          ,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [18]
          <string-name>
            <surname>Matthias</surname>
            <given-names>Meier</given-names>
          </string-name>
          , Michael Engel, Matthias Steinkamp, and Olaf Spinczyk.
          <article-title>LavA: An open platform for rapid prototyping of MPSoCs</article-title>
          .
          <source>In Proceedings of the 20th International Conference on Field Programmable Logic and Applications (FPL '10)</source>
          , Milano, Italy,
          <year>2010</year>
          . IEEE Computer Society Press. to appear.
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [19]
          <string-name>
            <surname>Toshio</surname>
            <given-names>Ogiso</given-names>
          </string-name>
          , Yusuke Sakabe, Masakazu Soshi, and
          <string-name>
            <given-names>Atsuko</given-names>
            <surname>Miyaji</surname>
          </string-name>
          .
          <article-title>Software tamper resistance based on the difficulty of interprocedural analysis</article-title>
          ,
          <year>August 2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [20]
          <string-name>
            <surname>Yoann</surname>
            <given-names>Padioleau</given-names>
          </string-name>
          , Julia Lawall, René Rydhof Hansen, and
          <string-name>
            <given-names>Gilles</given-names>
            <surname>Muller</surname>
          </string-name>
          .
          <article-title>Documenting and automating collateral evolutions in linux device drivers</article-title>
          .
          <source>REFERENCES In Proceedings of the EuroSys 2008 Conference (EuroSys '08)</source>
          , pages
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>Carsten</given-names>
            <surname>Böke</surname>
          </string-name>
          .
          <source>Automatic Configuration of Real-Time Operating Systems 247-260</source>
          , New York, NY, USA,
          <year>2008</year>
          . ACM Press.
          <article-title>and Real Time Communication Systems for Distributed Embedded</article-title>
          [21]
          <string-name>
            <given-names>H. D.</given-names>
            <surname>Pande</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W. A.</given-names>
            <surname>Landi</surname>
          </string-name>
          , and
          <string-name>
            <given-names>B. G.</given-names>
            <surname>Ryder. Interprocedural</surname>
          </string-name>
          def-use
          <source>Applications. Dissertation</source>
          , Universität Paderborn, Heinz Nixdorf Institut,
          <article-title>associations for c systems with single level pointers</article-title>
          .
          <source>IEEE Transactions Entwurf Paralleler Systeme</source>
          ,
          <year>2004</year>
          . on Software Engineering,
          <volume>20</volume>
          (
          <issue>5</issue>
          ):
          <fpage>385</fpage>
          -
          <lpage>403</lpage>
          ,
          <year>1994</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>Ramakrishna</given-names>
            <surname>Prasad</surname>
          </string-name>
          <string-name>
            <surname>Chivukula</surname>
          </string-name>
          , Carsten Boeke, and
          <string-name>
            <given-names>Franz J.</given-names>
            <surname>Rammig</surname>
          </string-name>
          . [22]
          <string-name>
            <surname>Calton</surname>
            <given-names>Pu</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>Henry</given-names>
            <surname>Massalin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>and John</given-names>
            <surname>Ioannidis</surname>
          </string-name>
          .
          <article-title>The Synthesis kernel. Customizing the configuration process of an operating system using Computing Systems</article-title>
          ,
          <volume>1</volume>
          (
          <issue>1</issue>
          ):
          <fpage>11</fpage>
          -
          <lpage>32</lpage>
          ,
          <year>Winter 1988</year>
          .
          <article-title>hierarchy and clustering</article-title>
          .
          <source>Proceedings of the 5th IEEE International [23] Marko Rosenmüller</source>
          , Norbert Siegmund, Horst Schirmeier, Julio Sincero, Symposium on Object-Oriented
          <string-name>
            <surname>Real-Time Distributed Computing (ISORC Sven Apel</surname>
            , Thomas Leich, Olaf Spinczyk, and
            <given-names>Gunter</given-names>
          </string-name>
          <string-name>
            <surname>Saake</surname>
          </string-name>
          .
          <source>FAME'02)</source>
          ,
          <volume>0</volume>
          :
          <fpage>0280</fpage>
          ,
          <year>2002</year>
          . DBMS:
          <article-title>Tailor-made Data Management Solutions for Embedded Systems</article-title>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>E. M.</given-names>
            <surname>Clarke</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E. A.</given-names>
            <surname>Emerson</surname>
          </string-name>
          ,
          <article-title>and</article-title>
          <string-name>
            <given-names>A. P.</given-names>
            <surname>Sistla</surname>
          </string-name>
          . Automatic verification In Workshop on Software Engineering for
          <article-title>Tailor-made Data Management, of finite-state concurrent systems using temporal logic specifications</article-title>
          . pages
          <fpage>1</fpage>
          -
          <lpage>6</lpage>
          . School of Computer Science, University of Magdeburg,
          <source>March ACM Transactions on Programming Languages and Systems (TOPLAS)</source>
          ,
          <year>2008</year>
          .
          <volume>2</volume>
          (
          <issue>8</issue>
          ):
          <fpage>244</fpage>
          -
          <lpage>263</lpage>
          ,
          <year>1986</year>
          . [24]
          <string-name>
            <given-names>Horst</given-names>
            <surname>Schirmeier</surname>
          </string-name>
          and
          <string-name>
            <given-names>Olaf</given-names>
            <surname>Spinczyk</surname>
          </string-name>
          .
          <article-title>Tailoring Infrastructure Software Product Lines by Static Application Analysis</article-title>
          .
          <source>In Proceedings of the 11th Software Product Line Conference (SPLC '07)</source>
          , pages
          <fpage>255</fpage>
          -
          <lpage>260</lpage>
          . IEEE Computer Society Press,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [25]
          <string-name>
            <surname>Julio</surname>
            <given-names>Sincero</given-names>
          </string-name>
          , Horst Schirmeier,
          <article-title>Wolfgang Schröder-Preikschat, and Olaf Spinczyk. Is The Linux Kernel a Software Product Line</article-title>
          ? In Frank van der Linden and Björn Lundell, editors,
          <source>Proceedings of the International Workshop on Open Source Software and Product Lines (SPLC-OSSPL</source>
          <year>2007</year>
          ), Kyoto, Japan,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [26]
          <string-name>
            <surname>Julio</surname>
            <given-names>Sincero</given-names>
          </string-name>
          , Wolfgang Schröder-Preikschat, and
          <string-name>
            <given-names>Olaf</given-names>
            <surname>Spinczyk</surname>
          </string-name>
          .
          <article-title>Towards Tool Support for the Configuration of Non-Functional Properties in SPLs</article-title>
          .
          <source>In Proceedings of the 42nd Hawai'i International Conference on System Sciences (HICSS '09)</source>
          , Waikoloa, Big Island, Hawaii,
          <year>January 2009</year>
          . IEEE Computer Society Press.
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [27]
          <string-name>
            <given-names>Olaf</given-names>
            <surname>Spinczyk</surname>
          </string-name>
          and
          <string-name>
            <given-names>Holger</given-names>
            <surname>Papajewski</surname>
          </string-name>
          .
          <article-title>Using Feature Models for Product Derivation</article-title>
          .
          <source>In Proceedings of the 11th Software Product Line Conference (SPLC '07)</source>
          , pages
          <fpage>5</fpage>
          -
          <lpage>6</lpage>
          , Kyoto, Japan,
          <year>September 2007</year>
          . Tutorial Description.
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [28]
          <string-name>
            <given-names>Bart</given-names>
            <surname>Veer</surname>
          </string-name>
          and John Dallaway.
          <source>The eCos Component Writer's Guide. Free Software Foundation</source>
          , Inc.,
          <year>2001</year>
          . http://ecos.sourceware.
          <source>org/docs-3</source>
          .0/.
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [29]
          <string-name>
            <surname>Charles</surname>
            <given-names>Zhang</given-names>
          </string-name>
          , Dapeng Gao, and
          <string-name>
            <surname>Hans-Arno Jacobsen</surname>
          </string-name>
          .
          <article-title>Towards just-intime middleware architectures</article-title>
          .
          <source>In Proceedings of the 4th International Conference on Aspect-Oriented Software Development (AOSD '05)</source>
          , pages
          <fpage>63</fpage>
          -
          <lpage>74</lpage>
          , New York, NY, USA,
          <year>2005</year>
          . ACM.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>