I wrote a basic device driver that sits between a virtual application and virtualized hardware. The application makes use of an abstraction that I’ve implemented called tagline storage. The design of the system is shown in the figure below.

The tagline application is provided and calls the tagline device driver functions with “tagline operations”. These operations create and read/write data to special data abstractions called taglines. And for this project, I’ve implemented this abstraction layer. The software layer basically creates taglines by sending “RAID operations” to a virtual RAID disk array using a virtual I/O bus.

Numerous utility functions were provided by the professor to help debug and test the program, as well as simply the creation of readable output. Sample workloads was generated and given to extensively test the program.


In the later stages of the project, instead of sending the RAID bus operations to a virtual RAID disk array, I implemented a client that connected to a local server over TCP and sent operations through a socket. I’ve also implemented an LRU cache that had cached 1024 cache lines at max with write-through semantics.

Tagline Abstraction


A tagline is storage abstraction somewhat similar to a data file, with several key differences. The basic idea is that the application will create, read, and write to a tagline. Almost all of the important details of the tagline interface are defined in the tagline_driver.h header file.

The “name” of a tagline is a 16-bit unsigned integer. This is assigned by the application and managed by the device driver. The tagline consists of a zero-indexed set of blocks that are read from and written to the storage. A file will initially have zero blocks. All reads and writes will be performed on one or more blocks. Taglines are monotonically increasing, meaning that they are never deleted and they never shrink. Blocks can be overwritten however.