See Chapter 3, "Processes: The Principal Model of Execution," on building the kernel and user code. Recompile the kernel and compile mytest.c. Run mytest.c and observe the output.
2:
Add another parameter to ourcall.
3:
Make a system call from within ourcall.
4:
Explain the similarities and differences between system calls and device drivers.
5:
Why can't we use memcpy to copy data between user space and kernel space?
6:
What is the difference between a top-half and bottom-half routine?
7:
What's the difference between a tasklet and a work_queue?
8:
When a device can handle more than simply read and write requests, how does Linux interact with it?
9:
What is the numerical value of an unlocked spinlock on x86 architecture? On PPC?
10:
In one sentence, describe the difference between block drivers and character drivers.