好的,我正在阅读关于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);
}
看起来很简单,嗯?现在,我无法构建这个东西。我正在使用NetBeans。 sched.h是正确的文件,好像可以用CTRL +点击它,一个被带到正确的文件。
我是否需要以某种方式包含我的示例文件并从Makefile构建整个内核?我只是希望看到它的构建,并可能它会起作用。如果我需要构建整个内核,我将如何实际测试我的东西?
我必须做一些非常愚蠢的事情,因为我对内核开发很新。我有点失落。
谢谢你们!
答案 0 :(得分:6)
您不需要编译整个内核,但您必须至少创建一个内核模块,它更容易编译。您应该查看教程,例如this,或者甚至是this这本完整的书。
请记住,并非所有内核代码都可以移动到模块 - 只是那些使用内核的公共(导出)接口的模块。内核核心部分(例如VM或调度程序)固有的代码可能无法从内核的其余部分访问。
另请注意,不建议在开发计算机上尝试内核代码 - a 轻微的错误很容易导致整个系统崩溃。您应该在单独的虚拟机中尝试尝试内核代码,例如在VirtualBox。
使事情变得更难的细节:通常,您只能在为其构建的内核中插入模块。在主机系统上编译的模块可以在测试VM 上使用,当且仅当内核相同时,即来自相同分发的相同内核包版本。考虑到您需要升级主机分发,我认为在测试系统上构建模块更简单。
由于您需要full development suite for C,您应该安装一个流行的Linux发行版。它应该更稳定,您可以访问其用户社区。如果要保持其大小不变,只需在没有X服务器或图形应用程序的情况下安装基本系统。
BTW Netbeans旨在开发用户空间应用程序。您可以根据内核代码调整它,但它永远不会像用户空间编程那样适合。事实上,没有IDE真的适合。内核代码无法从用户空间运行(更不用说使用单独的VM),这会破坏IDE自动化的正常编辑 - >编译 - >运行 - >调试工作流程周期。
大多数内核开发人员只使用带有C语法突出显示的加强编辑器,例如Vim或Emacs。 Emacs实际上是一个IDE(还有更多),但是,正如我上面提到的,你不能轻易地使用基于IDE的工作流来进行内核代码开发。
答案 1 :(得分:1)
如果您不想构建整个内核,则可以构建可加载的内核模块 - 例如见http://www.linux-tutorial.info/modules.php?name=Howto&pagename=Module-HOWTO。
答案 2 :(得分:1)
您编写,编译和运行的所有代码作为用户程序在用户模式下运行为......用户程序。内核以内核模式运行。两种模式都是分开的,不能直接看到对方。它们通过定义的接口进行通这些接口是C系统调用(与C库调用相反)。
为了能够访问task_struct结构,您的代码必须以内核模式运行。最好的选择是编写内核模块,并将其加载到内核中。
答案 3 :(得分:1)
很少的内核代码可以以任何形式在内核之外运行。大多数内核代码是非常'intertwingled'(使用我多年前从同事那里学到的用来描述过度耦合的短语)与内核代码的其他部分。功能“知道”结构定义适用于许多远离他们工作的结构。典型的软件工程人员讨厌这样的代码:
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;
}
此例程必须知道如何通过三个结构和在链的另一端的函数指针的调用约定来销毁inode。内核社区非常了解所有这些函数,并且非常乐意在进行更改时修改整个内核中的结构中的成员名称,但是这种紧密耦合使得在用户空间中运行内核部分非常困难。 (并且相信我,有时我希望我可以在我的内核代码的小部分上编写将在用户空间中运行的测试。)
如果您想玩游戏,现在使用qemu + kvm或virtualbox或uml来启动和运行虚拟系统并不难以尝试对内核进行修改。在实时运行的系统上“玩”结构很难,但是比在用户空间中编译部分内核要可行得多。
祝你好运。 :)答案 4 :(得分:0)
您可能喜欢使用systemtap作为少量内核模块代码的包装器:
# stap -g -e 'probe begin { your_function() exit() }
%{
#include <linux/whatever.h>
%}
function your_function() %{
... insert safe c code here ...
%}'
它也可以自动交叉编译(如果你使用stap --remote=VIRTMACHINE ...
)。