资讯专栏INFORMATION COLUMN

成为 Linux 内核高手的四个方法

Moxmi / 3455人阅读

摘要:方法一编写你自己的操作系统这看起来是一个相当可怕的方法。是一个内核开发人员,她在协调这个活动而且她本人也是非常热心的。是一个内核开发人员,负责内核的对外服务,是非常好的一个女人。

(之前我在 CUSEC 网站发表了关于内核并不可怕的一篇文章,本文是后续。)

我曾经问别人如何开始内核编程的学习,他们基本上都说:
1. 如果你不需要了解内核是如何为你工作的,你为何要尝试呢?
2. 你应该订阅Linux内核邮件列表,然后努力去理解。
3. 如果你不去编写针对Linux内核的代码,你就是在浪费时间。

这些对我一点儿帮助都没有。所以我在这里列举了一些可行的方法,他们是有关操作系统和Linux内核是怎样在你的项目里工作的,而且还很有趣。虽然我知道得并不多,但至少比我做这些之前了解了更多。

对于下面这几个途径,你只需要了解一些C语言和汇编语言(至少要会复制粘贴)。我会写一些小的C程序,还会用汇编来上课,虽然这些我都忘得差不多了。

方法一:编写你自己的操作系统

这看起来是一个相当可怕的方法。但事实上并不是!我是从 rustboot这个项目开始的,重要的是它已经可以工作了。然后我会做一些简单的事情,比如让屏幕由红色变为蓝色,打印字符到屏幕,持续获取键盘中断来工作。

MikeOS 是我另一个有趣的开始。请记住,你的操作系统没有必要做得很大很专业——如果你能够让它把屏幕颜色由红色变为紫色或者让它打印一首诗,你就算成功了。

你一定会想使用一个仿真器去运行你的操作系统,比如 qemu。OSDev wiki同样是一个很有用的网站——上面有很多你会碰到的常见的问题。

方法二:编写一些内核模块!

如果你已经准备运行Linux了,那么再写一些内核模块就会是相当相当容易的,即使他们什么都不会做。

这里有一个能够打印“Hello, hacker school!”到内核日志的模块源代码。它只有18行代码。基本上你只需要编写一个init进程和一个cleanup函数就可以了。我并不知道__init和_exit这两个宏命令做了些什么,但是我会使用他们!

编写一个有一定功能的内核模块是比较难的。我做这个的时候,都是先决定要完成的功能(比如打印一个信息给每一个经过内核的数据包),然后回去阅读一些 Kernel Newbies上的东西,再大量地使用谷歌来搜索,再复制和粘贴大量的代码来搞明白究竟该怎样去编写它。这里有几个内核模块的例子,我把他们放在了 kernel-module-fun 项目里。

方法三:参加一次Linux内核实习!

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的代码)是可以理解的。

总结几个链接:

Jessica McKellar在Ksplice blog上的博客文章

《Linux Device Drivers》是这样描述它自己的,我发现还是有点用:

  

“这本书会教你怎样编写你自己的驱动和怎样入侵与内核相关的地方”

如果你在写一个操作系统,OSDev wiki是一个不错的网站

Kernel Newbies有一些给内核开发新手的资源,虽然在它的聊天室里我有一些不爽的经历。

Sarah Sharp是一个内核开发人员,负责Linux内核的对外服务,是非常好的一个女人。


原文:4 paths to being a kernel hacker
转载自:伯乐在线 - haofly

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/7473.html

相关文章

  • Linux用户态与内核态通信的几种方式

    摘要:我们平常在写代码时,一般是在用户空间,通过系统调用函数来访问内核空间,这是最常用的一种用户态和内核态通信的方式。它本质上还是用到了文件的读写操作,来完成用户态和内核态的通信。总结用户态和内核态通信主要的四种方式,其中和是最常见的方式。 本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,...

    sarva 评论0 收藏0
  • Linux用户态与内核态通信的几种方式

    摘要:我们平常在写代码时,一般是在用户空间,通过系统调用函数来访问内核空间,这是最常用的一种用户态和内核态通信的方式。它本质上还是用到了文件的读写操作,来完成用户态和内核态的通信。总结用户态和内核态通信主要的四种方式,其中和是最常见的方式。 本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,...

    crossoverJie 评论0 收藏0
  • Linux虚拟网络设备之tun/tap

    摘要:虚拟设备和物理设备的区别在网络数据包的接收过程和数据包的发送过程这两篇文章中,介绍了数据包的收发流程,知道了内核中有一个网络设备管理层,处于网络设备驱动和协议栈之间,负责衔接它们之间的数据交互。 在现在的云时代,到处都是虚拟机和容器,它们背后的网络管理都离不开虚拟网络设备,所以了解虚拟网络设备有利于我们更好的理解云时代的网络结构。从本篇开始,将介绍Linux下的虚拟网络设备。 虚拟设备...

    zzbo 评论0 收藏0
  • 技术人攻略访谈二十九:平行世界守护者

    摘要:从第一次向内核社区提交,到成为全职的开源贡献者,峰光投身于开源领域已将近年。或许是虚拟世界过于精彩,在现实中,峰光过得至为简朴。不知为何,每当想起像峰光这样的一群人在守护着,我对现实世界就多了一份信心。showImg(http://segmentfault.com/img/bVcpsi); 文:Gracia (本文为原创内容,部分或全文转载均需经过作者授权,并保留完整的作者信息和技术人攻略...

    lewinlee 评论0 收藏0
  • 简述Linux的启动过程

    摘要:本文将简单介绍一下的启动过程,希望对那些安装的过程中遇到了问题的朋友有些帮助声明本人没用过模式和分区格式,所有关于这两部分的内容都是网络上找的资料,仅供参考。这是内核给用户态启动的第一个进程的特殊待遇。 本文将简单介绍一下Linux的启动过程,希望对那些安装Linux的过程中遇到了问题的朋友有些帮助 声明: 本人没用过UEFI模式和GPT分区格式,所有关于这两部分的内容都是网络上找的资...

    余学文 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<