In the course of this lab project we successfully implemented an \ac{ahci}
driver and supporting code for data storage and retrieval.

\section{Flounder Modifications}

The extensions added to flounder provide a very simple and extensible way to
interface with disks. The overhead incurred is acceptable in the trade-off for
simplicity and modularity. The seperation of interface definition for \ac{ata}
from implementation of command dispatching to the device allows simple addition
of further \ac{ata} transports, such as additional \acs{pata}/\acs{sata}
controllers.

\section{Security}

The \acs{ahci} driver demonstrates the trade-off when dealing with \acs{dma}.
If a domain is allowed full control over the configuration of \acs{dma}
aspects, it can obtain full read/write access to physical memory. To mitigate
this problem, the management service would have to check and validate any
memory regions supplied before allowing a command to execute. If only trusted
domains are allowed to bind to the \acs{ahci} driver, these checks are not
neccessary. This is a valid assumption, as filesystems and blockdevice-like
services are the only ones that should be allowed raw access to disks.

\section{Performance}

Performance is in the same order of magnitude as seen on Linux for large
blocksizes and random access. There is some bottleneck during read operations
that could relate either to interrupt dispatching or memcopy performance.  To
achieve high throughput on sequential workloads with small blocksizes, a
prefetcher of some sort is necessary. A possible solution would be to have a
cache that stores pages or larger chunks of data. A read operation would then
have to read multiples of the cached size if the data is not present in the
cache. If data is cached, the request can be completed much faster without
needing to consult the disk.
