diff --git a/src/scheme/sys/iostat.rs b/src/scheme/sys/iostat.rs
new file mode 100644
index 0000000000000000000000000000000000000000..f7316bb1e679320552c5db5b2101c3e491f4787a
--- /dev/null
+++ b/src/scheme/sys/iostat.rs
@@ -0,0 +1,60 @@
+use collections::{String, Vec};
+use core::fmt::Write;
+use core::str;
+
+use context;
+use scheme;
+use syscall::error::Result;
+
+pub fn resource() -> Result<Vec<u8>> {
+    let mut string = String::new();
+
+    {
+        let mut rows = Vec::new();
+        {
+            let contexts = context::contexts();
+            for (id, context_lock) in contexts.iter() {
+                let context = context_lock.read();
+
+                rows.push((*id, context.name.lock().clone(), context.files.lock().clone()));
+            }
+        }
+
+        for row in rows.iter() {
+            let id: usize = row.0.into();
+            let name = str::from_utf8(&row.1).unwrap_or(".");
+            let _ = writeln!(string, "{}: {}", id, name);
+
+            for (fd, f) in row.2.iter().enumerate() {
+                let file = match *f {
+                    None => continue,
+                    Some(file) => file
+                };
+
+                let scheme = {
+                    let schemes = scheme::schemes();
+                    match schemes.get(file.scheme) {
+                        Some(scheme) => scheme.clone(),
+                        None => {
+                            let _ = writeln!(string, "  {:>4}: {:>8} {:>8}: no scheme", fd, file.scheme.into(), file.number);
+                            continue;
+                        }
+                    }
+                };
+
+                let mut fpath = [0; 4096];
+                match scheme.fpath(file.number, &mut fpath) {
+                    Ok(path_len) => {
+                        let fname = str::from_utf8(&fpath[..path_len]).unwrap_or("?");
+                        let _ = writeln!(string, "  {:>4}: {:>8} {:>8}: {}", fd, file.scheme.into(), file.number, fname);
+                    },
+                    Err(err) => {
+                        let _ = writeln!(string, "  {:>4}: {:>8} {:>8}: {}", fd, file.scheme.into(), file.number, err);
+                    }
+                }
+            }
+        }
+    }
+
+    Ok(string.into_bytes())
+}
diff --git a/src/scheme/sys/mod.rs b/src/scheme/sys/mod.rs
index 02273ba45e28235fec715e2754e88e028ac09c08..ed09117d2c453d4967863759fe93bba162bac850 100644
--- a/src/scheme/sys/mod.rs
+++ b/src/scheme/sys/mod.rs
@@ -12,6 +12,7 @@ use syscall::scheme::Scheme;
 mod context;
 mod cpu;
 mod exe;
+mod iostat;
 mod scheme;
 //mod interrupt;
 //mod log;
@@ -40,6 +41,7 @@ impl SysScheme {
         files.insert(b"context", Box::new(move || context::resource()));
         files.insert(b"cpu", Box::new(move || cpu::resource()));
         files.insert(b"exe", Box::new(move || exe::resource()));
+        files.insert(b"iostat", Box::new(move || iostat::resource()));
         files.insert(b"scheme", Box::new(move || scheme::resource()));
         //files.insert(b"interrupt", Box::new(move || interrupt::resource()));
         //files.insert(b"log", Box::new(move || log::resource()));