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 |