注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

易拉罐的博客

心静自然凉

 
 
 

日志

 
 

转 Linux内核  

2014-11-21 14:05:32|  分类: 嵌入式系统 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Linux内核是整个Linux系统的灵魂,Linux内核负责整个系统的内存管理,进程调度和文件管理。Linux内核的容量并不大,并且大小可以裁减,这个特性对于嵌入式是非常有好处的。一般一个功能比较全面的内核也不会超过1M。合理的配置Linux内核是嵌入式开发中很重要的一步,对内核的充分了解是嵌入式Linux开发的基本功。

简单介绍一下内核功能的划分,Linux内核的功能大致分成如下几个部分:
1.进程调度:精度调度控制系统中的多个进程对CPU的访问使得多个进程能在CPU微观观串行,宏观并行地执行。进程调度处于系统的中心位置,内核中其他的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。
2.内存管理:内存是计算机的主要资源之一,用来管理内存的策略是决定系统性能的一个关键因素。内存管理的主要作用是控制多个进程安全地共享主内存区域。当CPU提供内存管理单元(MMU)时,Linux内存管理完成为每个进程进行虚拟内存到屋里内存的转换。Linux2.6引入了对无MMU CPU的支持进程管理:进程管理功能负责创建和撤销进程以及处理他们和外部世界的连接。不同进程之间的通信是整个系统的基本功能,因此也由内核处理。除此之外,控制进程如何共享CPU资源的调度程序也是进程管理的一部分。概括的说,内核的进程管理活动就是在单个或多个CPU上实现多进程的抽象。
3.虚拟文件系统:Linux在很大程度上依赖于文件系统的概念,Linux中的每个对象几乎都是可以被视为文件的。Linux虚拟文件系统(VFS)隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口。而且,它独立于各个具体的文件系统,是对各种文件系统的一个抽象,它使用超级模块super block存放文件系统相关信息,使用索引节点inode存放文件系统的物理信息,使用目录项dentry存放文件的逻辑信息。
4.网络接口:网络接口提供了对各种网络的标准的存取和各宗网络硬件的支持。网络接口可分为网络协议和网络驱动程序,网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备进行通信,每一种可能的硬件设备都有相应的设备驱动程序。
5.进程通信:Linux支持进程间多种通信机制,包含信号量、共享内存、管道等,这些机制可协助多个进程、多资源的互斥访问、进程间的同步和消息传递。

LINUX内核
一、内核简介
内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src/linux下找到,大部分应用软件也都是遵循GPL而设计的,你都可以获取相应的源程序代码。全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。而Linux的内核则是这些特点的最直接的代表。
想象一下,拥有了内核的源程序对你来说意味着什么?首先,我们可以了解系统是如何工作的。通过通读源代码,我们就可以了解系统的工作原理,这在Windows下简直是天方夜谭。其次,我们可以针对自己的情况,量体裁衣,定制适合自己的系统,这样就需要重新编译内核。在Windows下是什么情况呢?相信很多人都被越来越庞大的Windows整得莫名其妙过。再次,我们可以对内核进行修改,以符合自己的需要。这意味着什么?没错,相当于自己开发了一个操作系统,但是大部分的工作已经做好了,你所要做的就是要增加并实现自己需要的功能。在Windows下,除非你是微软的核心技术人员,否则就不用痴心妄想了。
内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬体的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬体操作多长时间。直接对硬体操作是非常覆杂的,所以内核通常提供一种硬体抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。

二、内核版本号
由于Linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布给他人使用。Linux的开发采用的是集市模型(bazaar,与cathedral--教堂模型--对应),
为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。一个树是稳定树(stable tree),另一个树是非稳定(unstable tree)或者开发树(developmenttree)。一些新特性、实验性改进等都将首先在开发树中进行。如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。一旦开发树经过了足够的发展,开发树就会成为新的稳定树。开发数就体现在源程序的版本号中;源程序版本号的形式为x.y.z:对于稳定树来说,y是偶数;对于开发树来说,y比相应的稳定树大一(因此,是奇数)。到目前为止最高版本是3.2;我们所使用版本是2.6.32。下载内核版本请访问http://www.kernel.org/

三、为什么重新编译内核
Linu x作为一个自由软件,在广大爱好者的支持下,内核版本不细隆P碌哪诤诵薅┝司赡诤说腷ug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、 更稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是Linux使用者的必要操作内容。为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑:
1、 定制编译的内核运行更快(具有更少的代码)
2、 系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)
3、 不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞以及内核体积
4、 将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些

四、内核编译模式
要增加对某部分功能的支持,比如网络之类,可以把相应部分编译到内核中(build-in),也可以把该部分编译成模块(module),动态调用。如果编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,你就可以使用这部分功能了;缺点是会使内核变得庞大起来,不管你是否需要这部分功能,它都会存在,这就是Windows惯用的招数,建议经常使用的部分直接编译到内核中,比如网卡。如果编译成模块,就会生成对应的.ko文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是你得自己来调用这些模块。

内核源代码目录介绍 Linux内核源代码可以从网上下载,一般主机平台的Linux (如Ubuntu Linux)源代码在根目录下的/usr/src/linux-x-x目录下。内核源代码的文件按树形结构进行组织的,在源代码树最上层的主要可以看到如下的一些目录:
(1)、arch:arch子目录包括所有与体系结构相关的内核代码。arch的每一个子目录都代表一个Linux所支持的体系结构。
(2)、include:include子目录包括编译内核所需要的头文件。与ARM相关的头文件在include/asm-arm子目录下。
(3)、init:这个目录包含内核的初始化代码,但不是系统的引导代码,其中所包含main.c和Version.c文件是研究Linux内核的起点。
(4)、mm:该目录包含所有独立于CPU体系结构的内存管理代码,如页式存储管理内存的分配和释放等。与ARM体系结构相关的代码在arch/arm/mm中。
(5)、Kernel:这里包括主要的内核代码,此目录下的文件实现大多数Linux的内核函数,其中最重要的文件是sched.c。与Xscale体系结构相关的代码在arch/arm-pxa/kernel目录中。
(6)、Drives:此目录存放系统所有的设备驱动程序,每种驱动程序各占一个子目录。
(a)、/block:块设备驱动程序。块设备包括IDE和scsi设备。
(b)、/char:字符设备驱动程序。如串口、鼠标等。
(c)、/cdrom:包含Linux所有的CD-ROM代码。
(d)、/pci:PCI卡驱动程序代码,包含PCI子系统映射和初始化代码等。
(e)、/scsi:包含所有的SCSI代码以及Linux所支持的所有的SCSI设备驱动程序代码. (f)、/net:网络设备驱动程序。
(g)、/sound:声卡设备驱动程序。
(7)、lib目录放置内核的库代码;
(8)、net目录包含内核与网络的相关的代码;
(9)、ipc目录包含内核进程通信的代码;
(10)、fs目录是所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统,如JFFS2; (11)、scripts目录包含用于配置内核的脚本文件等。每个目录下一般都有depend文件和一个makefile文件,他们是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件之间的相互依托关系很有帮助。

内核配置的基本结构
Linux内核的配置系统由四个部分组成
(1)、Makefile:分布在Linux内核源码中的Makefile,定义Linux内核的编译规则;顶层Makefile是整个内核配置、编译的总体控制文件;
(2)、配置文件(Kconfig:):内核配置文件,给用户提供配置选择的功能;包括由用户选择的配置选项,用来存放内核配置后的结果;
(3)、配置工具:包括对配置脚本中使用的配置命令进行解释的配置命令解释器和配置用户界面(基于字符界面:make config;基于Ncurses图形界面:make menuconfig;基于xWindows图形界面:make xconfig)
(4)、Rules.make:规则文件,被所有的Makefile使用。
编译规则Makefile 利用 make menuconfig(或make config、make xconfig)对Linux内核进行配置后,系统将产生配置文件(.config)。在编译时,顶层 Makefile 将读取 .config 中的配置选择。
顶层 Makefile完成产生核心文件(vmlinux )和内核模块(module)两个任务,为了达到此目的,顶层 Makefile 递归进入到内核的各个子目录中,分别调用位于这些子目录中的 Makefile,然后进行编译。至于到底进入哪些子目录,取决于内核的配置。顶层Makefile中的include arch/$(ARCH)/Makefile指定特定 CPU 体系结构下的 Makefile,这个Makefile包含了特定平台相关的信息。
各个子目录下的 Makefile 同样也根据 配置文件(.config)给出的配置信息,构造出当前配置下需要的源文件列表,并在文件最后有 include $(TOPDIR)/Rules.make。
顶层 Makefile 定义并向环境中输出了许多变量,为各个子目录下的 Makefile 传递一些变量信息。有些变量,比如 SUBDIRS,不仅在顶层 Makefile 中定义并且赋初值,而且在 arch/*/Makefile 还作了扩充。

内核代码树介绍
linux-2.6.32
|-arch : 包含和硬件体系结构相关的代码
|-block : 硬盘调度算法,不是驱动
|-firmware : 固件,如BOIS
|-Documentation: 标准官方文档
|-dirver : linux设备驱动
|-fs : 内核所支持的文件体系
|-include :头文件。linux/module.h linux/init.h 常用库。
|-init :库文件代码,C库函数在内核中的实现。
init/main.c ->start_kernel->内核执行第一条代码
|-ipc : 进程件通信
|-mm :内存管理
|-kernel : 内核核心部分,包括进程调度等
|-net :网络协议
|-sound : 所有音频相关
其中,跟设备驱动有关并且经常查阅的文件夹有:
init
include : linux, asm-arm
drivers:
arch:






  评论这张
 
阅读(169)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017