 | Explain the differences between user memory and kernel memory |
 |
List the major subsystems of the Linux kernel |
 |
Describe several types of Linux kernel extensions |
 |
Describe the address space architecture of a 32-bit, Intel-based Linux process |
 |
List and describe the characteristics of the states of the life cycle of a Linux process |
 |
Explain how Linux implements file and device Input/Output (I/O) operations |
 |
Explain how the Linux kernel implements the virtual file system concept |
 |
Locate the Linux source code and header file directory trees |
 |
Use the printk( ) function to print messages from within the Linux kernel |
 |
Build a new Linux kernel |
 |
Relate the significance of the above objectives to the role of a Linux device driver writer |
 |
Write, compile, install, and remove simple Linux kernel modules |
 |
List the modules being used by the kernel |
 |
Pass parameters into module code when the code is loaded into the kernel |
 |
Export or prevent the exporting of symbols from one module to another |
 |
Stack modules |
 |
Describe the kernel structures used to manage modules |
 |
Describe how Linux implements the virtual file system concept and how it relates to device I/O |
 |
Write applications that perform file I/O with a simple character device driver |
 |
Explain how Linux assigns device major numbers |
 |
Create a device special file using the mknod command |
 |
Implement macros that track the current usage of a device driver |
 |
List the aspects of hardware involved in writing a simple device driver |
 |
Explain the use of I/O ports and Interrupt Requests (IRQ) |
 |
Allocate and free I/O ports and IRQ lines |
 |
Describe how interrupts occur and how to handle them |
 |
Describe the pin configuration of the parallel port |
 |
Write data to an I/O port |
 |
Read data from I/O ports |
 |
Build a complete character-based device driver |
 |
Use the ioctl( ) system call to control the behavior of a device driver from an application |
 |
Explain the logic behind ioctl( ) command values and use macros to manipulate them |
 |
Copy data from an application in user space to a device driver in kernel space |
 |
Copy data from a device driver in kernel space to an application in user space |
 |
Access fields from the task_struct structure of a process that is using the device driver |
 |
Perform blocking and non-blocking I/O operations |
 |
Use various time management techniques within a device driver |
 |
Describe and use various kernel task queues |
 |
Allocate and deallocate memory from within a device driver |
 |
Describe the entire scope of Linux interrupt handling |
 |
Install fast and slow interrupt handlers |
 |
Install and call bottom half interrupt handlers |
 |
List and describe many ways of disabling interrupts in Linux |
 |
Describe many ways of setting IRQs within a Linux device driver |
 |
Use the /proc file system to help determine IRQs and track number of interrupts |
 |
Briefly describe the characteristics of the Peripheral Component Interconnect (PCI) hardware environment |
 |
Describe the address layout of the PCI environment |
 |
Describe the layout of the PCI configuration header |
 |
Write a module that detects a PCI device |
 |
Describe how the functions referenced by a block device driver jump table differ from those referenced by a character device driver |
 |
Register and unregister a block device driver |
 |
Create a device driver that supports multiple devices through minor numbers |
 |
Describe the attributes that the Linux kernel maintains for block device drivers |
 |
Populate Linux kernel structures with attribute information for a block device |
 |
Describe the use of the blk_dev_struct structure |
 |
Code I/O requests for a block device driver |
 |
Code a block device driver to properly open, close and clean up a block device |