64-bit vkernel

Jordan Gordeev jgordeev at dir.bg
Wed Jan 27 05:08:54 PST 2010


On 1/25/10 6:10 PM, Matthew Dillon wrote:
     The issue has to do with the vkernel not having a boot loader.
     So the vkernel binary is loaded as a normal ELF program by the
     normal rtelf-elf, libc, etc code.  This portion of the vkernel,
     along with any incidental malloc()'s done by libc and friends,
     does not use the mapped vpagetable area.
     I'm not sure what you are proposing in terms of coding.  Are
     you talking about changing the KernelPTA calculation in the
     vkernel code and the related pmaps?  If so I think it is a good
     idea.
I was proposing to change vm_fault() and vm_fault_page() to pass an 
additional argument to vm_fault_vpagetable() - the actual virtual 
address of the fault. This would have allowed vm_fault_vpagetable() to 
always use the actual virtual address and not some value that is offset 
for the vkernel and not offset for userland processes.
I've found a less invasive solution though.
I'll illustrate it on the code of the 32-bit vkernel.
The vkernel does this to map its kernel virtual memory:
        try = (void *)0x40000000;
        base = NULL;
        while ((char *)try + KERNEL_KVA_SIZE < topofstack) {
                base = mmap(try, KERNEL_KVA_SIZE, PROT_READ|PROT_WRITE,
                            MAP_FILE|MAP_SHARED|MAP_VPAGETABLE,
                            MemImageFd, 0);
                if (base == try)
                        break;
                if (base != MAP_FAILED)
                        munmap(base, KERNEL_KVA_SIZE);
                try = (char *)try + 0x10000000;
        }
A simple change does wonders:
--- a/sys/platform/vkernel/platform/init.c
+++ b/sys/platform/vkernel/platform/init.c
@@ -473,7 +473,7 @@ init_kern_memory(void)
        while ((char *)try + KERNEL_KVA_SIZE < topofstack) {
                base = mmap(try, KERNEL_KVA_SIZE, PROT_READ|PROT_WRITE,
                            MAP_FILE|MAP_SHARED|MAP_VPAGETABLE,
-                           MemImageFd, 0);
+                           MemImageFd, try);
                if (base == try)
                        break;
                if (base != MAP_FAILED)
Now when we access address 'va', the vpagetable is asked to map address 
'va - start_of_region + offset' == 'va - try + try' == 'va'.
We can't pass mmap() a suitable offset argument unless we know where it 
will map our region.

About the progress of the 64-bit vkernel: it will be enduring a pkgsrc 
bulk build tomorrow; then I'll have to make the SMP version compile and 
run; after that I have to prepare it for publishing.





More information about the Kernel mailing list