nuttx/Documentation/os/app_vs_os.rst
Vinicius May f6ecf80ebb Documentation: brand new layout for NuttX documentation.
The documentation grew one page at a time, so the tree follows the
history of who wrote what and not the shape of NuttX. Scheduling is
spread over three places, a driver page can sit above the subsystem
that owns it, and the front page lists everything at the same level.
That is a lot to face when all you want to know is where the scheduler
lives.

This change files every page under the code it describes. It is a move,
not a rewrite: outside the ten pages named below, every page keeps the
text that is already in master, and no page's text is deleted.

What it does:

* Groups the table of contents into nine chapters.
* Moves the OS subsystems under os/: scheduling, memory, drivers,
  filesystem, networking, IPC, interrupts, libs, time.
* Renames the platform pages to the names the source tree uses, and
  derives their tags from the tree instead of by hand.
* Splits guides/ by subject.
* Adds Documentation/redirects.py, with a rule for every page that left
  its old path, so old URLs keep working. The redirect page also carries
  a link's #anchor across to the new page.

Ten pages have text that is new or rewritten. Nine of them are the
landing page of a chapter, which has to exist for the new structure:

    index                  the front page
    os/index               OS Design
    os/scheduling/index    Scheduling
    os/interrupts/index    Interrupts
    os/ipc/index           IPC
    os/time/index          Time and timers
    about/index            About
    developing/index       Developing NuttX
    ReleaseNotes/index     Release notes

The tenth is os/libs/libbuiltin, the only page here with technical
content: libs/libbuiltin/ had no page at all. Five SVG diagrams come
with these pages, hand-written XML with no editor metadata.

Nothing outside Documentation/ is touched.

How it was checked:

* Sphinx builds with -W: no warnings, and no document left outside a
  toctree.
* A script, offered in the PR, proves the narrow claim this rests on.
  For every page outside the ten named above it erases what a move
  touches -- link target, path, tag line, toctree block, table border --
  from the whole old text and the whole new text, and requires the two
  to be byte for byte identical. It also requires every sentence of a
  deleted page to turn up somewhere, and every page that left its old
  path to have a redirect, from a URL that existed, to where its content
  went. It exits non-zero and names the page if any of that is not true,
  and it tests added pages too, so forgetting to declare one cannot make
  it pass.
* An independent audit checked 133 factual claims on these ten pages
  against the tree, one shell command per claim: 130 confirmed, 1
  refuted and fixed here, 2 not checkable.
* tools/checkpatch.sh is clean over the range.

The diff is large because moving a page changes every link that points
to it. Most of it is pure renames, and board pages that gained one tag
line.

Assisted-by: Claude:claude-opus-5
2026-10-08 01:40:54 +08:00

96 lines
4.6 KiB
ReStructuredText

=========================================
Application OS vs. Internal OS Interfaces
=========================================
NuttX provides a standard, portable OS interface for use by
applications. This standard interface is controlled by the
specifications proved at `OpenGroup.org <http://opengroup.org>`__.
These application interfaces, in general, should not be used
directly by logic executing within the OS. The reason for this is
that there are certain properties of the standard application
interfaces that make them unsuitable for use within the OS These
properties include:
#. **Use of the per-thread** ``errno`` **variable**: Handling of
return values, particularly, in the case of returned error
indications. Most legacy POSIX OS interface return information
via a *per-thread* ``errno``. There must be no alteration of
the ``errno`` value that must be stable from the point of view
of the application. So, as a general rule, internal OS logic
must never modify the ``errno`` and particularly not by the
inappropriate use of application OS interfaces within OS
itself.
Within the OS, functions do not return error information via
the ``errno`` variable. Instead, the majority of internal OS
function return error information as an integer value: Returned
values greater than or equal to zero are success values;
returned values less than zero indicate failures. Failures are
reported by returning a negated ``errno`` value from
``include/errno.h``,
#. **Cancellation Points**: Many of the application OS interfaces
are *cancellation points*, i.e., when the task is operating in
*deferred cancellation* state, it cannot be deleted or
cancelled until it calls an application OS interface that is a
cancellation point.
The POSIX specification is very specific about this, specific
both in identifying which application OS interfaces are
cancellation points and specific in the fact that it is
prohibited for any OS operation other than those listed in the
specification to generate cancellation points. If internal OS
logic were to reuse application OS interfaces directly then it
could very easily violate this POSIX requirement by incorrectly
generating cancellation points on inappropriate OS operations
and could result in very difficult to analyze application
failures.
#. **Use of per-task Resources**: Many resources are only valid in
the task group context in which a thread operates. Above we
mentioned one: ``errno`` is only valid for the thread that is
currently executing. So, for example, the ``errno`` at the time
of a call is a completely different variable than, say, the
``errno`` while running in a work queue task.
File descriptors are an even better example: An open file on
file descriptor 5 on task A is *not* the same open file as
might be used on file descriptor 5 on task B.
As a result, internal OS logic may not use application OS
interfaces that use file descriptors or any other *per-task*
resource.
Within NuttX, this is handled by supporting equivalent internal OS
interfaces that do not break the above rules. These internal
interfaces are intended for use *only* within the OS and should
not be used by application logic. Some examples include:
- ``nxsem_wait()``: functionally
equivalent to the standard application interface
``sem_wait()``. However, ``nxsem_wait()`` will not modify the
errno value and will not cause a cancellation point. (see
``include/nuttx/semaphore.h`` for other internal OS interfaces
for semaphores).
- ``nxmq_send()``: functionally equivalent
to the standard application interface ``mq_send()``. However,
``nxmq_send()`` will not modify the errno value and will not
cause a cancellation point (see ``include/nuttx/mqueue.h`` for
other internal OS interfaces for POSIX message queues).
- ``file_read()``: functionally equivalent
to the standard application interface ``read()``. However,
``file_read()`` will not modify the errno value, will not cause
a cancellation point, and uses a special internal data
structure in place of the file descriptor (see
``include/nuttx/fs/fs.h`` for other internal OS interfaces for
VFS functions).
- ``psock_recvfrom()``: functionally
equivalent to the standard application interface
``recvfrom()``. However, ``psock_recvfrom()`` will not modify
the errno value, will not cause a cancellation point, and uses
a special internal data structure in place of the socket
descriptor (see ``include/nuttx/net/net.h`` for other internal
OS interfaces for sockets).