diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2014-09-23 07:11:47 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2014-09-23 07:11:47 -0600 |
commit | 0f3f2d5095043776fc32c2f802bbbf2ed3865533 (patch) | |
tree | 599ec7c7ad4de4cbba8ba9d034f065204395191e /nuttx/mm/shm | |
parent | 28d43328a09aa47e58def877d6102bdf8b8bbb87 (diff) | |
download | nuttx-0f3f2d5095043776fc32c2f802bbbf2ed3865533.tar.gz nuttx-0f3f2d5095043776fc32c2f802bbbf2ed3865533.tar.bz2 nuttx-0f3f2d5095043776fc32c2f802bbbf2ed3865533.zip |
Add README files and configuration support for the shared memory logic
Diffstat (limited to 'nuttx/mm/shm')
-rwxr-xr-x | nuttx/mm/shm/README.txt | 117 | ||||
-rwxr-xr-x | nuttx/mm/shm/shmat.c | 254 | ||||
-rwxr-xr-x | nuttx/mm/shm/shmctl.c | 271 | ||||
-rwxr-xr-x | nuttx/mm/shm/shmget.c | 298 |
4 files changed, 529 insertions, 411 deletions
diff --git a/nuttx/mm/shm/README.txt b/nuttx/mm/shm/README.txt new file mode 100755 index 000000000..681f5a0eb --- /dev/null +++ b/nuttx/mm/shm/README.txt @@ -0,0 +1,117 @@ +Shared Memory Support +===================== + +Prerequisites +------------- + These features must be enabled before shared memory support can be + provided: + + CONFIG_ARCH_ADDRENV=y - Support for per-task address environment using a + MMU. + CONFIG_BUILD_KERNEL=y - Support for protected kernel-/user-space memory + regions must be provided by the MMU. + CONFIG_GRAN=y - The granule allocation is the allocation underlying all + paged allocations. + CONFIG_GRAN_SINGLE=n - Multiple granule allocators are needed: One for + the physical page allocation and one virtual page allocator for each + process. + CONFIG_MM_PGALLOC=y - Enables the physical page allocator + CONFIG_MM_PGSIZE - Determines the size of one page that can be mapped by + the MMU. + + And then finally: + + CONFIG_MM_SHM=y - Enables shared memory support + CONFIG_ARCH_SHM_VBASE - The virtual address of the beginning of the + shared memory region. + CONFIG_ARCH_SHM_MAXREGIONS - The maximum number of regions that can + allocated for the shared memory space. This hard-coded value permits + static allocation of the shared memory data structures and serves no + other purpose. Default is 1. + CONFIG_ARCH_SHM_NPAGES - The maximum number of pages that can allocated + for the shared memory region. Default is 1. + + The size of the virtual shared memory address space is then determined by + the product of the maximum number of regions, the maximum number of pages + per region, and the configured size of each page. + +Concepts +-------- + Each process has a task group structure, struct task_group_s, that holds + information common to all threads in the group. If CONFIG_MM_SHM=y, then + this includes data structures for the per-process shared memory virtual + page allocator. + + A memory region is accessed using: + + int shmget(key_t key, size_t size, int shmflg); + + by a lookup using internal shared memory data sets with key as the lookup + match value. On success, shmget returns the shared memory identifier for + the match -- in this implementation that identifier is simply the table + index of the match. + + If the memory region does not exist, it may also be created by shmget (if + the IPC_CREAT bit is set in the shmflag). When a shared memory region is + created, the following things happen: + + - A new entry is set aside in the internal data set. The key value is + assigned to the entry and the table index is the new shared memory + identifier. + + - The requested size is rounded up to rounded up to full pages, each of + size CONFIG_MM_PGSIZE. + + - A set of physical pages are allocated and the physical address of + these pages is retained in the internel data set. + + Now the key maps to and shared memory identifier (the table index) and + the table index provides access to the list of physical pages making up + the shared memory region. + + NOTE: An improved implementation my perform a "lazy" back up of the + physical memory, i.e., do not allocate the physical memory until the + memory is required, for example, when a page fault occurs when a + application tries to allocate the memory. + + A shared memory region is destroyed via: + + int shmctl(int shmid, int cmd, struct shmid_ds *buf); + + In order for a process to make use of the memory region, it must be + "attached" the the process using: + + FAR void *shmat(int shmid, FAR const void *shmaddr, int shmflg); + + shmat() returns the virtual address where the shared memory can be found + in the user process. Attaching the shared memory region involves the + following steps: + + - Use the shmid as a table index to look up the mapping in the shared + memory internal data structures. + + - Allocate a virtual address spaces of the same size as the physical + address space using the per-process virtual shared memory virtual + page allocator that can be found in the calling process' task group + structure. + + - Use platform specific interfaces to mapy the physical memory to the + selected virtual address space, and + + - Return the allocated virtual base address to the caller. + + The memory region can be detached from the user process using: + + int shmdt(FAR const void *shmaddr); + +Relevant header files: +--------------------- + + include/sys/shm.h - Shared memory interface declarations + include/sys/ipc.h - Provides additional definitions used by the shared + memory interfaces + include/nuttx/addrenv.h - Defines the virtual address space of the + process. + include/nuttx/pgalloc.h - Page allocator interfaces + mm/shm/shm.h - Internal shared memory definitions. This includes the + definitions of the internal shared memory data structures. diff --git a/nuttx/mm/shm/shmat.c b/nuttx/mm/shm/shmat.c index 4f4cf89e9..a76327e13 100755 --- a/nuttx/mm/shm/shmat.c +++ b/nuttx/mm/shm/shmat.c @@ -1,127 +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 */
+/**************************************************************************** + * 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 */ diff --git a/nuttx/mm/shm/shmctl.c b/nuttx/mm/shm/shmctl.c index 04f59dd64..9721e88cb 100755 --- a/nuttx/mm/shm/shmctl.c +++ b/nuttx/mm/shm/shmctl.c @@ -1,135 +1,136 @@ -/****************************************************************************
- * 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 */
+/**************************************************************************** + * 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 */ diff --git a/nuttx/mm/shm/shmget.c b/nuttx/mm/shm/shmget.c index 2c733d88f..f5e718b4a 100755 --- a/nuttx/mm/shm/shmget.c +++ b/nuttx/mm/shm/shmget.c @@ -1,149 +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 */
-
+/**************************************************************************** + * 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 */ + |