Thanks for your answer, Adam.
Adam Lackorzynski a écrit :
I suppose that faulty address in pagefault protocol is a virtual address. A thread tries to access to a unmapped memory.
Yes, the fault address is virtual.
OK.
In this pagefault function, I have to find a free memory page. Thus, my function looks for small aligned page that contains requested address. It looks for a free physical page, and sends a mapitem message to faulty thread. My new code is available at:
http://www.freevms.net/gitweb/?p=FreeVMS.git;a=blob;f=sources/freevms/vm/vm_...
I understand why faulty task sends a pagefault signal. I think my mapitem answer is correct. But I don't understand how assign physical page to virtual one.
Actually, there aren't any physical addresses really. What's special is that sigma0 has identity mappings (only) and thus for sigma0 a virtual address is same as the corresponding physical address. The same is usually true for the roottask. Now if the app page-faults, the roottask gets this page-fault and needs to send some reasonable mapping back so that the app can continue. For that to work, roottask needs to have that memory available in its task. This mapping basically says map the memory at virtual address soandso in my task to that app at virtual address soandso there. Consequently you need a representation of all the client memory in your roottask, i.e. when you get a page-fault from a client you look up this address in some data structure to find the virtual address in roottask and map it to the app. Initially roottask is getting this memory from sigma0.
I understand what you say but I think that I misunderstand some L4 concepts.
Now, I have written a roottask that starts (or tries to start, it depends ;-) ) a new task (init.exe) in new address space. This task is loaded by bootloader and _physically_ mapped as it's mapped by roottask and sigma0.
Problem : start init.exe address is outside physical memory and requires virtual memory mapping. Thus, I have written a very simple pagefault handler in roottask. When this thread starts, it sends a pagefault IPC to roottask.
Pagefault handler knows required memory, but it needs to associate roottask's memory and I don't see how pagefault can return this memory.
For example : physical memory : 0 - 128 M roottask starts at 16 M init.exe starts at 512 M
When init.exe starts, it sends a pagefault error to its pager (roottask):
-> vms$pagefault(addr:200000b0) [priv=4]
and pager must reply with a mapitem message with the _same_ address. I understand that pager has to associate a memory region to virtual address required by init.exe. I know how find an available page to satisfy this request, but I don't know how associate this page to returned memory. Is there anywhere an example ? All pagers I have found only maps physical memory (iguana, darbat...).
Regards,
JKB