summaryrefslogtreecommitdiffstats
path: root/native_client_sdk
diff options
context:
space:
mode:
authoreliben@chromium.org <eliben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-05 20:53:02 +0000
committereliben@chromium.org <eliben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-05 20:53:02 +0000
commit5d88a98b6b3a5dedd4c4af7daf407ba11c8a43d6 (patch)
tree4af5e5e844f28f171cb47b4de0395b1dfb8c0201 /native_client_sdk
parentdccd1918999f27e97601fbed1adc41abbcf9958b (diff)
downloadchromium_src-5d88a98b6b3a5dedd4c4af7daf407ba11c8a43d6.zip
chromium_src-5d88a98b6b3a5dedd4c4af7daf407ba11c8a43d6.tar.gz
chromium_src-5d88a98b6b3a5dedd4c4af7daf407ba11c8a43d6.tar.bz2
This updates the Native Client technical overview to the new bright world of PNaCl. As discussed in the team meeting, I'm still focusing on Native Client as the umbrella name for the technology, but trying to present PNaCl as the default toolchain.
This update also removes some duplication from the document (with itself and with other documents), and introduces new, consistent diagrams. The other documents touched are just adding placeholders for links to look nicely in rendering. It's still rough along the edges and has some TODOs, but I think it's ready for an initial review. BUG=None R=binji@chromium.org Review URL: https://codereview.chromium.org/23629023 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@221511 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'native_client_sdk')
-rw-r--r--native_client_sdk/src/doc/devguide/coding/3D-graphics.rst8
-rw-r--r--native_client_sdk/src/doc/devguide/coding/FileIO.rst8
-rw-r--r--native_client_sdk/src/doc/devguide/coding/audio.rst8
-rw-r--r--native_client_sdk/src/doc/devguide/coding/message-system.rst2
-rw-r--r--native_client_sdk/src/doc/images/nacl-in-a-web-app.pngbin0 -> 29254 bytes
-rw-r--r--native_client_sdk/src/doc/images/nacl-pnacl-component-diagram.pngbin0 -> 25884 bytes
-rw-r--r--native_client_sdk/src/doc/images/web-app-with-nacl.pngbin0 -> 18361 bytes
-rw-r--r--native_client_sdk/src/doc/index.rst1
-rw-r--r--native_client_sdk/src/doc/overview.rst516
-rw-r--r--native_client_sdk/src/doc/sdk/index.rst8
10 files changed, 224 insertions, 327 deletions
diff --git a/native_client_sdk/src/doc/devguide/coding/3D-graphics.rst b/native_client_sdk/src/doc/devguide/coding/3D-graphics.rst
new file mode 100644
index 0000000..5c432e0
--- /dev/null
+++ b/native_client_sdk/src/doc/devguide/coding/3D-graphics.rst
@@ -0,0 +1,8 @@
+.. _devguide-coding-3D-graphics:
+
+###########
+3D Graphics
+###########
+
+foo
+
diff --git a/native_client_sdk/src/doc/devguide/coding/FileIO.rst b/native_client_sdk/src/doc/devguide/coding/FileIO.rst
new file mode 100644
index 0000000..347a89f
--- /dev/null
+++ b/native_client_sdk/src/doc/devguide/coding/FileIO.rst
@@ -0,0 +1,8 @@
+.. _devguide-coding-fileio:
+
+########
+File I/O
+########
+
+foo
+
diff --git a/native_client_sdk/src/doc/devguide/coding/audio.rst b/native_client_sdk/src/doc/devguide/coding/audio.rst
new file mode 100644
index 0000000..f1696e5
--- /dev/null
+++ b/native_client_sdk/src/doc/devguide/coding/audio.rst
@@ -0,0 +1,8 @@
+.. _devguide-coding-audio:
+
+#####
+Audio
+#####
+
+fooooooooooooooooooooo
+
diff --git a/native_client_sdk/src/doc/devguide/coding/message-system.rst b/native_client_sdk/src/doc/devguide/coding/message-system.rst
index 6fba516..6120254 100644
--- a/native_client_sdk/src/doc/devguide/coding/message-system.rst
+++ b/native_client_sdk/src/doc/devguide/coding/message-system.rst
@@ -1,5 +1,3 @@
-.. _devcycle-message-system:
-
##############
Message System
##############
diff --git a/native_client_sdk/src/doc/images/nacl-in-a-web-app.png b/native_client_sdk/src/doc/images/nacl-in-a-web-app.png
new file mode 100644
index 0000000..1ffed33
--- /dev/null
+++ b/native_client_sdk/src/doc/images/nacl-in-a-web-app.png
Binary files differ
diff --git a/native_client_sdk/src/doc/images/nacl-pnacl-component-diagram.png b/native_client_sdk/src/doc/images/nacl-pnacl-component-diagram.png
new file mode 100644
index 0000000..338be19
--- /dev/null
+++ b/native_client_sdk/src/doc/images/nacl-pnacl-component-diagram.png
Binary files differ
diff --git a/native_client_sdk/src/doc/images/web-app-with-nacl.png b/native_client_sdk/src/doc/images/web-app-with-nacl.png
new file mode 100644
index 0000000..46d5ca6
--- /dev/null
+++ b/native_client_sdk/src/doc/images/web-app-with-nacl.png
Binary files differ
diff --git a/native_client_sdk/src/doc/index.rst b/native_client_sdk/src/doc/index.rst
index c8b566e..c224a93 100644
--- a/native_client_sdk/src/doc/index.rst
+++ b/native_client_sdk/src/doc/index.rst
@@ -11,6 +11,7 @@ Contents:
quick-start.rst
sdk/download.rst
sdk/examples.rst
+ sdk/index.rst
sdk/release-notes.rst
devguide/index.rst
devguide/tutorial.rst
diff --git a/native_client_sdk/src/doc/overview.rst b/native_client_sdk/src/doc/overview.rst
index 2f3d877..4618089 100644
--- a/native_client_sdk/src/doc/overview.rst
+++ b/native_client_sdk/src/doc/overview.rst
@@ -12,364 +12,222 @@ Technical Overview
Introduction
============
-**Native Client** is an open-source technology for running native compiled code
-in the browser, with the goal of maintaining the OS portability and safety
-that people expect from web apps. Native Client expands web programming
-beyond JavaScript, enabling developers to enhance their web applications
-using their preferred language. This document describes a few of the key
-benefits of Native Client, as well as current limitations, common use cases,
-and tips for getting started with Native Client.
-
-Google has implemented the open-source
-`Native Client project <http://www.chromium.org/nativeclient>`_ in the Chrome
-browser on Windows, Mac, Linux, and Chrome OS. The **Native Client Software
-Development Kit (SDK)**, itself an open-source project, lets developers create
-web applications that use Native Client and run in Chrome across OS
-platforms. In addition to software libraries, the SDK includes a toolchain
-tailored to generate executable Native Client code, as well as a variety of
-code examples and documentation.
-
-A web application that uses Native Client generally consists of a combination
-of JavaScript, HTML, CSS, and a Native Client module that is written in a
-language supported by a Native Client compiler. The Native Client SDK
-currently supports C and C++. As compilers for additional languages are
-developed, the SDK will be updated to support those languages as well.
-
-.. image:: /images/NaclBlock.png
+**Native Client** (NaCl) is an open-source technology for running native
+applications in the browser, with the goal of maintaining the portability
+and safety that people expect from web applications. Native Client expands web
+programming beyond JavaScript, enabling developers to enhance their web
+applications using their preferred language. This document describes a few of
+the key benefits of Native Client, as well as current limitations and common use
+cases.
+
+Google has implemented the open-source `Native Client project
+<http://www.chromium.org/nativeclient>`_ in the Chrome browser on Windows, Mac,
+Linux, and Chrome OS. The :doc:`Native Client Software Development Kit (SDK)
+<sdk/index>`, itself an open-source project, lets developers create web
+applications that use NaCl and run in Chrome across OS platforms.
+
+A web application that uses NaCl generally consists of a combination of
+JavaScript, HTML, CSS, and a NaCl module that is written in a language supported
+by the SDK. The NaCl SDK currently supports C and C++. As compilers for
+additional languages are developed, the SDK will be updated to support those
+languages as well.
+
+.. image:: /images/web-app-with-nacl.png
Why use Native Client?
======================
-The Native Client open-source technology is designed to run native compiled
-code securely inside browsers. Native Client puts web applications on the same
-playing field as local applications, providing the raw speed needed to compete
-with traditional software like 3D games, video editing, and other applications.
-Native Client also gives languages like C and C++ (and eventually others as
-well) the same level of portability and safety that JavaScript provides on the
-web today.
+The Native Client open-source technology is designed to run compiled code
+securely inside a browser at near-native speeds. Native Client puts web
+applications on the same playing field as traditional (locally-run) software; it
+provides the means to fully harness the system's computational resources for
+applications like 3D games and multimedia editors. Native Client also aims to
+give C and C++ (and eventually other languages) the same level of portability
+and safety that JavaScript provides on the web today.
Here are some of the key features that Native Client offers:
* **Graphics, audio, and much more:** Run native code modules that render 2D
and 3D graphics, play audio, respond to mouse and keyboard events, run on
multiple threads, and access memory directly---all without requiring
- the user to install a plug-in.
-* **Portability:** Write your apps once and you'll be able to run them on
- Windows, Linux, Mac, and Chrome OS.
-* **Security:** Installing a desktop app or a browser plug-in can present
- serious security risks and deter potential users. Native Client uses a
- double sandbox designed to protect resources on the user's system. This
- framework offers the safety of traditional web apps in addition to the
- performance benefits of native compiled code, without requiring users to
- install a plug-in.
-* **Easy migration path to the web:** Many developers and companies have
- years of work invested in existing desktop applications. Native Client
- makes the transition from desktop app to web app significantly easier
- because Native Client supports C and C++ (and will continue to add more
- languages).
-* **Performance:** Native Client allows your app to run at a speed comparable
- to a desktop app. This capability enables demanding applications such as
- console-quality games to run inside the browser.
+ the user to install a plugin.
+* **Portability:** Write your applications once and you'll be able to run them
+ across operating systems (Windows, Linux, Mac, and Chrome OS) and CPU
+ architectures (x86, ARM).
+* **Easy migration path to the web:** Many developers and companies have years
+ of work invested in existing desktop applications. Native Client makes the
+ transition from the desktop to a web application significantly easier because
+ it supports C and C++.
+* **Security:** Native Client uses a double sandbox model designed to protect
+ the user's system from malicious or buggy applications. This model offers the
+ safety of traditional web applications without sacrificing performance and
+ without requiring users to install a plugin.
+* **Performance:** Native Client allows your application to run at a speed
+ comparable to a desktop app (within 5-15% of native speed); it also allows
+ harnessing all available CPU cores via a threading API. This capability
+ enables demanding applications such as console-quality games to run inside the
+ browser.
Common use cases
================
-Native Client enables you to extend web apps running in the browser with custom
-features and proprietary code. Typical use cases for Native Client include the
-following:
+Typical use cases for Native Client include the following:
-* **Existing software components:** With its native language support
- (currently C and C++), Native Client enables you to reuse current software
- modules in a web app---you don't need to spend time reinventing and debugging
- code that's already proven to work well.
+* **Existing software components:** With its C and C++ language support, Native
+ Client enables you to reuse current software modules in a web
+ application---you don't need to spend time reinventing and debugging code
+ that's already proven to work well.
* **Legacy desktop applications:** Native Client provides a smooth migration
- path from desktop application to web app. You can port and recompile
- existing code for the computation engine of your application directly to
- Native Client, and need repurpose only the user interface and event
- handling portions to the new browser platform. Native Client allows you to
- embed existing functionality directly into the browser at the same time
- your application takes advantage of things the browser does well: handling
- user interaction and processing events, based on the latest developments in
- HTML5.
+ path from desktop applications to the web. You can port and recompile existing
+ code for the computation engine of your application directly to Native Client,
+ and need repurpose only the user interface and event handling portions to the
+ new browser platform. Native Client allows you to embed existing functionality
+ directly into the browser. At the same time, your application takes advantage
+ of things the browser does well: handling user interaction and processing
+ events, based on the latest developments in HTML5.
* **Enterprise applications that require heavy computation:** Native Client
- handles the number crunching required by large-scale enterprise apps. To
- ensure protection of user data, Native Client enables you to build complex
+ handles the number crunching required by large-scale enterprise applications.
+ To ensure protection of user data, Native Client enables you to build complex
cryptographic algorithms directly into the browser so that unencrypted data
never goes out over the network.
-* **Multimedia apps:** Codecs for processing sounds, images, and movies can
- be added to the browser in a Native Client web app.
-* **Games:** Native Client enables a web app to run close to native speed,
- reusing existing multithreaded/multicore C/C++ code bases, combined with
- low-level access to low-latency audio and (coming soon) networking APIs and
- OpenGL ES with programmable shaders. Programming to Native Client also
- enables your binary to run unchanged across many platforms. Native Client
- is a natural fit for running a physics engine or artificial intelligence
- module that powers a sophisticated web game.
-
-Compiling existing native code for your app helps protect the investment you've
-made in research and development. In addition to the protection offered by
-Native Client compile-time restrictions, users benefit from the security
-offered by its runtime validator. The validator decodes modules and limits the
-instructions that can run in the browser, and the sandboxed environment proxies
-system calls Users can run Native Client apps without installing a new
-application or a browser plug-in, and you can update your app without requiring
-user intervention.
-
-Current limitations
-===================
-
-Native Client currently has the following limitations:
-
-* no support for hardware exceptions
-* no support for process creation / subprocesses
-* no support for raw TCP/UDP sockets (analogous versions---websockets for TCP
- and peer connect for UDP---are in the works and will be available soon)
-* no support for query to available memory
-* inline assembly must be compatible with the Native Client validator (you
- can use the ncval utility in the SDK to check)
-
-Some of these limitations are required to execute code safely in a browser. To
-understand the reasons for these limitations read the `Google Chrome technical
-booklet <http://www.google.com/googlebooks/chrome/index.html>`_ and the `Native
-Client technical paper
-<http://src.chromium.org/viewvc/native_client/data/docs_tarball/nacl/googleclient/native_client/documentation/nacl_paper.pdf>`_
-(PDF).
+* **Multimedia applications:** Codecs for processing sounds, images, and movies
+ can be added to the browser in a Native Client module.
+* **Games:** Native Client enables a web application to run close to native
+ speed, reusing existing multithreaded/multicore C/C++ code bases, combined
+ with low-level access to low-latency audio, networking APIs and OpenGL ES with
+ programmable shaders. Programming to Native Client also enables your binary to
+ run unchanged across many platforms. Native Client is a natural fit for
+ running a physics engine or artificial intelligence module that powers a
+ sophisticated web game.
+* **Any application that requires acceleration**: Native Client fits seamlessly
+ into any web application, so it is up to the developer to decide to what
+ extent to utilize it. Native Client usage covers the full spectrum from
+ complete applications to small optimized routines that accelerate vital parts
+ of traditional web applications.
How Native Client works
=======================
-In order to be safe and portable for the web, the executable native code that
-is produced must be sandbox-safe. More specifically, it cannot cause any
-malicious or harmful effects on an end-user's machine. Native Client achieves
-this security through a number of techniques, including API restrictions and
-use of a modified compilation process.
-
-Even though it provides software-based fault isolation on the x86 architecture,
-Native Client still maintains the speed of native code---or thereabout. As of
-current timings, the Native Client sandbox adds only about 5% overhead, which
-makes it possible to do serious rendering and serious number-crunching in the
-browser without a big performance hit.
-
-A compiled Native Client module (.nexe file) is loaded into a web page through
-an <embed> element. Once uploaded to a server, the .html page and the .nexe
-file(s) define a web application.
-
-To the Native Client runtime system, a Native Client module is simply a set of
-machine code, formatted to adhere to a few special rules. No matter whether the
-code starts out as C or C++ or any other language, the Native Client runtime
-system performs the steps shown in the following figure:
-
-.. image:: /images/NaClExecution.png
-
-To ensure that system resources are untouched, the Native Client runtime system
-prevents the following unsafe activities:
-
-* Manipulating devices or files directly (instead, a special file system API
- is provided)
-* Directly accessing the operating system
-* Using self-modifying code to hide the code's intent (such as attempts to
- write to protected memory)
-
-Salt & Pepper
--------------
-
-Native Client product names follow a salt & pepper theme. Native Client,
-abbreviated to **NaCl**, started the salt & pepper naming theme.
-
-The Pepper Plug-in API (PPAPI), called **Pepper** for convenience, is an
-open-source, cross-platform API for web browser plug-ins. From the point of
-view of Native Client, Pepper is a set of APIs that allow a C or C++ Native
-Client module to communicate with the hosting browser and get access to
-system-level functions in a safe and portable way. One of the security
-constraints in Native Client is that modules cannot make any OS-level calls.
-Pepper provides analogous APIs that modules can target instead. You can use the
-Pepper APIs to:
-
-* `talk to the JavaScript code in your application
- <https://developers.google.com/native-client/devguide/coding/message-system>`_
- from the C++ code in your NaCl module
-* `do FileIO
- <https://developers.google.com/native-client/devguide/coding/FileIO>`_
-* `play audio
- <https://developers.google.com/native-client/devguide/coding/audio>`_
-* `render 3D graphics
- <https://developers.google.com/native-client/devguide/coding/3D-graphics>`_
-
-The figure below illustrates how Pepper serves as a bridge between Native
-Client modules and the browser:
-
-.. image:: /images/pepper.jpg
+Native Client is an umbrella name for a set of interrelated software components
+that work together to provide a way to develop C/C++ applications and run them
+securely on the web.
-Pepper includes both a C API and a C++ API. The C++ API is a set of bindings
-written on top of the C API. You can access reference documentation for both
-the C API and the C++ API through the left-nav on this site. For additional
-information about Pepper, see `Pepper Concepts
-<http://code.google.com/p/ppapi/wiki/Concepts>`_.
+At a high level, Native Client consists of:
+
+* **Toolchains**: collections of development tools (compilers, linkers, etc.)
+ that transform C/C++ code to Native Client modules.
+* **Runtime components**: embedded in the browser (or another host platform),
+ that allow to execute Native Client modules securely and efficiently.
+
+The following diagram shows how these components interact:
+
+.. image:: /images/nacl-pnacl-component-diagram.png
+
+Native Client executables and sandbox
+-------------------------------------
+
+Since Native Client permits executing native code on the client's machine,
+special security measures have to be implemented. The security is achieved
+through the following means:
+
+* The NaCl sandbox ensures that code accesses system resources only through
+ safe, whitelisted APIs, and operates within its limits without attempting to
+ interfere with other code running within the browser or outside it.
+* The NaCl validator is used prior to running native code to statically analyze
+ the code and make sure it only uses allowed and safe code and data patterns.
+
+These come in addition to the existing sandbox in the browser---the Native
+Client module always executes within a process with restricted permissions. The
+only interaction of this process with the outside world is through sanctioned
+browser interfaces. For this reason, we say that Native Client employs a *double
+sandbox* design.
+
+PNaCl and NaCl
+--------------
+
+*PNaCl* (Portable Native Client) employs state-of-the-art compiler technology to
+compile C/C++ source code to a portable bitcode executable (**pexe**). PNaCl
+bitcode is an OS- and architecture-independent format that can be freely
+distributed on the web and :ref:`embedded in web
+applications<link_nacl_in_web_apps>`.
+
+The *PNaCl translator* is a component embedded in the web browser; its task is
+to run a **pexe**. Internally, the translator compiles a **pexe** to a **nexe**
+(a native executable for the host platform's architecture) and then executes it
+within the Native Client sandbox as described above. It also uses intelligent
+caching to avoid this compilation if this **pexe** was already compiled on the
+client's browser.
+
+Native Client also supports running a **nexe** directly in the browser. However,
+since a **nexe** contains architecture-specific machine code, distributing
+**nexe** modules on the open web is not allowed. **nexe** modules can only be
+used as part of applications that are installed from the Chrome Web Store and in
+browser extensions.
+
+Toolchains
+----------
-Application Structure
-=====================
+A *toolchain* is a set of tools used to create an application from a set of
+source files. In the case of Native Client, a toolchain consists of a compiler,
+linker, assembler and other tools that are used by the developer to convert an
+application written in C/C++ into a module loadable by the browser.
-A Native Client application is divided into three main parts:
+The Native Client SDK provides two toolchains:
-* **HTML/JavaScript application:** Provides the user interface and event
- handling mechanisms as well as the main HTML document; can perform
- computation as well.
-* **Pepper API:** Enables the JavaScript code and the Native Client module to
- send messages to each other, and provides interfaces that allow Native
- Client modules to create and use browser resources.
-* **Native Client module:** Typically, performs numerical computation and
- other compute-intensive tasks. Handles large-scale data manipulation. Also
- provides event handling APIs for apps such as games where the user interface
- is integrated into the code that is run natively.
+* A PNaCl toolchain for generating portable NaCl modules (**pexe**).
+* A gcc-based toolchain (**nacl-gcc**) for generating native NaCl modules
+ (**nexe**).
-The following diagram shows how Pepper provides the bridge between the Native
-Client module's code and the browser's JavaScript:
+For most applications, the PNaCl toolchain is recommended. The **nacl-gcc**
+toolchain should only be used if the application will not be available on the
+open web.
-.. image:: /images/ProgramStructure.png
- :align: center
- :alt: Program Structure
+.. _link_nacl_in_web_apps:
-Files in a Native Client application
-------------------------------------
+Native Client in a web application
+==================================
A Native Client application consists of a set of files:
-* The **HTML web page**, **CSS**, and **JavaScript** files. Most Native Client
- apps contain at least an HTML document, optional CSS for styling of the web
- page, and one or more supporting JavaScript files for user interface
- objects, event handling, and simple programming tasks and calculations
- suitable for the JavaScript layer.
-* The **Native Client module**. This module contains the native compiled
- code, and uses the Pepper Library (included in the SDK), which provides the
- bridge between the Native Client module and JavaScript and browser
- resources. Currently, the SDK supports the C and C++ languages for Native
- Client modules. When compiled, the extension for this filename is
- *.nexe*.
-* A **manifest** file that specifies modules to load for different
- processors. This file includes a set of key-value pairs, where a key is the
- end-user's processor (for example, x86-32, x86-64, or ARM) and the
- corresponding value is the URL of the module compiled for that processor.
- The extension for this filename is *.nmf*.
-
-HTML file
-^^^^^^^^^
-
-The HTML file contains the ``<embed>`` tag that loads the Native Client module.
-For example::
-
- <embed name="nacl_module"
- id="hello_world"
- width=0 height=0
- src="hello_world.nmf"
- type="application/x-nacl">
-
-The mimetype for a Native Client module, specified in the ``type`` attribute, is
-``application/x-nacl``.
-
-Native Client modules are operating system independent, but they are not (yet)
-processor independent. Therefore, you must compile separate versions of a Native
-Client module for x86 32-bit, x86 64-bit, ARM, and other processors. The
-manifest file, specified in the ``src`` attribute of the ``<embed>``
-tag, specifies which version of the Native Client module to load depending on
-the end-user's processor.
-
-Native Client module
-^^^^^^^^^^^^^^^^^^^^
-
-You can write a Native Client module in C or C++, and use existing libraries
-and modules compatible with that language. After you've implemented your
-functions in the module, you can use the Pepper API to pass messages to and
-receive messages from the JavaScript/browser side of the application.
-
-
-Creating a Native Client application
-====================================
-
-Native Client is extremely flexible, allowing for numerous ways to develop an
-application. The following is one of the more common approaches:
-
-1. :doc:`Download <sdk/download>` the Native Client SDK. You may also need to
- download and install Python, which is required to run a number of tools in
- the SDK.
-2. Write the application:
-
- a. Create a user interface using HTML, JavaScript, and CSS.
- b. If necessary, port existing libraries to compile with your Native Client
- module. If you find yourself missing a common library, have a look at
- `NaCl ports <http://code.google.com/p/naclports>`_, a repository for open
- source libraries. Contributions are welcome.
- c. Create the Native Client module and `build
- <https://developers.google.com/native-client/devguide/devcycle/building>`_
- it using one of the NaCl toolchains in the SDK.
-3. `Run
- <https://developers.google.com/native-client/devguide/devcycle/running>`_ the
- application.
-4. `Distribute
- <https://developers.google.com/native-client/devguide/distributing>`_ the
- application.
-
-For detailed, step-by-step instructions on how to create a Native Client
-application, see the `Getting Started Tutorial
-<https://developers.google.com/native-client/devguide/tutorial>`_. The tutorial
-includes a basic set of template files that you can modify for your project.
-
-Using existing code
-===================
-
-The Native Client SDK comes with a modified version of the GNU toolchain
-(including GCC and G++) that produces sandbox-safe native code to be run in the
-browser. This opens the browser to 3D games, video editing, and other
-applications that can be moved to the web with relatively little effort. Some
-work is required, however, to keep code safe for execution on the web. For
-instance, OS-level calls must be redirected to target the Pepper API, and there
-are also restrictions on how file IO and threading operations work.
-
-Distributing a Native Client application
-========================================
-
-The Chrome browser only runs Native Client applications published through the
-`Chrome Web Store
-<https://chrome.google.com/webstore/search/%22native%20client%22%20OR%20nativeclient%20OR%20nacl>`_
-(CWS). To distribute an application, you must compile the application for both
-the 32-bit and 64-bit x86 architectures, and publish the application in the
-CWS.
-
-Native Client has not been standardized yet, and currently it requires
-compilation for specific instruction set architectures. Google only allows
-Native Client applications into the CWS if the applications are available for
-both 32-bit and 64-bit x86 architectures; developers are also strongly
-encouraged to provide a build for the ARM architecture. The intent behind the
-current policy of requiring applications to be compiled for multiple
-architectures is not to bake one instruction set into the web, and to make sure
-that future architectures are supported as well.
-
-Note that this is only a temporary requirement: The ultimate plan is to create
-a new version of Native Client executables that can run on any processor. This
-new Native Client technology is called Portable Native Client (PNaCl,
-pronounced "pinnacle"), and it is already under development. Instead of
-generating x86 code or ARM code, PNaCl transforms high-level code into bitcode
-using a compiler based on the open source LLVM (low-level virtual machine)
-project. When the browser downloads the bitcode, PNaCl then translates it to
-native machine code and validates it in the same way Native Client validates
-machine code today.
-
-PNaCl could potentially give Native Client the same reach as JavaScript, but
-there are still hurdles to overcome. Part of the problem is that PNaCl has more
-overhead. Currently PNaCl can execute much faster than JavaScript, but it does
-not yet start up as quickly. Before officially launching PNaCl, Google wants to
-make sure to close that gap.
-
-The Native Client SDK
-=====================
-
-The Native Client SDK includes the following:
-
-* GNU-based toolchains: gcc, g++, as, ld, gdb, and other tools customized for
- Native Client
-* API libraries (Pepper, POSIX)
-* Makefiles for building Native Client applications
-* Examples
-* Documentation
+* **HTML web page**, **CSS**, and **JavaScript** files, as in any modern web
+ application. The JavaScript is also responsible for communicating with the
+ NaCl module.
+* The **pexe** (portable NaCl module). This module uses the :ref:`Pepper
+ <link_pepper>` API, which provides the bridge to JavaScript and
+ browser resources.
+* A **manifest** file that specifies the **pexe** to load with some loading
+ options. This manifest file is embedded into the HTML page through an
+ ``<embed>`` tag.
+
+.. image:: /images/nacl-in-a-web-app.png
+
+For more details, see TODO (link to example walk-through).
+
+.. _link_pepper:
+
+Pepper Plugin API
+-----------------
+
+The Pepper Plugin API (PPAPI), called **Pepper** for convenience, is an
+open-source, cross-platform C/C++ API for web browser plugins. From the point
+of view of NaCl, Pepper allows a C/C++ NaCl module to communicate with the
+hosting browser and get access to system-level functions in a safe and portable
+way. One of the security constraints in NaCl is that modules cannot make any
+OS-level calls directly. Pepper provides analogous APIs that modules can target
+instead.
+
+You can use the Pepper APIs to gain access to the full array of browser
+capabilities, including:
+
+* :doc:`Talk to the JavaScript code in your application
+ <devguide/coding/message-system>` from the C++ code in your NaCl module.
+* :doc:`Do file I/O <devguide/coding/FileIO>`.
+* :doc:`Play audio <devguide/coding/audio>`.
+* :doc:`Render 3D graphics <devguide/coding/3D-graphics>`.
+
+Pepper includes both a C API and a C++ API. The C++ API is a set of bindings
+written on top of the C API. For additional information about Pepper, see
+`Pepper Concepts <http://code.google.com/p/ppapi/wiki/Concepts>`_.
Versioning
==========
@@ -383,3 +241,11 @@ work with subsequent versions of Pepper/Chrome. The SDK includes multiple
`versions <https://developers.google.com/native-client/version>`_ of the Pepper
APIs to help developers make adjustments to API changes and take advantage of
new features.
+
+Where to go next
+================
+
+The :doc:`quick start <quick-start>` document provides links to downloads and
+documentation that should help you get started with developing and distributing
+NaCl applications.
+
diff --git a/native_client_sdk/src/doc/sdk/index.rst b/native_client_sdk/src/doc/sdk/index.rst
new file mode 100644
index 0000000..077f63f
--- /dev/null
+++ b/native_client_sdk/src/doc/sdk/index.rst
@@ -0,0 +1,8 @@
+.. _sdk-index:
+
+#################
+Native Client SDK
+#################
+
+This is the index of the ``sdk`` directory.
+