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

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

  我曾经问别人如何开始内核编程的学习,他们基本上都说:①如果你不需要了解内核是如何为你工作的,你为何要尝试呢?②你应该订阅Linux内核邮件列表,然后努力去理解。③如果你不去编写针对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内核的对外服务,是非常好的一个女人。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-23 20:36:04

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

Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装

原文:Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装 Linux内核分析(一) 从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底,同时在博文中如果那些地方有问题还请各位大神为我讲解. 今天我们会分析到以下内容: 1.      Linux体系结构简介 2.      Linux内核源码简介 3.      Linux内核配置.编译.安装   l  Linux体系结构简介 1.       Linux体系结构(linux系统构

使用Kdump检查Linux内核崩溃

让我们先看一下 kdump 的基本使用方法,和 kdump/kexec 在内核中是如何实现. kdump 是获取崩溃的 Linux 内核转储的一种方法,但是想找到解释其使用和内部结构的文档可能有点困难.在本文中,我将研究 kdump 的基本使用方法,和 kdump/kexec 在内核中是如何实现. kexec 是一个 Linux 内核到内核的引导加载程序,可以帮助从第一个内核的上下文引导到第二个内核.kexec 会关闭第一个内核,绕过 BIOS 或固件阶段,并跳转到第二个内核.因此,在没有 BI

Linux 内核的测试和调试(1)

Linux 内核的测试和调试(1) Linux 内核测试哲学 不管是开源还是闭源,所有软件的开发流程中,测试是一个重要的.不可或缺的环节,Linux 内核也不例外.开发人员自测.系统测试.回归测试.压力测试,都有各自不同的目的,但是从更高一个层次上看,这些测试的最终目的又是一样的:保证软件能一直运行下去,当有新功能加进去时,要保证新功能可以正常工作. 在软件释出 release 版之前,不用回归测试就能保证稳定性,并且尽量避免在软件发布后被用户发现 bug.调试被用户发现的 bug 是一项非常浪

Linux内核分析(七)----并发与竞态

原文:Linux内核分析(七)----并发与竞态 Linux内核分析(七) 这两天家里的事好多,我们今天继续接着上一次的内容学习,上次我们完善了字符设备控制方法,并深入分析了系统调用的实质,今天我们主要来了解一下并发和竞态. 今天我们会分析到以下内容: 1.      并发和竞态简介 2.      竞态解决办法 3.      为我们的虚拟设备增加并发控制   在前几次博文我们已经实现了简单的字符设备,看似完美但我们忽视了一个很严重的问题,即并发问题,那么什么是并发,又如何解决并发呢,我们下面

《Linux设备驱动开发详解 A》一一第3章Linux内核及内核编程

第3章Linux内核及内核编程 本章导读本章有助于读者打下Linux驱动编程的软件基础.由于Linux驱动编程的本质属于Linux内核编程,因此我们有必要熟悉Linux内核及内核编程的基础知识.3.1-3.2节讲解了Linux内核的演变及新版Linux 内核的特点.3.3节分析了Linux内核源代码目录结构和Linux内核的组成部分及其关系,并对Linux的用户空间和内核空间进行了说明.3.4节讲述了Linux内核的编译及内核的引导过程.除此之外,还描述了在Linux内核中新增程序的方法,驱动工

linux 内核与用户空间通信之netlink使用方法

Linux中的进程间通信机制源自于Unix平台上的进程通信机制.Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制.同时Linux也遵循IEEE制定的Posix IPC标准,在三者的基础之上实现了以下几种主要的IPC机制:管道(Pipe)及命名管道(Named Pipe),信号(Signal),消息队列(Message queue),共享内存(Shared M

linux内核空间与用户空间信息交互方法

     摘要:在进行设备驱动程序,内核功能模块等系统级开发时,通常需要在内核和用户程序之间交换信息.Linux提供了多种方法可以用来完成这些任务.本文总结了各种常用的信息交换方法,并用简单的例子演示这些方法各自的特点及用法.其中有大家非常熟悉的方法,也有特殊条件下方可使用的手段.通过对比明确这些方法,可以加深我们对Linux内核的认识,更重要的是,可以让我们更熟练驾御linux内核级的应用开发技术. 内核空间(kernel-space) VS 用户空间(user-space) 作为一个Linu

Ubuntu中为Android系统上编写Linux内核驱动程序实现方法_Android

        在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iphone莫属了.据统计,截止2011年5月,AppStore的应用软件数量达381062个,位居第一,而Android Market的应用软件数量达294738,紧随AppStore后面,并有望在8月份越过AppStore.随着Android系统逐步扩大市场占有率,终端设备的多样性亟需更多的移动开发人员的参与.据业内统计,Android研发人才缺口至

Linux内核驱动--mmap设备方法【原创】

mmap系统调用(功能) void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset) 内存映射函数mmap , 负责把文件内容映射到进程的虚拟内存空间,通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read, write等操作.   addr:        指定映射的起始地址,通常设为NULL, 由系统指定. len:          映射到内存的文件长度 prot: