0 : Suppose you write the following: ... printf("%d %d %s %s",a,b); ... You often get an error. Explain. 1: Give the exact meaning of the following: #define assert(EX) do { \ if (!(EX)) printk("assertion failed: %s, %s::%d\n", \ #EX, __FILE__, __LINE__); \ } while (0) 2: Search for thread_info in 2.5.x: struct thread_info { ... __u8 supervisor_stack[0]; }; Explain the last line (what does [0] mean?). 3: Are ECC errors handled in Linux? What exception is raised by the IA-32 arch for ECC errors (both correctable and uncorrectable)? Locate the corresponding source to where the control flow should jump. 4: Do a "man dlopen" and study the example of dynamically loading the math lib and computing cosine. Show the change in the mappings in the address space of the program as it executes. Can you write a program that dynamically loads in an older version of libc.so to be compatible with that program? 5: Study the following code: #include .... main(int argc, char * argv[]) { void (*greeting)(); void * module; if( argc < 2 ) exit(0); module = dlopen(argv[1], RTLD_LAZY); if(!module) exit(0); greeting = dlsym(module, "greet"); if(greeting) { (*greeting)(); } dlclose(module); } What is it doing? How can you use it? 6: Locate and study the following DTrace scripts: iocpu.d (what does it print?) iosnoop.d iothrough.d iotime.d and on the web: seeksize.d Run all of the above on soffice. Can you get a histogram of the seek times? Can you infer positions on the disk where files are located? Can we find out how to identify which lib is loading? Can you reorder the lib loading to minimize seeks?