Re: Creating tasks and the l4_task_map function

Paul Boddie <[email protected]> Mon, 25 Apr 2022 17:55:45 +0200
Newsgroups gmane.comp.micro-kernel.l4.devel
Message-ID <2294939.Finm2YSOeD@jason>
On Monday, 25 April 2022 01:04:44 CEST Adam Lackorzynski wrote:
> 
> Thanks for the example.

Thanks for looking at it! I appreciate the help.

> I believe I see the issue but first I immediately change to buf_log2size
> to 12 for the reason of less suprise, and did not change further on the
> sizes. Then I noticed your way of handling the UTCB involved allocating
> memory. That's not needed. With the fpage you specify the window of the
> UTCB memory in the other task, so no need to allocation memory in the
> launcher task, if it is for reserving the virtual memory.

I didn't really understand this when looking through the existing code. It 
seemed that the memory was reserved, and that seemed to involve telling a 
region manager/mapper about it, such as in Remote_app_model where the 
prog_reserve_utcb_area method appears to attach an invalid dataspace (obtained 
from the reserved_area method) to an existing RM.

Meanwhile, the l4_factory_create_task function accepts a flexpage as parameter 
whose details are then provided in the IPC message. As you noted before, 
Fiasco is meant to handle this flexpage. And it does appear that if I just 
remove the dataspace allocation and provide the flexpage details, the UTCB 
gets set up in the new task at the appropriate location.

> Then, the issue is that posix_memalign allocates memory which does not
> have the x-bit set, i.e., is memory that is not executable.
> Change it to
>   buf = (char *)mmap(NULL, region_size, PROT_EXEC | PROT_READ | PROT_WRITE,
> MAP_PRIVATE | MAP_ANON, -1, 0); if (buf == MAP_FAILED)
>   {
>     printf("Could not reserve memory.\n");
>     return 1;
>   }
> and it should work (it did for me).

This seems like the obvious thing that I couldn't see: that the memory needs 
to have the appropriate permissions associated with it. Well, it seems a bit 
more obvious now!

For the larger region I had in mind, just to keep things simple, mmap is a bit 
cumbersome because it only supports page-level alignment, so I used the L4Re 
memory allocator to get a dataspace that I could attach at a suitably aligned 
address. I imagine that if the parent task were to terminate, having an 
independently allocated dataspace would be desirable, too.

Thanks once again for the guidance, and sorry I didn't see my mistake!

Paul