微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Linux中编译内核代码

好的,我正在阅读关于Linux内核开发的内容,并且有一些使用内核数据结构和内容代码片断。 比方说,我想尝试一下,例如,有一个非常简单的代码片段:

#include <../../linux-2.6.37.1/include/linux/sched.h> struct task_struct *task; for_each_process(task) { printk("%s[%d]n",task->comm,task->pid); }

看起来很简单,呃? 那么现在我不可能build造这个东西。 我正在使用NetBeans。 sched.h是正确的文件,就像一个人可以按CTRL +点击它,一个被带到正确的文件

我是否需要包含我的示例文件,并从Makefile构build整个内核? 我只是希望看到它的构build,可能会起作用。 如果我需要构build整个内核,我将如何testing我的东西?

我一定是在做一些非常愚蠢的事情,因为我对内核开发很陌生。 我有点迷路了

构build环境隔离和文件系统差异

如何以非交互方式打开Linux内核.config文件中的function?

在非标准的位置build立gcc-4.3.4时遇到困难

如何build立一个项目(如zeromq)作为静态库,并将其链接到我的项目

保持构build服务器更新的build议

多谢你们!

用msvcbuild立Qt for Windows – Qmakespec错误

如何为微处理器SA1100安装交叉编译器(在ubuntu 12.04 LTS上)?

你可以编译一个OCaml项目本地作为一个Windows库吗?

我可以从dynamic库中加载链接这个dl的函数,但是我不能在代码中使用'dlsym'加载它,而不链接这个dl

C ++编译器的Windows没有IDE?

你不需要编译整个内核,但是你至少需要创建一个内核模块,这个模块比较容易编译。 你应该看看这个教程,甚至像这样一本完整的书。

请记住,并不是所有的内核代码都可以被移动到一个模块 – 只是那些使用内核的公共(导出)接口的代码。 内核核心部分(如虚拟机或调度程序)固有的代码可能无法从其他内核访问。

另外请记住,不要在您的开发机器上尝试内核代码 – 轻微的错误很容易使整个系统失效。 你应该看看在一个单独的虚拟机,例如在VirtualBox中尝试你的内核代码

使事情变得更加困难的一个细节:一般来说,只能在为其构​​建的内核中插入一个模块。 在主机系统上编译的模块可以在测试VM上使用, 当且仅当内核是相同的,即相同分发版本的相同的内核包版本。 考虑到你将要升级你的主机分布,在我看来,在测试系统上构建模块只是简单的。

既然你需要一个完整的C开发套件 ,你应该安装一个流行的Linux发行版。 它应该更稳定,您可以访问其用户社区。 如果你想保持它的大小,你可以在没有X服务器或图形应用程序的情况下安装基本系统。

BTW Netbeans旨在开发用户空间应用程序。 您可能可以调整它的内核代码,但它永远不会像用户空间编程那样合适。 事实上,没有IDE是真的适合的。 内核代码不能从用户空间运行(更不用说使用单独的虚拟机),这会打破IDE自动化的正常编辑 – >编译 – >运行 – >调试工作流程循环。

大多数内核开发人员只是使用C语言高亮的编辑器,如Vim或Emacs 。 Emacs实际上是一个IDE(还有更多),但正如我上面提到的那样,您不能轻易使用基于IDE的工作流来进行内核代码开发。

如果你不想构建整个内核,你可以构建一个可加载的内核模块 – 例如http://www.linux-tutorial.info/modules.PHP?name=Howto&pagename=modulee-HOWTO 。

所有你编写,编译和运行的代码都是以用户程序的形式运行的。 内核以内核模式运行。 这两种模式是分开的,不能直接看到对方。 它们通过定义的接口进行通 这些接口是C系统调用(而不是C库调用)。

为了能够访问task_struct结构,你的代码必须以内核模式运行。 最好的选择是编写一个内核模块,并将其加载到内核中。

很少的内核代码可以以任何形式在内核之外运行。 大多数内核代码与其他部分的内核代码非常 “交织”(用几年前从同事那里学到的术语来描述过多的耦合)。 功能“知道”许多结构的结构定义远离他们正在工作。 典型的软件工程人员讨厌这样的代码

if (unlikely(inode_init_always(sb,inode))) { if (inode->i_sb->s_op->destroy_inode) inode->i_sb->s_op->destroy_inode(inode); else kmem_cache_free(inode_cachep,inode); return NULL; }

这个例程必须知道如何通过三个结构来破坏i节点,以及链的另一端的函数指针的调用约定。 内核社区非常了解所有这些功能,并且非常高兴在修改内核的时候修改整个内核结构中的成员名称,但是这种紧密的耦合使得用户空间中的内核部分运行非常困难。 (并且相信我,有时候我希望能够在用户空间中运行的一小部分内核代码上编写测试。)

如果你想玩耍,现在用qemu + kvm或者virtualBox或者uml来创建和运行一个虚拟系统并不难,试着修改内核。 在一个实时运行的系统上“搭建”结构是相当困难的,但是比在用户空间中编译内核部分更加可行。

祝你好运。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐