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