diff -ur a/libguile/vm.c b/libguile/vm.c
--- a/libguile/vm.c
+++ b/libguile/vm.c
@@ -50,6 +50,10 @@
 #include <unistd.h>
 #endif
 
+#ifdef __MINGW32__
+#include <windows.h>
+#endif
+
 #include "alist.h"
 #include "atomics-internal.h"
 #include "cache-internal.h"
@@ -604,6 +608,7 @@
   if (vp->sp_min_since_gc - stack->base > SCM_STACK_OVERFLOW_MARGIN_WORDS)
     {
       size_t page_size;
+#ifndef __MINGW32__
 #ifdef HAVE_SYSCONF
       page_size = sysconf (_SC_PAGESIZE);
 #else
@@ -611,6 +616,9 @@
 #endif
       vp->stack_limit = stack->base + page_size / sizeof(union scm_vm_stack_element);
       vp->stack_limit += SCM_STACK_OVERFLOW_MARGIN_WORDS;
+#else
+      vp->stack_limit = stack->base + 4096 / sizeof(union scm_vm_stack_element) + SCM_STACK_OVERFLOW_MARGIN_WORDS;
+#endif
     }
 }
 
@@ -645,6 +653,7 @@
           unused += lo - hi;
         }
 
+#ifndef __MINGW32__
       if (unused)
         {
           int ret = madvise ((void *) lo, hi - lo, MADV_DONTNEED);
@@ -652,6 +661,7 @@
             perror ("madvise failed");
           vp->sp_min_since_gc = hi;
         }
+#endif
     }
 }
 
diff -ur a/libguile/loader.c b/libguile/loader.c
--- a/libguile/loader.c
+++ b/libguile/loader.c
@@ -45,7 +45,9 @@
 #include <sys/types.h>
 #include <assert.h>
 
+#ifndef __MINGW32__
 #include <sys/mman.h>
+#endif
 
 #include <unistd.h>
 #include <string.h>
@@ -863,6 +865,20 @@
   uint32_t *ip;
 };
 
+#ifdef __MINGW32__
+/* Minimal mmap/munmap replacement for Windows */
+static void* mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
+{
+  void *mem = malloc(length);
+  if (mem && fd != -1)
+    lseek(fd, offset, SEEK_SET);
+  return mem ? mem : MAP_FAILED;
+}
+
+static int munmap(void *addr, size_t length) {
+  free(addr); return 0;
+}
+#endif
 
 static SCM
 load_thunk_from_memory (char *data, size_t len, int is_read_only)
