万事开头难 - 如何开始?

人总是对未知的事物充满恐惧!就像航海一样,在面对危难的时候,船员和船长是一样心中充满恐惧的!只是船员始终充满恐惧,而船长却能压抑恐惧并从当前找出突破口! 
我没有船长之能,但也算入行两年的老船员,我会追随船长一起寻找突破口!而内核如此庞然大物不知从何入手这真的很正常,那么应该的入口在哪里?其实我也不知道,一千个读者就有一千个哈姆雷特。每个人都入口的理解都不一样,有人说是必须有着良好的C编程经验,有人说必须有着对Linux发行版等必要的操作经验,也有的人说一定要数据结构理解的很好,还有的人说你必须的对各种架构的汇编了如指掌!眼花撩乱的知识你又掌握了多少呢?

我列出三点

1.必须有着良好的C语言理解能力,尤其是指针(灵魂嘛) 
2.数据结构确实的能看懂,尤其是链表 
3.一定要有着非常浓厚的兴趣,不成魔,不成活 
第3点尤其最重要,因为兴趣才是王道

假设你已经对上述内容有了一定的了解或者已经是个老手了!想急需的去更深入的研究内核! 
那么我们就开始吧!

1. 你应该了解内核源码树

顶层目录

├── arch            --  体系架构相关代码,内核支持市面上所有的主流架构以及N多种CPU
├── block -- 块设备子系统
├── crypto -- 加密解密库函数
├── Documentation -- 说明文档
├── drivers -- 设备驱动
├── firmware -- 第三方设备固件
├── fs -- 文件系统子系统(VFS)
├── include -- 公共头文件
├── init -- 启动初始化子系统(如挂载initrd)
├── ipc -- 进程通信子系统
├── Kbuild -- 顶层链接文件
├── Kconfig -- 顶层配置配置
├── kernel -- 内核核心代码(基本与架构无关,包括调度子系统)
├── lib -- 公共LIB库函数
├── Makefile -- 顶层编译文件
├── mm -- 内存管理子系统
├── net -- 不包括网络设备驱动的网络子系统
├── README -- 你懂得
├── samples -- Demo 代码
├── scripts -- 编译脚本以及工具
├── security -- 模块安全相关(SELinux)
├── sound -- 音频驱动子系统
├── tools -- 内核辅助工具
├── usr -- 用户程序(目前只有一个用于initramfs的cpio打包程序)
└── virt -- 虚拟化相关
├── REPORTING-BUGS -- Bug 上报流程
├── MAINTAINERS -- 主要维护者(向社区致敬)
├── CREDITS -- 贡献者(请牢记伟大的程序员)

内核真是太庞大了,目前这个版本的代码量已经到了几百万行之多,那么问题来了,这么多的内容我们应该如何取舍?

2. Linux Kernel 核心功能一览

Linux 核心功能分为五大子系统(进程管理,内存管理,虚拟文件系统,网络子系统,进程间通信)! 
Ps.下面是网上找了一张图片 

  1. Process Mangement称作进程管理or进程调度。主要负责管理CPU资源的平衡调度,抢占,异常入口等的管理。主要为了确保各个进程尽量以公平的方式来对CPU执行调度!Ps.这里其实就要说到优先级等相关内容!这部分是必须要研究的一部分!
  2. Memory Manager称作内存管理。主要负责管理内存资源的分配以及配额,确保各个进程任务可以放心去共享使用当前的内存资源。此外,内存管理也会提供虚拟内存机制处理,该机制可以让进程使用多于系统可用Memory的内存(也就是内存地址转换),不用的内存会通过文件系统保存在外部非易失存储器中,需要使用的时候,再取回到内存中。这部分也是必须要研究的一部分!
  3. IPC称作进程间通信。它主要负责Linux系统中进程之间的通信,这里跟硬件无关! 这部分无需多说,必须研究!
  4. Network称作网络子系统,主要负责管理系统的网络设备,并实现多种多样的网络标准以及提供各种各样协议的基本协议栈。这部分如果从事网络领域可以仔细研究(难点也是在于协议栈),这部分可以了先了解!
  5. Virtual File System称作虚拟文件系统。Linux内核将不同功能的外部设备,例如Disk设备(硬盘、磁盘、NAND Flash、Nor Flash等)、输入输出设备、显示设备等等,抽象为可以通过统一的文件操作接口(open、close、read、write等)来访问。这部分如果从事存储就必须要研究啦!它往往是结合块设备驱动来进行的!
  6. SELinux/AppArmor号称最杰出的操作系统安全子系统,最早由NSA(美国国家安全局)来领导并研发的一套安全子系统!这部分内容如果暂时可以先了解下!

Ps…对了,还忘了说一个非常非常重要的核心,那就是体系架构,因为我当前是Mips,所以首先的熟悉MIPS架构中的一些最基本的处理方式,并且内核中有很多关于MIPS的汇编以及GUN混合MIPS的伪汇编,都需要去啃啊,瞬间好头大!深吸一口气,慢慢来吧!这部分内容作为整体穿插的时候在进行脑补吧!!!!

3.Makefile

好吧,下一节就要进行实战了,这里先脑补一下Makefile. 
Makefile作为构建内核的引线,穿插在各个目录中!那么对它的语法先简单的了解下! 
基本的 make流程 其实是根据文件的时间戳来更新(读取Makefile) 文件的编译工作 
从一个样例来说明Makefile.

    main:main.o name.o age.o
gcc main.o name.o age.o -o main
main.o:main.c
gcc -c main.c -o main.o
name.o:name.c
gcc -c name.c -o name.o
age.o:age.c
gcc -c age.c -o age.o
clean:
rm *.o main

基本格式为: 目标生成文件名:源文件 
生成过程(得到结果) 
clean 作为方便的清除Makefike生成的编译文件 
看上述的主文件 
main.c

    #include <stdio.h>
extern void name();
extern void age(); int main()
{
name();
age(); return 0;
}
name.c
#include <stdio.h> void name()
{
printf("My name is Xw. \n");
} age.c
#include <stdio.h> void age()
{
printf("My age is 22........\n");
}
  • 直接编译可产生结果。

杂种Shell + Makefile的演变 
当我们的可编译文件越来越多时候,那么即时可能你少了一个.o文件那也直接导致程序崩溃。 
所以这个时候我们的杂种Shell(其实严谨的说不是shell相似而已)就有用了。我们大可以用一个变量去代替你的源文件、也可以代替我们的编译器。如下

     CC=gcc                           //变量代替你的编译器
OBJS=main.o name.o age.o //源文件
main:$(OBJS)
$(CC) $^ -o $@
main.o:main.c
$(CC) -c $^ -o $@
name.o:name.c
$(CC) -c $^ -o $@
age.o:age.c
$(CC) -c $^ -o $@
clean:
rm *.o main
  • 没有出现的<这些命令以后会用到。分别先介绍一下<这些命令以后会用到。分别先介绍一下@ 表示目标文件的完整名称 如上述main main.o name.o age.o等

表示所有不重复的依赖包名称以空格隔开如上述main.omain.c分别可以做依赖包、因为依赖和被依赖仅仅是方向不一样。其实是可以转化的。当然上述还可以写成。表示所有不重复的依赖包名称以空格隔开如上述main.omain.c分别可以做依赖包、因为依赖和被依赖仅仅是方向不一样。其实是可以转化的。当然上述还可以写成。(CC) -c OBJS−omain.oOBJS−omain.o<表示第一个依赖包名称

Ps.上述仅仅是Makefile 最基本的使用,在内核里完全是另外一回事,但是基本语法是一样的!

*下一节我们就开始内核的Makefile以及其它编译规则的分析*

全面解析Linux 内核 3.10.x - 如何开始的更多相关文章

  1. Linux 内核3.10.5 专场

    今天本人十分靠谱地下载了linux 内核的3.10.5版本,这个版本是最新的稳定版. 听路飞大虾(哪个路飞?就是那个戴草帽的橡胶小伙,航海很多时候都很空闲的,于是最近他也开始研读linux 内核了.) ...

  2. 解析 Linux 内核可装载模块的版本检查机制

    转自:http://www.ibm.com/developerworks/cn/linux/l-cn-kernelmodules/ 为保持 Linux 内核的稳定与可持续发展,内核在发展过程中引进了可 ...

  3. 深入解析Linux内核I/O剖析(open,write实现)

    Linux内核将一切视为文件,那么Linux的文件是什么呢?其既可以是事实上的真正的物理文件,也可以是设备.管道,甚至还可以是一块内存.狭义的文件是指文件系统中的物理文件,而广义的文件则可以是Linu ...

  4. 解析Linux内核的基本的模块管理与时间管理操作---超时处理【转】

    转自:http://www.jb51.net/article/79960.htm 这篇文章主要介绍了Linux内核的基本的模块管理与时间管理操作,包括模块加载卸载函数的使用和定时器的用法等知识,需要的 ...

  5. 深入解析Linux内核及其相关架构的依赖关系

    Linux kernel 成功的两个原因: 灵活的架构设计使得大量的志愿开发者能够很容易加入到开发过程中:每个子系统(尤其是那些需要改进的)都具备良好的可扩展性.正是这两个原因使得Linux kern ...

  6. mysql 5.7.15 vs mysql 5.6.31性能测试以及不同linux内核性能比较

    最近,将部分开发和测试环境的mysql升级到5.7之后,今天抽时间测试了下5.6和5.7 PK查询的性能,使用mysqlslap进行测试,测试结果发现在低配下,percona 5.6.31大约比5.7 ...

  7. linux内核获取当前进程路径分析

    一个简单的问题,·linux下获取当前进程.我们都知道在内核中获取当前进程可以利用current宏 #define get_current() (current_thread_info()->t ...

  8. 基于tiny4412的Linux内核移植 --- aliases节点解析

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  9. Linux内核:sk_buff解析

    sk_buff 目录 1 sk_buff介绍 2 sk_buff组成 3 struct sk_buff 结构体 4 sk_buff成员变量 4.1 Layout布局 4.2 General通用 4.3 ...

随机推荐

  1. Linux 完整的修改用户名,用户组的方法记录

    今天将虚拟机内所有的用户都是统一规划自己的名字,方便识别操作,特记录相关修改Linux 用户名以及修改用户组的方法 第一种方式,直接改相关文件: /etc/passwd 如图所示,改为自己想用户名,描 ...

  2. BloomFilter——大规模数据处理利器[转]

    原文链接:原文 Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合. 一. 实 ...

  3. JAVA 监控工具 VisualVM 插件路径配置地址

    在使用VisualVM监控工具的时候,发现无法安装或者更新插件,或者报错,最后发现原来是插件中心的URL地址原装地址就不对.根据官方网站的地址配置后就正常了.下面的具体地址. VisualVMRele ...

  4. java- Servlet-session

    Servlet 相关:http://blog.csdn.net/ggGavin/article/category/2134213 Servlet——Session(1)之基础知识 Servlet——S ...

  5. ubuntu 12.04 rails server 时候报错 execjs

    新的应用创建好了,使用rails server启动看看,oops!原来是没有javascript运行环境. 1 2 $ rails server  /usr/local/lib/ruby/gems/1 ...

  6. python中的argsort函数

    >>> import numpy >>> help(numpy.argsort) Help on function argsort in module numpy. ...

  7. IoC最大的好处是什么?

    IoC最大的好处是什么?因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拨(有 ...

  8. e667. 在给定图像中创建缓冲图像

    An Image object cannot be converted to a BufferedImage object. The closest equivalent is to create a ...

  9. JavaScript 学习笔记(三)

    本章学习内容: 1.数组的使用 2.类和对象细节. 3.this关键字的使用 4.构造函数,成员函数的使用 1.数组的使用   在任何的语言中,必须要有的就是数组了,有了数组,使得很多操作都变得非常的 ...

  10. (转)Tiny210v2( S5PV210 ) 平台下 FIMD 对应 的 framebuffer 驱动中,关于 video buffer 的理解

    原文:http://www.arm9home.net/read.php?tid-25938.html 管理提醒: 本帖被 xoom 执行加亮操作(2012-12-13) 如之前所说,一直想知道显示数据 ...