(以前我在 CUSEC 网站发表了关于内核并不可怕的一篇文章,本文是后续。)html
我曾经问别人如何开始内核编程的学习,他们基本上都说:
1. 若是你不须要了解内核是如何为你工做的,你为什么要尝试呢?
2. 你应该订阅Linux内核邮件列表,而后努力去理解。
3. 若是你不去编写针对Linux内核的代码,你就是在浪费时间。node
这些对我一点儿帮助都没有。因此我在这里列举了一些可行的方法,他们是有关操做系统和Linux内核是怎样在你的项目里工做的,并且还颇有趣。虽然我知道得并很少,但至少比我作这些以前了解了更多。linux
对于下面这几个途径,你只须要了解一些C语言和汇编语言(至少要会复制粘贴)。我会写一些小的C程序,还会用汇编来上课,虽然这些我都忘得差很少了。ios
这看起来是一个至关可怕的方法。但事实上并非!我是从 rustboot这个项目开始的,重要的是它已经能够工做了。而后我会作一些简单的事情,好比让屏幕由红色变为蓝色,打印字符到屏幕,持续获取键盘中断来工做。git
MikeOS 是我另外一个有趣的开始。请记住,你的操做系统没有必要作得很大很专业——若是你可以让它把屏幕颜色由红色变为紫色或者让它打印一首诗,你就算成功了。程序员
你必定会想使用一个仿真器去运行你的操做系统,好比 qemu。OSDev wiki一样是一个颇有用的网站——上面有不少你会碰到的常见的问题。github
若是你已经准备运行Linux了,那么再写一些内核模块就会是至关至关容易的,即便他们什么都不会作。web
这里有一个可以打印“Hello, hacker school!”到内核日志的模块源代码。它只有18行代码。基本上你只须要编写一个init进程和一个cleanup函数就能够了。我并不知道__init和_exit这两个宏命令作了些什么,可是我会使用他们!编程
编写一个有必定功能的内核模块是比较难的。我作这个的时候,都是先决定要完成的功能(好比打印一个信息给每个通过内核的数据包),而后回去阅读一些 Kernel Newbies上的东西,再大量地使用谷歌来搜索,再复制和粘贴大量的代码来搞明白究竟该怎样去编写它。这里有几个内核模块的例子,我把他们放在了 kernel-module-fun 项目里。c#
Linux内核团队参与了GNOME女性拓展实习项目。它是惊人、奇妙而且使人很是愉快的一个活动。这意味着,若是你是一个女人而且愿意花费三个月时间在内核开发上,你就能参与内核的开发,而且不须要任何的经验,还能获得一些报酬(5000美圆)。在 Kernel Newbies上有关于它的介绍。
若是你对此感兴趣,那会是很是值得去申请的——你可以为内核作一个格式化的补丁,这很是有趣。Sarah Sharp是一个Linux内核开发人员,她在协调这个活动并且她本人也是很是热心的。你能够阅读她的这篇博客文章,讲述了在第一轮里137个补丁是怎样被容许加入到内核中去的。这些补丁也将会是你提供的!查看申请说明!
若是你不是一个女生,那么能够选择Google Summer of Code这个类似的活动。(编注:这句话可能会引发女程序员的反感)
这听起来像是最糟糕的建议——“想要去了解内核是如何工做的就去看源代码,太蠢了”
但事实上这个方法是很是有趣。你并不须要了解一切东西。当遇到没法理解的东西时,我就会感到无能为力,可是我告诉人们的时候,每一个人都会说:“嗯,这就是传说中的Linux内核,你不能理解很正常!”
个人朋友Dave最近给了我一个网站 LXR,在里面你能够阅读到内核的资源,并且还提供了大量有用的引用连接。好比,若是你想要了解chmod这个命令的系统调用,你能够在 the chmod_common definition 页面看到有关于它在Linux内核里的定义!
这里是部分chmod_common的部分代码,其中有一些我写的注释:
static int chmod_common(struct path *path, umode_t mode) { struct inode *inode = path->dentry->d_inode; struct iattr newattrs; int error; // 不知道这是在干什么 error = mnt_want_write(path->mnt); if (error) return error; // 互斥锁!避免出现冲突现象!=D mutex_lock(&inode->i_mutex); // 我猜这是在检查是否能使用chmod error = security_path_chmod(path, mode); if (error) goto out_unlock; // 我猜这是在改变mode的值 newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~IALLUGO); newattrs.ia_valid = ATTR_MODE | ATTR_CTIME; error = notify_change(path->dentry, &newattrs); out_unlock: mutex_unlock(&inode->i_mutex); // 完成时就解除互斥锁 mnt_drop_write(path->mnt); // ??? return error; }
我以为这个过程是颇有趣的,并且也帮助了我阐明了内核的意义。我发现我所阅读的代码大多都是生涩难懂的,可是也有一些(好比chmod的代码)是能够理解的。
总结几个连接:
《Linux Device Drivers》是这样描述它本身的,我发现仍是有点用:
“这本书会教你怎样编写你本身的驱动和怎样入侵与内核相关的地方”
若是你在写一个操做系统,OSDev wiki是一个不错的网站
原文:4 paths to being a kernel hacker
转载自:伯乐在线 - haofly