2019独角兽企业重金招聘Python工程师标准>>>

本文由 伯乐在线 - haofly 翻译自 Julia Evans。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。

(之前我在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的部分代码,其中有一些我写的注释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
staticintchmod_common(structpath *path, umode_t mode)
{
structinode *inode = path->dentry->d_inode;
structiattr newattrs;
interror;
// 不知道这是在干什么
error = mnt_want_write(path->mnt);
if(error)
returnerror;
// 互斥锁!避免出现冲突现象!=D
mutex_lock(&inode->i_mutex);
// 我猜这是在检查是否能使用chmod
error = security_path_chmod(path, mode);
if(error)
gotoout_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);// ???
returnerror;
}

我觉得这个过程是很有趣的,而且也帮助了我阐明了内核的意义。我发现我所阅读的代码大多都是生涩难懂的,但是也有一些(比如chmod的代码)是可以理解的。

总结几个链接:

  • Jessica McKellar在Ksplice blog上的博客文章
  • 《Linux Device Drivers》是这样描述它自己的,我发现还是有点用。

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

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

转载于:https://my.oschina.net/qiangzigege/blog/208097

内核-程序员的顶级梦寐相关推荐

  1. 寻找优秀的程序员之实战指南-1

    寻找优秀的程序员之实战指南 --选自<软件随想录:程序员部落酋长Joel谈软件> [好消息]本书今天(12.10)互动有货,感兴趣的朋友可以 逛逛去 2006 年 9 月 7 日 ,星期四 ...

  2. 程序员薪资两极分化,如何成为高薪程序员?

    整理 | 李磊 出品 | CSDN(ID:CSDNnews) 现代管理学之父彼得·德鲁克在<知识社会>中说,40 年前,从事知识与服务劳动的人占总劳动力的比例不到 1/3.今天的发达国家, ...

  3. 软件随想录:程序员部落酋长Joel谈软件(阮一峰译)-3

    3. 寻找优秀的程序员之实战指南 2006年9月7日,星期四 你是一个雇主.你在所有正确的地方刊登了招聘广告,你有一个完善的实习生制度,你面试了所有你想要的人.但是很不幸,如果优秀的程序员不愿意为你工 ...

  4. 【连载】听程序员部落酋长畅谈关于软件的人和事-节选3

    寻找优秀的程序员之实战指南 --选自<软件随想录:程序员部落酋长Joel谈软件> [好消息]本书今天(12.10)互动有货,感兴趣的朋友可以 逛逛去 2006 年 9 月 7 日 ,星期四 ...

  5. 2020 程序员找工作指南

    2020 程序员找工作指南 术语科普 hc,headcount,人头数,表示计划招聘的人员的个数,例句 今年的 hc 很充足. jd,job description,工作描述,例句 发个 jd 给我看 ...

  6. 扎心了,老铁!下班回家无人陪,程序员又双叒叕成单身率最高!

    程序猿(微信号:imkuqin) 猿妹 整编 参考:2017职场单身人群婚恋需求报告 近日,网上发布了一份报告--<2017 职场单身人群婚恋需求报告>,此报告引起了网友热议,它是由珍爱网 ...

  7. 顶级c程序员之路 基础篇 - 第一章 关键字的深度理解 number-1

    c语言有32个关键字,每个关键字你都理解吗? 今天出场的是: auto ,  register,  static,   extern 为什么他们会一起呢,说到这里不得不谈到c语言对变量的描述. c给每 ...

  8. 解读程序员的武侠世界,顶级程序员是内外兼修的大侠,那么你呢?

    在漫天的星河中,有这样一颗星,他朴实无华,却又熠熠生辉,照亮了无数人的人生.他就是金庸先生.随着一代大侠的驾鹤西去,"飞雪连天射白鹿,笑书神侠倚碧鸳",成为绝响. 每一个少年心中, ...

  9. 全球最年轻的Python程序员;13 岁创建 RISC-V 内核,后浪程序员有多恐怖?

    [CSDN 编者按]前不久,英国一位仅 6 岁多的孩子获得了 IBM AI 认证,创下新的吉尼斯记录,成为全球最年轻程序员.前有 AI 编程掀餐桌,后有 6 岁娃娃抢饭碗,程序员们真的太难了.别慌,今 ...

最新文章

  1. C++ 基础知识总结
  2. BERT新转变:面向视觉基础进行预训练
  3. DeepMind新突破!首次用深度学习从第一性原理计算分子能量
  4. android app打开流程_App冷启动,你还要我怎样?
  5. DPM2012恢复单个Exchange2010用户邮箱
  6. batch_normalization (bn)层以及实际使用中合并bn层
  7. Linux系统调用号表
  8. 4种实例 advice aop_《Spring实战》阅读笔记
  9. 保存时间 默认_一些不起眼但又非常的实用的PPT制作技巧,大大节省PPT制作时间...
  10. C++的四种强制转型形式:
  11. C# string 判断字符串是否是中文
  12. 教职工信息管理系统(C++)
  13. 计算机系统基础(1)
  14. 文件批量提取工具,从大量文件中批量提取指定文件的实现思路,文件批量复制
  15. Oracle 数据库修复,IBM DB2 数据库修复,MY SQL 数据库修复,SQL Server 数据 库修复,Sybase 数据库,Foxpro 数据库,Access 数据库,Informi
  16. C++ 自定义新的运算符
  17. linux中文件权限为drwxr,linux drwxr-xr-x 什么意思 ?
  18. mysql中in的参数有限制_数据库 in 可以包含的参数个数
  19. 东方财富通快捷键一览
  20. 爬虫—微博博主动态及相册的请求构造规律

热门文章

  1. matlab 双边沿滤波,图片漫画效果(DoG算子和双边滤波)
  2. 简述使用混合传递参数时的基本原则_JUnit 5参数化方法测试(一)
  3. JS鼠标移动显示图片
  4. “输入字符不是 MATLAB 语句或表达式中的有效字符”的解决办法
  5. FPGA之道(60)时空变换之空域优化
  6. FPGA之道(15)组合逻辑与时序逻辑、同步逻辑与异步逻辑的概念
  7. 仿夸克浏览器底部工具栏
  8. 软考程序员2009年下午试题是否有误?
  9. 《Ext JS权威指南》节选:在Visual Studio中实现Ext JS智能提示
  10. GitHub使用指南!(ubuntu)