Skip to content

Commit

Permalink
Initial pmem.io web content
Browse files Browse the repository at this point in the history
  • Loading branch information
Andy Rudoff committed Sep 3, 2014
1 parent 3034650 commit 7aa418c
Show file tree
Hide file tree
Showing 34 changed files with 908 additions and 490 deletions.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* text=auto eol=lf
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*.swp
_site
7 changes: 7 additions & 0 deletions 404.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
permalink: /404.html
---

### Page not found

Sorry, couldn't find that page. Perhaps it was an outdated link to a blog post? You'll find a list of blog posts [here](/blog/).
29 changes: 29 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
Copyright (c) 2014, Intel Corporation

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.

* Neither the name of Intel Corporation nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
pmem.github.io
==============

pmem Organization Pages
### pmem.io web site

This repo contains the jekyll-based web site for http://pmem.io.

The contents of this site are BSD-licensed open source.

Send questions or comments to [[email protected]](mailto:[email protected]).
17 changes: 17 additions & 0 deletions _config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: pmem.io
description: Persistent Memory Programming
url: http://pmem.io

highlighter: pygments

gems:
- jekyll-mentions

defaults:
-
scope:
path: "" # all files
values:
layout: "default" # default layout is "default"

exclude: ['CNAME', 'LICENSE', 'README.md']
5 changes: 5 additions & 0 deletions _includes/pagefooter.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<p size="-2">
The contents of this web site and the associated
<a href="https://github.com/pmem">GitHub repositories</a>
are BSD-licensed open source.
</p>
50 changes: 50 additions & 0 deletions _layouts/default.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>{% if page.title %}pmem.io: {{ page.title }}{% else %}pmem.io{% endif %}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="/css/pmem.css" type="text/css">
<link rel="stylesheet" href="/css/pygment_trac.css" type="text/css">
<link rel="shortcut icon" href="/favicon.ico">
<link href="http://pmem.io/feed.xml" rel="alternate" type="application/atom+xml">
</head>
<body>
<!-- _layouts/default.html -->
<div id="wrap">
<div id="header">
<a href="http://pmem.io/">
<h2>pmem.io<br>Persistent Memory Programming</h2>
</a>
</div>
<div id="nav">
<ul>
<li><a href="/" {% if page.title == "Home" %} class="sel" {% endif %}>Home</a></li>
<li><a href="/glossary/" {% if page.title == "Glossary" %} class="sel" {% endif %}>Glossary</a></li>
<li><a href="/nvml/" {% if page.title == "NVM Library" %} class="sel" {% endif %}>NVM&nbsp;Library</a></li>
<li><a href="/blog/" {% if page.title == "Blog" %} class="sel" {% endif %}>Blog</a></li>
<li><a href="/about/" {% if page.title == "About" %} class="sel" {% endif %}>About</a></li>
</ul>
</div>
<div id="main">
{{ content }}
</div>
{% if page.title != "Blog" %}
<div id="sidebar">
<h5>Recent Blog Posts</h5>
{% for post in site.posts limit:5 %}
<hr>
<a href="{{ post.url }}">{{ post.title }}</a><br>
<div id="postinfo">Posted {{ post.date | date: '%B %d, %Y' }}</div>
{{ post.content | strip_html | truncatewords:20}}
<br><br>
{% endfor %}
</div>
{% endif %}
<div id="footer">
<hr>
{% include pagefooter.html %}
</div>
</div>
</body>
</html>
43 changes: 43 additions & 0 deletions _layouts/post.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>{% if page.title %}pmem.io: {{ page.title }}{% else %}pmem.io{% endif %}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="/css/pmem.css" type="text/css">
<link rel="stylesheet" href="/css/pygment_trac.css" type="text/css">
<link rel="shortcut icon" href="/favicon.ico">
<link href="http://pmem.io/feed.xml" rel="alternate" type="application/atom+xml">
</head>
<body>
<!-- _layouts/post.html -->
<div id="wrap">
<div id="header">
<a href="http://pmem.io/">
<h2>pmem.io<br>Persistent Memory Programming</h2>
</a>
</div>
<div id="nav">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/glossary/">Glossary</a></li>
<li><a href="/nvml/">NVM&nbsp;Library</a></li>
<li><a href="/blog/" class="sel">Blog</a></li>
<li><a href="/about/">About</a></li>
</ul>
</div>
<br>
<h3>{{ page.title }}</h3>
<div id="postinfo">Posted {{ page.date | date: '%B %d, %Y' }}</div>
<br>
{{ content }}
<br>
<br>
<div id="postinfo">Posted by <a href="https://github.com/{{ page.author }}">@{{ page.author }}</a></div>
<div id="footer">
<hr>
{% include pagefooter.html %}
</div>
</div>
</body>
</html>
60 changes: 60 additions & 0 deletions _posts/2014-08-25-creating-pmem-io.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
---
title: Creating pmem.io
author: andyrudoff
layout: post
---

The [pmem](https://github.com/pmem) project in GitHub has been
created as an open source project focused on persistent memory programming.
Everything on this web site and the associated GitHub repositories is
open source under the "three-clause" BSD license.

Some educational [Linux examples](https://github.com/pmem/linux-examples)
are included, which demonstrate the
[SNIA NVM programming model](http://snia.org/nvmp) and some of the
interesting features and challenges associated with persistent memory.

The team's initial focus is the Linux [NVM Library](/nvml/) which
will provide useful APIs for memory allocation, transactions, etc.
built on top of the NVM programming model.

This site includes a [pmem blog](/blog/) based on
[Jekyll](https://github.com/jekyll/jekyll) so over time we can
write up our experiences working with persistent memory programming.
There are [many ways](/about/) to get involved and we welcome your
contributions!

#### GitHub Pages and Jekyll

Since we will surely keep our focus on persistent memory and
immediately forget the steps taken to create this site, here's
a quick summary for reference. First, any GitHub user or project
area can have [GitHub Pages](https://pages.github.com/) associated
with them with almost no effort. We simply created a repository
named **pmem.github.io** to hold the pages. GitHub pages use
Jekyll automatically, but it is convenient to install it locally
for previewing content before pushing changes to the repo. On the
Debian-based distro known as _CrunchBang_, these steps did the trick:

{% highlight sh %}
$ sudo apt-get install ruby ruby-dev node python-pygments
$ sudo gem install jekyll
$ sudo gem install jekyll-mentions
{% endhighlight %}

After creating the appropriate Jekyll files in the local copy
of the repo, we used this command:

{% highlight sh %}
$ jekyll serve --watch
{% endhighlight %}

This watches for changes, re-generating
the web pages as necessary, and provides the content for preview
at the local URL `http://0.0.0.0:4000/`.

The rest of the details (like how to write a `_config.yml` or create
templates or includes) can all be found in the
[Jekyll documentation](http://jekyllrb.com/) or you can look
at the [source for this web site](https://github.com/pmem/pmem.github.io/)
for details.
48 changes: 48 additions & 0 deletions _posts/2014-08-26-references.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
---
title: References
author: andyrudoff
layout: post
---

Some very interesting research has been happening in the area of
Persistent Memory and more is emerging. While the examples provided
here are meant as introductory and simple, some publications cover
the topic in much more depth and include complete transaction systems,
compiler/language enhancements, etc. Here are some of the most
important publications in this space (please send links to more and
we'll include them).

One of the most impressive bodies of work in this area is **Mnemosyne**.
Read the paper:

- Haris Volos, Andres Jaan Tack, Michael M. Swift: _Mnemosyne:
Lightweight Persistent Memory_, The 16th ACM Conference on
Architectural Support for Programming Languages and Operating
Systems (ASPLOS 2011), March 2011, Newport Beach, California.

and explore the website, which includes full source and documentation:

- [http://research.cs.wisc.edu/sonar/projects/mnemosyne/](http://research.cs.wisc.edu/sonar/projects/mnemosyne/)

Another very relevant project is **NV-Heaps**. Read the paper:

- J. Coburn, et al.: _NV-Heaps: Making Persistent Objects Fast and Safe
with Next Generation, Non-Volatile Memories_, The 16th ACM Conference
on Architectural Support for Programming Languages and Operating
Systems (ASPLOS 2011), March 2011, Newport Beach, Ca.

The June 2013 issue of _USENIX ;login:_ contains an article that discusses
the NVM Programming Model, including a discussion of Persistent Memory.

- [https://www.usenix.org/publications/login/june-2013-volume-38-number-3](https://www.usenix.org/publications/login/june-2013-volume-38-number-3)

The NVM Programming Technical Work Group (TWG) in SNIA has over 35
companies working together on NVM programming models, including
Persistent Memory. You can read more about the TWG and see the
programming model specification here:

- [http://snia.org/nvmp](http://snia.org/nvmp)

The basics of NVDIMM at Wikipedia, with lots of additional links:

- [http://en.wikipedia.org/wiki/NVDIMM](http://en.wikipedia.org/wiki/NVDIMM)
71 changes: 71 additions & 0 deletions _posts/2014-08-27-crawl-walk-run.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
---
title: Crawl, Walk, Run...
author: andyrudoff
layout: post
---

> _If you can't fly then run, if you can't run then walk, if you can't walk then crawl, but whatever you do you have to keep moving forward._
>
> - Martin Luther King Jr.
This project, as well as the support for persistent memory in
various operating systems, can be thought of as a _crawl, walk, run_
approach. As byte-addressable persistence enters the market,
modified system BIOS images and device drivers expose it to
other modules in the kernel. Despite the byte-addressability,
many of the initial usages are based on block storage device
interfaces. But you have to start somewhere, so this is the
_crawl_ phase. The move beyond that, we need a software
architecture for exposing persistent memory up the stack.

![alt text](/assets/swarch.jpg)

The picture above shows the _walk_ phase of persistent memory
support: exposing persistent memory up the stack so applications
can leverage it. When the [SNIA NVM Programming TWG](http://snia.org/nvmp)
(Technical Work Group) was discussing how persistent memory was
exposed, there was a pervasive feeling in the group that the
best approach would leverage existing mechanisms, like the file system
naming and administrative model. So the recommendation published
by the TWG matches the above diagram, and that's the initial
approach we see happening in the Linux community.

The idea is fairly straightforward. We want applications to have
direct load/store access to persistent memory just as they do to
traditional volatile memory. But since persistent memory is, well,
persistent, applications are going to need to be able to express
which blob of previously-stored data is desired when asking the OS
for direct access to it. This is done using the well-understood
file namespace. So walking through the path from hardware (at the bottom)
to the application (at the top) in the above picture, we see a
non-volatile DIMM (NVDIMM), which is one way of providing persistent
memory to the platform, and it is managed by a driver in the OS labeled
_NVDIMM Driver_ in the picture. That driver provides access for
manageability, shown on the left (for things like configuration changes
and health monitoring). The driver may also provide the common
block-based storage interfaces shown in the middle of the picture,
so that existing file systems or applications that use block storage
directly work without modification. But the more disruptive path
(and the more interesting to this project) is the rightmost path
where the application opens a file using a _persistent memory aware
file system_ and then memory-maps that file. This is done in Linux
using the [mmap(2)](http://linux.die.net/man/2/mmap) system call.

So this is the _walk_ phase for persistent memory: when an application
memory-maps a file from a _persistent memory aware file system_ it
gets direct access to the persistence (shown in the far right arrow
in the above picture). Unlike the page-cache-cased memory mapping
done by traditional file systems, the persistent memory aware file
system literally provides the shortest possible path
between an application and some storage! Once things are set up and
initial page faults are taken, there's no kernel code running at all
when data is fetched from persistent memory -- the application loads
the data directly from the NVDIMM.

So what's the _run_ phase? Giving an application a large range of
directly-mapped persistence is cool, but every application writer
will then start the complex process of managing how data structures
are laid out in that raw range of memory. That's where libraries
come in -- to help application writers solve some of the more common
problems like memory allocation or transactional updates. That will
be the topic for an upcoming blog entry.
35 changes: 35 additions & 0 deletions _posts/2014-08-29-linux-examples.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
title: Linux Examples
author: andyrudoff
layout: post
---

The [basic architecture]({% post_url 2014-08-27-crawl-walk-run %})
for exposing persistent memory gives applications a very **raw**
type of access. Applications can load/store directly to the
persistence, but then what. What are the interesting problems
facing an application developer and what would some solutions
look like?

To help describe the issues and potential solutions, we've
published a set of [Linux examples](https://github.com/pmem/linux-examples)
around persistent memory. These examples start with a simple
"hello, world!" style program for storing a string in persistent
memory, and end with a full binary tree sort example which maintains
a consistent tree data structure even in the face of power failure or
other types of system interruption. The examples include a mini
fault injection framework to illustrate the type of tools that
are necessary for demonstrating programs correctly survive system
interruption.

While not really useful in a production environment, these examples
are educational, and provide a background on how persistent memory
is exposed to applications and what the application writer needs to
consider before using it. So please
[check it out](https://github.com/pmem/linux-examples) and feel
free to ask questions, comment on it, or contribute to it.
(Scroll down on the GitHub repository page to see the README which
contains all sorts of details on the examples.)
A good
place to send questions or comments is our
[Google Group](http://groups.google.com/group/pmem).
Loading

0 comments on commit 7aa418c

Please sign in to comment.