如何进行Linux源代码自定义?

时间:2017-09-08 04:52:03

标签: linux linux-kernel

我是非CS / IT学生,但具备C,Java,DS和算法知识。现在,我专注于操作系统并获得了一些概念。但我想要一些实用的知识。仅仅在java / c中编写algo代码就没什么乐趣了。我已经阅读了很多文章,他们提到我们可以自定义Linux内核的源代码。

我希望在学习OS概念时继续自定义内核并应用相同的内容。它将实现两个目标1.我将获得操作系统的实际想法2.我将有一个项目。

我面临的问题 -
1.从哪里获取源代码?我应该下载哪些源代码?如果可能的话,还有文件 https://www.kernel.org/
我去了那里但是有这么多人哪个会更好? 2.一旦有了代码,我将如何自定义代码?

请给我详细说明如何开始这个旅程(更改源代码以定制Linux)。

此外我使用的是Windows 8。

3 个答案:

答案 0 :(得分:3)

我建议先阅读有关操作系统和编程的几本书籍。您需要广泛的CS文化(如果可能的话,获得CS学位)

  

我是非CS / IT学生,

你最好成为一个人,或者花更多年的时间来学习CS研究生所学的所有东西。

首先,您需要非常熟悉用户端的Linux编程(应用程序)。所以至少阅读Advanced Linux Programming并研究几个程序的源代码,包括shell(和某种服务器)。请仔细阅读syscalls(2)。探索内核的状态(例如通过proc(5) ...)。查看https://kernelnewbies.org/

我还建议学习几种编程语言。你应该特别阅读SICP,这是对编程的一个很好的介绍。另请阅读programming language pragmatics之类的书。阅读有关延续和continuation passing style的内容。阅读Dragon book。阅读一些Introduction to Algorithms。阅读有关computer architectureinstruction set architecture

的内容
  

仅仅在java / c中编写algo代码就没什么乐趣了。

但内核也是用C编写的(大部分)并且充满了算法代码。是什么让你觉得你会变得更有趣?

  

我希望在学习OS概念的过程中开始自定义内核并应用它。

但为什么呢?你为什么不考虑研究和贡献一些user级代码

我建议首先阅读一本关于操作系统的好书,特别是Operating Systems: Three Easy Pieces。另请参阅OSdev

最后,关于内核编程的一般建议是。一个常见的错误是尝试在内核中添加代码来解决一些可以并且应该在用户范围内解决的问题。

  
      
  1. 如果有代码,我将如何自定义代码?
  2.   

您可能不应该自定义内核,但如果您这样做,您将使用熟悉的工具(emacs,如vimmake,命令行上的编译器和链接器, let pm = placemarks! as [CLPlacemark] // this is Clpmacemark let placemark = MKPlacemark.init(placemark: pm) self.mapview.addAnnotation(placemark) source code editor工具。修补内核类似于修补其他build automation。但是测试你的内核更难(因为你经常重启)。

你还会找到几本解释Linux内核的书。

如果您仍想自定义内核,首先应该尝试编写一些内核模块。

  

此外我使用的是Windows 8。

这是 巨大错误 。您首先需要成为高级Linux用户。所以从您的计算机上清除Windows,并安装一些Linux发行版 - 我推荐Debian-(并且只使用Linux,不再使用Windows)。熟悉命令行。

我认真建议避免将内核作为您的第一个项目。 我强烈建议首先查看一些现有的用户自由软件项目(其中有数千个,特别是在free software,例如在您的发行版中选择一些github,研究其源代码,对其进行处理,向社区提出补丁)。能够从源代码构建很多东西。

答案 1 :(得分:2)

一个聪明的人曾经说过你必须按照自己的方式进行正确的思考,因为你无法想象自己的正确行事方式。在您的情况下,您需要充当经验丰富的程序员才能采取行动,这意味着在我们编写任何代码之前,我们需要回答一些问题。

  • 我们想改变什么?
  • 我们为什么要改变它?
  • 这种变化会产生什么影响(即,在数百万行源代码的所有10行中,还有其他功能 - 调用此函数)?
  • 在我们做出改变之后,我们将如何编译它?换句话说,有一个定义的过程。它是什么?
  • 在我们编译新的内核/模块之后,我们将如何测试它?

除了刚刚发布的答案之外,一个好的开始是运行LFS(来自Scratch的Linux)。成功安装并以此为出发点。

现在,由于我们经验丰富的程序员,我们知道修补10M +行代码库是一个麻烦的方法;我们需要更多的方向。以下是需要修复的错误列表:https://bugzilla.kernel.org/buglist.cgi?chfield=%5BBug%20creation%5D&chfieldfrom=7d 举个例子,我很高兴看到一个名为" AUFS挂在fanotify"离开,因为我每天都使用带有Docker的AUFS。

如果您认为自己决定除了内核之外还有其他东西,还有很多其他选择。

答案 2 :(得分:2)

  1. 从您的问题可以看出,您已经获得了操作系统的一些概念。但是,如果您觉得它还不够,可以花更多时间学习。操作系统(主要是内核)具有执行某些任务,如内存管理(或内存保护),多道程序设计,硬件抽象等。这两个主题都不会被忽视 - 它们都同样重要。所以,如果你有一些时间,你可以参考像#34;现代操作系统"由Andrew Tanenbaum。这样的特殊书籍将对现代操作系统的所有重要方面有所了解。可以这么说,Linux内核本身是由Linus Torvalds启动的,因为MINIX的强大灵感 - A. Tanenbaum的教育项目。
  2. 像OS内核(BSD,Linux等)这样繁琐的项目包含大量代码。许多人正在合作编写或增强内核的任何部分。因此,使用version control system有一个共同且不可避免的需求。因此,如果您打算将来将代码提交给内核,那么您还必须掌握版本控制。特别是,Linux依赖于Git SCM(软件配置管理 - version control的同义词)。 所以,一旦掌握了Git知识,就可以在计算机上安装并下载Linux源代码:git clone https://github.com/torvalds/linux.git
  3. 确定Linux内核修改的目标。你想达到什么目的?也许,你有一个网卡,你怀疑它错过了Linux的一些功能?看看其他供应商'驱动程序并尝试修复感兴趣的驱动程序以包含这些功能。当然,这需要一些关于硬件的知识,并且,如果这些特性与硬件有关,那么在没有特殊知识的情况下,您将不可能成功地编写代码。但是,一般而言, - 如果您正在尝试进行增强,则假定您自己是一位经验丰富的Linux用户。否则,您将如何理解一些修复/增强/等。是必要的?所以,我无法提供帮助,但同意推迟推出Windows 8并开始使用某些Linux发行版的提议(例如Debian)。
  4. 如果您成功确定了目标(例如,如果您发现了一篇描述Linux内核中某些所需更改的论文,或者如果您决定增强某些设备驱动程序/编写自己的内容),您将可以亲自尝试。但是,您仍然可能需要一些有用的书籍,但在本例中,还有一些特定于Linux的书籍。此外,为内核编写C代码本身需要一个重要的细节 - 您需要遵守所谓的coding standard,否则Linux内核维护者将无法接受您的补丁。
  5. 因此,我尝试根据您当前的问题概述一些提示。当然,内核开发的工作有更广泛的先决条件,但这些都是显而易见的。