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

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

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

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

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

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

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

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

你一定会想使用一个仿真器去运行你的操作系统,比如 qemuOSDev 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 McKellarKsplice blog上的博客文章
  • Linux Device Drivers》是这样描述它自己的,我发现还是有点用:

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

  • 如果你在写一个操作系统,OSDev wiki是一个不错的网站
  • Kernel Newbies有一些给内核开发新手的资源,虽然在它的聊天室里我有一些不爽的经历。
  • Sarah Sharp是一个内核开发人员,负责Linux内核的对外服务,是非常好的一个女人。


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

      http://segmentfault.com/a/1190000000382157http://segmentfault.com/a/1190000000382157

http://blog.csdn.net/xiangpingli/article/details/44428155

时间: 2024-10-06 05:48:58

成为 Linux 内核高手的四个方法的相关文章

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

我曾经问别人如何开始内核编程的学习,他们基本上都说:①如果你不需要了解内核是如何为你工作的,你为何要尝试呢?②你应该订阅Linux内核邮件列表,然后努力去理解.③如果你不去编写针对Linux内核的代码,你就是在浪费时间. 这些对我一点儿帮助都没有.所以我在这里列举了一些可行的方法,他们是有关操作系统和Linux内核是怎样在你的项目里工作的,而且还很有趣.虽然我知道得并不多,但至少比我做这些之前了解了更多. 对于下面这几个途径,你只需要了解一些C语言和汇编语言(至少要会复制粘贴).我会写一些小的C

Linux内核分析第四章 读书笔记

Linux内核分析第四章 读书笔记 第一部分--进程调度 进程调度:操作系统规定下的进程选取模式 面临问题:多任务选择问题 多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这会产生多个进程在同时运行的幻觉,在多处理器机器上,这会使多个进程在不同的处理机上真正同时.并行地运行.无论在单处理器或者多处理器机器上,多任务操作系统都能使多个进程处于堵塞或者睡眠状态,也就是说,实际上不被投入执行,直到工作确实就绪. 多任务系统可以划分为两类:非抢占式多任务和抢占式多任务.Linu

Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介

Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理子系统.网络子系统.虚拟文件系统在这个阶段进行分析的,但是为了让大家对内核有个整体的把握,今天还是简单的介绍一下剩余的几个子系统,我们对这几个子系统的分析,只要了解其作用和部分内容即可,不必深究,等我们写上几个驱动,到时候按照驱动再来分析这几个子系统我们就清晰多了. 在http://www.cnblogs.com/wrjvszq/p/4257164.html一文我们提到过linux

Linux内核设计基础(四)之虚拟文件系统

先来看一下写文件函数write的执行过程: ret = write(fd, buf, len); write适用于各种文件系统,它首先执行sys_write(),而正是这个sys_write()进行实际文件系统类型的判别并执行该类型文件系统下的写操作.我们可以看出在多种多样的文件系统上抽象出了一个通用接口性质的虚拟文件系统. 我们这里非常关心Linux 2.6是如何去实现VFS的.先来看一下VFS中的四个主要的对象类型: 超级块对象,它代表一个具体的已安装文件系统. 索引节点对象,它代表一个具体

十天学Linux内核之第四天---如何处理输入输出操作

原文:十天学Linux内核之第四天---如何处理输入输出操作 真的是悲喜交加呀,本来这个寒假早上8点都去练车,两个小时之后再来实验室陪伴Linux内核,但是今天教练说没名额考试了,好纠结,不过想想就可以睡懒觉了,哈哈,自从大三寒假以来还没睡过懒觉呢,现在也有更多的时间来分享自己学习Linux内核的感受,前几天觉得就是自己也有些不懂的,相信大家看了也是很模糊,以后我会标志出来自己不懂的,希望大神们指教,也希望大家多多指点,共同攻克Linux内核,今天将讲到处理器是如何与其它设备进行交互的,内核又是

Linux内核中实现保留内存的方法

Linux中保留内存(Reserved memory)是指把系统中的一部分内存保留起来,内核不会为它建立页表,一般的应用程序无法访问到这段内存.在板卡调试.内存测试和设备DAM调试的过程中,可以运用这种办法,先验证系统在只有低端内存的情况下能否顺利启动:此外,服务器和存储系统的环境下,也可以用这种方法从大量系统内存中保留出一部分,留给特殊用途使用或者模拟诸如NVDIMM等设备.因此,有必要对Reserved Memory的使用有一定了解. 1.实现保留内存 Linux内核启动参数cmdline提

Linux内核实验作业四

实验作业:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 20135313吴子怡.北京电子科技学院 [第一部分]使用库函数API来获取用户标识号.库函数为getuid() 代码如下: 编译运行之后,将用户id号1000打印输出在屏幕上. [第二部分]使用汇编方式触发系统调用来获取用户标识号.库函数依旧为getuid() 代码如下: 可以看出,打印出来的用户id和之前的一样都是1000. [第三部分]系统调用的工作机制学习总结 我认为系统调用的工作机制就是系统调用经过封装包装成为

重编译LINUX内核调整SCTP参数的方法

1.  背景: sctp协议不匹配引发的内核编译. 公司的SIGTRANS在于华为HSTP进行联调时发现,华为的HSTP的SCTP层中INIT消息不认识我们的SCTP层中的INIT消息中的ECN\Forward TSN\ADAPTATION参数. 经过在网络上用搜索引擎反复查找LINUX\SCTP相关资料,才发现LINUX内核2.6.18版本的SCTPINIT强制性添置ECN.ADAPTATION参赛,Forwrd TSN参数可以通过/proc/sys/net/sctp进行开关配置(0携带1不携

linux内核分析第二四学习报告

学生  黎静 课程内容 计算机三大法宝 • 存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: • 函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那么重要,但有了高级语言及函数,堆栈成为了计算机的基础功能: • 中断,多道程序操作系统的基点,没有中断机制程序只能从头一直运行结束才有可能开始运行其他程序. 一.函数调用堆栈 1.堆栈 堆栈式C语言程序运行时必须的一个记录调用路径和参数的空间.包括: 函数调用框架 传递参数 保存返回地址(如eax)