forked from brho/akaros
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGETTING_STARTED
355 lines (254 loc) · 13.3 KB
/
GETTING_STARTED
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
GETTING_STARTED
Barret Rhoden
Last thorough update: 2013-02-07
1. Overview
---------------------
In this document, I outline what steps I go through to set up my development
environment. Some devs use other setups, and they can put sections farther
down in this document describing their steps.
Due to the nature of different workflows and different Linux distros, you'll
need to do some configuration of your environment. Things won't magically work
out of the box.
2. Need help?
---------------------
First off, if you get stuck, email someone. You can join our mailing list by
sending an email to [email protected]. Send your messages
to [email protected]. Or just email me (brho@cs), though the
mailing list is a more scalable method in the long run.
Alternatively, you can poke your head in #akaros on irc.freenode.net. I'm
usually idling in there (alone), and if I'm at my computer, I'll respond.
3. From Download to Hello World
---------------------
I'll describe how to get x86 working. RISCV is similar.
The first step is to configure the kernel. config, menuconfig, and some of the
other KBuild targets work. Defconfig gives you a default configuration. For
example, to config for 64-bit x86:
$ make ARCH=x86 defconfig
Alternatively, you can run menuconfig to customize what settings you want:
$ make ARCH=x86 menuconfig
For x86, you can choose between 32 and 64 bit when you make menuconfig. This
selection must match your cross compiler make command. The default is 64 bit.
There are a lot of other settings when you make config, and you should browse
through to decide what you want to enable/disable.
Most everyone wants KFS turned on (Filesystems --> KFS filesystem). This is
the in-memory filesystem that the kernel uses. The kernel build scripts will
look at the "KFS/Initramfs paths" string and take any of those directories and
add them to a CPIO archive that will eventually become the root filesystem when
Akaros runs. These settings are set by default when you do a 'make defconfig'.
There are also settings for ext2. If you turn on ext2 support, you need to
point to an img file that has been formatted with ext2 and has files in it. If
you aren't messing with filesystems at all, feel free to ignore this. It's an
in-memory filesystem, like KFS (linked to the end of the kernel), so you won't
gain much by using it for now.
3.1 Cross compiler (and glibc)
----------
The second step is to build the cross compiler, which lives in
tools/compilers/gcc-glibc
$ cd tools/compilers/gcc-glibc
In this directory, you first need to set up your Makelocal file. There is a
template to work from.
$ cp Makelocal.template Makelocal
You need to set your INSTDIRS to some place where you want the cross compiler
installed. I have a directory named ros-gcc-glibc for this.
You also need to add bin directories to your PATH where the cross compiler will
be installed. This will vary based on your value for INSTDIRS. For instance,
my path contains:
/home/brho/classes/ros/ros-gcc-glibc/install-x86_64-ros-gcc/bin
You can also set up MAKE_JOBS, so you don't over or under load your system when
building. I have a 2 core laptop, so I use MAKE_JOBS := 3
At this point, you can build (for example):
$ make x86_64
This might take a while (10-20 minutes for me on a 2007 era laptop).
Just to double check everything installed correctly, you should be able to run
x86_64-ros-gcc from your shell.
Now, you have a cross compiler ready, and you can start to build Akaros.
3.2 Kernel
----------
cd back into the repo root.
Like the cross compiler, the kernel has its own Makelocal.
$ cp Makelocal.template Makelocal
This file is used to set up custom make targets that are not part of the
default Makefile, but fit nicely into your personal workflow. This file is not
under version control and can me made to contain just about anything.
Now you're ready to build the kernel:
$ make
So the kernel built, but you can't do much with it, and you probably have no
programs.
Notice that we didn't have to set the ARCH variable this time. The make system
knows what architecture we are set up for and will always build for that
architecture until a new ARCh is selected (i.e. via 'make ARCH=xxx defconfig'
etc.)
3.3 Userspace
---------
To build userspace and test programs:
$ make tests
You now have programs and libraries, and need to put them in KFS. To do this,
we provide a 'fill-kfs' make target.
$ make fill-kfs
The 'fill-kfs' target copies your cross compiler's shared libraries and all
test binaries into the first "KFS/Initramfs path" you set during configuration
(or kern/kfs/lib if you just kept the default).
Now that you've changed the contents of KFS's source, remake the kernel. You
should see something like
Building initramfs:
Adding kern/kfs to initramfs...
before the kernel links. If you don't see this, then you probably didn't
actually fill KFS properly.
3.4 Busybox
---------
Busybox provides our shell and some basic utilities. You almost certainly want
to build and install busybox.
Userspace programs like busybox need to be compiled with the cross compiler and
then have their binaries copied to kern/kfs/bin. Since most everyone wants
busybox and we have a few patches of our own, we have support for automatically
building and installing it to KFS.
For the default build (x86_64):
$ cd tools/apps/busybox
$ make [x86_64|riscv]
$ cd -
And you should be set. Check kfs to make sure everything installed. You
should get sane results from:
$ ls -l kern/kfs/bin | grep cat
lrwxrwxrwx 1 brho brho 7 Jan 23 09:19 cat -> busybox
You can customize your busybox installation, including the install prefix, the
.config file, and make jobs. Check out the makefile in tools/apps/busybox for
details.
Now that you've changed KFS, don't forget to remake the kernel.
3.5 Building and Loading a Virtual Machine Image
---------
At this point, you probably have a runnable kernel with programs in KFS. It
should be sitting at obj/kernel/akaros-kernel. When running in a VM, you can
either run the kernel directly from qemu, or put it in a virtual machine image
file.
If you don't want to bother with the image, skip this section. I tend to run
my images off an image file, since qemu acts more like hardware (as far as
multiboot goes). The downside is the boot up is slower, especially if you have
a large kernel (>100MB). It also takes some effort to set up the VM image.
If you are still reading, you'll need an image file that looks like a hard disk
to boot qemu off of. I put one similar to mine at:
http://akaros.cs.berkeley.edu/files/hdd268mb.img
It's around 268MB (256MiB, or whatever). If you want to make your own, check
out Documentation/howtos/make-bootable-grub-hdd.txt. That's actually the
original document I made back when I first figured it out back in 2009, which
has been updated again in 2013. In between, I wrote it up online at
http://www.omninerd.com/articles/Installing_GRUB_on_a_Hard_Disk_Image_File,
which has some other tidbits in the comments. Both methods still use grub1.
Anyway, I put that img in AKAROS-ROOT/mnt/, and make a folder next to it:
AKAROS-ROOT/mnt/hdd. mnt/hdd is the mount point where I mount hdd.img (Note I
don't call it hdd64mb.img on my dev machine).
Personally, I always have hdd.img mounted. Some of the other devs have make
targets that mount and umount it. Whenever I reboot my development machine, I
run a script (as root) that mounts the image file and sets up a few things for
networking. I put a script I use for this in scripts/kvm-up.sh. You'll likely
want to copy it to the directory *above* the akaros root directory and edit it
accordingly. Feel free to comment out the networking stuff. That's for using
networking in qemu.
Now that your image file is mounted at mnt/hdd, you'll want to copy your
freshly built kernel to the root of the image. I have a make target in my
makelocal for this, so that whenever I do a make kvm, it builds the kernel and
copies it to my hdd.img.
I added edited versions of my KVM (and USB) make targets to the
Makelocal.template. Uncomment the KVM one (at least).
Incidentally, I also have the following in my Makelocal, so that make (and make
all) also make kvm:
all: kvm
Now, make kvm. You should be able to see the new kernel in mnt/hdd/ (do an ls
-l and check the timestamp).
3.6 Running Qemu
---------
Here is the command I use to run qemu/kvm. It's evolved over the years, and it
will vary based on your linux distribution. Don't run it just yet:
$ qemu-system-i386 -s -enable-kvm -cpu phenom -smp 8 -m 2048 -nographic -monitor /dev/pts/3 -net nic,model=e1000 -net tap,ifname=tap0,script=no mnt/hdd.img
If you skipped making a virtual machine image, replace "mnt/hdd.img" with
"-kernel obj/kern/akaros-kernel".
The -monitor is the qemu monitor, which is a CLI for qemu. Pick a
tab/terminal/pty in Linux that you will only use for qemu monitoring, and enter
'tty'. Whatever it tells you, put in place of /dev/pts/3. I've been using the
same tab for about 4 years now. In that tab, enter 'sleep 999999999'. Qemu
will still access it, but you won't have to worry about bash trying to handle
your inputs.
-nographic allows qemu to work in the terminal you run qemu from, instead of
spawning off a fake cpu crt/monitor.
If you don't have networking set up (including the tun/tap stuff from
kvm-up.sh), remove the -net commands/options.
Fell free to pick different values for the number of cpus and RAM (8 and 1024
in the example).
Once you finally run it, you can stop the VM by entering 'q' to the qemu
monitor (or just killing the process).. Other help commands from the monitor
include 'info cpus', 'info registers', 'x', and 'help'.
3.7 Running on Hardware
---------
I have a few bootable USB sticks with grub set up to run Akaros. The make usb
target (example in Makelocal.template) will copy freshly made kernels to your
USB device. You'll need to adjust those paths according to your distro. My
usb sticks are usually /dev/sdc, for instance (some odd USB device in the last
couple of years has taken over /dev/sdb. Probably something to do with udev
changing over the years).
Anyway, you'll need to mess around a bit to get that working. Or I can dd one
for you (I have 4GB disks in my office that I use). If you make your own, the
critical part is getting grub to pick the right device (from what I remember),
and its fairly similar to installing grub on any old hard drive (since it's
just a bloc device). Much easier than a hard disk image file.
3.8 Hello World
---------
So now you can run the kernel. It's time to edit a program (or make your own).
In this, I'll go through my workflow for making changes.
$ vi tests/hello.c
(edit, save)
$ make tests
(new version in obj/tests/hello)
$ make fill-kfs
(updates kfs)
$ make
(rebuilds kernel with the new KFS)
$ qemu...
(following commands are in Akaros)
Shift-G (to get to the kernel monitor)
ROS(Core 0)> bb (to run busybox)
/ $ hello
(Should print your message)
3.9 Other Dev Workflow stuff
---------
One thing to note is that while we use dynamic linking for libc, parlib
libraries are statically linked with applications. In fact, nowadays *all*
Akaros programs need to be linked againt parlib (used to be that single-core
processes (SCPs) didn't need it).
The makefiles won't notice if you change a file in parlib and then remake a
binary. So if you edit user/parlib/uthread.c for example, tests/pthread_test
won't get rebuilt. Here's what I do:
$ vi user/parlib/uthread.c (make awesome change)
$ touch tests/pthread_test.c ; make tests
This will force the rebuild of pthread_test. Older, untouched binaries (e.g.
block_test), won't get rebuilt. I actually want this in some cases (different
versions of parlib when I'm running certain tests). Anyway, just pay attention
to what you're building. There's not much output in the console, so you should
be able to see what's going on all the time. (unlike when building glibc...).
Oh, and don't forget to:
$ make fill-kfs
to make sure you run the new pthread_test.
Additionally, when switching between 32 and 64 bit x86, make objclean before
filling KFS. This is the easiest way to make sure you get the appropriate
libraries loaded in KFS.
Early on as a dev, there are lots of times where you accidentally don't run the
right program (or kernel) and won't understand why your change isn't happening.
A few printk("WTF\n")'s later, you realize you didn't have the hdd.img mounted,
or you didn't fill KFS, or you didn't relink your binaries, or you forgot to
save all files in vi (and not just the current buffer). But after doing a
couple hello worlds, you're set.
Alternatively, you could have a make target to run qemu, which also touches all
binaries (or otherwise enforces a rebuild), auto-fills KFS, remakes the kernel,
and mounts/copies/unmounts your hdd.img. Kevin's sim repo has stuff like this,
so check it out if that's what you're into. (I think it is at
http://akaros.cs.berkeley.edu/ros-sim.tar.gz). Personally, I'm not that into
it, since I like to keep track of what is going on under the hood, esp if I
want to do something a little differently (like with testing ext2, having
different versions of parlib with some binaries, or being picky about my
mount/umounts).
4. RISCV
---------------------
TODO.
For now, you need a 64 bit distro to build the RISCV stuff, so I don't do it
very often. I'll eventually sync up with Andrew and we'll get this part sorted
out.
5. Other Developer's Stuff
---------------------