2 |
- |
1 |
.HTML "Plan 9 from Bell Labs"
|
|
|
2 |
.TL
|
|
|
3 |
Plan 9 from Bell Labs
|
|
|
4 |
.AU
|
|
|
5 |
Rob Pike
|
|
|
6 |
Dave Presotto
|
|
|
7 |
Sean Dorward
|
|
|
8 |
Bob Flandrena
|
|
|
9 |
Ken Thompson
|
|
|
10 |
Howard Trickey
|
|
|
11 |
Phil Winterbottom
|
|
|
12 |
.AI
|
|
|
13 |
.MH
|
|
|
14 |
USA
|
|
|
15 |
.SH
|
|
|
16 |
Motivation
|
|
|
17 |
.PP
|
|
|
18 |
.FS
|
|
|
19 |
Appeared in a slightly different form in
|
|
|
20 |
.I
|
|
|
21 |
Computing Systems,
|
|
|
22 |
.R
|
|
|
23 |
Vol 8 #3, Summer 1995, pp. 221-254.
|
|
|
24 |
.FE
|
|
|
25 |
By the mid 1980's, the trend in computing was
|
|
|
26 |
away from large centralized time-shared computers towards
|
|
|
27 |
networks of smaller, personal machines,
|
|
|
28 |
typically UNIX `workstations'.
|
|
|
29 |
People had grown weary of overloaded, bureaucratic timesharing machines
|
|
|
30 |
and were eager to move to small, self-maintained systems, even if that
|
|
|
31 |
meant a net loss in computing power.
|
|
|
32 |
As microcomputers became faster, even that loss was recovered, and
|
|
|
33 |
this style of computing remains popular today.
|
|
|
34 |
.PP
|
|
|
35 |
In the rush to personal workstations, though, some of their weaknesses
|
|
|
36 |
were overlooked.
|
|
|
37 |
First, the operating system they run, UNIX, is itself an old timesharing system and
|
|
|
38 |
has had trouble adapting to ideas
|
|
|
39 |
born after it. Graphics and networking were added to UNIX well into
|
|
|
40 |
its lifetime and remain poorly integrated and difficult to administer.
|
|
|
41 |
More important, the early focus on having private machines
|
|
|
42 |
made it difficult for networks of machines to serve as seamlessly as the old
|
|
|
43 |
monolithic timesharing systems.
|
|
|
44 |
Timesharing centralized the management
|
|
|
45 |
and amortization of costs and resources;
|
|
|
46 |
personal computing fractured, democratized, and ultimately amplified
|
|
|
47 |
administrative problems.
|
|
|
48 |
The choice of
|
|
|
49 |
an old timesharing operating system to run those personal machines
|
|
|
50 |
made it difficult to bind things together smoothly.
|
|
|
51 |
.PP
|
|
|
52 |
Plan 9 began in the late 1980's as an attempt to have it both
|
|
|
53 |
ways: to build a system that was centrally administered and cost-effective
|
|
|
54 |
using cheap modern microcomputers as its computing elements.
|
|
|
55 |
The idea was to build a time-sharing system out of workstations, but in a novel way.
|
|
|
56 |
Different computers would handle
|
|
|
57 |
different tasks: small, cheap machines in people's offices would serve
|
|
|
58 |
as terminals providing access to large, central, shared resources such as computing
|
|
|
59 |
servers and file servers. For the central machines, the coming wave of
|
|
|
60 |
shared-memory multiprocessors seemed obvious candidates.
|
|
|
61 |
The philosophy is much like that of the Cambridge
|
|
|
62 |
Distributed System [NeHe82].
|
|
|
63 |
The early catch phrase was to build a UNIX out of a lot of little systems,
|
|
|
64 |
not a system out of a lot of little UNIXes.
|
|
|
65 |
.PP
|
|
|
66 |
The problems with UNIX were too deep to fix, but some of its ideas could be
|
|
|
67 |
brought along. The best was its use of the file system to coordinate
|
|
|
68 |
naming of and access to resources, even those, such as devices, not traditionally
|
|
|
69 |
treated as files.
|
|
|
70 |
For Plan 9, we adopted this idea by designing a network-level protocol, called 9P,
|
|
|
71 |
to enable machines to access files on remote systems.
|
|
|
72 |
Above this, we built a naming
|
|
|
73 |
system that lets people and their computing agents build customized views
|
|
|
74 |
of the resources in the network.
|
|
|
75 |
This is where Plan 9 first began to look different:
|
|
|
76 |
a Plan 9 user builds a private computing environment and recreates it wherever
|
|
|
77 |
desired, rather than doing all computing on a private machine.
|
|
|
78 |
It soon became clear that this model was richer
|
|
|
79 |
than we had foreseen, and the ideas of per-process name spaces
|
|
|
80 |
and file-system-like resources were extended throughout
|
|
|
81 |
the system\(emto processes, graphics, even the network itself.
|
|
|
82 |
.PP
|
|
|
83 |
By 1989 the system had become solid enough
|
|
|
84 |
that some of us began using it as our exclusive computing environment.
|
|
|
85 |
This meant bringing along many of the services and applications we had
|
|
|
86 |
used on UNIX. We used this opportunity to revisit many issues, not just
|
|
|
87 |
kernel-resident ones, that we felt UNIX addressed badly.
|
|
|
88 |
Plan 9 has new compilers,
|
|
|
89 |
languages,
|
|
|
90 |
libraries,
|
|
|
91 |
window systems,
|
|
|
92 |
and many new applications.
|
|
|
93 |
Many of the old tools were dropped, while those brought along have
|
|
|
94 |
been polished or rewritten.
|
|
|
95 |
.PP
|
|
|
96 |
Why be so all-encompassing?
|
|
|
97 |
The distinction between operating system, library, and application
|
|
|
98 |
is important to the operating system researcher but uninteresting to the
|
|
|
99 |
user. What matters is clean functionality.
|
|
|
100 |
By building a complete new system,
|
|
|
101 |
we were able to solve problems where we thought they should be solved.
|
|
|
102 |
For example, there is no real `tty driver' in the kernel; that is the job of the window
|
|
|
103 |
system.
|
|
|
104 |
In the modern world, multi-vendor and multi-architecture computing
|
|
|
105 |
are essential, yet the usual compilers and tools assume the program is being
|
|
|
106 |
built to run locally; we needed to rethink these issues.
|
|
|
107 |
Most important, though, the test of a system is the computing
|
|
|
108 |
environment it provides.
|
|
|
109 |
Producing a more efficient way to run the old UNIX warhorses
|
|
|
110 |
is empty engineering;
|
|
|
111 |
we were more interested in whether the new ideas suggested by
|
|
|
112 |
the architecture of the underlying system encourage a more effective way of working.
|
|
|
113 |
Thus, although Plan 9 provides an emulation environment for
|
|
|
114 |
running POSIX commands, it is a backwater of the system.
|
|
|
115 |
The vast majority
|
|
|
116 |
of system software is developed in the `native' Plan 9 environment.
|
|
|
117 |
.PP
|
|
|
118 |
There are benefits to having an all-new system.
|
|
|
119 |
First, our laboratory has a history of building experimental peripheral boards.
|
|
|
120 |
To make it easy to write device drivers,
|
|
|
121 |
we want a system that is available in source form
|
|
|
122 |
(no longer guaranteed with UNIX, even
|
|
|
123 |
in the laboratory in which it was born).
|
|
|
124 |
Also, we want to redistribute our work, which means the software
|
|
|
125 |
must be locally produced. For example, we could have used some vendors'
|
|
|
126 |
C compilers for our system, but even had we overcome the problems with
|
|
|
127 |
cross-compilation, we would have difficulty
|
|
|
128 |
redistributing the result.
|
|
|
129 |
.PP
|
|
|
130 |
This paper serves as an overview of the system. It discusses the architecture
|
|
|
131 |
from the lowest building blocks to the computing environment seen by users.
|
|
|
132 |
It also serves as an introduction to the rest of the Plan 9 Programmer's Manual,
|
|
|
133 |
which it accompanies. More detail about topics in this paper
|
|
|
134 |
can be found elsewhere in the manual.
|
|
|
135 |
.SH
|
|
|
136 |
Design
|
|
|
137 |
.PP
|
|
|
138 |
The view of the system is built upon three principles.
|
|
|
139 |
First, resources are named and accessed like files in a hierarchical file system.
|
|
|
140 |
Second, there is a standard protocol, called 9P, for accessing these
|
|
|
141 |
resources.
|
|
|
142 |
Third, the disjoint hierarchies provided by different services are
|
|
|
143 |
joined together into a single private hierarchical file name space.
|
|
|
144 |
The unusual properties of Plan 9 stem from the consistent, aggressive
|
|
|
145 |
application of these principles.
|
|
|
146 |
.PP
|
|
|
147 |
A large Plan 9 installation has a number of computers networked
|
|
|
148 |
together, each providing a particular class of service.
|
|
|
149 |
Shared multiprocessor servers provide computing cycles;
|
|
|
150 |
other large machines offer file storage.
|
|
|
151 |
These machines are located in an air-conditioned machine
|
|
|
152 |
room and are connected by high-performance networks.
|
|
|
153 |
Lower bandwidth networks such as Ethernet or ISDN connect these
|
|
|
154 |
servers to office- and home-resident workstations or PCs, called terminals
|
|
|
155 |
in Plan 9 terminology.
|
|
|
156 |
Figure 1 shows the arrangement.
|
|
|
157 |
.KF
|
|
|
158 |
.PS < network.pic
|
|
|
159 |
.IP
|
|
|
160 |
.ps -1
|
|
|
161 |
.in .25i
|
|
|
162 |
.ll -.25i
|
|
|
163 |
.ps -1
|
|
|
164 |
.vs -1
|
|
|
165 |
.I "Figure 1. Structure of a large Plan 9 installation.
|
|
|
166 |
CPU servers and file servers share fast local-area networks,
|
|
|
167 |
while terminals use slower wider-area networks such as Ethernet,
|
|
|
168 |
Datakit, or telephone lines to connect to them.
|
|
|
169 |
Gateway machines, which are just CPU servers connected to multiple
|
|
|
170 |
networks, allow machines on one network to see another.
|
|
|
171 |
.ps +1
|
|
|
172 |
.vs +1
|
|
|
173 |
.ll +.25i
|
|
|
174 |
.in 0
|
|
|
175 |
.ps
|
|
|
176 |
.sp
|
|
|
177 |
.KE
|
|
|
178 |
.PP
|
|
|
179 |
The modern style of computing offers each user a dedicated workstation or PC.
|
|
|
180 |
Plan 9's approach is different.
|
|
|
181 |
The various machines with screens, keyboards, and mice all provide
|
|
|
182 |
access to the resources of the network, so they are functionally equivalent,
|
|
|
183 |
in the manner of the terminals attached to old timesharing systems.
|
|
|
184 |
When someone uses the system, though,
|
|
|
185 |
the terminal is temporarily personalized by that user.
|
|
|
186 |
Instead of customizing the hardware, Plan 9 offers the ability to customize
|
|
|
187 |
one's view of the system provided by the software.
|
|
|
188 |
That customization is accomplished by giving local, personal names for the
|
|
|
189 |
publicly visible resources in the network.
|
|
|
190 |
Plan 9 provides the mechanism to assemble a personal view of the public
|
|
|
191 |
space with local names for globally accessible resources.
|
|
|
192 |
Since the most important resources of the network are files, the model
|
|
|
193 |
of that view is file-oriented.
|
|
|
194 |
.PP
|
|
|
195 |
The client's local name space provides a way to customize the user's
|
|
|
196 |
view of the network. The services available in the network all export file
|
|
|
197 |
hierarchies.
|
|
|
198 |
Those important to the user are gathered together into
|
|
|
199 |
a custom name space; those of no immediate interest are ignored.
|
|
|
200 |
This is a different style of use from the idea of a `uniform global name space'.
|
|
|
201 |
In Plan 9, there are known names for services and uniform names for
|
|
|
202 |
files exported by those services,
|
|
|
203 |
but the view is entirely local. As an analogy, consider the difference
|
|
|
204 |
between the phrase `my house' and the precise address of the speaker's
|
|
|
205 |
home. The latter may be used by anyone but the former is easier to say and
|
|
|
206 |
makes sense when spoken.
|
|
|
207 |
It also changes meaning depending on who says it,
|
|
|
208 |
yet that does not cause confusion.
|
|
|
209 |
Similarly, in Plan 9 the name
|
|
|
210 |
.CW /dev/cons
|
|
|
211 |
always refers to the user's terminal and
|
|
|
212 |
.CW /bin/date
|
|
|
213 |
the correct version of the date
|
|
|
214 |
command to run,
|
|
|
215 |
but which files those names represent depends on circumstances such as the
|
|
|
216 |
architecture of the machine executing
|
|
|
217 |
.CW date .
|
|
|
218 |
Plan 9, then, has local name spaces that obey globally understood
|
|
|
219 |
conventions;
|
|
|
220 |
it is the conventions that guarantee sane behavior in the presence
|
|
|
221 |
of local names.
|
|
|
222 |
.PP
|
|
|
223 |
The 9P protocol is structured as a set of transactions that
|
|
|
224 |
send a request from a client to a (local or remote) server and return the result.
|
|
|
225 |
9P controls file systems, not just files:
|
|
|
226 |
it includes procedures to resolve file names and traverse the name
|
|
|
227 |
hierarchy of the file system provided by the server.
|
|
|
228 |
On the other hand,
|
|
|
229 |
the client's name space is held by the client system alone, not on or with the server,
|
|
|
230 |
a distinction from systems such as Sprite [OCDNW88].
|
|
|
231 |
Also, file access is at the level of bytes, not blocks, which distinguishes
|
|
|
232 |
9P from protocols like NFS and RFS.
|
|
|
233 |
A paper by Welch compares Sprite, NFS, and Plan 9's network file system structures [Welc94].
|
|
|
234 |
.PP
|
|
|
235 |
This approach was designed with traditional files in mind,
|
|
|
236 |
but can be extended
|
|
|
237 |
to many other resources.
|
|
|
238 |
Plan 9 services that export file hierarchies include I/O devices,
|
|
|
239 |
backup services,
|
|
|
240 |
the window system,
|
|
|
241 |
network interfaces,
|
|
|
242 |
and many others.
|
|
|
243 |
One example is the process file system,
|
|
|
244 |
.CW /proc ,
|
|
|
245 |
which provides a clean way
|
|
|
246 |
to examine and control running processes.
|
|
|
247 |
Precursor systems had a similar idea [Kill84], but Plan 9 pushes the
|
|
|
248 |
file metaphor much further [PPTTW93].
|
|
|
249 |
The file system model is well-understood, both by system builders and general users,
|
|
|
250 |
so services that present file-like interfaces are easy to build, easy to understand,
|
|
|
251 |
and easy to use.
|
|
|
252 |
Files come with agreed-upon rules for
|
|
|
253 |
protection,
|
|
|
254 |
naming,
|
|
|
255 |
and access both local and remote,
|
|
|
256 |
so services built this way are ready-made for a distributed system.
|
|
|
257 |
(This is a distinction from `object-oriented' models, where these issues
|
|
|
258 |
must be faced anew for every class of object.)
|
|
|
259 |
Examples in the sections that follow illustrate these ideas in action.
|
|
|
260 |
.SH
|
|
|
261 |
The Command-level View
|
|
|
262 |
.PP
|
|
|
263 |
Plan 9 is meant to be used from a machine with a screen running
|
|
|
264 |
the window system.
|
|
|
265 |
It has no notion of `teletype' in the UNIX sense. The keyboard handling of
|
|
|
266 |
the bare system is rudimentary, but once the window system, 8½ [Pike91],
|
|
|
267 |
is running,
|
|
|
268 |
text can be edited with `cut and paste' operations from a pop-up menu,
|
|
|
269 |
copied between windows, and so on.
|
|
|
270 |
8½ permits editing text from the past, not just on the current input line.
|
|
|
271 |
The text-editing capabilities of 8½ are strong enough to displace
|
|
|
272 |
special features such as history in the shell,
|
|
|
273 |
paging and scrolling,
|
|
|
274 |
and mail editors.
|
|
|
275 |
8½ windows do not support cursor addressing and,
|
|
|
276 |
except for one terminal emulator to simplify connecting to traditional systems,
|
|
|
277 |
there is no cursor-addressing software in Plan 9.
|
|
|
278 |
.PP
|
|
|
279 |
Each window is created in a separate name space.
|
|
|
280 |
Adjustments made to the name space in a window do not affect other windows
|
|
|
281 |
or programs, making it safe to experiment with local modifications to the name
|
|
|
282 |
space, for example
|
|
|
283 |
to substitute files from the dump file system when debugging.
|
|
|
284 |
Once the debugging is done, the window can be deleted and all trace of the
|
|
|
285 |
experimental apparatus is gone.
|
|
|
286 |
Similar arguments apply to the private space each window has for environment
|
|
|
287 |
variables, notes (analogous to UNIX signals), etc.
|
|
|
288 |
.PP
|
|
|
289 |
Each window is created running an application, such as the shell, with
|
|
|
290 |
standard input and output connected to the editable text of the window.
|
|
|
291 |
Each window also has a private bitmap and multiplexed access to the
|
|
|
292 |
keyboard, mouse, and other graphical resources through files like
|
|
|
293 |
.CW /dev/mouse ,
|
|
|
294 |
.CW /dev/bitblt ,
|
|
|
295 |
and
|
|
|
296 |
.CW /dev/cons
|
|
|
297 |
(analogous to UNIX's
|
|
|
298 |
.CW /dev/tty ).
|
|
|
299 |
These files are provided by 8½, which is implemented as a file server.
|
|
|
300 |
Unlike X windows, where a new application typically creates a new window
|
|
|
301 |
to run in, an 8½ graphics application usually runs in the window where it starts.
|
|
|
302 |
It is possible and efficient for an application to create a new window, but
|
|
|
303 |
that is not the style of the system.
|
|
|
304 |
Again contrasting to X, in which a remote application makes a network
|
|
|
305 |
call to the X server to start running,
|
|
|
306 |
a remote 8½ application sees the
|
|
|
307 |
.CW mouse ,
|
|
|
308 |
.CW bitblt ,
|
|
|
309 |
and
|
|
|
310 |
.CW cons
|
|
|
311 |
files for the window as usual in
|
|
|
312 |
.CW /dev ;
|
|
|
313 |
it does not know whether the files are local.
|
|
|
314 |
It just reads and writes them to control the window;
|
|
|
315 |
the network connection is already there and multiplexed.
|
|
|
316 |
.PP
|
|
|
317 |
The intended style of use is to run interactive applications such as the window
|
|
|
318 |
system and text editor on the terminal and to run computation- or file-intensive
|
|
|
319 |
applications on remote servers.
|
|
|
320 |
Different windows may be running programs on different machines over
|
|
|
321 |
different networks, but by making the name space equivalent in all windows,
|
|
|
322 |
this is transparent: the same commands and resources are available, with the same names,
|
|
|
323 |
wherever the computation is performed.
|
|
|
324 |
.PP
|
|
|
325 |
The command set of Plan 9 is similar to that of UNIX.
|
|
|
326 |
The commands fall into several broad classes. Some are new programs for
|
|
|
327 |
old jobs: programs like
|
|
|
328 |
.CW ls ,
|
|
|
329 |
.CW cat ,
|
|
|
330 |
and
|
|
|
331 |
.CW who
|
|
|
332 |
have familiar names and functions but are new, simpler implementations.
|
|
|
333 |
.CW Who ,
|
|
|
334 |
for example, is a shell script, while
|
|
|
335 |
.CW ps
|
|
|
336 |
is just 95 lines of C code.
|
|
|
337 |
Some commands are essentially the same as their UNIX ancestors:
|
|
|
338 |
.CW awk ,
|
|
|
339 |
.CW troff ,
|
|
|
340 |
and others have been converted to ANSI C and extended to handle
|
|
|
341 |
Unicode, but are still the familiar tools.
|
|
|
342 |
Some are entirely new programs for old niches: the shell
|
|
|
343 |
.CW rc ,
|
|
|
344 |
text editor
|
|
|
345 |
.CW sam ,
|
|
|
346 |
debugger
|
|
|
347 |
.CW acid ,
|
|
|
348 |
and others
|
|
|
349 |
displace the better-known UNIX tools with similar jobs.
|
|
|
350 |
Finally, about half the commands are new.
|
|
|
351 |
.PP
|
|
|
352 |
Compatibility was not a requirement for the system.
|
|
|
353 |
Where the old commands or notation seemed good enough, we
|
|
|
354 |
kept them. When they didn't, we replaced them.
|
|
|
355 |
.SH
|
|
|
356 |
The File Server
|
|
|
357 |
.PP
|
|
|
358 |
A central file server stores permanent files and presents them to the network
|
|
|
359 |
as a file hierarchy exported using 9P.
|
|
|
360 |
The server is a stand-alone system, accessible only over the network,
|
|
|
361 |
designed to do its one job well.
|
|
|
362 |
It runs no user processes, only a fixed set of routines compiled into the
|
|
|
363 |
boot image.
|
|
|
364 |
Rather than a set of disks or separate file systems,
|
|
|
365 |
the main hierarchy exported by the server is a single
|
|
|
366 |
tree, representing files on many disks.
|
|
|
367 |
That hierarchy is
|
|
|
368 |
shared by many users over a wide area on a variety of networks.
|
|
|
369 |
Other file trees exported by
|
|
|
370 |
the server include
|
|
|
371 |
special-purpose systems such as temporary storage and, as explained
|
|
|
372 |
below, a backup service.
|
|
|
373 |
.PP
|
|
|
374 |
The file server has three levels of storage.
|
|
|
375 |
The central server in our installation has
|
|
|
376 |
about 100 megabytes of memory buffers,
|
|
|
377 |
27 gigabytes of magnetic disks,
|
|
|
378 |
and 350 gigabytes of
|
|
|
379 |
bulk storage in a write-once-read-many (WORM) jukebox.
|
|
|
380 |
The disk is a cache for the WORM and the memory is a cache for the disk;
|
|
|
381 |
each is much faster, and sees about an order of magnitude more traffic,
|
|
|
382 |
than the level it caches.
|
|
|
383 |
The addressable data in the file system can be larger than the size of the
|
|
|
384 |
magnetic disks, because they are only a cache;
|
|
|
385 |
our main file server has about 40 gigabytes of active storage.
|
|
|
386 |
.PP
|
|
|
387 |
The most unusual feature of the file server
|
|
|
388 |
comes from its use of a WORM device for
|
|
|
389 |
stable storage.
|
|
|
390 |
Every morning at 5 o'clock, a
|
|
|
391 |
.I dump
|
|
|
392 |
of the file system occurs automatically.
|
|
|
393 |
The file system is frozen and
|
|
|
394 |
all blocks modified since the last dump
|
|
|
395 |
are queued to be written to the WORM.
|
|
|
396 |
Once the blocks are queued,
|
|
|
397 |
service is restored and
|
|
|
398 |
the read-only root of the dumped
|
|
|
399 |
file system appears in a
|
|
|
400 |
hierarchy of all dumps ever taken, named by its date.
|
|
|
401 |
For example, the directory
|
|
|
402 |
.CW /n/dump/1995/0315
|
|
|
403 |
is the root directory of an image of the file system
|
|
|
404 |
as it appeared in the early morning of March 15, 1995.
|
|
|
405 |
It takes a few minutes to queue the blocks,
|
|
|
406 |
but the process to copy blocks to the WORM, which runs in the background, may take hours.
|
|
|
407 |
.PP
|
|
|
408 |
There are two ways the dump file system is used.
|
|
|
409 |
The first is by the users themselves, who can browse the
|
|
|
410 |
dump file system directly or attach pieces of
|
|
|
411 |
it to their name space.
|
|
|
412 |
For example, to track down a bug,
|
|
|
413 |
it is straightforward to try the compiler from three months ago
|
|
|
414 |
or to link a program with yesterday's library.
|
|
|
415 |
With daily snapshots of all files,
|
|
|
416 |
it is easy to find when a particular change was
|
|
|
417 |
made or what changes were made on a particular date.
|
|
|
418 |
People feel free to make large speculative changes
|
|
|
419 |
to files in the knowledge that they can be backed
|
|
|
420 |
out with a single
|
|
|
421 |
copy command.
|
|
|
422 |
There is no backup system as such;
|
|
|
423 |
instead, because the dump
|
|
|
424 |
is in the file name space,
|
|
|
425 |
backup problems can be solved with
|
|
|
426 |
standard tools
|
|
|
427 |
such as
|
|
|
428 |
.CW cp ,
|
|
|
429 |
.CW ls ,
|
|
|
430 |
.CW grep ,
|
|
|
431 |
and
|
|
|
432 |
.CW diff .
|
|
|
433 |
.PP
|
|
|
434 |
The other (very rare) use is complete system backup.
|
|
|
435 |
In the event of disaster,
|
|
|
436 |
the active file system can be initialized from any dump by clearing the
|
|
|
437 |
disk cache and setting the root of
|
|
|
438 |
the active file system to be a copy
|
|
|
439 |
of the dumped root.
|
|
|
440 |
Although easy to do, this is not to be taken lightly:
|
|
|
441 |
besides losing any change made after the date of the dump, this recovery method
|
|
|
442 |
results in a very slow system.
|
|
|
443 |
The cache must be reloaded from WORM, which is much
|
|
|
444 |
slower than magnetic disks.
|
|
|
445 |
The file system takes a few days to reload the working
|
|
|
446 |
set and regain its full performance.
|
|
|
447 |
.PP
|
|
|
448 |
Access permissions of files in the dump are the same
|
|
|
449 |
as they were when the dump was made.
|
|
|
450 |
Normal utilities have normal
|
|
|
451 |
permissions in the dump without any special arrangement.
|
|
|
452 |
The dump file system is read-only, though,
|
|
|
453 |
which means that files in the dump cannot be written regardless of their permission bits;
|
|
|
454 |
in fact, since directories are part of the read-only structure,
|
|
|
455 |
even the permissions cannot be changed.
|
|
|
456 |
.PP
|
|
|
457 |
Once a file is written to WORM, it cannot be removed,
|
|
|
458 |
so our users never see
|
|
|
459 |
``please clean up your files''
|
|
|
460 |
messages and there is no
|
|
|
461 |
.CW df
|
|
|
462 |
command.
|
|
|
463 |
We regard the WORM jukebox as an unlimited resource.
|
|
|
464 |
The only issue is how long it will take to fill.
|
|
|
465 |
Our WORM has served a community of about 50 users
|
|
|
466 |
for five years and has absorbed daily dumps, consuming a total of
|
|
|
467 |
65% of the storage in the jukebox.
|
|
|
468 |
In that time, the manufacturer has improved the technology,
|
|
|
469 |
doubling the capacity of the individual disks.
|
|
|
470 |
If we were to upgrade to the new media,
|
|
|
471 |
we would have more free space than in the original empty jukebox.
|
|
|
472 |
Technology has created storage faster than we can use it.
|
|
|
473 |
.SH
|
|
|
474 |
Unusual file servers
|
|
|
475 |
.PP
|
|
|
476 |
Plan 9 is characterized by a variety of servers that offer
|
|
|
477 |
a file-like interface to unusual services.
|
|
|
478 |
Many of these are implemented by user-level processes, although the distinction
|
|
|
479 |
is unimportant to their clients; whether a service is provided by the kernel,
|
|
|
480 |
a user process, or a remote server is irrelevant to the way it is used.
|
|
|
481 |
There are dozens of such servers; in this section we present three representative ones.
|
|
|
482 |
.PP
|
|
|
483 |
Perhaps the most remarkable file server in Plan 9 is 8½, the window system.
|
|
|
484 |
It is discussed at length elsewhere [Pike91], but deserves a brief explanation here.
|
|
|
485 |
8½ provides two interfaces: to the user seated at the terminal, it offers a traditional
|
|
|
486 |
style of interaction with multiple windows, each running an application, all controlled
|
|
|
487 |
by a mouse and keyboard.
|
|
|
488 |
To the client programs, the view is also fairly traditional:
|
|
|
489 |
programs running in a window see a set of files in
|
|
|
490 |
.CW /dev
|
|
|
491 |
with names like
|
|
|
492 |
.CW mouse ,
|
|
|
493 |
.CW screen ,
|
|
|
494 |
and
|
|
|
495 |
.CW cons .
|
|
|
496 |
Programs that want to print text to their window write to
|
|
|
497 |
.CW /dev/cons ;
|
|
|
498 |
to read the mouse, they read
|
|
|
499 |
.CW /dev/mouse .
|
|
|
500 |
In the Plan 9 style, bitmap graphics is implemented by providing a file
|
|
|
501 |
.CW /dev/bitblt
|
|
|
502 |
on which clients write encoded messages to execute graphical operations such as
|
|
|
503 |
.CW bitblt
|
|
|
504 |
(RasterOp).
|
|
|
505 |
What is unusual is how this is done:
|
|
|
506 |
8½ is a file server, serving the files in
|
|
|
507 |
.CW /dev
|
|
|
508 |
to the clients running in each window.
|
|
|
509 |
Although every window looks the same to its client,
|
|
|
510 |
each window has a distinct set of files in
|
|
|
511 |
.CW /dev .
|
|
|
512 |
8½ multiplexes its clients' access to the resources of the terminal
|
|
|
513 |
by serving multiple sets of files. Each client is given a private name space
|
|
|
514 |
with a
|
|
|
515 |
.I different
|
|
|
516 |
set of files that behave the same as in all other windows.
|
|
|
517 |
There are many advantages to this structure.
|
|
|
518 |
One is that 8½ serves the same files it needs for its own implementation\(emit
|
|
|
519 |
multiplexes its own interface\(emso it may be run, recursively, as a client of itself.
|
|
|
520 |
Also, consider the implementation of
|
|
|
521 |
.CW /dev/tty
|
|
|
522 |
in UNIX, which requires special code in the kernel to redirect
|
|
|
523 |
.CW open
|
|
|
524 |
calls to the appropriate device.
|
|
|
525 |
Instead, in 8½ the equivalent service falls out
|
|
|
526 |
automatically: 8½ serves
|
|
|
527 |
.CW /dev/cons
|
|
|
528 |
as its basic function; there is nothing extra to do.
|
|
|
529 |
When a program wants to
|
|
|
530 |
read from the keyboard, it opens
|
|
|
531 |
.CW /dev/cons ,
|
|
|
532 |
but it is a private file, not a shared one with special properties.
|
|
|
533 |
Again, local name spaces make this possible; conventions about the consistency of
|
|
|
534 |
the files within them make it natural.
|
|
|
535 |
.PP
|
|
|
536 |
8½ has a unique feature made possible by its design.
|
|
|
537 |
Because it is implemented as a file server,
|
|
|
538 |
it has the power to postpone answering read requests for a particular window.
|
|
|
539 |
This behavior is toggled by a reserved key on the keyboard.
|
|
|
540 |
Toggling once suspends client reads from the window;
|
|
|
541 |
toggling again resumes normal reads, which absorb whatever text has been prepared,
|
|
|
542 |
one line at a time.
|
|
|
543 |
This allows the user to edit multi-line input text on the screen before the application sees it,
|
|
|
544 |
obviating the need to invoke a separate editor to prepare text such as mail
|
|
|
545 |
messages.
|
|
|
546 |
A related property is that reads are answered directly from the
|
|
|
547 |
data structure defining the text on the display: text may be edited until
|
|
|
548 |
its final newline makes the prepared line of text readable by the client.
|
|
|
549 |
Even then, until the line is read, the text the client will read can be changed.
|
|
|
550 |
For example, after typing
|
|
|
551 |
.P1
|
|
|
552 |
% make
|
|
|
553 |
rm *
|
|
|
554 |
.P2
|
|
|
555 |
to the shell, the user can backspace over the final newline at any time until
|
|
|
556 |
.CW make
|
|
|
557 |
finishes, holding off execution of the
|
|
|
558 |
.CW rm
|
|
|
559 |
command, or even point with the mouse
|
|
|
560 |
before the
|
|
|
561 |
.CW rm
|
|
|
562 |
and type another command to be executed first.
|
|
|
563 |
.PP
|
|
|
564 |
There is no
|
|
|
565 |
.CW ftp
|
|
|
566 |
command in Plan 9. Instead, a user-level file server called
|
|
|
567 |
.CW ftpfs
|
|
|
568 |
dials the FTP site, logs in on behalf of the user, and uses the FTP protocol
|
|
|
569 |
to examine files in the remote directory.
|
|
|
570 |
To the local user, it offers a file hierarchy, attached to
|
|
|
571 |
.CW /n/ftp
|
|
|
572 |
in the local name space, mirroring the contents of the FTP site.
|
|
|
573 |
In other words, it translates the FTP protocol into 9P to offer Plan 9 access to FTP sites.
|
|
|
574 |
The implementation is tricky;
|
|
|
575 |
.CW ftpfs
|
|
|
576 |
must do some sophisticated caching for efficiency and
|
|
|
577 |
use heuristics to decode remote directory information.
|
|
|
578 |
But the result is worthwhile:
|
|
|
579 |
all the local file management tools such as
|
|
|
580 |
.CW cp ,
|
|
|
581 |
.CW grep ,
|
|
|
582 |
.CW diff ,
|
|
|
583 |
and of course
|
|
|
584 |
.CW ls
|
|
|
585 |
are available to FTP-served files exactly as if they were local files.
|
|
|
586 |
Other systems such as Jade and Prospero
|
|
|
587 |
have exploited the same opportunity [Rao81, Neu92],
|
|
|
588 |
but because of local name spaces and the simplicity of implementing 9P,
|
|
|
589 |
this approach
|
|
|
590 |
fits more naturally into Plan 9 than into other environments.
|
|
|
591 |
.PP
|
|
|
592 |
One server,
|
|
|
593 |
.CW exportfs ,
|
|
|
594 |
is a user process that takes a portion of its own name space and
|
|
|
595 |
makes it available to other processes by
|
|
|
596 |
translating 9P requests into system calls to the Plan 9 kernel.
|
|
|
597 |
The file hierarchy it exports may contain files from multiple servers.
|
|
|
598 |
.CW Exportfs
|
|
|
599 |
is usually run as a remote server
|
|
|
600 |
started by a local program,
|
|
|
601 |
either
|
|
|
602 |
.CW import
|
|
|
603 |
or
|
|
|
604 |
.CW cpu .
|
|
|
605 |
.CW Import
|
|
|
606 |
makes a network call to the remote machine, starts
|
|
|
607 |
.CW exportfs
|
|
|
608 |
there, and attaches its 9P connection to the local name space. For example,
|
|
|
609 |
.P1
|
|
|
610 |
import helix /net
|
|
|
611 |
.P2
|
|
|
612 |
makes Helix's network interfaces visible in the local
|
|
|
613 |
.CW /net
|
|
|
614 |
directory. Helix is a central server and
|
|
|
615 |
has many network interfaces, so this permits a machine with one network to
|
|
|
616 |
access to any of Helix's networks. After such an import, the local
|
|
|
617 |
machine may make calls on any of the networks connected to Helix.
|
|
|
618 |
Another example is
|
|
|
619 |
.P1
|
|
|
620 |
import helix /proc
|
|
|
621 |
.P2
|
|
|
622 |
which makes Helix's processes visible in the local
|
|
|
623 |
.CW /proc ,
|
|
|
624 |
permitting local debuggers to examine remote processes.
|
|
|
625 |
.PP
|
|
|
626 |
The
|
|
|
627 |
.CW cpu
|
|
|
628 |
command connects the local terminal to a remote
|
|
|
629 |
CPU server.
|
|
|
630 |
It works in the opposite direction to
|
|
|
631 |
.CW import :
|
|
|
632 |
after calling the server, it starts a
|
|
|
633 |
.I local
|
|
|
634 |
.CW exportfs
|
|
|
635 |
and mounts it in the name space of a process, typically a newly created shell, on the
|
|
|
636 |
server.
|
|
|
637 |
It then rearranges the name space
|
|
|
638 |
to make local device files (such as those served by
|
|
|
639 |
the terminal's window system) visible in the server's
|
|
|
640 |
.CW /dev
|
|
|
641 |
directory.
|
|
|
642 |
The effect of running a
|
|
|
643 |
.CW cpu
|
|
|
644 |
command is therefore to start a shell on a fast machine, one more tightly
|
|
|
645 |
coupled to the file server,
|
|
|
646 |
with a name space analogous
|
|
|
647 |
to the local one.
|
|
|
648 |
All local device files are visible remotely, so remote applications have full
|
|
|
649 |
access to local services such as bitmap graphics,
|
|
|
650 |
.CW /dev/cons ,
|
|
|
651 |
and so on.
|
|
|
652 |
This is not the same as
|
|
|
653 |
.CW rlogin ,
|
|
|
654 |
which does nothing to reproduce the local name space on the remote system,
|
|
|
655 |
nor is it the same as
|
|
|
656 |
file sharing with, say, NFS, which can achieve some name space equivalence but
|
|
|
657 |
not the combination of access to local hardware devices, remote files, and remote
|
|
|
658 |
CPU resources.
|
|
|
659 |
The
|
|
|
660 |
.CW cpu
|
|
|
661 |
command is a uniquely transparent mechanism.
|
|
|
662 |
For example, it is reasonable
|
|
|
663 |
to start a window system in a window running a
|
|
|
664 |
.CW cpu
|
|
|
665 |
command; all windows created there automatically start processes on the CPU server.
|
|
|
666 |
.SH
|
|
|
667 |
Configurability and administration
|
|
|
668 |
.PP
|
|
|
669 |
The uniform interconnection of components in Plan 9 makes it possible to configure
|
|
|
670 |
a Plan 9 installation many different ways.
|
|
|
671 |
A single laptop PC can function as a stand-alone Plan 9 system;
|
|
|
672 |
at the other extreme, our setup has central multiprocessor CPU
|
|
|
673 |
servers and file servers and scores of terminals ranging from small PCs to
|
|
|
674 |
high-end graphics workstations.
|
|
|
675 |
It is such large installations that best represent how Plan 9 operates.
|
|
|
676 |
.PP
|
|
|
677 |
The system software is portable and the same
|
|
|
678 |
operating system runs on all hardware.
|
|
|
679 |
Except for performance, the appearance of the system on, say,
|
|
|
680 |
an SGI workstation is the same
|
|
|
681 |
as on a laptop.
|
|
|
682 |
Since computing and file services are centralized, and terminals have
|
|
|
683 |
no permanent file storage, all terminals are functionally identical.
|
|
|
684 |
In this way, Plan 9 has one of the good properties of old timesharing systems, where
|
|
|
685 |
a user could sit in front of any machine and see the same system. In the modern
|
|
|
686 |
workstation community, machines tend to be owned by people who customize them
|
|
|
687 |
by storing private information on local disk.
|
|
|
688 |
We reject this style of use,
|
|
|
689 |
although the system itself can be used this way.
|
|
|
690 |
In our group, we have a laboratory with many public-access machines\(ema terminal
|
|
|
691 |
room\(emand a user may sit down at any one of them and work.
|
|
|
692 |
.PP
|
|
|
693 |
Central file servers centralize not just the files, but also their administration
|
|
|
694 |
and maintenance.
|
|
|
695 |
In fact, one server is the main server, holding all system files; other servers provide
|
|
|
696 |
extra storage or are available for debugging and other special uses, but the system
|
|
|
697 |
software resides on one machine.
|
|
|
698 |
This means that each program
|
|
|
699 |
has a single copy of the binary for each architecture, so it is
|
|
|
700 |
trivial to install updates and bug fixes.
|
|
|
701 |
There is also a single user database; there is no need to synchronize distinct
|
|
|
702 |
.CW /etc/passwd
|
|
|
703 |
files.
|
|
|
704 |
On the other hand, depending on a single central server does limit the size of an installation.
|
|
|
705 |
.PP
|
|
|
706 |
Another example of the power of centralized file service
|
|
|
707 |
is the way Plan 9 administers network information.
|
|
|
708 |
On the central server there is a directory,
|
|
|
709 |
.CW /lib/ndb ,
|
|
|
710 |
that contains all the information necessary to administer the local Ethernet and
|
|
|
711 |
other networks.
|
|
|
712 |
All the machines use the same database to talk to the network; there is no
|
|
|
713 |
need to manage a distributed naming system or keep parallel files up to date.
|
|
|
714 |
To install a new machine on the local Ethernet, choose a
|
|
|
715 |
name and IP address and add these to a single file in
|
|
|
716 |
.CW /lib/ndb ;
|
|
|
717 |
all the machines in the installation will be able to talk to it immediately.
|
|
|
718 |
To start running, plug the machine into the network, turn it on, and use BOOTP
|
|
|
719 |
and TFTP to load the kernel.
|
|
|
720 |
All else is automatic.
|
|
|
721 |
.PP
|
|
|
722 |
Finally,
|
|
|
723 |
the automated dump file system frees all users from the need to maintain
|
|
|
724 |
their systems, while providing easy access to backup files without
|
|
|
725 |
tapes, special commands, or the involvement of support staff.
|
|
|
726 |
It is difficult to overstate the improvement in lifestyle afforded by this service.
|
|
|
727 |
.PP
|
|
|
728 |
Plan 9 runs on a variety of hardware without
|
|
|
729 |
constraining how to configure an installation.
|
|
|
730 |
In our laboratory, we
|
|
|
731 |
chose to use central servers because they amortize costs and administration.
|
|
|
732 |
A sign that this is a good decision is that our cheap
|
|
|
733 |
terminals remain comfortable places
|
|
|
734 |
to work for about five years, much longer than workstations that must provide
|
|
|
735 |
the complete computing environment.
|
|
|
736 |
We do, however, upgrade the central machines, so
|
|
|
737 |
the computation available from even old Plan 9 terminals improves with time.
|
|
|
738 |
The money saved by avoiding regular upgrades of terminals
|
|
|
739 |
is instead spent on the newest, fastest multiprocessor servers.
|
|
|
740 |
We estimate this costs about half the money of networked workstations
|
|
|
741 |
yet provides general access to more powerful machines.
|
|
|
742 |
.SH
|
|
|
743 |
C Programming
|
|
|
744 |
.PP
|
|
|
745 |
Plan 9 utilities are written in several languages.
|
|
|
746 |
Some are scripts for the shell,
|
|
|
747 |
.CW rc
|
|
|
748 |
[Duff90]; a handful
|
|
|
749 |
are written in a new C-like concurrent language called Alef [Wint95], described below.
|
|
|
750 |
The great majority, though, are written in a dialect of ANSI C [ANSIC].
|
|
|
751 |
Of these, most are entirely new programs, but some
|
|
|
752 |
originate in pre-ANSI C code
|
|
|
753 |
from our research UNIX system [UNIX85].
|
|
|
754 |
These have been updated to ANSI C
|
|
|
755 |
and reworked for portability and cleanliness.
|
|
|
756 |
.PP
|
|
|
757 |
The Plan 9 C dialect has some minor extensions,
|
|
|
758 |
described elsewhere [Pike95], and a few major restrictions.
|
|
|
759 |
The most important restriction is that the compiler demands that
|
|
|
760 |
all function definitions have ANSI prototypes
|
|
|
761 |
and all function calls appear in the scope of a prototyped declaration
|
|
|
762 |
of the function.
|
|
|
763 |
As a stylistic rule,
|
|
|
764 |
the prototyped declaration is placed in a header file
|
|
|
765 |
included by all files that call the function.
|
|
|
766 |
Each system library has an associated header file, declaring all
|
|
|
767 |
functions in that library.
|
|
|
768 |
For example, the standard Plan 9 library is called
|
|
|
769 |
.CW libc ,
|
|
|
770 |
so all C source files include
|
|
|
771 |
.CW <libc.h> .
|
|
|
772 |
These rules guarantee that all functions
|
|
|
773 |
are called with arguments having the expected types \(em something
|
|
|
774 |
that was not true with pre-ANSI C programs.
|
|
|
775 |
.PP
|
|
|
776 |
Another restriction is that the C compilers accept only a subset of the
|
|
|
777 |
preprocessor directives required by ANSI.
|
|
|
778 |
The main omission is
|
|
|
779 |
.CW #if ,
|
|
|
780 |
since we believe it
|
|
|
781 |
is never necessary and often abused.
|
|
|
782 |
Also, its effect is
|
|
|
783 |
better achieved by other means.
|
|
|
784 |
For instance, an
|
|
|
785 |
.CW #if
|
|
|
786 |
used to toggle a feature at compile time can be written
|
|
|
787 |
as a regular
|
|
|
788 |
.CW if
|
|
|
789 |
statement, relying on compile-time constant folding and
|
|
|
790 |
dead code elimination to discard object code.
|
|
|
791 |
.PP
|
|
|
792 |
Conditional compilation, even with
|
|
|
793 |
.CW #ifdef ,
|
|
|
794 |
is used sparingly in Plan 9.
|
|
|
795 |
The only architecture-dependent
|
|
|
796 |
.CW #ifdefs
|
|
|
797 |
in the system are in low-level routines in the graphics library.
|
|
|
798 |
Instead, we avoid such dependencies or, when necessary, isolate
|
|
|
799 |
them in separate source files or libraries.
|
|
|
800 |
Besides making code hard to read,
|
|
|
801 |
.CW #ifdefs
|
|
|
802 |
make it impossible to know what source is compiled into the binary
|
|
|
803 |
or whether source protected by them will compile or work properly.
|
|
|
804 |
They make it harder to maintain software.
|
|
|
805 |
.PP
|
|
|
806 |
The standard Plan 9 library overlaps much of
|
|
|
807 |
ANSI C and POSIX [POSIX], but diverges
|
|
|
808 |
when appropriate to Plan 9's goals or implementation.
|
|
|
809 |
When the semantics of a function
|
|
|
810 |
change, we also change the name.
|
|
|
811 |
For instance, instead of UNIX's
|
|
|
812 |
.CW creat ,
|
|
|
813 |
Plan 9 has a
|
|
|
814 |
.CW create
|
|
|
815 |
function that takes three arguments,
|
|
|
816 |
the original two plus a third that, like the second
|
|
|
817 |
argument of
|
|
|
818 |
.CW open ,
|
|
|
819 |
defines whether the returned file descriptor is to be opened for reading,
|
|
|
820 |
writing, or both.
|
|
|
821 |
This design was forced by the way 9P implements creation,
|
|
|
822 |
but it also simplifies the common use of
|
|
|
823 |
.CW create
|
|
|
824 |
to initialize a temporary file.
|
|
|
825 |
.PP
|
|
|
826 |
Another departure from ANSI C is that Plan 9 uses a 16-bit character set
|
|
|
827 |
called Unicode [ISO10646, Unicode].
|
|
|
828 |
Although we stopped short of full internationalization,
|
|
|
829 |
Plan 9 treats the representation
|
|
|
830 |
of all major languages uniformly throughout all its
|
|
|
831 |
software.
|
|
|
832 |
To simplify the exchange of text between programs, the characters are packed into
|
|
|
833 |
a byte stream by an encoding we designed, called UTF-8,
|
|
|
834 |
which is now
|
|
|
835 |
becoming accepted as a standard [FSSUTF].
|
|
|
836 |
It has several attractive properties,
|
|
|
837 |
including byte-order independence,
|
|
|
838 |
backwards compatibility with ASCII,
|
|
|
839 |
and ease of implementation.
|
|
|
840 |
.PP
|
|
|
841 |
There are many problems in adapting existing software to a large
|
|
|
842 |
character set with an encoding that represents characters with
|
|
|
843 |
a variable number of bytes.
|
|
|
844 |
ANSI C addresses some of the issues but
|
|
|
845 |
falls short of
|
|
|
846 |
solving them all.
|
|
|
847 |
It does not pick a character set encoding and does not
|
|
|
848 |
define all the necessary I/O library routines.
|
|
|
849 |
Furthermore, the functions it
|
|
|
850 |
.I does
|
|
|
851 |
define have engineering problems.
|
|
|
852 |
Since the standard left too many problems unsolved,
|
|
|
853 |
we decided to build our own interface.
|
|
|
854 |
A separate paper has the details [Pike93].
|
|
|
855 |
.PP
|
|
|
856 |
A small class of Plan 9 programs do not follow the conventions
|
|
|
857 |
discussed in this section.
|
|
|
858 |
These are programs imported from and maintained by
|
|
|
859 |
the UNIX community;
|
|
|
860 |
.CW tex
|
|
|
861 |
is a representative example.
|
|
|
862 |
To avoid reconverting such programs every time a new version
|
|
|
863 |
is released,
|
|
|
864 |
we built a porting environment, called the ANSI C/POSIX Environment, or APE [Tric95].
|
|
|
865 |
APE comprises separate include files, libraries, and commands,
|
|
|
866 |
conforming as much as possible to the strict ANSI C and base-level
|
|
|
867 |
POSIX specifications.
|
|
|
868 |
To port network-based software such as X Windows, it was necessary to add
|
|
|
869 |
some extensions to those
|
|
|
870 |
specifications, such as the BSD networking functions.
|
|
|
871 |
.SH
|
|
|
872 |
Portability and Compilation
|
|
|
873 |
.PP
|
|
|
874 |
Plan 9 is portable across a variety of processor architectures.
|
|
|
875 |
Within a single computing session, it is common to use
|
|
|
876 |
several architectures: perhaps the window system running on
|
|
|
877 |
an Intel processor connected to a MIPS-based CPU server with files
|
|
|
878 |
resident on a SPARC system.
|
|
|
879 |
For this heterogeneity to be transparent, there must be conventions
|
|
|
880 |
about data interchange between programs; for software maintenance
|
|
|
881 |
to be straightforward, there must be conventions about cross-architecture
|
|
|
882 |
compilation.
|
|
|
883 |
.PP
|
|
|
884 |
To avoid byte order problems,
|
|
|
885 |
data is communicated between programs as text whenever practical.
|
|
|
886 |
Sometimes, though, the amount of data is high enough that a binary
|
|
|
887 |
format is necessary;
|
|
|
888 |
such data is communicated as a byte stream with a pre-defined encoding
|
|
|
889 |
for multi-byte values.
|
|
|
890 |
In the rare cases where a format
|
|
|
891 |
is complex enough to be defined by a data structure,
|
|
|
892 |
the structure is never
|
|
|
893 |
communicated as a unit; instead, it is decomposed into
|
|
|
894 |
individual fields, encoded as an ordered byte stream, and then
|
|
|
895 |
reassembled by the recipient.
|
|
|
896 |
These conventions affect data
|
|
|
897 |
ranging from kernel or application program state information to object file
|
|
|
898 |
intermediates generated by the compiler.
|
|
|
899 |
.PP
|
|
|
900 |
Programs, including the kernel, often present their data
|
|
|
901 |
through a file system interface,
|
|
|
902 |
an access mechanism that is inherently portable.
|
|
|
903 |
For example, the system clock is represented by a decimal number in the file
|
|
|
904 |
.CW /dev/time ;
|
|
|
905 |
the
|
|
|
906 |
.CW time
|
|
|
907 |
library function (there is no
|
|
|
908 |
.CW time
|
|
|
909 |
system call) reads the file and converts it to binary.
|
|
|
910 |
Similarly, instead of encoding the state of an application
|
|
|
911 |
process in a series of flags and bits in private memory,
|
|
|
912 |
the kernel
|
|
|
913 |
presents a text string in the file named
|
|
|
914 |
.CW status
|
|
|
915 |
in the
|
|
|
916 |
.CW /proc
|
|
|
917 |
file system associated with each process.
|
|
|
918 |
The Plan 9
|
|
|
919 |
.CW ps
|
|
|
920 |
command is trivial: it prints the contents of
|
|
|
921 |
the desired status files after some minor reformatting; moreover, after
|
|
|
922 |
.P1
|
|
|
923 |
import helix /proc
|
|
|
924 |
.P2
|
|
|
925 |
a local
|
|
|
926 |
.CW ps
|
|
|
927 |
command reports on the status of Helix's processes.
|
|
|
928 |
.PP
|
|
|
929 |
Each supported architecture has its own compilers and loader.
|
|
|
930 |
The C and Alef compilers produce intermediate files that
|
|
|
931 |
are portably encoded; the contents
|
|
|
932 |
are unique to the target architecture but the format of the
|
|
|
933 |
file is independent of compiling processor type.
|
|
|
934 |
When a compiler for a given architecture is compiled on
|
|
|
935 |
another type of processor and then used to compile a program
|
|
|
936 |
there,
|
|
|
937 |
the intermediate produced on
|
|
|
938 |
the new architecture is identical to the intermediate
|
|
|
939 |
produced on the native processor. From the compiler's
|
|
|
940 |
point of view, every compilation is a cross-compilation.
|
|
|
941 |
.PP
|
|
|
942 |
Although each architecture's loader accepts only intermediate files produced
|
|
|
943 |
by compilers for that architecture,
|
|
|
944 |
such files could have been generated by a compiler executing
|
|
|
945 |
on any type of processor.
|
|
|
946 |
For instance, it is possible to run
|
|
|
947 |
the MIPS compiler on a 486, then use the MIPS loader on a
|
|
|
948 |
SPARC to produce a MIPS executable.
|
|
|
949 |
.PP
|
|
|
950 |
Since Plan 9 runs on a variety of architectures, even in a single installation,
|
|
|
951 |
distinguishing the compilers and intermediate names
|
|
|
952 |
simplifies multi-architecture
|
|
|
953 |
development from a single source tree.
|
|
|
954 |
The compilers and the loader for each architecture are
|
|
|
955 |
uniquely named; there is no
|
|
|
956 |
.CW cc
|
|
|
957 |
command.
|
|
|
958 |
The names are derived by concatenating a code letter
|
|
|
959 |
associated with the target architecture with the name of the
|
|
|
960 |
compiler or loader. For example, the letter `8' is
|
|
|
961 |
the code letter for Intel
|
|
|
962 |
.I x 86
|
|
|
963 |
processors; the C compiler is named
|
|
|
964 |
.CW 8c ,
|
|
|
965 |
the Alef compiler
|
|
|
966 |
.CW 8al ,
|
|
|
967 |
and the loader is called
|
|
|
968 |
.CW 8l .
|
|
|
969 |
Similarly, the compiler intermediate files are suffixed
|
|
|
970 |
.CW .8 ,
|
|
|
971 |
not
|
|
|
972 |
.CW .o .
|
|
|
973 |
.PP
|
|
|
974 |
The Plan 9
|
|
|
975 |
build program
|
|
|
976 |
.CW mk ,
|
|
|
977 |
a relative of
|
|
|
978 |
.CW make ,
|
|
|
979 |
reads the names of the current and target
|
|
|
980 |
architectures from environment variables called
|
|
|
981 |
.CW $cputype
|
|
|
982 |
and
|
|
|
983 |
.CW $objtype .
|
|
|
984 |
By default the current processor is the target, but setting
|
|
|
985 |
.CW $objtype
|
|
|
986 |
to the name of another architecture
|
|
|
987 |
before invoking
|
|
|
988 |
.CW mk
|
|
|
989 |
results in a cross-build:
|
|
|
990 |
.P1
|
|
|
991 |
% objtype=sparc mk
|
|
|
992 |
.P2
|
|
|
993 |
builds a program for the SPARC architecture regardless of the executing machine.
|
|
|
994 |
The value of
|
|
|
995 |
.CW $objtype
|
|
|
996 |
selects a
|
|
|
997 |
file of architecture-dependent variable definitions
|
|
|
998 |
that configures the build to use the appropriate compilers and loader.
|
|
|
999 |
Although simple-minded, this technique works well in practice:
|
|
|
1000 |
all applications in Plan 9 are built from a single source tree
|
|
|
1001 |
and it is possible to build the various architectures in parallel without conflict.
|
|
|
1002 |
.SH
|
|
|
1003 |
Parallel programming
|
|
|
1004 |
.PP
|
|
|
1005 |
Plan 9's support for parallel programming has two aspects.
|
|
|
1006 |
First, the kernel provides
|
|
|
1007 |
a simple process model and a few carefully designed system calls for
|
|
|
1008 |
synchronization and sharing.
|
|
|
1009 |
Second, a new parallel programming language called Alef
|
|
|
1010 |
supports concurrent programming.
|
|
|
1011 |
Although it is possible to write parallel
|
|
|
1012 |
programs in C, Alef is the parallel language of choice.
|
|
|
1013 |
.PP
|
|
|
1014 |
There is a trend in new operating systems to implement two
|
|
|
1015 |
classes of processes: normal UNIX-style processes and light-weight
|
|
|
1016 |
kernel threads.
|
|
|
1017 |
Instead, Plan 9 provides a single class of process but allows fine control of the
|
|
|
1018 |
sharing of a process's resources such as memory and file descriptors.
|
|
|
1019 |
A single class of process is a
|
|
|
1020 |
feasible approach in Plan 9 because the kernel has an efficient system
|
|
|
1021 |
call interface and cheap process creation and scheduling.
|
|
|
1022 |
.PP
|
|
|
1023 |
Parallel programs have three basic requirements:
|
|
|
1024 |
management of resources shared between processes,
|
|
|
1025 |
an interface to the scheduler,
|
|
|
1026 |
and fine-grain process synchronization using spin locks.
|
|
|
1027 |
On Plan 9,
|
|
|
1028 |
new processes are created using the
|
|
|
1029 |
.CW rfork
|
|
|
1030 |
system call.
|
|
|
1031 |
.CW Rfork
|
|
|
1032 |
takes a single argument,
|
|
|
1033 |
a bit vector that specifies
|
|
|
1034 |
which of the parent process's resources should be shared,
|
|
|
1035 |
copied, or created anew
|
|
|
1036 |
in the child.
|
|
|
1037 |
The resources controlled by
|
|
|
1038 |
.CW rfork
|
|
|
1039 |
include the name space,
|
|
|
1040 |
the environment,
|
|
|
1041 |
the file descriptor table,
|
|
|
1042 |
memory segments,
|
|
|
1043 |
and notes (Plan 9's analog of UNIX signals).
|
|
|
1044 |
One of the bits controls whether the
|
|
|
1045 |
.CW rfork
|
|
|
1046 |
call will create a new process; if the bit is off, the resulting
|
|
|
1047 |
modification to the resources occurs in the process making the call.
|
|
|
1048 |
For example, a process calls
|
|
|
1049 |
.CW rfork(RFNAMEG)
|
|
|
1050 |
to disconnect its name space from its parent's.
|
|
|
1051 |
Alef uses a
|
|
|
1052 |
fine-grained fork in which all the resources, including
|
|
|
1053 |
memory, are shared between parent
|
|
|
1054 |
and child, analogous to creating a kernel thread in many systems.
|
|
|
1055 |
.PP
|
|
|
1056 |
An indication that
|
|
|
1057 |
.CW rfork
|
|
|
1058 |
is the right model is the variety of ways it is used.
|
|
|
1059 |
Other than the canonical use in the library routine
|
|
|
1060 |
.CW fork ,
|
|
|
1061 |
it is hard to find two calls to
|
|
|
1062 |
.CW rfork
|
|
|
1063 |
with the same bits set; programs
|
|
|
1064 |
use it to create many different forms of sharing and resource allocation.
|
|
|
1065 |
A system with just two types of processes\(emregular processes and threads\(emcould
|
|
|
1066 |
not handle this variety.
|
|
|
1067 |
.PP
|
|
|
1068 |
There are two ways to share memory.
|
|
|
1069 |
First, a flag to
|
|
|
1070 |
.CW rfork
|
|
|
1071 |
causes all the memory segments of the parent to be shared with the child
|
|
|
1072 |
(except the stack, which is
|
|
|
1073 |
forked copy-on-write regardless).
|
|
|
1074 |
Alternatively, a new segment of memory may be
|
|
|
1075 |
attached using the
|
|
|
1076 |
.CW segattach
|
|
|
1077 |
system call; such a segment
|
|
|
1078 |
will always be shared between parent and child.
|
|
|
1079 |
.PP
|
|
|
1080 |
The
|
|
|
1081 |
.CW rendezvous
|
|
|
1082 |
system call provides a way for processes to synchronize.
|
|
|
1083 |
Alef uses it to implement communication channels,
|
|
|
1084 |
queuing locks,
|
|
|
1085 |
multiple reader/writer locks, and
|
|
|
1086 |
the sleep and wakeup mechanism.
|
|
|
1087 |
.CW Rendezvous
|
|
|
1088 |
takes two arguments, a tag and a value.
|
|
|
1089 |
When a process calls
|
|
|
1090 |
.CW rendezvous
|
|
|
1091 |
with a tag it sleeps until another process
|
|
|
1092 |
presents a matching tag.
|
|
|
1093 |
When a pair of tags match, the values are exchanged
|
|
|
1094 |
between the two processes and both
|
|
|
1095 |
.CW rendezvous
|
|
|
1096 |
calls return.
|
|
|
1097 |
This primitive is sufficient to implement the full set of synchronization routines.
|
|
|
1098 |
.PP
|
|
|
1099 |
Finally, spin locks are provided by
|
|
|
1100 |
an architecture-dependent library at user level.
|
|
|
1101 |
Most processors provide atomic test and set instructions that
|
|
|
1102 |
can be used to implement locks.
|
|
|
1103 |
A notable exception is the MIPS R3000, so the SGI
|
|
|
1104 |
Power series multiprocessors have special lock hardware on the bus.
|
|
|
1105 |
User processes gain access to the lock hardware
|
|
|
1106 |
by mapping pages of hardware locks
|
|
|
1107 |
into their address space using the
|
|
|
1108 |
.CW segattach
|
|
|
1109 |
system call.
|
|
|
1110 |
.PP
|
|
|
1111 |
A Plan 9 process in a system call will block regardless of its `weight'.
|
|
|
1112 |
This means that when a program wishes to read from a slow
|
|
|
1113 |
device without blocking the entire calculation, it must fork a process to do
|
|
|
1114 |
the read for it. The solution is to start a satellite
|
|
|
1115 |
process that does the I/O and delivers the answer to the main program
|
|
|
1116 |
through shared memory or perhaps a pipe.
|
|
|
1117 |
This sounds onerous but works easily and efficiently in practice; in fact,
|
|
|
1118 |
most interactive Plan 9 applications, even relatively ordinary ones written
|
|
|
1119 |
in C, such as
|
|
|
1120 |
the text editor Sam [Pike87], run as multiprocess programs.
|
|
|
1121 |
.PP
|
|
|
1122 |
The kernel support for parallel programming in Plan 9 is a few hundred lines
|
|
|
1123 |
of portable code; a handful of simple primitives enable the problems to be handled
|
|
|
1124 |
cleanly at user level.
|
|
|
1125 |
Although the primitives work fine from C,
|
|
|
1126 |
they are particularly expressive from within Alef.
|
|
|
1127 |
The creation
|
|
|
1128 |
and management of slave I/O processes can be written in a few lines of Alef,
|
|
|
1129 |
providing the foundation for a consistent means of multiplexing
|
|
|
1130 |
data flows between arbitrary processes.
|
|
|
1131 |
Moreover, implementing it in a language rather than in the kernel
|
|
|
1132 |
ensures consistent semantics between all devices
|
|
|
1133 |
and provides a more general multiplexing primitive.
|
|
|
1134 |
Compare this to the UNIX
|
|
|
1135 |
.CW select
|
|
|
1136 |
system call:
|
|
|
1137 |
.CW select
|
|
|
1138 |
applies only to a restricted set of devices,
|
|
|
1139 |
legislates a style of multiprogramming in the kernel,
|
|
|
1140 |
does not extend across networks,
|
|
|
1141 |
is difficult to implement, and is hard to use.
|
|
|
1142 |
.PP
|
|
|
1143 |
Another reason
|
|
|
1144 |
parallel programming is important in Plan 9 is that
|
|
|
1145 |
multi-threaded user-level file servers are the preferred way
|
|
|
1146 |
to implement services.
|
|
|
1147 |
Examples of such servers include the programming environment
|
|
|
1148 |
Acme [Pike94],
|
|
|
1149 |
the name space exporting tool
|
|
|
1150 |
.CW exportfs
|
|
|
1151 |
[PPTTW93],
|
|
|
1152 |
the HTTP daemon,
|
|
|
1153 |
and the network name servers
|
|
|
1154 |
.CW cs
|
|
|
1155 |
and
|
|
|
1156 |
.CW dns
|
|
|
1157 |
[PrWi93].
|
|
|
1158 |
Complex applications such as Acme prove that
|
|
|
1159 |
careful operating system support can reduce the difficulty of writing
|
|
|
1160 |
multi-threaded applications without moving threading and
|
|
|
1161 |
synchronization primitives into the kernel.
|
|
|
1162 |
.SH
|
|
|
1163 |
Implementation of Name Spaces
|
|
|
1164 |
.PP
|
|
|
1165 |
User processes construct name spaces using three system calls:
|
|
|
1166 |
.CW mount ,
|
|
|
1167 |
.CW bind ,
|
|
|
1168 |
and
|
|
|
1169 |
.CW unmount .
|
|
|
1170 |
The
|
|
|
1171 |
.CW mount
|
|
|
1172 |
system call attaches a tree served by a file server to
|
|
|
1173 |
the current name space. Before calling
|
|
|
1174 |
.CW mount ,
|
|
|
1175 |
the client must (by outside means) acquire a connection to the server in
|
|
|
1176 |
the form of a file descriptor that may be written and read to transmit 9P messages.
|
|
|
1177 |
That file descriptor represents a pipe or network connection.
|
|
|
1178 |
.PP
|
|
|
1179 |
The
|
|
|
1180 |
.CW mount
|
|
|
1181 |
call attaches a new hierarchy to the existing name space.
|
|
|
1182 |
The
|
|
|
1183 |
.CW bind
|
|
|
1184 |
system call, on the other hand, duplicates some piece of existing name space at
|
|
|
1185 |
another point in the name space.
|
|
|
1186 |
The
|
|
|
1187 |
.CW unmount
|
|
|
1188 |
system call allows components to be removed.
|
|
|
1189 |
.PP
|
|
|
1190 |
Using
|
|
|
1191 |
either
|
|
|
1192 |
.CW bind
|
|
|
1193 |
or
|
|
|
1194 |
.CW mount ,
|
|
|
1195 |
multiple directories may be stacked at a single point in the name space.
|
|
|
1196 |
In Plan 9 terminology, this is a
|
|
|
1197 |
.I union
|
|
|
1198 |
directory and behaves like the concatenation of the constituent directories.
|
|
|
1199 |
A flag argument to
|
|
|
1200 |
.CW bind
|
|
|
1201 |
and
|
|
|
1202 |
.CW mount
|
|
|
1203 |
specifies the position of a new directory in the union,
|
|
|
1204 |
permitting new elements
|
|
|
1205 |
to be added either at the front or rear of the union or to replace it entirely.
|
|
|
1206 |
When a file lookup is performed in a union directory, each component
|
|
|
1207 |
of the union is searched in turn and the first match taken; likewise,
|
|
|
1208 |
when a union directory is read, the contents of each of the component directories
|
|
|
1209 |
is read in turn.
|
|
|
1210 |
Union directories are one of the most widely used organizational features
|
|
|
1211 |
of the Plan 9 name space.
|
|
|
1212 |
For instance, the directory
|
|
|
1213 |
.CW /bin
|
|
|
1214 |
is built as a union of
|
|
|
1215 |
.CW /$cputype/bin
|
|
|
1216 |
(program binaries),
|
|
|
1217 |
.CW /rc/bin
|
|
|
1218 |
(shell scripts),
|
|
|
1219 |
and perhaps more directories provided by the user.
|
|
|
1220 |
This construction makes the shell
|
|
|
1221 |
.CW $PATH
|
|
|
1222 |
variable unnecessary.
|
|
|
1223 |
.PP
|
|
|
1224 |
One question raised by union directories
|
|
|
1225 |
is which element of the union receives a newly created file.
|
|
|
1226 |
After several designs, we decided on the following.
|
|
|
1227 |
By default, directories in unions do not accept new files, although the
|
|
|
1228 |
.CW create
|
|
|
1229 |
system call applied to an existing file succeeds normally.
|
|
|
1230 |
When a directory is added to the union, a flag to
|
|
|
1231 |
.CW bind
|
|
|
1232 |
or
|
|
|
1233 |
.CW mount
|
|
|
1234 |
enables create permission (a property of the name space) in that directory.
|
|
|
1235 |
When a file is being created with a new name in a union, it is created in the
|
|
|
1236 |
first directory of the union with create permission; if that creation fails,
|
|
|
1237 |
the entire
|
|
|
1238 |
.CW create
|
|
|
1239 |
fails.
|
|
|
1240 |
This scheme enables the common use of placing a private directory anywhere
|
|
|
1241 |
in a union of public ones,
|
|
|
1242 |
while allowing creation only in the private directory.
|
|
|
1243 |
.PP
|
|
|
1244 |
By convention, kernel device file systems
|
|
|
1245 |
are bound into the
|
|
|
1246 |
.CW /dev
|
|
|
1247 |
directory, but to bootstrap the name space building process it is
|
|
|
1248 |
necessary to have a notation that permits
|
|
|
1249 |
direct access to the devices without an existing name space.
|
|
|
1250 |
The root directory
|
|
|
1251 |
of the tree served by a device driver can be accessed using the syntax
|
|
|
1252 |
.CW # \f2c\f1,
|
|
|
1253 |
where
|
|
|
1254 |
.I c
|
|
|
1255 |
is a unique character (typically a letter) identifying the
|
|
|
1256 |
.I type
|
|
|
1257 |
of the device.
|
|
|
1258 |
Simple device drivers serve a single level directory containing a few files.
|
|
|
1259 |
As an example,
|
|
|
1260 |
each serial port is represented by a data and a control file:
|
|
|
1261 |
.P1
|
|
|
1262 |
% bind -a '#t' /dev
|
|
|
1263 |
% cd /dev
|
|
|
1264 |
% ls -l eia*
|
|
|
1265 |
--rw-rw-rw- t 0 bootes bootes 0 Feb 24 21:14 eia1
|
|
|
1266 |
--rw-rw-rw- t 0 bootes bootes 0 Feb 24 21:14 eia1ctl
|
|
|
1267 |
--rw-rw-rw- t 0 bootes bootes 0 Feb 24 21:14 eia2
|
|
|
1268 |
--rw-rw-rw- t 0 bootes bootes 0 Feb 24 21:14 eia2ctl
|
|
|
1269 |
.P2
|
|
|
1270 |
The
|
|
|
1271 |
.CW bind
|
|
|
1272 |
program is an encapsulation of the
|
|
|
1273 |
.CW bind
|
|
|
1274 |
system call; its
|
|
|
1275 |
.CW -a
|
|
|
1276 |
flag positions the new directory at the end of the union.
|
|
|
1277 |
The data files
|
|
|
1278 |
.CW eia1
|
|
|
1279 |
and
|
|
|
1280 |
.CW eia2
|
|
|
1281 |
may be read and written to communicate over the serial line.
|
|
|
1282 |
Instead of using special operations on these files to control the devices,
|
|
|
1283 |
commands written to the files
|
|
|
1284 |
.CW eia1ctl
|
|
|
1285 |
and
|
|
|
1286 |
.CW eia2ctl
|
|
|
1287 |
control the corresponding device;
|
|
|
1288 |
for example,
|
|
|
1289 |
writing the text string
|
|
|
1290 |
.CW b1200
|
|
|
1291 |
to
|
|
|
1292 |
.CW /dev/eia1ctl
|
|
|
1293 |
sets the speed of that line to 1200 baud.
|
|
|
1294 |
Compare this to the UNIX
|
|
|
1295 |
.CW ioctl
|
|
|
1296 |
system call: in Plan 9, devices are controlled by textual messages,
|
|
|
1297 |
free of byte order problems, with clear semantics for reading and writing.
|
|
|
1298 |
It is common to configure or debug devices using shell scripts.
|
|
|
1299 |
.PP
|
|
|
1300 |
It is the universal use of the 9P protocol that
|
|
|
1301 |
connects Plan 9's components together to form a
|
|
|
1302 |
distributed system.
|
|
|
1303 |
Rather than inventing a unique protocol for each
|
|
|
1304 |
service such as
|
|
|
1305 |
.CW rlogin ,
|
|
|
1306 |
FTP, TFTP, and X windows,
|
|
|
1307 |
Plan 9 implements services
|
|
|
1308 |
in terms of operations on file objects,
|
|
|
1309 |
and then uses a single, well-documented protocol to exchange information between
|
|
|
1310 |
computers.
|
|
|
1311 |
Unlike NFS, 9P treats files as a sequence of bytes rather than blocks.
|
|
|
1312 |
Also unlike NFS, 9P is stateful: clients perform
|
|
|
1313 |
remote procedure calls to establish pointers to objects in the remote
|
|
|
1314 |
file server.
|
|
|
1315 |
These pointers are called file identifiers or
|
|
|
1316 |
.I fids .
|
|
|
1317 |
All operations on files supply a fid to identify an object in the remote file system.
|
|
|
1318 |
.PP
|
|
|
1319 |
The 9P protocol defines 17 messages, providing
|
|
|
1320 |
means to authenticate users, navigate fids around
|
|
|
1321 |
a file system hierarchy, copy fids, perform I/O, change file attributes,
|
|
|
1322 |
and create and delete files.
|
|
|
1323 |
Its complete specification is in Section 5 of the Programmer's Manual [9man].
|
|
|
1324 |
Here is the procedure to gain access to the name hierarchy supplied by a server.
|
|
|
1325 |
A file server connection is established via a pipe or network connection.
|
|
|
1326 |
An initial
|
|
|
1327 |
.CW session
|
|
|
1328 |
message performs a bilateral authentication between client and server.
|
|
|
1329 |
An
|
|
|
1330 |
.CW attach
|
|
|
1331 |
message then connects a fid suggested by the client to the root of the server file
|
|
|
1332 |
tree.
|
|
|
1333 |
The
|
|
|
1334 |
.CW attach
|
|
|
1335 |
message includes the identity of the user performing the attach; henceforth all
|
|
|
1336 |
fids derived from the root fid will have permissions associated with
|
|
|
1337 |
that user.
|
|
|
1338 |
Multiple users may share the connection, but each must perform an attach to
|
|
|
1339 |
establish his or her identity.
|
|
|
1340 |
.PP
|
|
|
1341 |
The
|
|
|
1342 |
.CW walk
|
|
|
1343 |
message moves a fid through a single level of the file system hierarchy.
|
|
|
1344 |
The
|
|
|
1345 |
.CW clone
|
|
|
1346 |
message takes an established fid and produces a copy that points
|
|
|
1347 |
to the same file as the original.
|
|
|
1348 |
Its purpose is to enable walking to a file in a directory without losing the fid
|
|
|
1349 |
on the directory.
|
|
|
1350 |
The
|
|
|
1351 |
.CW open
|
|
|
1352 |
message locks a fid to a specific file in the hierarchy,
|
|
|
1353 |
checks access permissions,
|
|
|
1354 |
and prepares the fid
|
|
|
1355 |
for I/O.
|
|
|
1356 |
The
|
|
|
1357 |
.CW read
|
|
|
1358 |
and
|
|
|
1359 |
.CW write
|
|
|
1360 |
messages allow I/O at arbitrary offsets in the file;
|
|
|
1361 |
the maximum size transferred is defined by the protocol.
|
|
|
1362 |
The
|
|
|
1363 |
.CW clunk
|
|
|
1364 |
message indicates the client has no further use for a fid.
|
|
|
1365 |
The
|
|
|
1366 |
.CW remove
|
|
|
1367 |
message behaves like
|
|
|
1368 |
.CW clunk
|
|
|
1369 |
but causes the file associated with the fid to be removed and any associated
|
|
|
1370 |
resources on the server to be deallocated.
|
|
|
1371 |
.PP
|
|
|
1372 |
9P has two forms: RPC messages sent on a pipe or network connection and a procedural
|
|
|
1373 |
interface within the kernel.
|
|
|
1374 |
Since kernel device drivers are directly addressable,
|
|
|
1375 |
there is no need to pass messages to
|
|
|
1376 |
communicate with them;
|
|
|
1377 |
instead each 9P transaction is implemented by a direct procedure call.
|
|
|
1378 |
For each fid,
|
|
|
1379 |
the kernel maintains a local representation in a data structure called a
|
|
|
1380 |
.I channel ,
|
|
|
1381 |
so all operations on files performed by the kernel involve a channel connected
|
|
|
1382 |
to that fid.
|
|
|
1383 |
The simplest example is a user process's file descriptors, which are
|
|
|
1384 |
indexes into an array of channels.
|
|
|
1385 |
A table in the kernel provides a list
|
|
|
1386 |
of entry points corresponding one to one with the 9P messages for each device.
|
|
|
1387 |
A system call such as
|
|
|
1388 |
.CW read
|
|
|
1389 |
from the user translates into one or more procedure calls
|
|
|
1390 |
through that table, indexed by the type character stored in the channel:
|
|
|
1391 |
.CW procread ,
|
|
|
1392 |
.CW eiaread ,
|
|
|
1393 |
etc.
|
|
|
1394 |
Each call takes at least
|
|
|
1395 |
one channel as an argument.
|
|
|
1396 |
A special kernel driver, called the
|
|
|
1397 |
.I mount
|
|
|
1398 |
driver, translates procedure calls to messages, that is,
|
|
|
1399 |
it converts local procedure calls to remote ones.
|
|
|
1400 |
In effect, this special driver
|
|
|
1401 |
becomes a local proxy for the files served by a remote file server.
|
|
|
1402 |
The channel pointer in the local call is translated to the associated fid
|
|
|
1403 |
in the transmitted message.
|
|
|
1404 |
.PP
|
|
|
1405 |
The mount driver is the sole RPC mechanism employed by the system.
|
|
|
1406 |
The semantics of the supplied files, rather than the operations performed upon
|
|
|
1407 |
them, create a particular service such as the
|
|
|
1408 |
.CW cpu
|
|
|
1409 |
command.
|
|
|
1410 |
The mount driver demultiplexes protocol
|
|
|
1411 |
messages between clients sharing a communication channel
|
|
|
1412 |
with a file server.
|
|
|
1413 |
For each outgoing RPC message,
|
|
|
1414 |
the mount driver allocates a buffer labeled by a small unique integer,
|
|
|
1415 |
called a
|
|
|
1416 |
.I tag .
|
|
|
1417 |
The reply to the RPC is labeled with the same tag, which is used by
|
|
|
1418 |
the mount driver to match the reply with the request.
|
|
|
1419 |
.PP
|
|
|
1420 |
The kernel representation of the name space
|
|
|
1421 |
is called the
|
|
|
1422 |
.I "mount table" ,
|
|
|
1423 |
which stores a list of bindings between channels.
|
|
|
1424 |
Each entry in the mount table contains a pair of channels: a
|
|
|
1425 |
.I from
|
|
|
1426 |
channel and a
|
|
|
1427 |
.I to
|
|
|
1428 |
channel.
|
|
|
1429 |
Every time a walk succeeds in moving a channel to a new location in the name space,
|
|
|
1430 |
the mount table is consulted to see if a `from' channel matches the new name; if
|
|
|
1431 |
so the `to' channel is cloned and substituted for the original.
|
|
|
1432 |
Union directories are implemented by converting the `to'
|
|
|
1433 |
channel into a list of channels:
|
|
|
1434 |
a successful walk to a union directory returns a `to' channel that forms
|
|
|
1435 |
the head of
|
|
|
1436 |
a list of channels, each representing a component directory
|
|
|
1437 |
of the union.
|
|
|
1438 |
If a walk
|
|
|
1439 |
fails to find a file in the first directory of the union, the list is followed,
|
|
|
1440 |
the next component cloned, and walk tried on that directory.
|
|
|
1441 |
.PP
|
|
|
1442 |
Each file in Plan 9 is uniquely identified by a set of integers:
|
|
|
1443 |
the type of the channel (used as the index of the function call table),
|
|
|
1444 |
the server or device number
|
|
|
1445 |
distinguishing the server from others of the same type (decided locally by the driver),
|
|
|
1446 |
and a
|
|
|
1447 |
.I qid
|
|
|
1448 |
formed from two 32-bit numbers called
|
|
|
1449 |
.I path
|
|
|
1450 |
and
|
|
|
1451 |
.I version .
|
|
|
1452 |
The path is a unique file number assigned by a device driver or
|
|
|
1453 |
file server when a file is created.
|
|
|
1454 |
The version number is updated whenever
|
|
|
1455 |
the file is modified; as described in the next section,
|
|
|
1456 |
it can be used to maintain cache coherency between
|
|
|
1457 |
clients and servers.
|
|
|
1458 |
.PP
|
|
|
1459 |
The type and device number are analogous to UNIX major and minor
|
|
|
1460 |
device numbers;
|
|
|
1461 |
the qid is analogous to the i-number.
|
|
|
1462 |
The device and type
|
|
|
1463 |
connect the channel to a device driver and the qid
|
|
|
1464 |
identifies the file within that device.
|
|
|
1465 |
If the file recovered from a walk has the same type, device, and qid path
|
|
|
1466 |
as an entry in the mount table, they are the same file and the
|
|
|
1467 |
corresponding substitution from the mount table is made.
|
|
|
1468 |
This is how the name space is implemented.
|
|
|
1469 |
.SH
|
|
|
1470 |
File Caching
|
|
|
1471 |
.PP
|
|
|
1472 |
The 9P protocol has no explicit support for caching files on a client.
|
|
|
1473 |
The large memory of the central file server acts as a shared cache for all its clients,
|
|
|
1474 |
which reduces the total amount of memory needed across all machines in the network.
|
|
|
1475 |
Nonetheless, there are sound reasons to cache files on the client, such as a slow
|
|
|
1476 |
connection to the file server.
|
|
|
1477 |
.PP
|
|
|
1478 |
The version field of the qid is changed whenever the file is modified,
|
|
|
1479 |
which makes it possible to do some weakly coherent forms of caching.
|
|
|
1480 |
The most important is client caching of text and data segments of executable files.
|
|
|
1481 |
When a process
|
|
|
1482 |
.CW execs
|
|
|
1483 |
a program, the file is re-opened and the qid's version is compared with that in the cache;
|
|
|
1484 |
if they match, the local copy is used.
|
|
|
1485 |
The same method can be used to build a local caching file server.
|
|
|
1486 |
This user-level server interposes on the 9P connection to the remote server and
|
|
|
1487 |
monitors the traffic, copying data to a local disk.
|
|
|
1488 |
When it sees a read of known data, it answers directly,
|
|
|
1489 |
while writes are passed on immediately\(emthe cache is write-through\(emto keep
|
|
|
1490 |
the central copy up to date.
|
|
|
1491 |
This is transparent to processes on the terminal and requires no change to 9P;
|
|
|
1492 |
it works well on home machines connected over serial lines.
|
|
|
1493 |
A similar method can be applied to build a general client cache in unused local
|
|
|
1494 |
memory, but this has not been done in Plan 9.
|
|
|
1495 |
.SH
|
|
|
1496 |
Networks and Communication Devices
|
|
|
1497 |
.PP
|
|
|
1498 |
Network interfaces are kernel-resident file systems, analogous to the EIA device
|
|
|
1499 |
described earlier.
|
|
|
1500 |
Call setup and shutdown are achieved by writing text strings to the control file
|
|
|
1501 |
associated with the device;
|
|
|
1502 |
information is sent and received by reading and writing the data file.
|
|
|
1503 |
The structure and semantics of the devices is common to all networks so,
|
|
|
1504 |
other than a file name substitution,
|
|
|
1505 |
the same procedure makes a call using TCP over Ethernet as URP over Datakit [Fra80].
|
|
|
1506 |
.PP
|
|
|
1507 |
This example illustrates the structure of the TCP device:
|
|
|
1508 |
.P1
|
|
|
1509 |
% ls -lp /net/tcp
|
|
|
1510 |
d-r-xr-xr-x I 0 bootes bootes 0 Feb 23 20:20 0
|
|
|
1511 |
d-r-xr-xr-x I 0 bootes bootes 0 Feb 23 20:20 1
|
|
|
1512 |
--rw-rw-rw- I 0 bootes bootes 0 Feb 23 20:20 clone
|
|
|
1513 |
% ls -lp /net/tcp/0
|
|
|
1514 |
--rw-rw---- I 0 rob bootes 0 Feb 23 20:20 ctl
|
|
|
1515 |
--rw-rw---- I 0 rob bootes 0 Feb 23 20:20 data
|
|
|
1516 |
--rw-rw---- I 0 rob bootes 0 Feb 23 20:20 listen
|
|
|
1517 |
--r--r--r-- I 0 bootes bootes 0 Feb 23 20:20 local
|
|
|
1518 |
--r--r--r-- I 0 bootes bootes 0 Feb 23 20:20 remote
|
|
|
1519 |
--r--r--r-- I 0 bootes bootes 0 Feb 23 20:20 status
|
|
|
1520 |
%
|
|
|
1521 |
.P2
|
|
|
1522 |
The top directory,
|
|
|
1523 |
.CW /net/tcp ,
|
|
|
1524 |
contains a
|
|
|
1525 |
.CW clone
|
|
|
1526 |
file and a directory for each connection, numbered
|
|
|
1527 |
.CW 0
|
|
|
1528 |
to
|
|
|
1529 |
.I n .
|
|
|
1530 |
Each connection directory corresponds to an TCP/IP connection.
|
|
|
1531 |
Opening
|
|
|
1532 |
.CW clone
|
|
|
1533 |
reserves an unused connection and returns its control file.
|
|
|
1534 |
Reading the control file returns the textual connection number, so the user
|
|
|
1535 |
process can construct the full name of the newly allocated
|
|
|
1536 |
connection directory.
|
|
|
1537 |
The
|
|
|
1538 |
.CW local ,
|
|
|
1539 |
.CW remote ,
|
|
|
1540 |
and
|
|
|
1541 |
.CW status
|
|
|
1542 |
files are diagnostic; for example,
|
|
|
1543 |
.CW remote
|
|
|
1544 |
contains the address (for TCP, the IP address and port number) of the remote side.
|
|
|
1545 |
.PP
|
|
|
1546 |
A call is initiated by writing a connect message with a network-specific address as
|
|
|
1547 |
its argument; for example, to open a Telnet session (port 23) to a remote machine
|
|
|
1548 |
with IP address 135.104.9.52,
|
|
|
1549 |
the string is:
|
|
|
1550 |
.P1
|
|
|
1551 |
connect 135.104.9.52!23
|
|
|
1552 |
.P2
|
|
|
1553 |
The write to the control file blocks until the connection is established;
|
|
|
1554 |
if the destination is unreachable, the write returns an error.
|
|
|
1555 |
Once the connection is established, the
|
|
|
1556 |
.CW telnet
|
|
|
1557 |
application reads and writes the
|
|
|
1558 |
.CW data
|
|
|
1559 |
file
|
|
|
1560 |
to talk to the remote Telnet daemon.
|
|
|
1561 |
On the other end, the Telnet daemon would start by writing
|
|
|
1562 |
.P1
|
|
|
1563 |
announce 23
|
|
|
1564 |
.P2
|
|
|
1565 |
to its control file to indicate its willingness to receive calls to this port.
|
|
|
1566 |
Such a daemon is called a
|
|
|
1567 |
.I listener
|
|
|
1568 |
in Plan 9.
|
|
|
1569 |
.PP
|
|
|
1570 |
A uniform structure for network devices cannot hide all the details
|
|
|
1571 |
of addressing and communication for dissimilar networks.
|
|
|
1572 |
For example, Datakit uses textual, hierarchical addresses unlike IP's 32-bit addresses, so
|
|
|
1573 |
an application given a control file must still know what network it represents.
|
|
|
1574 |
Rather than make every application know the addressing of every network,
|
|
|
1575 |
Plan 9 hides these details in a
|
|
|
1576 |
.I connection
|
|
|
1577 |
.I server ,
|
|
|
1578 |
called
|
|
|
1579 |
.CW cs .
|
|
|
1580 |
.CW Cs
|
|
|
1581 |
is a file system mounted in a known place.
|
|
|
1582 |
It supplies a single control file that an application uses to discover how to connect
|
|
|
1583 |
to a host.
|
|
|
1584 |
The application writes the symbolic address and service name for
|
|
|
1585 |
the connection it wishes to make,
|
|
|
1586 |
and reads back the name of the
|
|
|
1587 |
.CW clone
|
|
|
1588 |
file to open and the address to present to it.
|
|
|
1589 |
If there are multiple networks between the machines,
|
|
|
1590 |
.CW cs
|
|
|
1591 |
presents a list of possible networks and addresses to be tried in sequence;
|
|
|
1592 |
it uses heuristics to decide the order.
|
|
|
1593 |
For instance, it presents the highest-bandwidth choice first.
|
|
|
1594 |
.PP
|
|
|
1595 |
A single library function called
|
|
|
1596 |
.CW dial
|
|
|
1597 |
talks to
|
|
|
1598 |
.CW cs
|
|
|
1599 |
to establish the connection.
|
|
|
1600 |
An application that uses
|
|
|
1601 |
.CW dial
|
|
|
1602 |
needs no changes, not even recompilation, to adapt to new networks;
|
|
|
1603 |
the interface to
|
|
|
1604 |
.CW cs
|
|
|
1605 |
hides the details.
|
|
|
1606 |
.PP
|
|
|
1607 |
The uniform structure for networks in Plan 9 makes the
|
|
|
1608 |
.CW import
|
|
|
1609 |
command all that is needed to construct gateways.
|
|
|
1610 |
.SH
|
|
|
1611 |
Kernel structure for networks
|
|
|
1612 |
.PP
|
|
|
1613 |
The kernel plumbing used to build Plan 9 communications
|
|
|
1614 |
channels is called
|
|
|
1615 |
.I streams
|
|
|
1616 |
[Rit84][Presotto].
|
|
|
1617 |
A stream is a bidirectional channel connecting a
|
|
|
1618 |
physical or pseudo-device to a user process.
|
|
|
1619 |
The user process inserts and removes data at one end of the stream;
|
|
|
1620 |
a kernel process acting on behalf of a device operates at
|
|
|
1621 |
the other end.
|
|
|
1622 |
A stream comprises a linear list of
|
|
|
1623 |
.I "processing modules" .
|
|
|
1624 |
Each module has both an upstream (toward the process) and
|
|
|
1625 |
downstream (toward the device)
|
|
|
1626 |
.I "put routine" .
|
|
|
1627 |
Calling the put routine of the module on either end of the stream
|
|
|
1628 |
inserts data into the stream.
|
|
|
1629 |
Each module calls the succeeding one to send data up or down the stream.
|
|
|
1630 |
Like UNIX streams [Rit84],
|
|
|
1631 |
Plan 9 streams can be dynamically configured.
|
|
|
1632 |
.SH
|
|
|
1633 |
The IL Protocol
|
|
|
1634 |
.PP
|
|
|
1635 |
The 9P protocol must run above a reliable transport protocol with delimited messages.
|
|
|
1636 |
9P has no mechanism to recover from transmission errors and
|
|
|
1637 |
the system assumes that each read from a communication channel will
|
|
|
1638 |
return a single 9P message;
|
|
|
1639 |
it does not parse the data stream to discover message boundaries.
|
|
|
1640 |
Pipes and some network protocols already have these properties but
|
|
|
1641 |
the standard IP protocols do not.
|
|
|
1642 |
TCP does not delimit messages, while
|
|
|
1643 |
UDP [RFC768] does not provide reliable in-order delivery.
|
|
|
1644 |
.PP
|
|
|
1645 |
We designed a new protocol, called IL (Internet Link), to transmit 9P messages over IP.
|
|
|
1646 |
It is a connection-based protocol that provides
|
|
|
1647 |
reliable transmission of sequenced messages between machines.
|
|
|
1648 |
Since a process can have only a single outstanding 9P request,
|
|
|
1649 |
there is no need for flow control in IL.
|
|
|
1650 |
Like TCP, IL has adaptive timeouts: it scales acknowledge and retransmission times
|
|
|
1651 |
to match the network speed.
|
|
|
1652 |
This allows the protocol to perform well on both the Internet and on local Ethernets.
|
|
|
1653 |
Also, IL does no blind retransmission,
|
|
|
1654 |
to avoid adding to the congestion of busy networks.
|
|
|
1655 |
Full details are in another paper [PrWi95].
|
|
|
1656 |
.PP
|
|
|
1657 |
In Plan 9, the implementation of IL is smaller and faster than TCP.
|
|
|
1658 |
IL is our main Internet transport protocol.
|
|
|
1659 |
.SH
|
|
|
1660 |
Overview of authentication
|
|
|
1661 |
.PP
|
|
|
1662 |
Authentication establishes the identity of a
|
|
|
1663 |
user accessing a resource.
|
|
|
1664 |
The user requesting the resource is called the
|
|
|
1665 |
.I client
|
|
|
1666 |
and the user granting access to the resource is called the
|
|
|
1667 |
.I server .
|
|
|
1668 |
This is usually done under the auspices of a 9P attach message.
|
|
|
1669 |
A user may be a client in one authentication exchange and a server in another.
|
|
|
1670 |
Servers always act on behalf of some user,
|
|
|
1671 |
either a normal client or some administrative entity, so authentication
|
|
|
1672 |
is defined to be between users, not machines.
|
|
|
1673 |
.PP
|
|
|
1674 |
Each Plan 9 user has an associated DES [NBS77] authentication key;
|
|
|
1675 |
the user's identity is verified by the ability to
|
|
|
1676 |
encrypt and decrypt special messages called challenges.
|
|
|
1677 |
Since knowledge of a user's key gives access to that user's resources,
|
|
|
1678 |
the Plan 9 authentication protocols never transmit a message containing
|
|
|
1679 |
a cleartext key.
|
|
|
1680 |
.PP
|
|
|
1681 |
Authentication is bilateral:
|
|
|
1682 |
at the end of the authentication exchange,
|
|
|
1683 |
each side is convinced of the other's identity.
|
|
|
1684 |
Every machine begins the exchange with a DES key in memory.
|
|
|
1685 |
In the case of CPU and file servers, the key, user name, and domain name
|
|
|
1686 |
for the server are read from permanent storage,
|
|
|
1687 |
usually non-volatile RAM.
|
|
|
1688 |
In the case of terminals,
|
|
|
1689 |
the key is derived from a password typed by the user at boot time.
|
|
|
1690 |
A special machine, known as the
|
|
|
1691 |
.I authentication
|
|
|
1692 |
.I server ,
|
|
|
1693 |
maintains a database of keys for all users in its administrative domain and
|
|
|
1694 |
participates in the authentication protocols.
|
|
|
1695 |
.PP
|
|
|
1696 |
The authentication protocol is as follows:
|
|
|
1697 |
after exchanging challenges, one party
|
|
|
1698 |
contacts the authentication server to create
|
|
|
1699 |
permission-granting
|
|
|
1700 |
.I tickets
|
|
|
1701 |
encrypted with
|
|
|
1702 |
each party's secret key and containing a new conversation key.
|
|
|
1703 |
Each
|
|
|
1704 |
party decrypts its own ticket and uses the conversation key to
|
|
|
1705 |
encrypt the other party's challenge.
|
|
|
1706 |
.PP
|
|
|
1707 |
This structure is somewhat like Kerberos [MBSS87], but avoids
|
|
|
1708 |
its reliance on synchronized clocks.
|
|
|
1709 |
Also
|
|
|
1710 |
unlike Kerberos, Plan 9 authentication supports a `speaks for'
|
|
|
1711 |
relation [LABW91] that enables one user to have the authority
|
|
|
1712 |
of another;
|
|
|
1713 |
this is how a CPU server runs processes on behalf of its clients.
|
|
|
1714 |
.PP
|
|
|
1715 |
Plan 9's authentication structure builds
|
|
|
1716 |
secure services rather than depending on firewalls.
|
|
|
1717 |
Whereas firewalls require special code for every service penetrating the wall,
|
|
|
1718 |
the Plan 9 approach permits authentication to be done in a single place\(em9P\(emfor
|
|
|
1719 |
all services.
|
|
|
1720 |
For example, the
|
|
|
1721 |
.CW cpu
|
|
|
1722 |
command works securely across the Internet.
|
|
|
1723 |
.SH
|
|
|
1724 |
Authenticating external connections
|
|
|
1725 |
.PP
|
|
|
1726 |
The regular Plan 9 authentication protocol is not suitable for text-based services such as
|
|
|
1727 |
Telnet
|
|
|
1728 |
or FTP.
|
|
|
1729 |
In such cases, Plan 9 users authenticate with hand-held DES calculators called
|
|
|
1730 |
.I authenticators .
|
|
|
1731 |
The authenticator holds a key for the user, distinct from
|
|
|
1732 |
the user's normal authentication key.
|
|
|
1733 |
The user `logs on' to the authenticator using a 4-digit PIN.
|
|
|
1734 |
A correct PIN enables the authenticator for a challenge/response exchange with the server.
|
|
|
1735 |
Since a correct challenge/response exchange is valid only once
|
|
|
1736 |
and keys are never sent over the network,
|
|
|
1737 |
this procedure is not susceptible to replay attacks, yet
|
|
|
1738 |
is compatible with protocols like Telnet and FTP.
|
|
|
1739 |
.SH
|
|
|
1740 |
Special users
|
|
|
1741 |
.PP
|
|
|
1742 |
Plan 9 has no super-user.
|
|
|
1743 |
Each server is responsible for maintaining its own security, usually permitting
|
|
|
1744 |
access only from the console, which is protected by a password.
|
|
|
1745 |
For example, file servers have a unique administrative user called
|
|
|
1746 |
.CW adm ,
|
|
|
1747 |
with special privileges that apply only to commands typed at the server's
|
|
|
1748 |
physical console.
|
|
|
1749 |
These privileges concern the day-to-day maintenance of the server,
|
|
|
1750 |
such as adding new users and configuring disks and networks.
|
|
|
1751 |
The privileges do
|
|
|
1752 |
.I not
|
|
|
1753 |
include the ability to modify, examine, or change the permissions of any files.
|
|
|
1754 |
If a file is read-protected by a user, only that user may grant access to others.
|
|
|
1755 |
.PP
|
|
|
1756 |
CPU servers have an equivalent user name that allows administrative access to
|
|
|
1757 |
resources on that server such as the control files of user processes.
|
|
|
1758 |
Such permission is necessary, for example, to kill rogue processes, but
|
|
|
1759 |
does not extend beyond that server.
|
|
|
1760 |
On the other hand, by means of a key
|
|
|
1761 |
held in protected non-volatile RAM,
|
|
|
1762 |
the identity of the administrative user is proven to the
|
|
|
1763 |
authentication server.
|
|
|
1764 |
This allows the CPU server to authenticate remote users, both
|
|
|
1765 |
for access to the server itself and when the CPU server is acting
|
|
|
1766 |
as a proxy on their behalf.
|
|
|
1767 |
.PP
|
|
|
1768 |
Finally, a special user called
|
|
|
1769 |
.CW none
|
|
|
1770 |
has no password and is always allowed to connect;
|
|
|
1771 |
anyone may claim to be
|
|
|
1772 |
.CW none .
|
|
|
1773 |
.CW None
|
|
|
1774 |
has restricted permissions; for example, it is not allowed to examine dump files
|
|
|
1775 |
and can read only world-readable files.
|
|
|
1776 |
.PP
|
|
|
1777 |
The idea behind
|
|
|
1778 |
.CW none
|
|
|
1779 |
is analogous to the anonymous user in FTP
|
|
|
1780 |
services.
|
|
|
1781 |
On Plan 9, guest FTP servers are further confined within a special
|
|
|
1782 |
restricted name space.
|
|
|
1783 |
It disconnects guest users from system programs, such as the contents of
|
|
|
1784 |
.CW /bin ,
|
|
|
1785 |
but makes it possible to make local files available to guests
|
|
|
1786 |
by binding them explicitly into the space.
|
|
|
1787 |
A restricted name space is more secure than the usual technique of exporting
|
|
|
1788 |
an ad hoc directory tree; the result is a kind of cage around untrusted users.
|
|
|
1789 |
.SH
|
|
|
1790 |
The cpu command and proxied authentication
|
|
|
1791 |
.PP
|
|
|
1792 |
When a call is made to a CPU server for a user, say Peter,
|
|
|
1793 |
the intent is that Peter wishes to run processes with his own authority.
|
|
|
1794 |
To implement this property,
|
|
|
1795 |
the CPU server does the following when the call is received.
|
|
|
1796 |
First, the listener forks off a process to handle the call.
|
|
|
1797 |
This process changes to the user
|
|
|
1798 |
.CW none
|
|
|
1799 |
to avoid giving away permissions if it is compromised.
|
|
|
1800 |
It then performs the authentication protocol to verify that the
|
|
|
1801 |
calling user really is Peter, and to prove to Peter that
|
|
|
1802 |
the machine is itself trustworthy.
|
|
|
1803 |
Finally, it reattaches to all relevant file servers using the
|
|
|
1804 |
authentication protocol to identify itself as Peter.
|
|
|
1805 |
In this case, the CPU server is a client of the file server and performs the
|
|
|
1806 |
client portion of the authentication exchange on behalf of Peter.
|
|
|
1807 |
The authentication server will give the process tickets to
|
|
|
1808 |
accomplish this only if the CPU server's administrative user name is allowed to
|
|
|
1809 |
.I "speak for"
|
|
|
1810 |
Peter.
|
|
|
1811 |
.PP
|
|
|
1812 |
The
|
|
|
1813 |
.I "speaks for
|
|
|
1814 |
relation [LABW91] is kept in a table on the authentication server.
|
|
|
1815 |
To simplify the management of users computing in different authentication domains,
|
|
|
1816 |
it also contains mappings between user names in different domains,
|
|
|
1817 |
for example saying that user
|
|
|
1818 |
.CW rtm
|
|
|
1819 |
in one domain is the same person as user
|
|
|
1820 |
.CW rtmorris
|
|
|
1821 |
in another.
|
|
|
1822 |
.SH
|
|
|
1823 |
File Permissions
|
|
|
1824 |
.PP
|
|
|
1825 |
One of the advantages of constructing services as file systems
|
|
|
1826 |
is that the solutions to ownership and permission problems fall out naturally.
|
|
|
1827 |
As in UNIX,
|
|
|
1828 |
each file or directory has separate read, write, and execute/search permissions
|
|
|
1829 |
for the file's owner, the file's group, and anyone else.
|
|
|
1830 |
The idea of group is unusual:
|
|
|
1831 |
any user name is potentially a group name.
|
|
|
1832 |
A group is just a user with a list of other users in the group.
|
|
|
1833 |
Conventions make the distinction: most people have user names without group members,
|
|
|
1834 |
while groups have long lists of attached names. For example, the
|
|
|
1835 |
.CW sys
|
|
|
1836 |
group traditionally has all the system programmers,
|
|
|
1837 |
and system files are accessible
|
|
|
1838 |
by group
|
|
|
1839 |
.CW sys .
|
|
|
1840 |
Consider the following two lines of a user database stored on a server:
|
|
|
1841 |
.P1
|
|
|
1842 |
pjw:pjw:
|
|
|
1843 |
sys::pjw,ken,philw,presotto
|
|
|
1844 |
.P2
|
|
|
1845 |
The first establishes user
|
|
|
1846 |
.CW pjw
|
|
|
1847 |
as a regular user. The second establishes user
|
|
|
1848 |
.CW sys
|
|
|
1849 |
as a group and lists four users who are
|
|
|
1850 |
.I members
|
|
|
1851 |
of that group.
|
|
|
1852 |
The empty colon-separated field is space for a user to be named as the
|
|
|
1853 |
.I group
|
|
|
1854 |
.I leader .
|
|
|
1855 |
If a group has a leader, that user has special permissions for the group,
|
|
|
1856 |
such as freedom to change the group permissions
|
|
|
1857 |
of files in that group.
|
|
|
1858 |
If no leader is specified, each member of the group is considered equal, as if each were
|
|
|
1859 |
the leader.
|
|
|
1860 |
In our example, only
|
|
|
1861 |
.CW pjw
|
|
|
1862 |
can add members to his group, but all of
|
|
|
1863 |
.CW sys 's
|
|
|
1864 |
members are equal partners in that group.
|
|
|
1865 |
.PP
|
|
|
1866 |
Regular files are owned by the user that creates them.
|
|
|
1867 |
The group name is inherited from the directory holding the new file.
|
|
|
1868 |
Device files are treated specially:
|
|
|
1869 |
the kernel may arrange the ownership and permissions of
|
|
|
1870 |
a file appropriate to the user accessing the file.
|
|
|
1871 |
.PP
|
|
|
1872 |
A good example of the generality this offers is process files,
|
|
|
1873 |
which are owned and read-protected by the owner of the process.
|
|
|
1874 |
If the owner wants to let someone else access the memory of a process,
|
|
|
1875 |
for example to let the author of a program debug a broken image, the standard
|
|
|
1876 |
.CW chmod
|
|
|
1877 |
command applied to the process files does the job.
|
|
|
1878 |
.PP
|
|
|
1879 |
Another unusual application of file permissions
|
|
|
1880 |
is the dump file system, which is not only served by the same file
|
|
|
1881 |
server as the original data, but represented by the same user database.
|
|
|
1882 |
Files in the dump are therefore given identical protection as files in the regular
|
|
|
1883 |
file system;
|
|
|
1884 |
if a file is owned by
|
|
|
1885 |
.CW pjw
|
|
|
1886 |
and read-protected, once it is in the dump file system it is still owned by
|
|
|
1887 |
.CW pjw
|
|
|
1888 |
and read-protected.
|
|
|
1889 |
Also, since the dump file system is immutable, the file cannot be changed;
|
|
|
1890 |
it is read-protected forever.
|
|
|
1891 |
Drawbacks are that if the file is readable but should have been read-protected,
|
|
|
1892 |
it is readable forever, and that user names are hard to re-use.
|
|
|
1893 |
.SH
|
|
|
1894 |
Performance
|
|
|
1895 |
.PP
|
|
|
1896 |
As a simple measure of the performance of the Plan 9 kernel,
|
|
|
1897 |
we compared the
|
|
|
1898 |
time to do some simple operations on Plan 9 and on SGI's IRIX Release 5.3
|
|
|
1899 |
running on an SGI Challenge M with a 100MHz MIPS R4400 and a 1-megabyte
|
|
|
1900 |
secondary cache.
|
|
|
1901 |
The test program was written in Alef,
|
|
|
1902 |
compiled with the same compiler,
|
|
|
1903 |
and run on identical hardware,
|
|
|
1904 |
so the only variables are the operating system and libraries.
|
|
|
1905 |
.PP
|
|
|
1906 |
The program tests the time to do a context switch
|
|
|
1907 |
.CW rendezvous "" (
|
|
|
1908 |
on Plan 9,
|
|
|
1909 |
.CW blockproc
|
|
|
1910 |
on IRIX);
|
|
|
1911 |
a trivial system call
|
|
|
1912 |
.CW rfork(0) "" (
|
|
|
1913 |
and
|
|
|
1914 |
.CW nap(0) );
|
|
|
1915 |
and
|
|
|
1916 |
lightweight fork
|
|
|
1917 |
.CW rfork(RFPROC) "" (
|
|
|
1918 |
and
|
|
|
1919 |
.CW sproc(PR_SFDS|PR_SADDR) ).
|
|
|
1920 |
It also measures the time to send a byte on a pipe from one process
|
|
|
1921 |
to another and the throughput on a pipe between two processes.
|
|
|
1922 |
The results appear in Table 1.
|
|
|
1923 |
.KS
|
|
|
1924 |
.TS
|
|
|
1925 |
center,box;
|
|
|
1926 |
ccc
|
|
|
1927 |
lnn.
|
|
|
1928 |
Test Plan 9 IRIX
|
|
|
1929 |
_
|
|
|
1930 |
Context switch 39 µs 150 µs
|
|
|
1931 |
System call 6 µs 36 µs
|
|
|
1932 |
Light fork 1300 µs 2200 µs
|
|
|
1933 |
Pipe latency 110 µs 200 µs
|
|
|
1934 |
Pipe bandwidth 11678 KB/s 14545 KB/s
|
|
|
1935 |
.TE
|
|
|
1936 |
.ce
|
|
|
1937 |
.I
|
|
|
1938 |
Table 1. Performance comparison.
|
|
|
1939 |
.R
|
|
|
1940 |
.KE
|
|
|
1941 |
.LP
|
|
|
1942 |
Although the Plan 9 times are not spectacular, they show that the kernel is
|
|
|
1943 |
competitive with commercial systems.
|
|
|
1944 |
.SH
|
|
|
1945 |
Discussion
|
|
|
1946 |
.PP
|
|
|
1947 |
Plan 9 has a relatively conventional kernel;
|
|
|
1948 |
the system's novelty lies in the pieces outside the kernel and the way they interact.
|
|
|
1949 |
When building Plan 9, we considered all aspects
|
|
|
1950 |
of the system together, solving problems where the solution fit best.
|
|
|
1951 |
Sometimes the solution spanned many components.
|
|
|
1952 |
An example is the problem of heterogeneous instruction architectures,
|
|
|
1953 |
which is addressed by the compilers (different code characters, portable
|
|
|
1954 |
object code),
|
|
|
1955 |
the environment
|
|
|
1956 |
.CW $cputype "" (
|
|
|
1957 |
and
|
|
|
1958 |
.CW $objtype ),
|
|
|
1959 |
the name space
|
|
|
1960 |
(binding in
|
|
|
1961 |
.CW /bin ),
|
|
|
1962 |
and other components.
|
|
|
1963 |
Sometimes many issues could be solved in a single place.
|
|
|
1964 |
The best example is 9P,
|
|
|
1965 |
which centralizes naming, access, and authentication.
|
|
|
1966 |
9P is really the core
|
|
|
1967 |
of the system;
|
|
|
1968 |
it is fair to say that the Plan 9 kernel is primarily a 9P multiplexer.
|
|
|
1969 |
.PP
|
|
|
1970 |
Plan 9's focus on files and naming is central to its expressiveness.
|
|
|
1971 |
Particularly in distributed computing, the way things are named has profound
|
|
|
1972 |
influence on the system [Nee89].
|
|
|
1973 |
The combination of
|
|
|
1974 |
local name spaces and global conventions to interconnect networked resources
|
|
|
1975 |
avoids the difficulty of maintaining a global uniform name space,
|
|
|
1976 |
while naming everything like a file makes the system easy to understand, even for
|
|
|
1977 |
novices.
|
|
|
1978 |
Consider the dump file system, which is trivial to use for anyone familiar with
|
|
|
1979 |
hierarchical file systems.
|
|
|
1980 |
At a deeper level, building all the resources above a single uniform interface
|
|
|
1981 |
makes interoperability easy.
|
|
|
1982 |
Once a resource exports a 9P interface,
|
|
|
1983 |
it can combine transparently
|
|
|
1984 |
with any other part of the system to build unusual applications;
|
|
|
1985 |
the details are hidden.
|
|
|
1986 |
This may sound object-oriented, but there are distinctions.
|
|
|
1987 |
First, 9P defines a fixed set of `methods'; it is not an extensible protocol.
|
|
|
1988 |
More important,
|
|
|
1989 |
files are well-defined and well-understood
|
|
|
1990 |
and come prepackaged with familiar methods of access, protection, naming, and
|
|
|
1991 |
networking.
|
|
|
1992 |
Objects, despite their generality, do not come with these attributes defined.
|
|
|
1993 |
By reducing `object' to `file', Plan 9 gets some technology for free.
|
|
|
1994 |
.PP
|
|
|
1995 |
Nonetheless, it is possible to push the idea of file-based computing too far.
|
|
|
1996 |
Converting every resource in the system into a file system is a kind of metaphor,
|
|
|
1997 |
and metaphors can be abused.
|
|
|
1998 |
A good example of restraint is
|
|
|
1999 |
.CW /proc ,
|
|
|
2000 |
which is only a view of a process, not a representation.
|
|
|
2001 |
To run processes, the usual
|
|
|
2002 |
.CW fork
|
|
|
2003 |
and
|
|
|
2004 |
.CW exec
|
|
|
2005 |
calls are still necessary, rather than doing something like
|
|
|
2006 |
.P1
|
|
|
2007 |
cp /bin/date /proc/clone/mem
|
|
|
2008 |
.P2
|
|
|
2009 |
The problem with such examples is that they require the server to do things
|
|
|
2010 |
not under its control.
|
|
|
2011 |
The ability to assign meaning to a command like this does not
|
|
|
2012 |
imply the meaning will fall naturally out of the structure of answering the 9P requests
|
|
|
2013 |
it generates.
|
|
|
2014 |
As a related example, Plan 9 does not put machine's network names in the file
|
|
|
2015 |
name space.
|
|
|
2016 |
The network interfaces provide a very different model of naming, because using
|
|
|
2017 |
.CW open ,
|
|
|
2018 |
.CW create ,
|
|
|
2019 |
.CW read ,
|
|
|
2020 |
and
|
|
|
2021 |
.CW write
|
|
|
2022 |
on such files would not offer a suitable place to encode all the details of call
|
|
|
2023 |
setup for an arbitrary network.
|
|
|
2024 |
This does not mean that the network interface cannot be file-like, just that it must
|
|
|
2025 |
have a more tightly defined structure.
|
|
|
2026 |
.PP
|
|
|
2027 |
What would we do differently next time?
|
|
|
2028 |
Some elements of the implementation are unsatisfactory.
|
|
|
2029 |
Using streams to implement network interfaces in the kernel
|
|
|
2030 |
allows protocols to be connected together dynamically,
|
|
|
2031 |
such as to attach the same TTY driver to TCP, URP, and
|
|
|
2032 |
IL connections,
|
|
|
2033 |
but Plan 9 makes no use of this configurability.
|
|
|
2034 |
(It was exploited, however, in the research UNIX system for which
|
|
|
2035 |
streams were invented.)
|
|
|
2036 |
Replacing streams by static I/O queues would
|
|
|
2037 |
simplify the code and make it faster.
|
|
|
2038 |
.PP
|
|
|
2039 |
Although the main Plan 9 kernel is portable across many machines,
|
|
|
2040 |
the file server is implemented separately.
|
|
|
2041 |
This has caused several problems:
|
|
|
2042 |
drivers that must be written twice,
|
|
|
2043 |
bugs that must be fixed twice,
|
|
|
2044 |
and weaker portability of the file system code.
|
|
|
2045 |
The solution is easy: the file server kernel should be maintained
|
|
|
2046 |
as a variant of the regular operating system, with no user processes and
|
|
|
2047 |
special compiled-in
|
|
|
2048 |
kernel processes to implement file service.
|
|
|
2049 |
Another improvement to the file system would be a change of internal structure.
|
|
|
2050 |
The WORM jukebox is the least reliable piece of the hardware, but because
|
|
|
2051 |
it holds the metadata of the file system, it must be present in order to serve files.
|
|
|
2052 |
The system could be restructured so the WORM is a backup device only, with the
|
|
|
2053 |
file system proper residing on magnetic disks.
|
|
|
2054 |
This would require no change to the external interface.
|
|
|
2055 |
.PP
|
|
|
2056 |
Although Plan 9 has per-process name spaces, it has no mechanism to give the
|
|
|
2057 |
description of a process's name space to another process except by direct inheritance.
|
|
|
2058 |
The
|
|
|
2059 |
.CW cpu
|
|
|
2060 |
command, for example, cannot in general reproduce the terminal's name space;
|
|
|
2061 |
it can only re-interpret the user's login profile and make substitutions for things like
|
|
|
2062 |
the name of the binary directory to load.
|
|
|
2063 |
This misses any local modifications made before running
|
|
|
2064 |
.CW cpu .
|
|
|
2065 |
It should instead be possible to capture the terminal's name space and transmit
|
|
|
2066 |
its description to a remote process.
|
|
|
2067 |
.PP
|
|
|
2068 |
Despite these problems, Plan 9 works well.
|
|
|
2069 |
It has matured into the system that supports our research,
|
|
|
2070 |
rather than being the subject of the research itself.
|
|
|
2071 |
Experimental new work includes developing interfaces to faster networks,
|
|
|
2072 |
file caching in the client kernel,
|
|
|
2073 |
encapsulating and exporting name spaces,
|
|
|
2074 |
and the ability to re-establish the client state after a server crash.
|
|
|
2075 |
Attention is now focusing on using the system to build distributed applications.
|
|
|
2076 |
.PP
|
|
|
2077 |
One reason for Plan 9's success is that we use it for our daily work, not just as a research tool.
|
|
|
2078 |
Active use forces us to address shortcomings as they arise and to adapt the system
|
|
|
2079 |
to solve our problems.
|
|
|
2080 |
Through this process, Plan 9 has become a comfortable, productive programming
|
|
|
2081 |
environment, as well as a vehicle for further systems research.
|
|
|
2082 |
.SH
|
|
|
2083 |
References
|
|
|
2084 |
.nr PS -1
|
|
|
2085 |
.nr VS -2
|
|
|
2086 |
.IP [9man] 9
|
|
|
2087 |
.I
|
|
|
2088 |
Plan 9 Programmer's Manual,
|
|
|
2089 |
Volume 1,
|
|
|
2090 |
.R
|
|
|
2091 |
AT&T Bell Laboratories,
|
|
|
2092 |
Murray Hill, NJ,
|
|
|
2093 |
1995.
|
|
|
2094 |
.IP [ANSIC] 9
|
|
|
2095 |
\f2American National Standard for Information Systems \-
|
|
|
2096 |
Programming Language C\f1, American National Standards Institute, Inc.,
|
|
|
2097 |
New York, 1990.
|
|
|
2098 |
.IP [Duff90] 9
|
|
|
2099 |
Tom Duff, ``Rc - A Shell for Plan 9 and UNIX systems'',
|
|
|
2100 |
.I
|
|
|
2101 |
Proc. of the Summer 1990 UKUUG Conf.,
|
|
|
2102 |
.R
|
|
|
2103 |
London, July, 1990, pp. 21-33, reprinted, in a different form, in this volume.
|
|
|
2104 |
.IP [Fra80] 9
|
|
|
2105 |
A.G. Fraser,
|
|
|
2106 |
``Datakit \- A Modular Network for Synchronous and Asynchronous Traffic'',
|
|
|
2107 |
.I
|
|
|
2108 |
Proc. Int. Conf. on Commun.,
|
|
|
2109 |
.R
|
|
|
2110 |
June 1980, Boston, MA.
|
|
|
2111 |
.IP [FSSUTF] 9
|
|
|
2112 |
.I
|
|
|
2113 |
File System Safe UCS Transformation Format (FSS-UTF),
|
|
|
2114 |
.R
|
|
|
2115 |
X/Open Preliminary Specification, 1993.
|
|
|
2116 |
ISO designation is
|
|
|
2117 |
ISO/IEC JTC1/SC2/WG2 N 1036, dated 1994-08-01.
|
|
|
2118 |
.IP "[ISO10646] " 9
|
|
|
2119 |
ISO/IEC DIS 10646-1:1993
|
|
|
2120 |
.I
|
|
|
2121 |
Information technology \-
|
|
|
2122 |
Universal Multiple-Octet Coded Character Set (UCS) \(em
|
|
|
2123 |
Part 1: Architecture and Basic Multilingual Plane.
|
|
|
2124 |
.R
|
|
|
2125 |
.IP [Kill84] 9
|
|
|
2126 |
T.J. Killian,
|
|
|
2127 |
``Processes as Files'',
|
|
|
2128 |
.I
|
|
|
2129 |
USENIX Summer 1984 Conf. Proc.,
|
|
|
2130 |
.R
|
|
|
2131 |
June 1984, Salt Lake City, UT.
|
|
|
2132 |
.IP "[LABW91] " 9
|
|
|
2133 |
Butler Lampson,
|
|
|
2134 |
Martín Abadi,
|
|
|
2135 |
Michael Burrows, and
|
|
|
2136 |
Edward Wobber,
|
|
|
2137 |
``Authentication in Distributed Systems: Theory and Practice'',
|
|
|
2138 |
.I
|
|
|
2139 |
Proc. 13th ACM Symp. on Op. Sys. Princ.,
|
|
|
2140 |
.R
|
|
|
2141 |
Asilomar, 1991,
|
|
|
2142 |
pp. 165-182.
|
|
|
2143 |
.IP "[MBSS87] " 9
|
|
|
2144 |
S. P. Miller,
|
|
|
2145 |
B. C. Neumann,
|
|
|
2146 |
J. I. Schiller, and
|
|
|
2147 |
J. H. Saltzer,
|
|
|
2148 |
``Kerberos Authentication and Authorization System'',
|
|
|
2149 |
Massachusetts Institute of Technology,
|
|
|
2150 |
1987.
|
|
|
2151 |
.IP [NBS77] 9
|
|
|
2152 |
National Bureau of Standards (U.S.),
|
|
|
2153 |
.I
|
|
|
2154 |
Federal Information Processing Standard 46,
|
|
|
2155 |
.R
|
|
|
2156 |
National Technical Information Service, Springfield, VA, 1977.
|
|
|
2157 |
.IP [Nee89] 9
|
|
|
2158 |
R. Needham, ``Names'', in
|
|
|
2159 |
.I
|
|
|
2160 |
Distributed systems,
|
|
|
2161 |
.R
|
|
|
2162 |
S. Mullender, ed.,
|
|
|
2163 |
Addison Wesley, 1989
|
|
|
2164 |
.IP "[NeHe82] " 9
|
|
|
2165 |
R.M. Needham and A.J. Herbert,
|
|
|
2166 |
.I
|
|
|
2167 |
The Cambridge Distributed Computing System,
|
|
|
2168 |
.R
|
|
|
2169 |
Addison-Wesley, London, 1982
|
|
|
2170 |
.IP [Neu92] 9
|
|
|
2171 |
B. Clifford Neuman,
|
|
|
2172 |
``The Prospero File System'',
|
|
|
2173 |
.I
|
|
|
2174 |
USENIX File Systems Workshop Proc.,
|
|
|
2175 |
.R
|
|
|
2176 |
Ann Arbor, 1992, pp. 13-28.
|
|
|
2177 |
.IP "[OCDNW88] " 9
|
|
|
2178 |
John Ousterhout, Andrew Cherenson, Fred Douglis, Mike Nelson, and Brent Welch,
|
|
|
2179 |
``The Sprite Network Operating System'',
|
|
|
2180 |
.I
|
|
|
2181 |
IEEE Computer,
|
|
|
2182 |
.R
|
|
|
2183 |
21(2), 23-38, Feb. 1988.
|
|
|
2184 |
.IP [Pike87] 9
|
|
|
2185 |
Rob Pike, ``The Text Editor \f(CWsam\fP'',
|
|
|
2186 |
.I
|
|
|
2187 |
Software - Practice and Experience,
|
|
|
2188 |
.R
|
|
|
2189 |
Nov 1987, \f3\&17\f1(11), pp. 813-845; reprinted in this volume.
|
|
|
2190 |
.IP [Pike91] 9
|
|
|
2191 |
Rob Pike, ``8½, the Plan 9 Window System'',
|
|
|
2192 |
.I
|
|
|
2193 |
USENIX Summer Conf. Proc.,
|
|
|
2194 |
.R
|
|
|
2195 |
Nashville, June, 1991, pp. 257-265,
|
|
|
2196 |
reprinted in this volume.
|
|
|
2197 |
.IP [Pike93] 9
|
|
|
2198 |
Rob Pike and Ken Thompson, ``Hello World or Καλημέρα κόσμε or
|
|
|
2199 |
\f(Jpこんにちは 世界\fP'',
|
|
|
2200 |
.I
|
|
|
2201 |
USENIX Winter Conf. Proc.,
|
|
|
2202 |
.R
|
|
|
2203 |
San Diego, 1993, pp. 43-50,
|
|
|
2204 |
reprinted in this volume.
|
|
|
2205 |
.IP [Pike94] 9
|
|
|
2206 |
Rob Pike,
|
|
|
2207 |
``Acme: A User Interface for Programmers'',
|
|
|
2208 |
.I
|
|
|
2209 |
USENIX Proc. of the Winter 1994 Conf.,
|
|
|
2210 |
.R
|
|
|
2211 |
San Francisco, CA,
|
|
|
2212 |
.IP [Pike95] 9
|
|
|
2213 |
Rob Pike,
|
|
|
2214 |
``How to Use the Plan 9 C Compiler'',
|
|
|
2215 |
.I
|
|
|
2216 |
Plan 9 Programmer's Manual,
|
|
|
2217 |
Volume 2,
|
|
|
2218 |
.R
|
|
|
2219 |
AT&T Bell Laboratories,
|
|
|
2220 |
Murray Hill, NJ,
|
|
|
2221 |
1995.
|
|
|
2222 |
.IP [POSIX] 9
|
|
|
2223 |
.I
|
|
|
2224 |
Information Technology\(emPortable Operating
|
|
|
2225 |
System Interface (POSIX) Part 1:
|
|
|
2226 |
System Application Program Interface (API)
|
|
|
2227 |
[C Language],
|
|
|
2228 |
.R
|
|
|
2229 |
IEEE, New York, 1990.
|
|
|
2230 |
.IP "[PPTTW93] " 9
|
|
|
2231 |
Rob Pike, Dave Presotto, Ken Thompson, Howard Trickey, and Phil Winterbottom, ``The Use of Name Spaces in Plan 9'',
|
|
|
2232 |
.I
|
|
|
2233 |
Op. Sys. Rev.,
|
|
|
2234 |
.R
|
|
|
2235 |
Vol. 27, No. 2, April 1993, pp. 72-76,
|
|
|
2236 |
reprinted in this volume.
|
|
|
2237 |
.IP [Presotto] 9
|
|
|
2238 |
Dave Presotto,
|
|
|
2239 |
``Multiprocessor Streams for Plan 9'',
|
|
|
2240 |
.I
|
|
|
2241 |
UKUUG Summer 1990 Conf. Proc.,
|
|
|
2242 |
.R
|
|
|
2243 |
July 1990, pp. 11-19.
|
|
|
2244 |
.IP [PrWi93] 9
|
|
|
2245 |
Dave Presotto and Phil Winterbottom,
|
|
|
2246 |
``The Organization of Networks in Plan 9'',
|
|
|
2247 |
.I
|
|
|
2248 |
USENIX Proc. of the Winter 1993 Conf.,
|
|
|
2249 |
.R
|
|
|
2250 |
San Diego, CA,
|
|
|
2251 |
pp. 43-50,
|
|
|
2252 |
reprinted in this volume.
|
|
|
2253 |
.IP [PrWi95] 9
|
|
|
2254 |
Dave Presotto and Phil Winterbottom,
|
|
|
2255 |
``The IL Protocol'',
|
|
|
2256 |
.I
|
|
|
2257 |
Plan 9 Programmer's Manual,
|
|
|
2258 |
Volume 2,
|
|
|
2259 |
.R
|
|
|
2260 |
AT&T Bell Laboratories,
|
|
|
2261 |
Murray Hill, NJ,
|
|
|
2262 |
1995.
|
|
|
2263 |
.IP "[RFC768] " 9
|
|
|
2264 |
J. Postel, RFC768,
|
|
|
2265 |
.I "User Datagram Protocol,
|
|
|
2266 |
.I "DARPA Internet Program Protocol Specification,
|
|
|
2267 |
August 1980.
|
|
|
2268 |
.IP "[RFC793] " 9
|
|
|
2269 |
RFC793,
|
|
|
2270 |
.I "Transmission Control Protocol,
|
|
|
2271 |
.I "DARPA Internet Program Protocol Specification,
|
|
|
2272 |
September 1981.
|
|
|
2273 |
.IP [Rao91] 9
|
|
|
2274 |
Herman Chung-Hwa Rao,
|
|
|
2275 |
.I
|
|
|
2276 |
The Jade File System,
|
|
|
2277 |
.R
|
|
|
2278 |
(Ph. D. Dissertation),
|
|
|
2279 |
Dept. of Comp. Sci,
|
|
|
2280 |
University of Arizona,
|
|
|
2281 |
TR 91-18.
|
|
|
2282 |
.IP [Rit84] 9
|
|
|
2283 |
D.M. Ritchie,
|
|
|
2284 |
``A Stream Input-Output System'',
|
|
|
2285 |
.I
|
|
|
2286 |
AT&T Bell Laboratories Technical Journal,
|
|
|
2287 |
\f363\f1(8), October, 1984.
|
|
|
2288 |
.IP [Tric95] 9
|
|
|
2289 |
Howard Trickey,
|
|
|
2290 |
``APE \(em The ANSI/POSIX Environment'',
|
|
|
2291 |
.I
|
|
|
2292 |
Plan 9 Programmer's Manual,
|
|
|
2293 |
Volume 2,
|
|
|
2294 |
.R
|
|
|
2295 |
AT&T Bell Laboratories,
|
|
|
2296 |
Murray Hill, NJ,
|
|
|
2297 |
1995.
|
|
|
2298 |
.IP [Unicode] 9
|
|
|
2299 |
.I
|
|
|
2300 |
The Unicode Standard,
|
|
|
2301 |
Worldwide Character Encoding,
|
|
|
2302 |
Version 1.0, Volume 1,
|
|
|
2303 |
.R
|
|
|
2304 |
The Unicode Consortium,
|
|
|
2305 |
Addison Wesley,
|
|
|
2306 |
New York,
|
|
|
2307 |
1991.
|
|
|
2308 |
.IP [UNIX85] 9
|
|
|
2309 |
.I
|
|
|
2310 |
UNIX Time-Sharing System Programmer's Manual,
|
|
|
2311 |
Research Version, Eighth Edition, Volume 1.
|
|
|
2312 |
.R
|
|
|
2313 |
AT&T Bell Laboratories, Murray Hill, NJ, 1985.
|
|
|
2314 |
.IP [Welc94] 9
|
|
|
2315 |
Brent Welch,
|
|
|
2316 |
``A Comparison of Three Distributed File System Architectures: Vnode, Sprite, and Plan 9'',
|
|
|
2317 |
.I
|
|
|
2318 |
Computing Systems,
|
|
|
2319 |
.R
|
|
|
2320 |
7(2), pp. 175-199, Spring, 1994.
|
|
|
2321 |
.IP [Wint95] 9
|
|
|
2322 |
Phil Winterbottom,
|
|
|
2323 |
``Alef Language Reference Manual'',
|
|
|
2324 |
.I
|
|
|
2325 |
Plan 9 Programmer's Manual,
|
|
|
2326 |
Volume 2,
|
|
|
2327 |
.R
|
|
|
2328 |
AT&T Bell Laboratories,
|
|
|
2329 |
Murray Hill, NJ,
|
|
|
2330 |
1995.
|