Add the build framework and skeleton files for the shared memory feature (no logic yet provided)
This commit is contained in:
parent
e4e458b315
commit
18ce64d61e
10 changed files with 853 additions and 30 deletions
|
|
@ -13,7 +13,7 @@
|
|||
<h1><big><font color="#3c34ec"><i>NuttX Operating System<p>User's Manual</i></font></big></h1>
|
||||
<p><small>by</small></p>
|
||||
<p>Gregory Nutt<p>
|
||||
<p>Last Updated: August 21, 2014</p>
|
||||
<p>Last Updated: September 22, 2014</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
@ -63,6 +63,7 @@
|
|||
<li>Paragraph 2.9 <a href="#Environ">Environment Variables</a></li>
|
||||
<li>Paragraph 2.10 <a href="#FileSystem">File System Interfaces</a></li>
|
||||
<li>Paragraph 2.11 <a href="#Network">Network Interfaces</a></li>
|
||||
<li>Paragraph 2.12 <a href="#SharedMemory">Shared Memory Interfaces</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
|
|
@ -8419,25 +8420,24 @@ FAR void *mmap(FAR void *start, size_t length, int prot, int flags, int fd, off_
|
|||
</tr>
|
||||
</table>
|
||||
|
||||
<p>NuttX includes a simple interface layer based on uIP (see <a href="http://www.sics.se/~adam/uip/index.php/Main_Page">http://www.sics.se</a>).
|
||||
NuttX supports subset of a standard socket interface to uIP.
|
||||
These network feature can be enabled by settings in the architecture
|
||||
<a href="NuttXConfigVariables.html">configuration file</a>.
|
||||
Those socket APIs are discussed in the following paragraphs.</p>
|
||||
<p>
|
||||
NuttX includes a simple interface layer based on uIP (see <a href="http://www.sics.se/~adam/uip/index.php/Main_Page">http://www.sics.se</a>).
|
||||
NuttX supports subset of a standard socket interface to uIP.
|
||||
These network feature can be enabled by settings in the architecture <a href="NuttXConfigVariables.html">configuration file</a>.
|
||||
Those socket APIs are discussed in the following paragraphs.
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
</li>
|
||||
<li><a href="#socket">2.11.1 socket</a></li>
|
||||
<li><a href="#bind">2.11.2 bind</a></li>
|
||||
<li><a href="#connect">2.11.3 connect</a></li>
|
||||
<li><a href="#listen">2.11.4 listen</a></li>
|
||||
<li><a href="#accept">2.11.5 accept</a></li>
|
||||
<li><a href="#send">2.11.6 send</a></li>
|
||||
<li><a href="#sendto">2.11.7 sendto</a></li>
|
||||
<li><a href="#recv">2.11.8 recv</a></li>
|
||||
<li><a href="#recvfrom">2.11.9 recvfrom</a></li>
|
||||
<li><a href="#setsockopt">2.11.10 setsockopt</a></li>
|
||||
<li><a href="#getsockopt">2.11.11 getsockopt</a></li>
|
||||
<li><a href="#socket">2.11.1 socket</a></li>
|
||||
<li><a href="#bind">2.11.2 bind</a></li>
|
||||
<li><a href="#connect">2.11.3 connect</a></li>
|
||||
<li><a href="#listen">2.11.4 listen</a></li>
|
||||
<li><a href="#accept">2.11.5 accept</a></li>
|
||||
<li><a href="#send">2.11.6 send</a></li>
|
||||
<li><a href="#sendto">2.11.7 sendto</a></li>
|
||||
<li><a href="#recv">2.11.8 recv</a></li>
|
||||
<li><a href="#recvfrom">2.11.9 recvfrom</a></li>
|
||||
<li><a href="#setsockopt">2.11.10 setsockopt</a></li>
|
||||
<li><a href="#getsockopt">2.11.11 getsockopt</a></li>
|
||||
</ul>
|
||||
|
||||
<h3><a name="socket">2.11.1 <code>socket</code></a></h3>
|
||||
|
|
@ -8983,8 +8983,7 @@ int setsockopt(int sockfd, int level, int option,
|
|||
</p>
|
||||
<ul><pre>
|
||||
#include <sys/socket.h>
|
||||
int getsockopt(int sockfd, int level, int option,
|
||||
void *value, socklen_t *value_len);
|
||||
int getsockopt(int sockfd, int level, int option, void *value, socklen_t *value_len);
|
||||
</pre></ul>
|
||||
<p>
|
||||
<b>Description:</b>
|
||||
|
|
@ -9032,6 +9031,309 @@ int getsockopt(int sockfd, int level, int option,
|
|||
Insufficient resources are available in the system to complete the call.</li>
|
||||
</ul>
|
||||
|
||||
<table width ="100%">
|
||||
<tr bgcolor="#e4e4e4">
|
||||
<td>
|
||||
<a name="SharedMemory"><h2>2.12 Shared Memory Interfaces</h2></a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p>
|
||||
Shared memory interfaces are only available with the NuttX kernel build (<code>CONFIG_BUILD_KERNEL=y</code>).
|
||||
These interfaces support user memory regions that can be shared between multiple user processes.
|
||||
Shared memory interfaces:
|
||||
</p>
|
||||
<ul>
|
||||
<li><a href="#shmget">2.12.1 shmget</a></li>
|
||||
<li><a href="#shmat">2.12.2 shmat</a></li>
|
||||
<li><a href="#shmctl">2.12.3 shmctl</a></li>
|
||||
<li><a href="#shmdt">2.12.4 shmdt</a></li>
|
||||
</ul>
|
||||
<p>
|
||||
<b>NOTE</b>: This is advance documentation. These interfaces are not yet available as of this writing. If you are reading this note, then double check; since these interfaces are under development now, I may have simply failed to remove it.
|
||||
</p>
|
||||
|
||||
<h3><a name="shmget">2.12.1 <code>shmget</code></a></h3>
|
||||
<p>
|
||||
<b>Function Prototype:</b>
|
||||
</p>
|
||||
<ul><pre>
|
||||
#include <sys/shm.h>
|
||||
#include <sys/ipc.h>
|
||||
int shmget(key_t key, size_t size, int shmflg);
|
||||
</pre></ul>
|
||||
<p>
|
||||
<b>Description:</b>
|
||||
The <code>shmget()</code> function will return the shared memory identifier associated with <code>key</code>.
|
||||
</p>
|
||||
<p>
|
||||
A shared memory identifier, associated data structure, and shared memory segment of at least size bytes is created for <code>key</code> if one of the following is true:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>
|
||||
The argument <code>key</code> is equal to <code>IPC_PRIVATE</code>.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
The argument <code>key</code> does not already have a shared memory identifier associated with it and <code>(shmflg & IPC_CREAT)</code> is non-zero.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
Upon creation, the data structure associated with the new shared memory identifier will be initialized as follows:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>
|
||||
The values of <code>shm_perm.cuid</code>, <code>shm_perm.uid</code>, <code>shm_perm.cgid</code>, and <code>shm_perm.gid</code> are set equal to the effective user ID and effective group ID, respectively, of the calling process.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
The low-order nine bits of <code>shm_perm.mode</code> are set equal to the low-order nine bits of <code>shmflg</code>.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
The value of <code>shm_segsz</code> is set equal to the value of size.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
The values of <code>shm_lpid</code>, <code>shm_nattch</code>, <code>shm_atime</code>, and <code>shm_dtime</code> are set equal to 0.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
The value of <code>shm_ctime</code> is set equal to the current time.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
When the shared memory segment is created, it will be initialized with all zero values.
|
||||
</p>
|
||||
<p>
|
||||
<b>Input Parameters:</b>
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<code>key</code>: The key that is used to access the unique shared memory identifier.
|
||||
</li>
|
||||
<li>
|
||||
<code>size</code>: The shared memory region that is created will be at least this size in bytes.
|
||||
</li>
|
||||
<li>
|
||||
<code>shmflg</code>: See <code>IPC_*</code> definitions in <code>sys/ipc.h</code>. Only the values <code>IPC_PRIVATE</code> or <code>IPC_CREAT</code> are supported.
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
<b>Returned Value:</b>
|
||||
Upon successful completion, <code>shmget()</code> will return a non-negative integer, namely a shared memory identifier; otherwise, it will return -1 and set <code>errno</code> to indicate the error.
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<code>EACCES</code>.
|
||||
A shared memory identifier exists for key but operation permission as specified by the low-order nine bits of <code>shmflg</code> would not be granted.
|
||||
</li>
|
||||
<li>
|
||||
<code>EEXIST</code>.
|
||||
A shared memory identifier exists for the argument key but <code>(shmflg & IPC_CREAT) && (shmflg & IPC_EXCL)</code> are non-zero.
|
||||
</li>
|
||||
<li>
|
||||
<code>EINVAL</code>.
|
||||
A shared memory segment is to be created and the value of size is less than the system-imposed minimum or greater than the system-imposed maximum.
|
||||
</li>
|
||||
<li>
|
||||
<code>EINVAL</code>.
|
||||
No shared memory segment is to be created and a shared memory segment exists for key but the size of the segment associated with it is less than size and size is not 0.
|
||||
</li>
|
||||
<li>
|
||||
<code>ENOENT</code>.
|
||||
A shared memory identifier does not exist for the argument key and <code>(shmflg & IPC_CREAT)</code> is 0.
|
||||
</li>
|
||||
<li>
|
||||
<code>ENOMEM</code>.
|
||||
A shared memory identifier and associated shared memory segment will be created, but the amount of available physical memory is not sufficient to fill the request.
|
||||
</li>
|
||||
<li>
|
||||
<code>ENOSPC</code>.
|
||||
A shared memory identifier is to be created, but the system-imposed limit on the maximum number of allowed shared memory identifiers system-wide would be exceeded.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3><a name="shmat">2.12.2 <code>shmat</code></a></h3>
|
||||
<p>
|
||||
<b>Function Prototype:</b>
|
||||
</p>
|
||||
<ul><pre>
|
||||
#include <sys/shm.h>
|
||||
void *shmat(int shmid, FAR const void *shmaddr, int shmflg);
|
||||
</pre></ul>
|
||||
<p>
|
||||
<b>Description:</b>
|
||||
The <code>shmat()</code> function attaches the shared memory segment associated with the shared memory identifier specified by <code>shmid</code> to the address space of the calling process. The segment is attached at the address specified by one of the following criteria:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>
|
||||
If <code>shmaddr</code> is a null pointer, the segment is attached at the first available address as selected by the system.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
If <code>shmaddr</code> is not a null pointer and <code>(shmflg & SHM_RND)</code> is non-zero, the segment is attached at the address given by <code>(shmaddr - ((uintptr_t)shmaddr % SHMLBA))</code>.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
If <code>shmaddr</code> is not a null pointer and <code>(shmflg & SHM_RND)</code> is 0, the segment is attached at the address given by <code>shmaddr</code>.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
The segment is attached for reading if <code>(shmflg & SHM_RDONLY)</code> is non-zero and the calling process has read permission; otherwise, if it is 0 and the calling process has read and write permission, the segment is attached for reading and writing.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
<b>Input Parameters:</b>
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>shmid</code>: Shared memory identifier</li>
|
||||
<li><code>smaddr</code>: Determines mapping of the shared memory region</li>
|
||||
<li><code>shmflg</code>: See <code>SHM_*</code> definitions in <code>include/sys/shm.h</code>. Only <code>SHM_RDONLY</code> and <code>SHM_RND</code> are supported.</li>
|
||||
</ul>
|
||||
<p>
|
||||
<b>Returned Value:</b>
|
||||
Upon successful completion, <code>shmat()</code> will increment the value of <code>shm_nattch</code> in the data structure associated with the shared memory ID of the attached shared memory segment and return the segment's start address.
|
||||
|
||||
Otherwise, the shared memory segment will not be attached, <code>shmat()</code> will return -1, and <code>errno</code> will be set to indicate the error.
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<code>EACCES</code>.
|
||||
Operation permission is denied to the calling process
|
||||
</li>
|
||||
<li>
|
||||
<code>EINVAL</code>.
|
||||
The value of <code>shmid</code> is not a valid shared memory identifier, the <code>shmaddr</code> is not a null pointer, and the value of <code>(shmaddr -((uintptr_t)shmaddr % SHMLBA))</code> is an illegal address for attaching shared memory; or the <code>shmaddr</code> is not a null pointer, <code>(shmflg & SHM_RND)</code> is 0, and the value of <code>shmaddr</code> is an illegal address for attaching shared memory.
|
||||
</li>
|
||||
<li>
|
||||
<code>EMFILE</code>.
|
||||
The number of shared memory segments attached to the calling process would exceed the system-imposed limit.
|
||||
</li>
|
||||
<li>
|
||||
<code>ENOMEM</code>.
|
||||
The available data space is not large enough to accommodate the shared memory segment.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3><a name="shmctl">2.12.3 <code>shmctl</code></a></h3>
|
||||
<p>
|
||||
<b>Function Prototype:</b>
|
||||
</p>
|
||||
<ul><pre>
|
||||
#include <sys/shm.h>
|
||||
#include <sys/ipc.h>
|
||||
int shmctl(int shmid, int cmd, FAR struct shmid_ds *buf);
|
||||
</pre></ul>
|
||||
<p>
|
||||
<b>Description:</b>
|
||||
The <code>shmctl()</code> function provides a variety of shared memory control operations as specified by <code>cmd</code>. The following values for <code>cmd</code> are available:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>
|
||||
<code>IPC_STAT</code>.
|
||||
Place the current value of each member of the <code>shmid_ds</code> data structure associated with <code>shmid</code> into the structure pointed to by <code>buf</code>.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<code>IPC_SET</code>.
|
||||
Set the value of the following members of the <code>shmid_ds</code> data structure associated with <code>shmid</code> to the corresponding value found in the structure pointed to by <code>buf</code>:
|
||||
</p>
|
||||
<ul>
|
||||
<code>shm_perm.uid</code><br>
|
||||
<code>shm_perm.gid</code><br>
|
||||
<code>shm_perm.mode</code> (Low-order nine bits).
|
||||
</ul>
|
||||
<p>
|
||||
<code>IPC_SET</code> can only be executed by a process that has an effective user ID equal to either that of a process with appropriate privileges or to the value of <code>shm_perm.cuid</code> or <code>shm_perm.uid</code> in the <code>shmid_ds</code> data structure associated with <code>shmid</code>.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<code>IPC_RMID</code>.
|
||||
Remove the shared memory identifier specified by <code>shmid</code> from the system and destroy the shared memory segment and <code>shmid_ds</code> data structure associated with it. <code>IPC_RMID</code> can only be executed by a process that has an effective user ID equal to either that of a process with appropriate privileges or to the value of <code>shm_perm.cuid</code> or <code>shm_perm.uid</code> in the <code>shmid_ds</code> data structure associated with <code>shmid</code>.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
<b>Input Parameters:</b>
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>shmid</code>: Shared memory identifier</li>
|
||||
<li><code>cmd</code>: <code>shmctl()</code> command</li>
|
||||
<li><code>buf</code>: Data associated with the <code>shmctl()</code> command</li>
|
||||
</ul>
|
||||
<p>
|
||||
<b>Returned Value:</b>
|
||||
Upon successful completion, <code>shmctl()</code> will return 0; otherwise, it will return -1 and set <code>errno</code> to indicate the error.
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<code>EACCES</code>.
|
||||
The argument <code>cmd</code> is equal to <code>IPC_STAT</code> and the calling process does not have read permission.
|
||||
</li>
|
||||
<li>
|
||||
<code>EINVAL</code>.
|
||||
The value of <code>shmid</code> is not a valid shared memory identifier, or the value of <code>cmd </code>is not a valid command.
|
||||
</li>
|
||||
<li>
|
||||
<code>EPERM</code>.
|
||||
The argument <code>cmd</code> is equal to <code>IPC_RMID</code> or <code>IPC_SET</code> and the effective user ID of the calling process is not equal to that of a process with appropriate privileges and it is not equal to the value of <code>shm_perm.cuid</code> or <code>shm_perm.uid</code> in the data structure associated with <code>shmid</code>.
|
||||
</li>
|
||||
<li>
|
||||
<code>EOVERFLOW</code>.
|
||||
The <code>cmd</code> argument is <code>IPC_STAT</code> and the <code>gid</code> or <code>uid</code> value is too large to be stored in the structure pointed to by the <code>buf</code> argument.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3><a name="shmdt">2.12.4 <code>shmdt</code></a></h3>
|
||||
<p>
|
||||
<b>Function Prototype:</b>
|
||||
</p>
|
||||
<ul><pre>
|
||||
#include <sys/shm.h>
|
||||
int shmdt(FAR const void *shmaddr);
|
||||
</pre></ul>
|
||||
<p>
|
||||
<b>Description:</b>
|
||||
The <code>shmdt()</code> function detaches the shared memory segment located at the address specified by <code>shmaddr</code> from the address space of the calling process.
|
||||
</p>
|
||||
<p>
|
||||
<b>Input Parameters:</b>
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>shmid</code>: Shared memory identifier</li>
|
||||
</ul>
|
||||
<p>
|
||||
<b>Returned Value:</b>
|
||||
Upon successful completion, <code>shmdt()</code> will decrement the value of <code>shm_nattch</code> in the data structure associated with the shared memory ID of the attached shared memory segment and return 0.
|
||||
</p>
|
||||
<p>
|
||||
Otherwise, the shared memory segment will not be detached, <code>shmdt()</code> will return -1, and <code>errno</code> will be set to indicate the error.
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<code>EINVAL</code>.
|
||||
The value of <code>shmaddr</code> is not the data segment start address of a shared memory segment.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<table width ="100%">
|
||||
<tr bgcolor="#e4e4e4">
|
||||
<td>
|
||||
|
|
|
|||
|
|
@ -280,9 +280,9 @@ int nsh_archinitialize(void)
|
|||
}
|
||||
#else /* CONFIG_MIKROE_FLASH_PART */
|
||||
|
||||
/* Configure the device with no partition support */
|
||||
/* Configure the device with no partition support */
|
||||
|
||||
smart_initialize(CONFIG_MIKROE_FLASH_MINOR, mtd, NULL);
|
||||
smart_initialize(CONFIG_MIKROE_FLASH_MINOR, mtd, NULL);
|
||||
|
||||
#endif /* CONFIG_MIKROE_FLASH_PART */
|
||||
}
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@
|
|||
|
||||
/* Keys: */
|
||||
|
||||
#define IPC_PRIVATE 0 /* Private key */
|
||||
#define IPC_PRIVATE 0 /* Private key */
|
||||
|
||||
/* Control commands: */
|
||||
|
||||
|
|
@ -89,11 +89,12 @@ extern "C"
|
|||
|
||||
struct ipc_perm
|
||||
{
|
||||
uid_t uid /* Owner's user ID */
|
||||
gid_t gid /* Owner's group ID */
|
||||
uid_t cuid /* Creator's user ID */
|
||||
gid_t cgid /* Creator's group ID */
|
||||
mode_t mode /* Read/write permission */
|
||||
uid_t uid; /* Owner's user ID */
|
||||
gid_t gid; /* Owner's group ID */
|
||||
uid_t cuid; /* Creator's user ID */
|
||||
gid_t cgid; /* Creator's group ID */
|
||||
mode_t mode; /* Read/write permission */
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@
|
|||
****************************************************************************/
|
||||
|
||||
#define SHM_RDONLY 0x01 /* Attach read-only (else read-write) */
|
||||
#defube SHM_RND 0x02 /* Round attach address to SHMLBA */
|
||||
#define SHM_RND 0x02 /* Round attach address to SHMLBA */
|
||||
|
||||
/* Segment low boundary address multiple */
|
||||
|
||||
|
|
|
|||
|
|
@ -79,6 +79,15 @@ config HEAP2_SIZE
|
|||
|
||||
endif # ARCH_HAVE_HEAP2
|
||||
|
||||
|
||||
config MM_SHM
|
||||
bool "Shared memory support"
|
||||
default n
|
||||
depends on BUILD_KERNEL && EXPERIMENTAL
|
||||
---help---
|
||||
Build in support for the shared memory interfaces shmget(), shmat(),
|
||||
shmctl(), and shmdt().
|
||||
|
||||
config GRAN
|
||||
bool "Enable Granule Allocator"
|
||||
default n
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@
|
|||
# Shared memory allocator
|
||||
|
||||
ifeq ($(CONFIG_MM_SHM),y)
|
||||
CSRCS += shmat.c shmctl.c shmdt.c shmget.c
|
||||
|
||||
# Add the shared memory directory to the build
|
||||
|
||||
|
|
|
|||
127
mm/shm/shmat.c
Executable file
127
mm/shm/shmat.c
Executable file
|
|
@ -0,0 +1,127 @@
|
|||
/****************************************************************************
|
||||
* mm/shm/shmat.c
|
||||
*
|
||||
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
* 3. Neither the name NuttX 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.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <sys/shm.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef CONFIG_MM_SHM
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: shmat
|
||||
*
|
||||
* Description:
|
||||
* The shmat() function attaches the shared memory segment associated with
|
||||
* the shared memory identifier specified by shmid to the address space of
|
||||
* the calling process. The segment is attached at the address specified
|
||||
* by one of the following criteria:
|
||||
*
|
||||
* - If shmaddr is a null pointer, the segment is attached at the first
|
||||
* available address as selected by the system.
|
||||
* - If shmaddr is not a null pointer and (shmflg & SHM_RND) is non-
|
||||
* zero, the segment is attached at the address given by
|
||||
* (shmaddr - ((uintptr_t)shmaddr % SHMLBA)).
|
||||
* - If shmaddr is not a null pointer and (shmflg & SHM_RND) is 0, the
|
||||
* segment is attached at the address given by shmaddr.
|
||||
* - The segment is attached for reading if (shmflg & SHM_RDONLY) is
|
||||
* non-zero and the calling process has read permission; otherwise, if
|
||||
* it is 0 and the calling process has read and write permission, the
|
||||
* segment is attached for reading and writing.
|
||||
*
|
||||
* Input Parameters:
|
||||
* shmid - Shared memory identifier
|
||||
* smaddr - Determines mapping of the shared memory region
|
||||
* shmflg - See SHM_* definitions in include/sys/shm.h. Only SHM_RDONLY
|
||||
* and SHM_RND are supported.
|
||||
*
|
||||
* Returned Value:
|
||||
* Upon successful completion, shmat() will increment the value of
|
||||
* shm_nattch in the data structure associated with the shared memory ID
|
||||
* of the attached shared memory segment and return the segment's start address.
|
||||
*
|
||||
* Otherwise, the shared memory segment will not be attached, shmat() will
|
||||
* return -1, and errno will be set to indicate the error.
|
||||
*
|
||||
* - EACCES
|
||||
* Operation permission is denied to the calling process
|
||||
* - EINVAL
|
||||
* The value of shmid is not a valid shared memory identifier, the
|
||||
* shmaddr is not a null pointer, and the value of
|
||||
* (shmaddr -((uintptr_t)shmaddr % SHMLBA)) is an illegal address for
|
||||
* attaching shared memory; or the shmaddr is not a null pointer,
|
||||
* (shmflg & SHM_RND) is 0, and the value of shmaddr is an illegal
|
||||
* address for attaching shared memory.
|
||||
* - EMFILE
|
||||
* The number of shared memory segments attached to the calling
|
||||
* process would exceed the system-imposed limit.
|
||||
* - ENOMEM
|
||||
* The available data space is not large enough to accommodate the
|
||||
* shared memory segment.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
FAR void *shmat(int shmid, FAR const void *shmaddr, int shmflg)
|
||||
{
|
||||
#warning Not implemented
|
||||
set_errno(ENOSYS);
|
||||
return (FAR void *)ERROR;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MM_SHM */
|
||||
135
mm/shm/shmctl.c
Executable file
135
mm/shm/shmctl.c
Executable file
|
|
@ -0,0 +1,135 @@
|
|||
/****************************************************************************
|
||||
* mm/shm/shmctl.c
|
||||
*
|
||||
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
* 3. Neither the name NuttX 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.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <sys/shm.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef CONFIG_MM_SHM
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: shmctl
|
||||
*
|
||||
* Description:
|
||||
* The shmctl() function provides a variety of shared memory control
|
||||
* operations as specified by cmd. The following values for cmd are
|
||||
* available:
|
||||
*
|
||||
* - IPC_STAT
|
||||
* Place the current value of each member of the shmid_ds data
|
||||
* structure associated with shmid into the structure pointed to by buf.
|
||||
* - IPC_SET
|
||||
* Set the value of the following members of the shmid_ds data
|
||||
* structure associated with shmid to the corresponding value found
|
||||
* in the structure pointed to by buf:
|
||||
*
|
||||
* shm_perm.uid
|
||||
* shm_perm.gid
|
||||
* shm_perm.mode Low-order nine bits.
|
||||
*
|
||||
* IPC_SET can only be executed by a process that has an effective
|
||||
* user ID equal to either that of a process with appropriate
|
||||
* privileges or to the value of shm_perm.cuid or shm_perm.uid in the
|
||||
* shmid_ds data structure associated with shmid.
|
||||
* - IPC_RMID
|
||||
* Remove the shared memory identifier specified by shmid from the
|
||||
* system and destroy the shared memory segment and shmid_ds data
|
||||
* structure associated with it. IPC_RMID can only be executed by a
|
||||
* process that has an effective user ID equal to either that of a
|
||||
* process with appropriate privileges or to the value of
|
||||
* shm_perm.cuid or shm_perm.uid in the shmid_ds data structure
|
||||
* associated with shmid.
|
||||
*
|
||||
* Input Parameters:
|
||||
* shmid - Shared memory identifier
|
||||
* cmd - shmctl() command
|
||||
* buf - Data associated with the shmctl() command
|
||||
*
|
||||
* Returned Value:
|
||||
* Upon successful completion, shmctl() will return 0; otherwise, it will
|
||||
* return -1 and set errno to indicate the error.
|
||||
*
|
||||
* - EACCES
|
||||
* The argument cmd is equal to IPC_STAT and the calling process does
|
||||
* not have read permission.
|
||||
* - EINVAL
|
||||
* The value of shmid is not a valid shared memory identifier, or the
|
||||
* value of cmd is not a valid command.
|
||||
* - EPERM
|
||||
* The argument cmd is equal to IPC_RMID or IPC_SET and the effective
|
||||
* user ID of the calling process is not equal to that of a process
|
||||
* with appropriate privileges and it is not equal to the value of
|
||||
* shm_perm.cuid or shm_perm.uid in the data structure associated with
|
||||
* shmid.
|
||||
* - EOVERFLOW
|
||||
* The cmd argument is IPC_STAT and the gid or uid value is too large
|
||||
* to be stored in the structure pointed to by the buf argument.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
|
||||
{
|
||||
#warning Not implemented
|
||||
set_errno(ENOSYS);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MM_SHM */
|
||||
99
mm/shm/shmdt.c
Executable file
99
mm/shm/shmdt.c
Executable file
|
|
@ -0,0 +1,99 @@
|
|||
/****************************************************************************
|
||||
* mm/shm/shmdt.c
|
||||
*
|
||||
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
* 3. Neither the name NuttX 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.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <sys/shm.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef CONFIG_MM_SHM
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: shmdt
|
||||
*
|
||||
* Description:
|
||||
* The shmdt() function detaches the shared memory segment located at the
|
||||
* address specified by shmaddr from the address space of the calling
|
||||
* process.
|
||||
*
|
||||
* Input Parameters:
|
||||
* shmid - Shared memory identifier
|
||||
*
|
||||
* Returned Value:
|
||||
* Upon successful completion, shmdt() will decrement the value of
|
||||
* shm_nattch in the data structure associated with the shared memory ID
|
||||
* of the attached shared memory segment and return 0.
|
||||
*
|
||||
* Otherwise, the shared memory segment will not be detached, shmdt()
|
||||
& will return -1, and errno will be set to indicate the error.
|
||||
*
|
||||
* - EINVAL
|
||||
* The value of shmaddr is not the data segment start address of a
|
||||
* shared memory segment.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int shmdt(FAR const void *shmaddr)
|
||||
{
|
||||
#warning Not implemented
|
||||
set_errno(ENOSYS);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MM_SHM */
|
||||
149
mm/shm/shmget.c
Executable file
149
mm/shm/shmget.c
Executable file
|
|
@ -0,0 +1,149 @@
|
|||
/****************************************************************************
|
||||
* mm/shm/shmget.c
|
||||
*
|
||||
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
* 3. Neither the name NuttX 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.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <sys/shm.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef CONFIG_MM_SHM
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: shmget
|
||||
*
|
||||
* Description:
|
||||
* The shmget() function will return the shared memory identifier
|
||||
* associated with key.
|
||||
*
|
||||
* A shared memory identifier, associated data structure, and shared
|
||||
* memory segment of at least size bytes is created for key if one of the
|
||||
* following is true:
|
||||
*
|
||||
* - The argument key is equal to IPC_PRIVATE.
|
||||
* - The argument key does not already have a shared memory identifier
|
||||
* associated with it and (shmflg & IPC_CREAT) is non-zero.
|
||||
*
|
||||
* Upon creation, the data structure associated with the new shared memory
|
||||
* identifier will be initialized as follows:
|
||||
*
|
||||
* - The values of shm_perm.cuid, shm_perm.uid, shm_perm.cgid, and
|
||||
* shm_perm.gid are set equal to the effective user ID and effective
|
||||
* group ID, respectively, of the calling process.
|
||||
* - The low-order nine bits of shm_perm.mode are set equal to the low-
|
||||
* order nine bits of shmflg.
|
||||
* - The value of shm_segsz is set equal to the value of size.
|
||||
* - The values of shm_lpid, shm_nattch, shm_atime, and shm_dtime are
|
||||
* set equal to 0.
|
||||
* - The value of shm_ctime is set equal to the current time.
|
||||
*
|
||||
* When the shared memory segment is created, it will be initialized with
|
||||
* all zero values.
|
||||
*
|
||||
* Input Parameters:
|
||||
* key - The key that is used to access the unique shared memory
|
||||
* identifier.
|
||||
* size - The shared memory region that is created will be at least
|
||||
* this size in bytes.
|
||||
* shmflgs - See IPC_* definitions in sys/ipc.h. Only the values
|
||||
* IPC_PRIVATE or IPC_CREAT are supported.
|
||||
*
|
||||
* Returned Value:
|
||||
* Upon successful completion, shmget() will return a non-negative
|
||||
* integer, namely a shared memory identifier; otherwise, it will return
|
||||
* -1 and set errno to indicate the error.
|
||||
*
|
||||
* - EACCES
|
||||
* A shared memory identifier exists for key but operation permission
|
||||
* as specified by the low-order nine bits of shmflg would not be
|
||||
* granted.
|
||||
* - EEXIST
|
||||
* A shared memory identifier exists for the argument key but
|
||||
* (shmflg & IPC_CREAT) && (shmflg & IPC_EXCL) are non-zero.
|
||||
* - EINVAL
|
||||
* A shared memory segment is to be created and the value of size is
|
||||
* less than the system-imposed minimum or greater than the system-
|
||||
* imposed maximum.
|
||||
* - EINVAL
|
||||
* No shared memory segment is to be created and a shared memory
|
||||
* segment exists for key but the size of the segment associated with
|
||||
* it is less than size and size is not 0.
|
||||
* - ENOENT
|
||||
* A shared memory identifier does not exist for the argument key and
|
||||
* (shmflg & IPC_CREAT) is 0.
|
||||
* - ENOMEM
|
||||
* A shared memory identifier and associated shared memory segment
|
||||
* will be created, but the amount of available physical memory is
|
||||
* not sufficient to fill the request.
|
||||
* - ENOSPC
|
||||
* A shared memory identifier is to be created, but the system-imposed
|
||||
* limit on the maximum number of allowed shared memory identifiers
|
||||
* system-wide would be exceeded.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int shmget(key_t key, size_t size, int shmflg)
|
||||
{
|
||||
#warning Not implemented
|
||||
set_errno(ENOSYS);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MM_SHM */
|
||||
|
||||
Loading…
Add table
Reference in a new issue