Re: Creating tasks and the l4_task_map function
Adam Lackorzynski <[email protected]> Thu, 28 Apr 2022 23:21:46 +0200
| Newsgroups | gmane.comp.micro-kernel.l4.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi Paul,
On Mon Apr 25, 2022 at 17:55:45 +0200, Paul Boddie wrote:
> 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.
Generally, the RM API has a reserve_area call which should be used for
this.
> 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.
Yes, a dataspace has nothing to do with this.
> > 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.
Yes, of course using a dataspace is also totally fine.
Adam