Hi Paul,
On 01/21/2013 10:08 PM, Paul Dufresne wrote:
Before it works, I had to add these lines: <service name="RM"/> <service name="CPU"/> <service name="IO_PORT"/> <service name="IRQ"/> inside <parent-provides> section of hello.run.
You're right. These service declarations are missing, at least if you run this example on NOVA. If you try the same scenario on Linux, it will probably work. If you try it on our base-hw kernel you'll miss the IO_MEM service, but won't need the IO_PORT service for example ;-).
The component that requires all these different services is the timer, which is simply used by the hello client to delay it's messages. So that humans still can read them. The timer is implemented quite differently on all the available platforms. For example on Linux we simply use a system call for sleeping. On NOVA we use IBM's PIT, thereby we need I/O ports. The base-hw ARM kernel uses a timer of the respective ARM SoC, which typically requires memory mapped I/O (IO_MEM). Moreover, the timer implementation on most platforms requires the creation of another thread. Therefore, the CPU session is needed, as well as the RM session.
Originally, the example was meant to be really simple, that's why the run script was written as simple as possible (and apparently only written and tested on Linux)
I opened an issue in our issue tracker on Github to fix the insufficient run script:
https://github.com/genodelabs/genode/issues/629
I would have tought however that:
<default-route> <any-service> <parent/> <any-child/> </any-service> </default-route> would have made it optional, which was not.
This only says: if a client asks for some service, first have a look whether the parent provides such a service, if not have a look at your other children. Take for example the current, unmodified hello run script. When the timer wants to create a thread, it requests a CPU session from its parent - the init process. Given its configuration, init will first examine the services its parent provides. But, there is no '<service name="CPU"/>' entry in the '<parent-provides>' declaration. Thereby init will examine its children configurations. Here it only finds two other services: "Hello", and "Timer". So it will refuse the request from the timer, and the timer will exit.
For more information about the configuration language, and the concepts behind it, please refer to the release notes of the 10.05 release:
http://genode.org/documentation/release-notes/10.05
Best regards Stefan