Hi Chen,
the creating process. Is that true that all applications launched by init currently have the same RM/RAM session? Even so, each application should have its own region map and pager, right? I launched two applications, but the kernel debugger shows that only one pager exists except core.pager. Please help me understand this.
each process has a distinct RAM, CPU, and RM session, created by its parent process. The procedure of process creation is described here:
http://genode.org/documentation/architecture/process
Speaking of the init process, the child's RM, CPU, and RM sessions are created when the 'Child' class is constructed ('see os/include/init/child.h'). In the 'Child' class, you find the '_resources' member, which is a compound object comprised of a 'Ram_connection', a 'Cpu_connection', and a 'Rm_connection'. These connection objects represent an open session each. The session capabilities of these sessions are then passed to the 'Process' constructor, which performs the procedure as described in the document above.
On most base platforms including Fiasco.OC, Genode uses one pager thread (called pager activation) for all user threads. Each time a page fault occurs (regardless of which thread caused the page fault), the pager activation thread within core receives the page fault information from the kernel, looks up a page-fault resolution via the code in 'rm_session_component.cc', and installs a mapping if possible. Please note that the core.pager thread you have just observed in the kernel debugger handles page faults for core only. It does not deal with normal user-level threads.
BTW, using a global pager thread is not an inherent property of Genode. For example on NOVA, each user thread has a distinct pager thread within core. As another example, L4Linux running on Fiasco.OC acts as pager for the Linux user-level programs. OKLinux on OKL4 functions similarly. On an MP system, it would possibly be sensible to have one pager thread per CPU.
Best regards Norman