当今,我们身边如此多的服务器,工作站都运行着linux,因此也有不少的朋友想了解linux内的核心机理。但是由于kernel过于庞大,以致让一些朋友望而却步。(我在大二的时候也有过此经历,当时看到一些人在看kernel,自己也想进去一探究竟,但进去没多久就乱了头绪,从而转去看uboot源码)。今天我就以我个人的视角来展示kernel的结构图(先申明下,这里并不是讲目录结构图的,因为从目录的名字就知道里面放的是何种文件,我如果讲目录结构的话,相信很多同学会开挂骂我了),以及kernel是如何生成的,以给大家作为一种小借鉴吧!(在这以arm为例子            Linux kernel并不是一个何方神圣,说简单点的话,它无非是一个源码树组织而成的一个大的源代码,通过编译器编译后的一个可执行文件。既然是由一个源码树过来的,那么我们就进入源码树去一探究竟吧!(在此我给大家推荐一本我感觉比较好的书吧,书名:《Embedded.Linux.Primer》,建议大家看英文原版的,用中文翻译过来的书里面,有些内容虽然不能说它写错了,但它也没有把明确的作者意思完完全全的表达出来,让人看起来别扭,作为IT领域的人,我们也应该多看看英文资料!)

             要想了解kernel的整体结构,我建议大家最好有关于makefile的知识,因为像kernel这些庞大的工程用makefile来管理,控制整个编译过程很方便的。其实如果对makefile非常熟悉的话,可以完全无视此博文,直接看makefile就能全然得知整个kernel源码树结构。因此先学下makefile的相关知识为好,因为自己掌握了
makefile之后,就不用信赖他人了,不用别人说是这样你就跟着以为是这样,没准人家说错了呢。有适合多处好的方法总比只学一处的好,就比如C++里的类中
的方法一样,所有对象可以共用一个方法,但每个对象的属性值各不相同(感觉这个比喻不合理,先这样吧,意会一下就行)。
              下面我们进入kernel的主目录,可以看到有下面的内容:
arch .config crypto firmware .gitignore ipc kernel MAINTAINERS net samples sound virt
block COPYING Documentation fs include Kbuild lib Makefile README scripts tools
certs CREDITS drivers .get_maintainer.ignore init Kconfig .mailmap mm REPORTING-BUGS security usr
(我这是最近下载的linux-4.4-rc4的版本,其它版本的主目录也基本一样,其中。config是我用make menuconfig生成的一个配置文件)。既然makefile是管理整个工程的,那我们第二个要看的当然是Makefile了(哈哈,第一个要看的当然是README了,养成这个好习惯),在Makefile中的起始我们就能看到:
  8 # To see a list of typical targets execute "make help"
  9 # More info can be located in ./README
  没错,看下Makefile当中的help:

1244 help:
1245 @echo 'Cleaning targets:'
1246 @echo ' clean - Remove most generated files but keep the config and'
1247 @echo ' enough build support to build external modules'
1248 @echo ' mrproper - Remove all generated files + config + various backup files'
1249 @echo ' distclean - mrproper + remove editor backup and patch files'
1250 @echo ''
1251 @echo 'Configuration targets:'
1252 @$(MAKE) -f $(srctree)/scripts/kconfig/Makefile help
1253 @echo ''
1254 @echo 'Other generic targets:'
1255 @echo ' all - Build all targets marked with [*]'
1256 @echo '* vmlinux - Build the bare kernel'
1257 @echo '* modules - Build all modules'
1258 @echo ' modules_install - Install all modules to INSTALL_MOD_PATH (default: /)'
1259 @echo ' firmware_install- Install all firmware to INSTALL_FW_PATH'
1260 @echo ' (default: $$(INSTALL_MOD_PATH)/lib/firmware)'
1261 @echo ' dir/ - Build all files in dir and below'
1262 @echo ' dir/file.[oisS] - Build specified target only'

  .
  .
  .

  比较多行就不全部罗列出来了,可以看到用make menuconfig来生成一个指示工程编译的配置文件.config。致于这个界面是如何产生的,然后又如何生成.config的,我还是说一下吧:还是看Makefile:
527 config: scripts_basic outputmakefile FORCE
528 $(Q)$(MAKE) $(build)=scripts/kconfig $@
529
530 %config: scripts_basic outputmakefile FORCE
531 $(Q)$(MAKE) $(build)=scripts/kconfig $@
  对,是通过.../scripts/kconfig这个脚本来产生的(...代表源码树主目录)。大家会发现主目录下的子目录里都有一个Kconfig,它就是用于给menuconfig来配
置编译信息的。既然这通过它来达到间接配置编译相关指示信息的,那就看看.../Kconfig:
mainmenu "Linux/$ARCH $KERNELVERSION Kernel Configuration"

config SRCARCH
string
option env="SRCARCH"

source "arch/$SRCARCH/Kconfig"
看到source后就进去看.../arch/$SRCARCH/Kconfig文件吧,它会把源码树中的所有要用到的Kconfig全包含进来。包含进来了哪些,大家看Kconfig吧,有好几百
个呢。

    上面说了这么多的看似不重要的东西,其实在我看来它们是最要注意的,因为如果连主体结构都不熟悉的话,那你看源码会是一团乱麻,更别提后续修改以及裁剪kernel了。熟悉了整个结构之后,你就知道去哪查看,修改,添加代码。    上面是基于makefile,kconfig来说明是通过什么方法来组织这个庞大的kernel,并达到方便用户进行自主配置编译信息等内容的。下面就说说kernel的生成吧。

既然kernel是操作系统的核心部分,通常的操作系统还都有文件系统等其它部件,这里主要说kernel,文件系统那些就先不提了(况且博主我也还没开始学它呢,大神
看到了的话望提供点学习文件系统的建议哟).好的,开始一起谈论kernel吧,既然kernel在全世界如此火爆,和我们形影不离,android,linux各种发行版的操作系统
以及形形色色的servers都在用它,肯定有它特有的功能的。有一点必须明确:一台计算机刚加电启动时运行的并不是kernel,而是bootloader(pc机上通常叫BIOS),bootloader(bios)启动后,再把cpu的执行权传给kernel,kernel得到执行权后再进行一系列初始化,接着挂载根文件系统(root file system),执行一些脚本(scripts,比如你们linux系统下的/etc/init.d,/etc/cron*等这些)来启动一些系统进程(比如用户login程序,以太网初始化等)。既然kernel的执行是位于bootloader(BIOS)之后,那么它是怎么来接管bootloader(BIOS)的执行权呢?进入.../arch/arm/boot/compressed/目录下,看到了一个链接文件了没,名叫vmlinux.lds.S,对真正的kernel的二进制可执行文件vmlinux将会位于这(编译完内核可以看下),编译时你的终端会输出编译信息,通过查看这些信息你可以知道有哪些文件被编译进行内核中,一般会有下面这些:

arch/arm/kernel/head.o
arch/arm/kernel/init-atask.o
init
usr/built-in.o
arch/arm/kernel
arch/arm/mm
arch/arm/common
arch/arm/mach-ixp4xx
arch/arm/nwfpe
kernel
mm
fs
ipc
security
lib/lib.a
arch/arm/lib
lib
drivers
net

接着上面讲kernel在哪接管CPU的执行权的问题,也就是说kernel真正意义上的第一行代码到底在哪,注意:由于kernel是多平台的内核,所以这里讲和真正意义上的

第一行代码是去除了它之前的特定架构特定处理器的初始代码之后的首行代码。kernel真正的第一行代码是位于.../arch/$(SUBARCH)/kernel/head.S,在这里kernel会检测有效的architecture和processor,建立起初始页表入口,同时会使能MMU,然后真正起动kernel本身(跳转到.../init/main.c),说到这个main.c文件,这个文件是我们必须要好好看,好好理解它,通过它来慢慢切入到kernel当中,做到深度理解传说中的kernel。           之前不是一直强调kernel真正意义下的第一行代码吗,下面就来说说为什么吧,由于不同的处理器,一些处理器得先通过相应处理之后才能把CPU执行权交给kernel, 因此不同的架构下,它们还有不同的head.S(位于.../arch/$(SUBARCH)/boot/compressed/),比如power pc下有:head_32.S,head_40x.S,head_44x.S等。bootloader通过这些汇编程序再这把控制权交给kernel,在这的特定架构处理器的head.S程序会对processor进行一些处理,比如进行关中断,使能processor的指令缓存和数据缓存,建立起一个适合C代码运行的环境。大家也可以这样理解,把.../arch/$(SUBARCH)/kernel/head.S之前的操作看作第二个bootloader,它还可以对kernel进行校验,执行kernel的解压(在.../arch/$(SUBARCH)/boot/misc.c中实现此功能,函数为decompress_kernel),和kernel在内存中的重定位。不过有一些架构的处理器可以直接引导kernel,不必进行上面这些过程操作。

    第一篇关于kernel的博文就到这里吧,高手们欢迎提出好的建议,以及错误究正,共同学习进步,都凌晨了,大家下回见!

浅谈kernel的结构图及生成过程-----(1)的更多相关文章

  1. 浅谈大型web系统架构

    动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应用系统通常与数据库系统. ...

  2. 浅谈 Linux 内核无线子系统

    浅谈 Linux 内核无线子系统 本文目录 1. 全局概览 2. 模块间接口 3. 数据路径与管理路径 4. 数据包是如何被发送? 5. 谈谈管理路径 6. 数据包又是如何被接收? 7. 总结一下 L ...

  3. 【架构】浅谈web网站架构演变过程

    浅谈web网站架构演变过程   前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变.   该系统具备的功能:   用户模块:用户注册和管理 商品模块:商品展示和管 ...

  4. 浅谈B+树索引的分裂优化(转)

    http://www.tamabc.com/article/85038.html 从MySQL Bug#67718浅谈B+树索引的分裂优化   原文链接:http://hedengcheng.com/ ...

  5. 转:浅谈大型web系统架构

    浅谈大型web系统架构 动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应 ...

  6. 浅谈一下SSI+Oracle框架的整合搭建

    浅谈一下SSI+Oracle框架的整合搭建 最近换了一家公司,公司几乎所有的项目都采用的是Struts2+Spring+Ibatis+Oracle的架构,上一个东家一般用的就是JSF+Spring,所 ...

  7. Js之浅谈dom操作

    JavaScript之浅谈dom操作 1.理解dom: DOM(Document Object Model ,文档对象模型)一种独立于语言,用于操作xml,html文档的应用编程接口. 怎么说,我从两 ...

  8. 浅谈Java线程安全

    浅谈Java线程安全 - - 2019-04-25    17:37:28 线程安全 Java中的线程安全 按照线程安全的安全程序由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类 ...

  9. 浅谈分词算法(5)基于字的分词方法(bi-LSTM)

    目录 前言 目录 循环神经网络 基于LSTM的分词 Embedding 数据预处理 模型 如何添加用户词典 前言 很早便规划的浅谈分词算法,总共分为了五个部分,想聊聊自己在各种场景中使用到的分词方法做 ...

随机推荐

  1. js权威指南

    有很多js的细节基础不太了解,希望能通过阅读这本书查漏补缺!长期更新!

  2. Win10快捷键总结

    微软自发布Windows10以来,大部分的电脑系统都已更新.除了大量的新功能和界面改进,Windows 10中同样包含了一批新的键盘快捷键.熟练使用这些快捷键可以大大提高操作效率,很实用,推荐大家收藏 ...

  3. mac系统下配置域名映射关系

    1.cd /private/etc/ 先修改权限:sudo chmod 777 hosts vi hosts localhost:etc mhx$ cat hosts ## # Host Databa ...

  4. 实现静默安装APK的方法

    需要满足的条件: 内置到ROM.即APK包的安装位置是/system/app下. 下面以 test.apk 为例,演示这个操作.需要准备一台已经获得 Root 权限的手机. 1.通过 USB 连接手机 ...

  5. C++中class在实例化前到底占用多少空间

    最近忽然想起一个问题,C++中class在实例化前到底占用多少空间?我隐约记得书上是这么说的“类在实例化时才分配空间”!但是当我写下这个小程序的时候,杯具产生了—— #include<iostr ...

  6. C# 混淆 反编译

    .net破解一(反编译,反混淆-剥壳) http://www.cnblogs.com/jio92/p/de4dot.html C#学习系列-String与string的区别 http://www.cn ...

  7. E20180309-hm-xa

    conformance   n. 顺应,一致; symmetric   adj. 相称性的,均衡的; raw  adj. 生的,未加工的; 无经验的; 新近完成的; 发炎的,疼痛的; exceed  ...

  8. bzoj 1040: [ZJOI2008]骑士【基环树+树形dp】

    没考虑可以连着两个不选--直接染色了 实际上是基环森林,对于每棵基环树,dfs找出一个环边,然后断掉这条边,分别对这条边的两端点做一边treedp,取max加进答案里 treedp是设f[u]为选u点 ...

  9. 洛谷P3261 [JLOI2015]城池攻占(左偏树)

    传送门 每一个城市代表的点开一个小根堆,把每一个骑士合并到它开始攻占的城池所代表的点上 然后开始dfs,每一次把子树里那些还活着的骑士合并上来 然后再考虑当前点的堆,一直pop直到骑士全死光或者剩下的 ...

  10. 爬虫—Selenium爬取JD商品信息

    一,抓取分析 本次目标是爬取京东商品信息,包括商品的图片,名称,价格,评价人数,店铺名称.抓取入口就是京东的搜索页面,这个链接可以通过直接构造参数访问https://search.jd.com/Sea ...