You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by pk...@apache.org on 2022/04/21 09:54:29 UTC

[incubator-nuttx-apps] branch master updated: nsh/script: support rc.sysinit script

This is an automated email from the ASF dual-hosted git repository.

pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new 9f79bf183 nsh/script: support rc.sysinit script
9f79bf183 is described below

commit 9f79bf183ada404b63c00b5f595e64fbeb99125c
Author: Jiuzhu Dong <do...@xiaomi.com>
AuthorDate: Fri Apr 15 21:59:24 2022 +0800

    nsh/script: support rc.sysinit script
    
    Follow: http://glennastory.net/boot/sysinit.html
    
    This is first script that init runs is rc.sysinit. This
    script does serval initialization tasks about basic service.
    
    The boot sequence currently provided to the board level is:
    board_earlyinitialize->
        board_lateinitialize(Peripherals driver, core driver, ...)->
            run rcS script(mount fs, run service) ->
                board_appinitialize->
    
    After this patch:
    The boot sequence currently provided to the board level is:
    board_earlyinitialize->
        board_lateinitialize(core driver,...)->
            run rc.sysinit script(mount fs, run core service) ->
                board_appinitialize(Peripherals driver)->
                    run rcS script(run other service)->
    
    So, Peripheral drivers can do more with the file system and
    core services.
    
    Signed-off-by: Jiuzhu Dong <do...@xiaomi.com>
---
 nshlib/Kconfig                               | 18 ++++++--
 nshlib/README.md                             | 69 ++++++++++++++++++----------
 nshlib/nsh.h                                 |  8 ++++
 nshlib/nsh_consolemain.c                     | 10 +++-
 nshlib/nsh_script.c                          | 16 +++++++
 nshlib/{rcS.template => rc.sysinit.template} |  0
 nshlib/rcS.template                          |  5 --
 7 files changed, 92 insertions(+), 34 deletions(-)

diff --git a/nshlib/Kconfig b/nshlib/Kconfig
index df11aa072..c208b41b5 100644
--- a/nshlib/Kconfig
+++ b/nshlib/Kconfig
@@ -700,8 +700,9 @@ config NSH_ROMFSETC
 	default n
 	depends on FS_ROMFS
 	---help---
-		Mount a ROMFS filesystem at /etc and provide a startup script
-		at /etc/init.d/rcS.  The default startup script will mount
+		Mount a ROMFS filesystem at /etc and provide a system init
+		script at /etc/init.d/rc.sysinit and a startup script
+		at /etc/init.d/rcS.  The default system init script will mount
 		a FAT FS RAMDISK at /tmp but the logic is easily extensible.
 
 if NSH_ROMFSETC
@@ -711,8 +712,9 @@ config NSH_CROMFSETC
 	default n
 	depends on FS_CROMFS
 	---help---
-		Mount a CROMFS filesystem at /etc and provide a compressed startup
-		script at /etc/init.d/rcS.
+		Mount a CROMFS filesystem at /etc and provide a compressed system
+		init script at /etc/init.d/rc.sysinit and a startup script
+		at /etc/init.d/rcS.
 
 config NSH_ROMFSRC
 	bool "Support ROMFS login script"
@@ -734,6 +736,14 @@ config NSH_ROMFSMOUNTPT
 		can be changed with this setting.  This must be a absolute path
 		beginning with '/'.
 
+config NSH_SYSINITSCRIPT
+	string "Relative path to sysinit script"
+	default "init.d/rc.sysinit"
+	---help---
+		This is the relative path to the sysinit script within the mountpoint.
+		The default is init.d/rc.sysinit. This is a relative path and must not
+		start with '/'.
+
 config NSH_INITSCRIPT
 	string "Relative path to startup script"
 	default "init.d/rcS"
diff --git a/nshlib/README.md b/nshlib/README.md
index 471695e0f..8c52c7a99 100644
--- a/nshlib/README.md
+++ b/nshlib/README.md
@@ -176,21 +176,28 @@ the `echo $PWD` command.
 - `PWD`    - The current working directory
 - `OLDPWD` - The previous working directory
 
-## NSH Start-Up Script
+## NSH System-init And Start-Up Script
 
-NSH supports options to provide a start up script for NSH. In general this
-capability is enabled with `CONFIG_NSH_ROMFSETC`, but has several other related
-configuration options as described in the final section of this README. This
-capability also depends on:
+NSH supports options to provide a system init script and start up script for NSH.
+In general this capability is enabled with `CONFIG_NSH_ROMFSETC`, but has
+several other related configuration options as described in the final section
+of this README. This capability also depends on:
 
 - `CONFIG_DISABLE_MOUNTPOINT` not set
 - `CONFIG_FS_ROMFS`
 
-### Default Start-Up Behavior
+### Default Script Behavior
 
 The implementation that is provided is intended to provide great flexibility for
-the use of Start-Up files. This paragraph will discuss the general behavior when
-all of the configuration options are set to the default values.
+the use of script files, include system init file and start-up file. This
+paragraph will discuss the general behavior when all of the configuration
+options are set to the default values.
+
+System-init script is executed before Start-up script. The system-init script
+is mainly used for file system mounting and core system service startup, and the
+start-up script is used for application and other system service startup. So,
+Between them, some initialize can use filesystem and core system service,
+Examples: Peripheral driver initialize at `boardctl(BOARDIOC_FINALINIT, 0)`.
 
 In this default case, enabling `CONFIG_NSH_ROMFSETC` will cause NSH to behave as
 follows at NSH startup time:
@@ -201,9 +208,11 @@ follows at NSH startup time:
   ```
    |   `--init.d/
            `-- rcS
+           `-- rc.sysinit
   ````
 
   Where `rcS` is the NSH start-up script
+  Where `rc.sysinit` is the NSH system-init script
 
 - NSH will then mount the ROMFS file system at `/etc`, resulting in:
 
@@ -213,9 +222,10 @@ follows at NSH startup time:
    `--etc/
        `--init.d/
            `-- rcS
+           `-- rc.sysinit
   ```
 
-- By default, the contents of `rcS` script are:
+- By default, the contents of `rc.sysinit` script are:
 
   ```shell
   # Create a RAMDISK and mount it at XXXRDMOUNTPOINTXXX
@@ -225,8 +235,9 @@ follows at NSH startup time:
   mount -t vfat /dev/ram1 /tmp
   ```
 
-- NSH will execute the script at `/etc/init.d/rcS` at start-up (before the first
-  NSH prompt. After execution of the script, the root FS will look like:
+- NSH will execute the script at `/etc/init.d/rc.sysinit` at system init
+  before the first NSH prompt. After execution of the script, the root
+  FS will look like:
 
   ```
    |--dev/
@@ -235,6 +246,7 @@ follows at NSH startup time:
    |--etc/
    |   `--init.d/
    |       `-- rcS
+   |       `-- rc.sysinit
    `--tmp/
   ```
 
@@ -262,21 +274,27 @@ there are three things to study:
    - The file `apps/nshlib/rcS.template` (OR, if `CONFIG_NSH_ARCHROMFS` is
      defined, `include/arch/board/rcs.template`)
 
-3. `rcS.template`. The file `apps/nshlib/rcS.template` contains the general form
+3. `rc.sysinit.template`. The file `apps/nshlib/rc.sysinit.template` contains
+   the general form of the `rc.sysinit.template` file; configured values
+   are plugged into this template file to produce the final `rc.sysinit` file.
+
+   `rcS.template`. The file `apps/nshlib/rcS.template` contains the general form
    of the `rcS` file; configured values are plugged into this template file to
    produce the final `rcS` file.
 
-**Note**: `apps/nshlib/rcS.template` generates the standard, default
-`nsh_romfsimg.h` file. If `CONFIG_NSH_ARCHROMFS` is defined in the NuttX
-configuration file, then a custom, board-specific `nsh_romfsimg.h` file residing
-in `boards/<arch>/<chip>/<board>/include` will be used. **Note** when the OS is
-configured, `include/arch/board` will be linked to
+**Note**: `apps/nshlib/rc.sysinit.template` and ` apps/nshlib/rcS.template`
+generates the standard, default `nsh_romfsimg.h` file. If `CONFIG_NSH_ARCHROMFS`
+is defined in the NuttX configuration file, then a custom, board-specific
+`nsh_romfsimg.h` file residing in `boards/<arch>/<chip>/<board>/include` will be
+used. **Note** when the OS is configured, `include/arch/board` will be linked to
 `boards/<arch>/<chip>/<board>/include`.
 
-All of the startup-behavior is contained in `rcS.template`. The role of
-`mkromfsimg.sh` is to (1) apply the specific configuration settings to
-`rcS.template` to create the final `rcS`, and (2) to generate the header file
-`nsh_romfsimg.h` containing the ROMFS file system image.
+All of the startup-behavior is contained in `rc.sysinit.template` and
+`rcS.template`. The role of `mkromfsimg.sh` is to (1) apply the specific
+configuration settings to `rc.sysinit.template` to create the final
+`rc.sysinit.template`, and `rcS.template` to create the final `rcS` and
+(2) to generate the header file `nsh_romfsimg.h` containing the ROMFS file
+system image.
 
 ## Simple Commands
 
@@ -1803,8 +1821,9 @@ The behavior of NSH can be modified with the following settings in the
   `/dev/mmcsdN` where `N` is the minor number. Default is zero.
 
 - `CONFIG_NSH_ROMFSETC` – Mount a ROMFS file system at `/etc` and provide a
-  startup script at `/etc/init.d/rcS`. The default startup script will mount a
-  FAT FS RAMDISK at `/tmp` but the logic is easily extensible.
+  system init script at `/etc/init.d/rc.sysinit` and a startup script at
+  `/etc/init.d/rcS`. The default system init script will mount a FAT FS RAMDISK
+  at `/tmp` but the logic is easily extensible.
 
 - `CONFIG_NSH_CONSOLE`
 
@@ -1944,6 +1963,10 @@ configuration setting apply:
   `/etc`, but that can be changed with this setting. This must be a absolute
   path beginning with `/`.
 
+- `CONFIG_NSH_SYSINITSCRIPT` – This is the relative path to the system init
+  script within the mountpoint. The default is `init.d/rc.sysinit`. This
+  is a relative path and must not start with `/`.
+
 - `CONFIG_NSH_INITSCRIPT` – This is the relative path to the startup script
   within the mountpoint. The default is `init.d/rcS`. This is a relative path
   and must not start with `/`.
diff --git a/nshlib/nsh.h b/nshlib/nsh.h
index 539013407..60798cc9b 100644
--- a/nshlib/nsh.h
+++ b/nshlib/nsh.h
@@ -340,10 +340,17 @@
 #    define CONFIG_NSH_ROMFSMOUNTPT "/etc"
 #  endif
 
+#  ifndef CONFIG_NSH_SYSINITSCRIPT
+#    define CONFIG_NSH_SYSINITSCRIPT "init.d/rc.sysinit"
+#  endif
+
 #  ifndef CONFIG_NSH_INITSCRIPT
 #    define CONFIG_NSH_INITSCRIPT "init.d/rcS"
 #  endif
 
+#  undef NSH_SYSINITPATH
+#  define NSH_SYSINITPATH CONFIG_NSH_ROMFSMOUNTPT "/" CONFIG_NSH_SYSINITSCRIPT
+
 #  undef NSH_INITPATH
 #  define NSH_INITPATH CONFIG_NSH_ROMFSMOUNTPT "/" CONFIG_NSH_INITSCRIPT
 
@@ -829,6 +836,7 @@ int nsh_usbconsole(void);
 int nsh_script(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd,
                FAR const char *path);
 #ifdef CONFIG_NSH_ROMFSETC
+int nsh_sysinitscript(FAR struct nsh_vtbl_s *vtbl);
 int nsh_initscript(FAR struct nsh_vtbl_s *vtbl);
 #ifdef CONFIG_NSH_ROMFSRC
 int nsh_loginscript(FAR struct nsh_vtbl_s *vtbl);
diff --git a/nshlib/nsh_consolemain.c b/nshlib/nsh_consolemain.c
index 135923cd6..13cb6eb94 100644
--- a/nshlib/nsh_consolemain.c
+++ b/nshlib/nsh_consolemain.c
@@ -78,9 +78,9 @@ int nsh_consolemain(int argc, FAR char *argv[])
 #endif
 
 #if defined(CONFIG_NSH_ROMFSETC) && !defined(CONFIG_NSH_DISABLESCRIPT)
-  /* Execute the start-up script */
+  /* Execute the system init script */
 
-  nsh_initscript(&pstate->cn_vtbl);
+  nsh_sysinitscript(&pstate->cn_vtbl);
 #endif
 
 #ifdef CONFIG_NSH_NETINIT
@@ -95,6 +95,12 @@ int nsh_consolemain(int argc, FAR char *argv[])
   boardctl(BOARDIOC_FINALINIT, 0);
 #endif
 
+#if defined(CONFIG_NSH_ROMFSETC) && !defined(CONFIG_NSH_DISABLESCRIPT)
+  /* Execute the start-up script */
+
+  nsh_initscript(&pstate->cn_vtbl);
+#endif
+
   /* Execute the session */
 
   ret = nsh_session(pstate, true, argc, argv);
diff --git a/nshlib/nsh_script.c b/nshlib/nsh_script.c
index 9d9a81263..433f1529c 100644
--- a/nshlib/nsh_script.c
+++ b/nshlib/nsh_script.c
@@ -145,6 +145,22 @@ int nsh_script(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd,
   return ret;
 }
 
+/****************************************************************************
+ * Name: nsh_sysinitscript
+ *
+ * Description:
+ *   Attempt to execute the configured system initialization script. This
+ *   script should be executed once when NSH starts.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_NSH_ROMFSETC
+int nsh_sysinitscript(FAR struct nsh_vtbl_s *vtbl)
+{
+  return nsh_script(vtbl, "sysinit", NSH_SYSINITPATH);
+}
+#endif
+
 /****************************************************************************
  * Name: nsh_initscript
  *
diff --git a/nshlib/rcS.template b/nshlib/rc.sysinit.template
similarity index 100%
copy from nshlib/rcS.template
copy to nshlib/rc.sysinit.template
diff --git a/nshlib/rcS.template b/nshlib/rcS.template
index 452760e22..e69de29bb 100644
--- a/nshlib/rcS.template
+++ b/nshlib/rcS.template
@@ -1,5 +0,0 @@
-# Create a RAMDISK and mount it at XXXRDMOUNTPOINTXXX
-
-mkrd -m XXXMKRDMINORXXX -s XXMKRDSECTORSIZEXXX XXMKRDBLOCKSXXX
-mkfatfs /dev/ramXXXMKRDMINORXXX
-mount -t vfat /dev/ramXXXMKRDMINORXXX XXXRDMOUNTPOINTXXX