2014-02-18 31 views
2

我正在windows上编写解释型语言,我使用PAGE_GUARD来实现栈和HeapCreate/HeapAlloc动态分配我的语言。在linux(或POSIX)中的函数类似于win32 mem api

也许我需要将我的lang移植到其他操作系统。所以,在linux(或POSIX标准..)中,与这些win32 api有什么相似之处? (我希望他们也不是很不同的使用。)


好,见下文,如果你不知道这些的Win32 API:

HeapCreate - 简单。创建一个新的堆:

void *mem = malloc(123); // alloc from default heap 
HANDLE hHeap = HeapCreate(...); // create a new heap 
void *mem2 = HeapAlloc(hHeap, some_flag, 123); // alloc from new heap 

PAGE_GUARD - bit complex;它用于实现堆栈。例如,有一个堆栈,其最大大小为5页。为了节省内存,我只分配一个页面,只是“保留”4页的虚拟内存地址。

--------- 
| alloc | 
--------- 
|reserve| 
--------- 
|reserve| 
--------- 
|reserve| 
--------- 
|reserve| 
--------- 

当第一页堆栈被完全使用,并且程序将要使用更多堆栈时,会发生访问冲突。然后,我“提交”第二页并继续编程。

PAGE_GUARD只是帮手做到这一点。 (在win95中,没有页面防护,所以win95在没有这个帮助器的情况下执行)如果我提前并且提前标记第二页“保护”,并且程序使用更多堆栈,则发生GUARD-异常并且操作系统取消标记页面自动。我只需要提交并标记下一页。

回答

1

阅读Advanced Linux Programming。不要在Linux中为您知道或想要的每个Win32功能寻找确切的等价物。学习本地思考Linux的条款。研究free software类似于你的(见freecodesourceforge找一些)。

是的,Posix的或Linux的Windows VS是非常不同的,尤其是他们的processes概念,等等...

你可能想mmap(2)mprotect(2);我根本不知道Windows(所以我不知道HeapCreate是什么)。

也许使用的跨平台工具包一样Qt的下层(即QtCore ...)或Glib(从的Gtk ...)可以帮助你。

Linux C standard library通常是GNU libc(但您可以使用其他的,例如MUSL libc,这是非常可读的恕我直言)。它使用syscallssyscalls(2)中列出并由Linux kernel实施(特别是,malloc(3)一般建在mmap(2)以上......)。

如果这对你有帮助,你可以习惯研究自由软件的源代码。

顺便说一句,对于翻译,你可以考虑使用Boehm's conservative garbage collector ...

+0

请参阅编辑。我知道linux和win是不同的,我只想知道“在linux下如何做”,尽管我希望这种方式类似于windows ... – ikh

+0

不希望Linux和Windows类似:它们不是。另外,Linux是[免费软件](http://en.wikipedia.org/wiki/Free_software),您可以也应该研究源代码。 –

+0

我不是说“win vs linux”。我只是说“如何在Linux中做”..无论如何,'mmap'和'mprotect'似乎是我找到的,谢谢!顺便说一句,有没有办法创建新的堆?那么我需要实现堆?噢.. – ikh

相关问题