2014-09-05 258 views
-2

我想写我自己的内核,但我坚持为我的交叉编译器移植newlib。如何移植newlib?

  1. 我下载哪个版本的newlib

  2. 我在哪里可以将系统调用stubs?最小的实现足够了吗?如果我决定稍后编辑系统调用,是否必须重新构建newlib?

  3. 我的内核公开了中断0x80(128d)上的所有系统调用,所以我只需将一些内联程序集放入每个存根中以完成我需要的操作。这取决于你如何实现它们与内核的关系。

我该怎么做?

回答

2
  1. 有没有什么理由不下载最新版本?

  2. 看看newlib/libc/sys/*/syscall.c,一般在libgloss(它包含在newlib源文件中)。事实上,只要链接器可以找到它们,就可以将它们放在任何地方,但这些地方是其他端口的保存位置。 Newlib希望能够找到具有特定名称的函数,而你所要做的就是实现它们(我隐约记得有13个必要的函数,还有其他的像fork,你可以返回一个错误代码)。

  3. 是的,你只要插入你喜欢的任何代码到系统调用存根。

您还需要提供crt0.o;这为程序提供了真正的入口点,初始化内存(尤其是bss),从操作系统保留它的任何位置抓取argv,并调用main。在main返回后,通常会有一些内存处理程序调用atexit,并将退出代码传递回操作系统。