소스 검색

more crossplatform memory protaction used (mmap), fix by: Alexander Shiryaev

Ivan Denisov 9 년 전
부모
커밋
64afc27fa1
1개의 변경된 파일37개의 추가작업 그리고 11개의 파일을 삭제
  1. 37 11
      BlackBox/_Linux_/Lin/Rsrc/blackbox.c

+ 37 - 11
BlackBox/_Linux_/Lin/Rsrc/blackbox.c

@@ -11,11 +11,13 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <malloc.h>
+/* #include <malloc.h> */
+#include <errno.h>
+#include <fcntl.h>
 
 /* the exact size (in bytes) of the executable part of the file. */
 /* this constant needs to be updated everytime a change is made to this file */
-#define exeSize 16860
+#define exeSize 17028
 
 
 #define pageSize 4096
@@ -116,6 +118,8 @@ BootInfo* bootInfo;
 int newRecAdr, newArrAdr;
 int newRecFP, newArrFP;
 
+int zerofd;
+
 int donothing(char* fmt, ...)
 {
 }
@@ -355,6 +359,19 @@ int ReadBootHeader()
   return 1;
 }
 
+void * MEMALLOC (size_t len)
+{
+	void * res;
+
+	res = mmap(0, len, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, zerofd, 0);
+	if (res == MAP_FAILED) {
+		res = NULL;
+	} else {
+		bzero(res, len);
+	}
+	return res;
+}
+
 int ReadHeader ()
 {
   int ofTag, i, nofImps, processor;
@@ -385,7 +402,7 @@ int ReadHeader ()
   mod.imp = NULL;
   for (i = 0; i < nofImps; i++)
     {
-      imp = (ImpList*)calloc(1, sizeof(ImpList));
+      imp = (ImpList*)MEMALLOC(sizeof(ImpList));
       ReadName(imp->name);
       if (mod.imp == NULL)
 	mod.imp = imp;
@@ -421,8 +438,8 @@ int ReadModule ()
   int isLib;
   char* im;
 
-  mod.dad = (int) calloc(1, mod.ds);
-  mod.mad = (int) calloc(1, mod.ms + mod.cs + mod.vs);
+  mod.dad = (int) MEMALLOC(mod.ds);
+  mod.mad = (int) MEMALLOC(mod.ms + mod.cs + mod.vs);
   if ((mod.dad == 0) || (mod.mad == 0)) 
     {
       printf("BootLoader: Couldn't initalize heap\n");
@@ -570,8 +587,15 @@ int main (int argc, char *argv[])
   int callBackAdr;
   Module *k, *m;
 
+	zerofd = open("/dev/zero", O_RDWR);
+	if (zerofd == -1) {
+		printf("open /dev/zero failed: %s\n", strerror(errno));
+		return 101;
+	}
+
   modlist = NULL;
   dprintf("initializing BlackBox for Linux...\n");
+
   /*f = fopen(bbfile, "rb");*/
   f = fopen(argv[0], "r");
   if (f != NULL) 
@@ -604,7 +628,7 @@ int main (int argc, char *argv[])
 		else
 		  {
 		    /* assign the boot info to first variable in Kernel */
-		    bootInfo = calloc(1, sizeof(BootInfo));
+		    bootInfo = MEMALLOC(sizeof(BootInfo));
 		    bootInfo->modList = modlist;
 		    bootInfo->argc = argc;
 		    bootInfo->argv = argv;
@@ -612,14 +636,16 @@ int main (int argc, char *argv[])
 		    dprintf("before body\n");
 		    body = (BodyProc)(m->code);
 		    k->opts = k->opts | init; /* include init in opts */
+		    /*
 		    ok = mprotect(
-			(void *)(((m->code) / pageSize) * pageSize),
-			(((m->csize) + MOD(m->code, pageSize) - 1) / pageSize) * pageSize + pageSize,
-			PROT_READ|PROT_WRITE|PROT_EXEC);
+				(void *)(((m->code) / pageSize) * pageSize),
+				(((m->csize) + MOD(m->code, pageSize) - 1) / pageSize) * pageSize + pageSize,
+				PROT_READ|PROT_WRITE|PROT_EXEC);
 		    if (ok != 0){
-			printf("mprotect failed!\n");
-			return 100;
+				printf("mprotect failed: %s\n", strerror(errno));
+				return 100;
 		    }
+		    */
 		    body();
 		    dprintf("after body\n");
 		  }