dynamic loading tasks and address space
Till Straumann
strauman at slac.stanford.edu
Wed Nov 9 19:25:29 UTC 2005
Stanley Jobson wrote:
>hi till, hi all,
>
>with till's help i managed to implement my rtems tasks as loadable modules.
>
>first s.th. about the background:
> - basically my app consists of s.th. like a kernel and user land
> tasks (rtems tasks)
> - these user land tasks are now implemented as "modules" which means
> they are compiled to separate object files, included into a tar file
> which is then linked to the image.
> - on system startup the kernel:
> - extracts the tar file to IMFS
> - loads the "modules"/tasks via cexp and
> - executes a defined entry point (init task, create rtems task, etc)
> - after having loaded and initialized these tasks work again as ordinary
> rtems tasks.
>
>so far so good. everything runs fine now and i am now able to load an
>unload rtems task on runtime ;-)
>
>now imagine we want to have two instances of the same task (source code).
>therefore we need to create two rtems tasks, right?
>
>
yes
>question: does each rtems task need its own, different, unique
>entry_point?
>
no
> to get its own address space? how does rtems handle this?
>
>
there is no separate address space. Rtems has no 'unix processes'. All
tasks + the
kernel share a single, flat address space including memory,
memory-mapped devices
etc.
>imagine further that this tasks has two source files - one for the rtems
>task entry_point and one for the application logic (or what else).
>
>question: what about this file? each instance of the task mentioned above
>would need its own copy (especially of the global (static) variables),
>right?
>
>
no. There is a single copy of the program text and all non-automatic
variables.
Hence, if your code needs 'global' variables you must make it
're-entrant' first.
E.g., by putting all globals into a 'struct', malloc'ing memory for that
struct
at task initialization and passing a pointer to all routines that need
to access the
global data. Instead of explicitely passing a pointer you can use RTEMS
features
such as notepads or task variables [avoid task vars if possible - they
add to
the context switching overhead] -- (RTM).
>i cannot load this file twice cause this way i get name collisions with
>global symbols (e.g. function names).
>loading this file once is of course also problematic ...
>
>
not if the code is re-entrant. Note that RTEMS' C-library [newlibc] is
reentrant already.
Every task (implicitely) has its own copy of libc globals such as
'errno' 'stdin/stdout/stderr'
etc.
>in summary: on unix i can start two instances/processes of vim.
>
Think of a multithreaded application sharing a process' address space
and resources;
that's how RTEMS [and many other RTOSes work].
> vim
>consists of several .c files linked to one object file. each object file is
>loaded into its own address space and so theses two instances do not
>conflict with eachother --> how to achieve this on rtems?
>
>
See above.
HTH
-- Till
>
>thx for listening and ur help!
>
>regards,
>stan
>
>
More information about the users
mailing list