Subversion Repositories HelenOS-doc

Rev

Rev 179 | Rev 181 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 179 Rev 180
Line 1... Line 1...
1
\documentclass{llncs}
1
\documentclass{llncs}
2
\usepackage{graphicx}
2
\usepackage{graphicx}
3
 
3
 
4
\title{A Road to a Formally Verified General-Purpose Operating System}
4
\title{A Road to a Formally Verified General-Purpose Operating System}
5
\author{Martin D\v{e}ck\'{y}}
5
\author{Martin D\v{e}ck\'{y}}
6
\institute{Department of Software Engineering\\
6
\institute{Department of Distributed and Dependable Systems\\
7
        Faculty of Mathematics and Physics, Charles University\\
7
        Faculty of Mathematics and Physics, Charles University\\
8
        Malostransk\'{e} n\'{a}m\v{e}st\'{i} 25, Prague 1, 118~00, Czech Republic\\
8
        Malostransk\'{e} n\'{a}m\v{e}st\'{i} 25, Prague 1, 118~00, Czech Republic\\
9
        \email{martin.decky@dsrg.mff.cuni.cz}}
9
        \email{martin.decky@d3s.mff.cuni.cz}}
10
 
10
 
11
\begin{document}
11
\begin{document}
12
    \maketitle
12
    \maketitle
13
   
13
   
14
    \begin{abstract}
14
    \begin{abstract}
15
        Methods of formal description and verification represent a viable way for achieving
15
        Methods of formal description and verification represent a viable way for achieving
16
        fundamentally bug-free software. However, in reality only a small subset of the existing operating
16
        fundamentally bug-free software. However, in reality only a small subset of the existing operating
17
        systems were ever formally verified, despite the fact that an operating system is a critical part
17
        systems were ever formally verified, despite the fact that an operating system is a critical part
18
        of almost any other software system. This paper summarizes the challenges involved in formal verification
18
        of almost any other software system. This paper points out several key design choices which
19
        of operating systems, points out several key design choices which should make the formal verification
19
        should make the formal verification of an operating system easier and presents a work-in-progress
20
        easier and presents a work-in-progress and initial experiences with formal verification of HelenOS,
20
        and initial experiences with formal verification of HelenOS, a state-of-the-art microkernel-based
21
        a state-of-the-art microkernel-based operating system, which, however, was not designed specifically
21
        operating system, which, however, was not designed specifically with formal verification in mind,
22
        with formal verification in mind, as this is mostly prohibitive due to time and budget constrains.
22
        as this is mostly prohibitive due to time and budget constrains.
23
       
23
       
24
        The contribution of this paper is the shift of focus from attempts to use a single ``silver-bullet''
24
        The contribution of this paper is the shift of focus from attempts to use a single ``silver-bullet''
25
        formal verification method which would be able to verify everything to a combination of multiple
25
        formal verification method which would be able to verify everything to a combination of multiple
26
        formalisms and techniques to cover various aspects of the verification process. The formally verified
26
        formalisms and techniques to successfully cover various aspects of the operating system.
27
        operating system is the emerging property of the combination.
27
        A reliable and dependable operating system is the emerging property of the combination,
-
 
28
        thanks to the suitable architecture of the operating system.
28
    \end{abstract}
29
    \end{abstract}
29
   
30
   
30
    \section{Introduction}
31
    \section{Introduction}
31
        \label{introduction}
32
        \label{introduction}
32
        In the context of formal verification of software, it is always important to model the outer
33
        Operating systems (OSes for short) have a somewhat special position among all software.
33
        environment with a proper level of abstraction. Weak assumptions on the environment make the formal
-
 
34
        verification less feasible, because they yield many degrees of freedom which render
34
        OSes are usually designed to run on bare hardware. This means that they do not require
35
        the properties which we want to verify overly complex. But strong assumptions on the environment are likewise
35
        any special assumptions on the environment except the assumptions on the properties and
36
        not without a price: Any practical usability of the verification results depends on the question
36
        behavior of hardware. In many cases it is perfectly valid to consider the hardware
37
        whether we are really able to create a physical environment which satisfies the assumptions.
37
        as \emph{idealized hardware} (zero mathematical probability of failure, perfect compiance
38
       
-
 
39
        There are some assumptions which are universal for any formal verification method. For the sake of
38
        with the specifications, etc.). This means that it is solely the OS that defines the
40
        simplicity let us call them \emph{idealized hardware}. Let us also cover the computational model
-
 
41
        and basic mathematical principles by this term.
39
        environment for other software.
42
       
40
       
43
        What is \emph{idealized hardware}? We usually assume that the software is executed by a ``perfect'' hardware
41
        OSes represent the lowest software layer and provide services to essentially all other
44
        which works exactly according to its specification. Every divergence between the intended and actual
42
        software. Considering the principle of recursion, the properties of an OS form the
45
        behavior of software counts as a software bug and never as an issue in some hardware component. We
43
        assumptions for the upper layers of software. Thus the dependability of end-user and
46
        implicitly assume that the hardware is perfect in the sense of physical realization and all probabilities
-
 
47
        of accidental mechanical and electrical failures are expected to be zero.
44
        enterprise software systems is always limited by the dependability of the OS.
48
       
45
       
49
        It is trivial to see that the \emph{idealized hardware} assumptions can never hold in real world.
-
 
50
        Accidental mechanical and electrical failures are inevitable in principle and their probability can
46
        Finally, OSes are non-trivial software on their own. The way they are generally designed
51
        never be a mathematical zero. Does this mean that any formal verification method is ultimately futile
47
        and programmed (spanning both the kernel and user mode, manipulating execution contexts
52
        since we are unable to ensure validity of the most elementary assumptions? Probably not. We just need
48
        and concurrency, handling critical hardware-related operations) represent significant
53
        to be aware about the inherent and fundamental limitations of the formal methods which result from
-
 
54
        the shortcomings of the physical world.
49
        and interesting challenges for software analysis.
55
       
-
 
56
        The more precisely we model the software environment of the software under discussion, the more precisely
-
 
57
        we can calculate or estimate the resulting impact of the imperfections of the physical world on our software
-
 
58
        system. This is the most important motivation for formal reasoning about the correctness of the operating system.
-
 
59
       
50
       
60
        \medskip
51
        \medskip
61
       
52
       
62
        In more detail, operating systems have a somewhat special position among all software:
-
 
63
       
-
 
64
        \begin{itemize}
-
 
65
            \item \emph{Operating systems are usually designed to run on bare hardware.} This means that except
-
 
66
                  the \emph{idealized hardware} assumptions we do not have to take any or almost any extra assumptions
-
 
67
                  into account.
-
 
68
            \item \emph{Operating systems create the lowest software layer and provide services to essentially
53
        These are probably the most important reasons that led to several research initiatives
69
                  all other software.} Considering the principle of recursion, the properties of the
-
 
70
                  operating systems which we prove or disprove form the assumptions for the upper layers
54
        in the recent years which target the creation of a formally verified OSes from scratch
71
                  of software. Thus the dependability of end-user and enterprise software systems is limited
-
 
72
                  by the dependability of the operating system.
-
 
73
            \item \emph{Operating systems are non-trivial software on their own.} The way
55
        (e.g. \cite{seL4}). Methods of formal description and verification provide fundamentally
74
                  they are generally designed and programmed (spanning both the kernel and user mode,
56
        better guarantees of desirable properties than non-exhaustive engineering methods such
75
                  manipulating execution contexts and concurrency, handling critical hardware-related
-
 
76
                  operations) represent significant and interesting challenges for the formal verification
-
 
77
                  methods and tools.
-
 
78
        \end{itemize}
57
        as testing.
79
       
58
       
80
        Even in the informal understanding, the dependability of an operating system greatly determines the perceived
59
        However, 98~\%\footnote{98~\% of client computers connected to the Internet as of January
81
        dependability of the entire software stack. This led to several research initiatives in the recent years
60
        2010~\cite{marketshare}.} of the market share of general-purpose OSes is taken
82
        which target the creation of a formally verified operating systems from scratch~\cite{seL4}.
-
 
83
       
-
 
84
        However, 98~\%\footnote{98~\% of client computers connected to the Internet as of January 2010~\cite{marketshare}.} of
-
 
85
        the market share of general-purpose operating systems is taken by Windows, Mac~OS~X and Linux.
61
        by Windows, Mac~OS~X and Linux. These systems were clearly not designed with formal
86
        These systems were clearly not designed with formal verification in mind from the very beginning.
62
        verification in mind from the very beginning. The situation on the embedded, real-time
87
        The situation on the embedded, real-time and special-purpose operating systems market is probably different,
63
        and special-purpose OSes market is probably different, but it is unlikely that the
88
        but it is unlikely that the situation in the large domain of desktops and servers is going to change
64
        segmentation of the desktop and server OSes market is going to change very rapidly
89
        very rapidly in the near future.
65
        in the near future.
90
       
66
       
91
        Therefore we need to face the challenges of applying formal methods on an existing code base in the domain
67
        The architecture of these major desktop and server OSes is monolithic, which makes
92
        of general-purpose operating systems. Fortunately, the software design qualities of the general-purpose
68
        any attempts to do formal verification on them extremely challenging due to the large
93
        operating systems gradually improve over time. We can see then novel approaches in the operating systems
69
        state space. Fortunatelly we can observe that aspects of several novel approaches from
94
        research from the late 1980s and 1990s (microkernel design, user space file system and device drivers, etc.)
70
        the OS research from the late 1980s and early 1990s (microkernel design, user space
95
        to slowly emerge in the originally monolithic operating systems. We can also see better code quality thanks
71
        file system and device drivers, etc.) are slowly emerging in these originally purely
96
        to improved software engineering (code review, proper escalation management, etc.).
72
        monolithic implementations.
97
       
73
       
98
        \medskip
74
        \medskip
99
       
75
       
100
        This paper proposes an approach and presents a work-in-progress case study of formal verification
76
        In this paper we show how specific design choices can markedly improve the feasibility
101
        of an general-purpose research operating system, which was also not created specifically with formal
77
        of verification of an OS, even if the particular OS was not designed
102
        verification in mind from the very beginning, but it was designed according to state-of-the-art operating systems
78
        specifically with formal verification in mind. These design choices can be gradually
-
 
79
        introduced (and in fact some of them have already been introduced) to mainstream
103
        principles.
80
        general-purpose OSes.
-
 
81
       
-
 
82
        Our approach is not based on using a single ``silver-bullet'' formalism, methodology or
-
 
83
        tool, but on combining various enginering, semi-formal and formal approaches.
-
 
84
        While the lesser formal approaches give lesser guarantees, they can complement
-
 
85
        the formal approaches on their boundaries and increase the coverage of the set of
-
 
86
        all hypothetical interesting properties of the system.
-
 
87
       
-
 
88
        We also demonstrate work-in-progress case study of an general-purpose research OS
-
 
89
        that was not created specifically with formal verification in mind from the very
-
 
90
        beginning, but that was designed according to state-of-the-art OS principles.
104
       
91
       
105
        \medskip
92
        \medskip
106
       
93
       
107
        \noindent\textbf{Structure of the Paper.} In Section \ref{context} we introduce the case study in more detail and explain
94
        \noindent\textbf{Structure of the Paper.} In Section \ref{design} we introduce
108
        why we believe it is relevant. In Section \ref{analysis} we discuss our proposal of the combination of formal methods
95
        the design choices and our case study in more detail. In Section \ref{analysis} we
109
        and tools. In Section \ref{evaluation} we present the preliminary evaluation of our efforts and estimate the complexity
96
        discuss our approach of the combination of methods and tools. In Section \ref{evaluation}
110
        of the imminent next steps we want to take according to our proposal. Finally, in Section \ref{conclusion}
97
        we present a preliminary evaluation of our efforts and propose the imminent next steps
111
        we present the conclusion of the paper.
98
        to take. Finally, in Section \ref{conclusion} we present the conclusion of the paper.
112
   
99
   
113
    \section{Context}
100
    \section{Operating Systems Design}
114
        \label{context}
101
        \label{design}
115
        Two very common schemes of operating system design are \emph{monolithic design} and \emph{microkernel design}.
102
        Two very common schemes of OS design are \emph{monolithic design} and \emph{microkernel design}.
116
        Without going into much detail of any specific operating system, we can define the monolithic design as
103
        Without going into much detail of any specific implementation, we can define the monolithic design as
117
        a preference to put numerous aspects of the core operating system functionality into the kernel,
104
        a preference to put numerous aspects of the core OS functionality into the kernel, while microkernel
118
        while microkernel design is a preference to keep the kernel small, with just a minimal set of features.
105
        design is a preference to keep the kernel small, with just a minimal set of features.
119
       
106
       
120
        The features which are missing from the kernel in the microkernel design are implemented in user space, usually
107
        The features which are missing from the kernel in the microkernel design are implemented
121
        by means of libraries, servers and/or software components.
108
        in user space, usually by means of libraries, servers (e.g. processes/tasks) and/or software components.
122
       
109
       
123
        \subsection{HelenOS}
110
        \subsection{HelenOS}
124
            \label{helenos}
111
            \label{helenos}
125
            \emph{HelenOS} is a general-purpose research operating system which is being developed at Charles
112
            \emph{HelenOS} is a general-purpose research OS which is being developed at Charles
126
            University in Prague. The source code is available under the BSD open source license and can be
113
            University in Prague. The source code is available under the BSD open source license and can be
127
            freely downloaded from the project web site~\cite{helenos}. The authors of the code base are
114
            freely downloaded from the project web site~\cite{helenos}. The authors of the code base are
128
            both from the academia and from the open source community (several contributors are employed
115
            both from the academia and from the open source community (several contributors are employed
129
            as Solaris kernel developers and many are freelance IT professionals). We consistently strive to support
116
            as Solaris kernel developers and many are freelance IT professionals).
130
            the research and also the practical motivations for developing the system.
-
 
131
           
117
           
132
            HelenOS uses a preemptive priority-feedback scheduler, it supports SMP hardware and it is
118
            HelenOS uses a preemptive priority-feedback scheduler, it supports SMP hardware and it is
133
            designed to be highly portable. Currently it runs on 7 distinct hardware architectures, including the
119
            designed to be highly portable. Currently it runs on 7 distinct hardware architectures, including the
134
            most common IA-32, x86-64 (AMD64), IA-64, SPARC~v9 and PowerPC. It also runs on ARMv7 and MIPS,
120
            most common IA-32, x86-64 (AMD64), IA-64, SPARC~v9 and PowerPC. It also runs on ARMv7 and MIPS,
135
            but currently only in simulators and not on physical hardware.
121
            but currently only in simulators and not on physical hardware.
Line 137... Line 123...
137
            Although HelenOS is still far from being an everyday replacement for Linux or Windows due to the lack
123
            Although HelenOS is still far from being an everyday replacement for Linux or Windows due to the lack
138
            of end-user applications (whose development is extremely time-consuming, but unfortunately of
124
            of end-user applications (whose development is extremely time-consuming, but unfortunately of
139
            no scientific value), the essential foundations such as file system support and TCP/IP networking
125
            no scientific value), the essential foundations such as file system support and TCP/IP networking
140
            are already in place.
126
            are already in place.
141
           
127
           
142
            HelenOS does not currently target embedded devices (although the ARMv7 port can be easily modified to
128
            HelenOS does not currently target embedded devices (although the ARMv7 port can be very easily
143
            run on various embedded boards) and does not implement real-time scheduling and synchronization.
129
            modified to run on various embedded boards) and does not implement real-time features.
144
            Many development projects such as task snapshoting and migration, generic device driver
130
            Many development projects such as task snapshoting and migration, support for MMU-less
145
            framework, support for MMU-less platforms and performance monitoring are currently underway.
131
            platforms and performance monitoring are currently underway.
146
           
132
           
147
            \medskip
133
            \medskip
148
           
134
           
149
            HelenOS has a microkernel multiserver design, but the guiding principles of the HelenOS design are
135
            HelenOS can be briefly described as microkernel multiserver design. However, the actual design
150
            actually more elaborate:
136
            guiding principles of the HelenOS are more elaborate:
151
           
137
           
152
            \begin{itemize}
138
            \begin{description}
153
                \item \emph{(Microkernel principle)} Every functionality of the operating system that does not
139
                \item[Microkernel principle] Every functionality of the OS that does not
154
                      have to be necessary implemented in the kernel should be implemented in user space. This
140
                      have to be necessary implemented in the kernel should be implemented in user space. This
155
                      implies that subsystems such as the file system, device drivers (except those which are
141
                      implies that subsystems such as the file system, device drivers (except those which are
156
                      essential for the basic kernel functionality), naming and trading services, networking,
142
                      essential for the basic kernel functionality), naming and trading services, networking,
157
                      human interface and similar features should be implemented in user space.
143
                      human interface and similar features should be implemented in user space.
158
                \item \emph{(Full-fledged principle)} Features which need to be implemented in kernel should
144
                \item[Full-fledged principle] Features which need to be placed in kernel should
159
                      be designed with full-fledged algorithms and data structures. In contrast
145
                      be implemented by full-fledged algorithms and data structures. In contrast
160
                      to several other microkernel operating systems, where the authors have deliberately chosen
146
                      to several other microkernel OSes, where the authors have deliberately chosen
161
                      the most simplistic approach (static memory allocation, na\"{\i}ve algorithms, simple data
147
                      the most simplistic approach (static memory allocation, na\"{\i}ve algorithms, simple data
162
                      structures), HelenOS microkernel tries to use the most advanced and suitable means available.
148
                      structures), HelenOS microkernel tries to use the most advanced and suitable means available.
163
                      It contains features such as AVL and B+ trees, hashing tables, SLAB memory allocator, multiple
149
                      It contains features such as AVL and B+ trees, hashing tables, SLAB memory allocator, multiple
164
                      in-kernel synchronization primitives, fine-grained locking and so on.
150
                      in-kernel synchronization primitives, fine-grained locking and so on.
165
                \item \emph{(Multiserver principle)} Subsystems in user space should be decomposed with the smallest
151
                \item[Multiserver principle] Subsystems in user space should be decomposed with the smallest
166
                      reasonable granularity. Each unit of decomposition should be encapsulated in a separate task.
152
                      reasonable granularity. Each unit of decomposition should be encapsulated in a separate task.
167
                      The tasks represent software components with isolated address spaces. From the design point of
153
                      The tasks represent software components with isolated address spaces. From the design point of
168
                      view the kernel can be seen as a separate component, too.
154
                      view the kernel can be seen as a separate component, too.
169
                \item \emph{(Split of mechanism and policy)} The kernel should only provide low-level mechanisms,
155
                \item[Split of mechanism and policy] The kernel should only provide low-level mechanisms,
170
                      while the high-level policies which are built upon these mechanisms should be defined in
156
                      while the high-level policies which are built upon these mechanisms should be defined in
171
                      user space. This also implies that the policies should be easily replaceable while keeping
157
                      user space. This also implies that the policies should be easily replaceable while keeping
172
                      the low-level mechanisms intact.
158
                      the low-level mechanisms intact.
173
                \item \emph{(Encapsulation principle)} The communication between the tasks/components should be
159
                \item[Encapsulation principle] The communication between the tasks/components should be
174
                      implemented only via a set of well-defined interfaces. In the user-to-user case the preferred
160
                      implemented only via a set of well-defined interfaces. In the user-to-user case the preferred
175
                      communication mechanism is HelenOS IPC, which provides reasonable mix of abstraction and
161
                      communication mechanism is HelenOS IPC, which provides reasonable mix of abstraction and
176
                      performance (RPC-like primitives combined with implicit memory sharing for large data
162
                      performance (RPC-like primitives combined with implicit memory sharing for large data
177
                      transfers). In case of synchronous user-to-kernel communication the usual syscalls are used.
163
                      transfers). In case of synchronous user-to-kernel communication the usual syscalls are used.
178
                      HelenOS IPC is used again for asynchronous kernel-to-user communication.
164
                      HelenOS IPC is used again for asynchronous kernel-to-user communication.
179
                \item \emph{(Portability principle)} The design and implementation should always maintain a high
165
                \item[Portability principle] The design and implementation should always maintain a high
180
                      level of platform neutrality and portability. Platform-specific code in the kernel, core
166
                      level of platform neutrality and portability. Platform-specific code in the kernel, core
181
                      libraries and tasks implementing low-level functionality (e.g. device drivers) should be
167
                      libraries and tasks implementing device drivers should be clearly separated from the
182
                      clearly separated from the generic code (either by component decomposition, naming and trading,
-
 
183
                      or at least by internal compile-time APIs).
168
                      generic code (either by component decomposition or at least by internal compile-time APIs).
184
            \end{itemize}
169
            \end{description}
185
           
170
           
186
            As these design guiding principles suggest, the size of the HelenOS microkernel is considerably larger
171
            In Section \ref{analysis} we argue that several of these design principles significantly improve
187
            compared to ``scrupulous'' microkernel implementations. The average footprint of the kernel ranges from
-
 
188
            569~KiB when all logging messages, asserts, symbol resolution and debugging kernel console are compiled
-
 
189
            in, down to 198~KiB for a non-debugging production build. We do not believe that the raw size
172
            the feasibility of formal verification of the entire system. On the other hand, other design principles
190
            of the microkernel is a relevant quality criterion per se, without taking the actual feature set
173
            induce new interesting challenges for formal description and verification.
191
            into account.
-
 
192
           
-
 
193
            \medskip
-
 
194
           
174
           
195
            The run-time architecture of HelenOS is inherently dynamic. The bindings between the components are
175
            The run-time architecture of HelenOS is inherently dynamic. The bindings between the components are
196
            not created at compile-time, but during the bootstrap process and can be modified to a large degree
176
            not created at compile-time, but during bootstrap and can be modified to a large degree also during
197
            also during normal operation mode of the system (via human interaction and external events). This
177
            normal operation mode of the system (via human interaction and external events).
198
            creates particularly interesting challenges for describing the design of the system by many formalisms.
-
 
199
           
178
           
200
            \medskip
-
 
201
           
-
 
202
            Yet another set of obstacles for reasoning about the properties of HelenOS lies in the design of
179
            The design of the ubiquitous HelenOS IPC mechanism and the associated threading model present
203
            the ubiquitous HelenOS IPC mechanism and the associated threading model. The IPC is inherently
180
            the possibility to significantly reduce the size of the state space which needs to be explored
-
 
181
            by formal verification tools, but at the same time it is quite hard to express these
204
            asynchronous with constant message buffers in the kernel and dynamic buffers in user space.
182
            constrains in many formalisms. The IPC is inherently asynchronous with constant message buffers
-
 
183
            in the kernel and dynamic buffers in user space. It uses the notions of uni-directional bindings,
205
            It uses the notions of uni-directional bindings, mandatory pairing of requests and replies,
184
            mandatory pairing of requests and replies, binding establishment and abolishment handshakes,
206
            binding establishment and abolishment handshakes, memory sharing and fast message forwarding.
185
            memory sharing and fast message forwarding.
207
           
186
           
208
            For easier management of the asynchronous messages and the possibility to process multiple
187
            For easier management of the asynchronous messages and the possibility to process multiple
209
            messages from different peers without the usual kernel threading overhead, the core user space
188
            messages from different peers without the usual kernel threading overhead, the core user space
210
            library manages the execution flow by so-called \emph{fibrils}. A fibril is a user-space-managed thread with
189
            library manages the execution flow by so-called \emph{fibrils}. A fibril is a user-space-managed
211
            cooperative scheduling. A different fibril is scheduled every time the current fibril is
190
            thread with cooperative scheduling. A different fibril is scheduled every time the current fibril
212
            about to be blocked while sending out IPC requests (because the kernel buffers of the addressee
191
            is about to be blocked while sending out IPC requests (because the kernel buffers of the addressee
213
            are full) or while waiting on an IPC reply. This allows different execution flows within the
192
            are full) or while waiting on an IPC reply. This allows different execution flows within the
214
            same thread to process multiple requests and replies. To safeguard proper sequencing
193
            same thread to process multiple requests and replies. To safeguard proper sequencing of IPC
215
            of IPC messages and provide synchronization, special fibril-aware synchronization primitives
194
            messages and provide synchronization, special fibril-aware synchronization primitives
216
            (mutexes, condition variables, etc.) are available.
195
            (mutexes, condition variables, etc.) are available.
217
           
196
           
218
            Because of the cooperative nature of fibrils, they might cause severe performance under-utilization
197
            Because of the cooperative nature of fibrils, they might cause severe performance under-utilization
219
            in SMP configurations and system-wide bottlenecks. As multicore processors are more and more
198
            in SMP configurations and system-wide bottlenecks. As multicore processors are more and more
220
            common nowadays, that would be a substantial design flaw. Therefore the fibrils can be also freely
199
            common nowadays, that would be a substantial design flaw. Therefore the fibrils can be also freely
Line 222... Line 201...
222
            preemptive scheduling and true parallelism on SMP machines. Needless to say, this combination is
201
            preemptive scheduling and true parallelism on SMP machines. Needless to say, this combination is
223
            also a grand challenge for the formal reasoning.
202
            also a grand challenge for the formal reasoning.
224
           
203
           
225
            \medskip
204
            \medskip
226
           
205
           
-
 
206
            Incidentally, the \emph{full-fledged principle} causes that the size of the HelenOS microkernel is
-
 
207
            considerably larger compared to other ``scrupulous'' microkernel implementations. The average
-
 
208
            footprint of the kernel on IA-32 ranges from 569~KiB when all logging messages, asserts, symbol
-
 
209
            resolution and the debugging kernel console are compiled in, down to 198~KiB for a non-debugging
-
 
210
            production build. But we do not believe that the raw size of the microkernel is a relevant quality
-
 
211
            criterion per se, without taking the actual feature set into account.
-
 
212
           
-
 
213
            \medskip
-
 
214
           
227
            To sum up, the choice of HelenOS as our case study is based on the fact that it was not designed
215
            To sum up, the choice of HelenOS as our case study is based on the fact that it was not designed
228
            in advance with formal verification in mind. This is similar to most general-purpose operating
216
            in advance with formal verification in mind (some of the design principles might be beneficial,
229
            systems in common use. At the same time, it does not have an obsolete design and is non-trivial.
217
            but others might be disadvantageous), but the design of HelenOS is also non-trivial and not obsolete.
230
           
218
           
231
        \subsection{The C Programming Language}
219
        \subsection{The C Programming Language}
232
            A large majority of operating systems is coded in the C programming language. HelenOS is no exception
220
            A large majority of OSes is coded in the C programming language (HelenOS is no exception
233
            to this. The choice of C in the case of kernel is usually well-motivated -- the language was designed
221
            to this). The choice of C in the case of kernel is usually well-motivated, since the C language was designed
234
            specifically for implementing system software~\cite{c}. It is reasonably low-level in the sense that it allows
222
            specifically for implementing system software~\cite{c}: It is reasonably low-level in the sense that it allows
235
            to access the memory and other hardware resources with similar effectiveness as from assembler.
223
            to access the memory and other hardware resources with similar effectiveness as from assembler;
236
            It also requires almost no run-time support and it exports many features of the von Neumann hardware
224
            It also requires almost no run-time support and it exports many features of the von Neumann hardware
237
            architecture to the programmer in a very straightforward, but still relatively portable way.
225
            architecture to the programmer in a very straightforward, but still relatively portable way.
238
           
226
           
239
            However, what is the biggest advantage of C in terms of run-time performance is also the biggest weakness
227
            However, what is the biggest advantage of C in terms of run-time performance is also the biggest weakness
240
            for formal reasoning. The permissive memory access model of C, the lack of any reference safety
228
            for formal reasoning. The permissive memory access model of C, the lack of any reference safety
241
            enforcement, the weak type system and generally little semantic information in the code -- all these
229
            enforcement, the weak type system and generally little semantic information in the code -- all these
242
            properties do not allow to make many general assumptions about the code.
230
            properties that do not allow to make many general assumptions about the code.
243
           
231
           
244
            Programming languages which target controlled environments such as Java or C\(\sharp\) are
232
            Programming languages which target controlled environments such as Java or C\(\sharp\) are
245
            generally easier for formal reasoning because they provide a well-known set of primitives
233
            generally easier for formal reasoning because they provide a well-known set of primitives
246
            and language constructs for object ownership, threading and synchronization. Many non-imperative
234
            and language constructs for object ownership, threading and synchronization. Many non-imperative
247
            programming languages can be even considered to be a form of ``executable specification'' and thus
235
            programming languages can be even considered to be a form of ``executable specification'' and thus
248
            very suitable for formal reasoning. In C, almost everything is left to the programmer who
236
            very suitable for formal reasoning. In C, almost everything is left to the programmer who
249
            is free to set the rules.
237
            is free to set the rules.
250
           
238
           
251
            \medskip
239
            \medskip
252
           
240
           
253
            The reasons for using C in the user space of HelenOS (and other established operating systems) is
241
            The reasons for frequent use of C in the user space of many established OSes (and HelenOS) is
254
            probably much more questionable. Except for the core libraries and services (such as device drivers),
242
            probably much more questionable. In the case of HelenOS, except for the core libraries and tasks
255
            C might be easily replaced by any high-level and perhaps even non-imperative programming language.
243
            (such as device drivers), C might be easily replaced by any high-level and perhaps even
256
            The reasons for using C in this context is mostly historical.
244
            non-imperative programming language. The reasons for using C in this context are mostly historical.
257
           
245
           
258
            However, as we have stated in Section \ref{introduction}, the way general-purpose operating systems
246
            However, as we have stated in Section \ref{introduction}, the way general-purpose OSes
259
            are implemented changes only slowly and therefore any propositions which require radical modification
247
            are implemented changes only slowly and therefore any propositions which require radical modification
260
            of the existing code base before committing to the formal verification are not realistic.
248
            of the existing code base before committing to the formal verification are not realistic.
261
       
249
       
262
    \section{Analysis}
250
    \section{Analysis}
263
        \label{analysis}
251
        \label{analysis}
Line 272... Line 260...
272
       
260
       
273
        In this section, we analyze the properties we would like to check in a general-purpose
261
        In this section, we analyze the properties we would like to check in a general-purpose
274
        operating system. Each set of properties usually requires a specific verification method,
262
        operating system. Each set of properties usually requires a specific verification method,
275
        tool or toolchain.
263
        tool or toolchain.
276
       
264
       
277
        Our approach will be mostly bottom-to-top, or, in other words, from the lower levels of abstraction
265
        Our approach will be mostly bottom-up, or, in other words, from the lower levels of abstraction
278
        to the higher levels of abstraction. If the verification fails on a lower level, it usually
266
        to the higher levels of abstraction. If the verification fails on a lower level, it usually
279
        does not make much sense to continue with the higher levels of abstraction until the issues
267
        does not make much sense to continue with the higher levels of abstraction until the issues
280
        are tackled. A structured overview of the formalisms and tools can be seen on Figure \ref{fig:diag}.
268
        are tackled. A structured overview of the formalisms, methods and tools can be seen on
-
 
269
        Figure \ref{fig:diag}.
-
 
270
       
-
 
271
        \medskip
-
 
272
       
-
 
273
        Some of the proposed methods cannot be called ``formal methods'' in the rigorous understanding
-
 
274
        of the term. However, even methods which are based on semi-formal reasoning and non-exhaustive
-
 
275
        testing provide some limited guarantees in their specific context. A valued property
-
 
276
        of the formal methods is to preserve these limited guarantees even on the higher levels
-
 
277
        of abstraction, thus complementing the formal guarantees where the formal methods do not provide
-
 
278
        any feasible verification so far. This increases the coverage of the set of all hypothetical
-
 
279
        interesting properties of the system (although it is probably impossible to formally define
-
 
280
        this set).
-
 
281
       
-
 
282
        \medskip
281
       
283
       
282
        Please note that the titles of the following sections do not follow any particular established
284
        Please note that the titles of the following sections do not follow any particular established
283
        taxonomy of verification methods. We have simply chosen the names to be descriptive.
285
        taxonomy. We have simply chosen the names to be intuitivelly descriptive.
284
       
286
       
285
        \subsection{C Language Compiler and Continuous Integration Tool}
287
        \subsection{C Language Compiler and Continuous Integration Tool}
286
            \label{clang}
288
            \label{clang}
287
            The initial levels of abstraction do not go far from the C source code. First, we would certainly like to
289
            The initial levels of abstraction do not go far from the C source code. First, we would certainly like to
288
            know whether our code base is compliant with the programming language specification and passes
290
            know whether our code base is compliant with the programming language specification and passes