No longer valid in 2019
Lab 0 - C pointers and Pintos setup
Overview
Lab 0 can be seen as preparation to the Pintos labs (labs 1-4). The lab consists of three parts- Pointer debugging: This part is intended to make sure that you are able to understand and fix a program that uses arrays and pointers in C in a non-trivial fashion.
- Linked list implementation: This part is intended to make sure that you understand how lists are implemented with pointers in C (including memory (de)allocation) and also that you are able to create relevant test cases for your solutions.
- Pintos setup: The final part of this lab is to setup Pintos in your environment.
Pointer debugging (part 1)
First try to understand the program below and spot the bug, and fix it.
Run the program in ddd or gdb to find the row where the segmentation fault
occurs. You must first compile it with gcc -g
for this to work.
Copy the follwing text and save and compile it:
#include <stdio.h>
int main(int argc, char ** argv)
{
char str[] = "sihtgubed";
char *stri = &str[8];
char *buf[9];
char **bufi, **bufend;
bufi = buf;
bufend = &buf[9];
while (bufi != bufend){
*bufi = stri;
bufi++;
stri--;
}
while (bufi != buf){
*(*bufi) -= 32;
bufi--;
}
while (bufi != bufend){
printf("%c", **bufi);
bufi++;
}
}
N.B. This is a silly and not very pretty program. Hint: Check an ASCII table (for example by typing man ascii in the console).
Linked list implementation (part 2)
Create a linked list with the following functions:
void append(struct list_item *first, int x); /* puts x at the end of the list */
void prepend(struct list_item *first, int x); /* puts x at the beginning of the list */
void print(struct list_item *first); /* prints all elements in the list */
/* input_sorted: find the first element in the list larger than x
and input x right before that element */
void input_sorted(struct list_item *first, int x);
void clear(struct list_item *first); /* free everything dynamically allocated */
Hint1: You need to use malloc
(and
free
of course) and a struct list_item
that contains a pointer to the same struct:
struct list_item {
int value;
struct list_item * next;
};
Hint2: Implementing the list will be easier if you make
first
be a static head element that does not contain
any real data. (Because there are fewer exceptions if you know
first
is never NULL.) Your main
can start like this:
int main( int argc, char ** argv)
{
struct list_item root;
root.value = -1; /* This value is always ignored */
root.next = NULL;
Write a piece of code that tests you linked list implementation. You
should test all the relevant cases including, creation, insertion (all
different types), printing, and clearing. Try several different
orders of these functions (including printing after clearing the
list). Use Valgrind
to make sure you have got no memory leaks.
You can use the following command:
% valgrind --tool=memcheck --leak-check=yes your-program
Pintos setup (part 3)
The follwing instructions are for installing Pinots in Linux (mint).
Pintos is an instructional operating system that runs on x86 machines. You will run it in QEMU -- a computer system emulator, which runs as a user process under Linux. Pintos is written in C. The lab assignments require modification of the provided version of Pintos by adding functionality to parts of it, for instance, synchronization of threads and memory management.
Installation
Step 1: The first thing you must do is to create a repository:
svnadmin create $HOME/svnlinuxrepository
Step 2: Import the linux Pintos files into it (have patience, this may take a few minutes):
svn import /home/TDDE68/labs/linux/ file://$HOME/svnlinuxrepository -m "linux pintos "
Step 3: Now check out a working copy into a directory called pintos:
svn checkout file://$HOME/svnlinuxrepository/pintos linuxpintos
cd linuxpintos
Step 4: Run the following script to instruct svn to ignore some files
~TDDE68/labs/propset.bash
Step 5: Do not allow anyone else to read your code:
chmod -R og-rwx $HOME/svnlinuxrepository/ $HOME/linuxpintos
Commit your code:
cd linuxpintos/src/
svn -m "initial commit message" commit
Step 6: go int utils
cd utils
ln -s $(which qemu-system-i386) qemuStep 7:
make
chmod +x pintos
chmod +x pintos-mkdisk
chmod +x backtrace
chmod +x pintos-gdb
Step 8: Make the pintos commands available in your terminal using the follwoing command: (you might also want to add this to your ~/.bashrc file, you might need to create the file if it is missing.)
export PATH="${HOME}/linuxpintos/src/utils/:${PATH}/"
Compilation
To compile Pintos for the first time, change your current directory to the threads directory (cd pintos/src/threads) and issue the command:
make
Go down to the build directory and start Pintos to see that it runs:
cd build pintos --qemu -- run alarm-multipleYou should get a new window with an output that ends with something similar to the following (show this to your lab assistant):
eriha@parlomba1:build$ pintos --qemu -- run alarm-multiple Writing command line to /tmp/EAhN6wTYgK.dsk... qemu -hda /tmp/EAhN6wTYgK.dsk -m 4 -net none -serial stdio Kernel command line: run alarm-multiple Pintos booting with 4,088 kB RAM... 371 pages available in kernel pool. 371 pages available in user pool. Calibrating timer... 314,163,200 loops/s. Boot complete. Executing 'alarm-multiple': (alarm-multiple) begin (alarm-multiple) Creating 5 threads to sleep 7 times each. (alarm-multiple) Thread 0 sleeps 10 ticks each time, (alarm-multiple) thread 1 sleeps 20 ticks each time, and so on. (alarm-multiple) If successful, product of iteration count and (alarm-multiple) sleep duration will appear in nondescending order. (alarm-multiple) thread 0: duration=10, iteration=1, product=10 (alarm-multiple) thread 0: duration=10, iteration=2, product=20 (alarm-multiple) thread 1: duration=20, iteration=1, product=20 (alarm-multiple) thread 2: duration=30, iteration=1, product=30 (alarm-multiple) thread 0: duration=10, iteration=3, product=30 (alarm-multiple) thread 0: duration=10, iteration=4, product=40 (alarm-multiple) thread 1: duration=20, iteration=2, product=40 (alarm-multiple) thread 3: duration=40, iteration=1, product=40 (alarm-multiple) thread 4: duration=50, iteration=1, product=50 (alarm-multiple) thread 0: duration=10, iteration=5, product=50 (alarm-multiple) thread 0: duration=10, iteration=6, product=60 (alarm-multiple) thread 1: duration=20, iteration=3, product=60 (alarm-multiple) thread 2: duration=30, iteration=2, product=60 (alarm-multiple) thread 0: duration=10, iteration=7, product=70 (alarm-multiple) thread 3: duration=40, iteration=2, product=80 (alarm-multiple) thread 1: duration=20, iteration=4, product=80 (alarm-multiple) thread 2: duration=30, iteration=3, product=90 (alarm-multiple) thread 4: duration=50, iteration=2, product=100 (alarm-multiple) thread 1: duration=20, iteration=5, product=100 (alarm-multiple) thread 1: duration=20, iteration=6, product=120 (alarm-multiple) thread 2: duration=30, iteration=4, product=120 (alarm-multiple) thread 3: duration=40, iteration=3, product=120 (alarm-multiple) thread 1: duration=20, iteration=7, product=140 (alarm-multiple) thread 2: duration=30, iteration=5, product=150 (alarm-multiple) thread 4: duration=50, iteration=3, product=150 (alarm-multiple) thread 3: duration=40, iteration=4, product=160 (alarm-multiple) thread 2: duration=30, iteration=6, product=180 (alarm-multiple) thread 4: duration=50, iteration=4, product=200 (alarm-multiple) thread 3: duration=40, iteration=5, product=200 (alarm-multiple) thread 2: duration=30, iteration=7, product=210 (alarm-multiple) thread 3: duration=40, iteration=6, product=240 (alarm-multiple) thread 4: duration=50, iteration=5, product=250 (alarm-multiple) thread 3: duration=40, iteration=7, product=280 (alarm-multiple) thread 4: duration=50, iteration=6, product=300 (alarm-multiple) thread 4: duration=50, iteration=7, product=350 (alarm-multiple) end Execution of 'alarm-multiple' complete.
Page responsible: M. Asplund and K. Arvidsson
Last updated: 2024-06-25