22齐天宇Linux作业.docx
- 文档编号:7247195
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:6
- 大小:42.78KB
22齐天宇Linux作业.docx
《22齐天宇Linux作业.docx》由会员分享,可在线阅读,更多相关《22齐天宇Linux作业.docx(6页珍藏版)》请在冰豆网上搜索。
22齐天宇Linux作业
Linux内核分析大作业
Linux内核的发展与结构
姓名
:
齐天宇
学号:
:
2009201222
摘要
操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集得支撑软件。
在Linux的术语中被称为“内核”,也可以称为核心。
Linux内核的主要模块主要有存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的引导、系统调用等。
Linux内核及代码是高级程序员的必会课程之一,学习Linux内核不仅能帮我们了解Linux是怎么运作的,便于我们编写程序的时候考虑到操作系统的执行情况,还能够开拓我们的编程思路。
为了更好的了解Linux的内核,本文从Linux内核的背景概念、内核模块、发展、内核编译方面进行介绍。
关键词:
Linux内核;操作系统;发展
目录
1.绪论1
2.Linux内核的发展历史1
3.Linux的模块机制3
3.1模块的概念3
3.2内核的作用4
3.2.1进程管理4
3.2.2内存管理4
3.2.3文件系统4
3.2.4设备控制5
3.2.5网络5
3.3Linux内核的模块结构5
结论8
参考文献9
1.绪论
在IT术语中,内核既是操作系统的心脏,也是它的大脑,因为内核控制着基本的硬件。
内核是操作系统的核心,具有很多最基本功能,如虚拟内存、多任务、共享库、需求加载、共享的写时拷贝(copy-on-write)可执行程序和TCP/IP网络功能。
2.Linux内核的发展历史
Linux内核的起源可追溯到1991年芬兰大学生LinusTorvalds编写和第一次公布Linux的日子。
尽管到目前为止Linux生态系统早已远远发展到了Torvalds本人之外的范围,但Torvalds仍保持着对Linux内核的控制权,并且是Linux名称的唯一版权所有人。
自发布Linux0.12版起,Linux就一直依照GPL(通用公共许可协议)自由软件许可协议进行授权。
Linux快速从一个个人项目进化成为一个全球数千人参与的开发项目。
对于Linux来说,最为重要的决策之一是采用GPL(GNUGeneralPublicLicense)。
在GPL保护之下,Linux内核可以防止商业使用,并且它还从GNU项目(RichardStallman开发,其源代码要比Linux内核大得多)的用户空间开发受益。
这允许使用一些非常有用的应用程序,例如GCC(GNUCompilerCollection和各种shell支持。
尽管Linux绝对是最流行的开源操作系统,但是相对于其他操作系统的漫长历史来说,Linux的历史非常短暂。
在计算机出现早期,程序员是使用硬件语言在裸硬件上进行开发的。
缺少操作系统就意味着在某个时间只有一个应用程序(和一个用户)可以使用这些庞大而又昂贵的设备。
早期的操作系统是在20世纪50年代开发的,用来提供简单的开发体验。
包括为IBM701开发的GeneralMotorsOperatingSystem(GMOS)和NorthAmericanAviation为IBM709开发的FORTRANMonitorSystem(FMS)。
在20世纪60年代,MIT(MassachusettsInstituteofTechnology)和一些公司为GE-645开发了一个名为Multics(MultiplexedInformationandComputingService)的实验性的操作系统。
这个操作系统的开发者之一AT&T后来退出了Multics,并在1970年开发了自己的名为Unics的操作系统。
与这个操作系统一同诞生的是C语言,C语言就是为此而开发的,然后它们使用C语言对操作系统进行了重写,使操作系统开发具有可移植性。
二十年后,AndrewTanenbaum创建了一个微内核版本的UNIX®,名为MINIX(代表minimalUNIX),它可以在小型的个人计算机上运行。
这个开源操作系统在20世纪90年代激发了LinusTorvalds开发Linux的灵感。
主要Linux内核发行版简史如下图所示:
Linux内核可以进一步划分成3层。
最上面是系统调用接口,它实现了一些基本的功能,例如read和write。
系统调用接口之下是内核代码,可以更精确地定义为独立于体系结构的内核代码。
这些代码是Linux所支持的所有处理器体系结构所通用的。
在这些代码之下是依赖于体系结构的代码,构成了通常称为BSP(BoardSupportPackage)的部分。
这些代码用作给定体系结构的处理器和特定于平台的代码。
Linux内核本身并不是操作系统,它是一个完整操作系统的组成部分。
RedHat、Novell、Debian和Gentoo等Linux发行商都采用Linux内核,然后加入更多的工具、库和应用程序来构建一个完整的操作系统。
3.Linux的模块机制
由于内核中的各部件联系紧密,因此这种内核最重要的特点就是运行效率较高。
但也就是由于内核中各部件联系紧密,也给它带来了一个致命的缺点:
当因某种原因需要增加、扩充时,用户必须对内核全部重新编译一次。
所以,为了弥补这个缺点,Linux建立了模块机制。
3.1模块的概念
什么是模块?
从代码的特征上来看,模块就是可完成一项独立功能的一组函数的集合。
从使用特征上来看,它在被需要时可以随时被安装,而在不需要时又可以随时被卸载。
总之,模块是一个为内核(从某种意义上来说,内核也是一个模块)或其他内核模块提供使用功能的代码块。
从内核的角度来看,模块由在运行时可连接并删除的、包含了至少2个函数的代码段。
这个代码段一旦被连接到内核,它就可以是内核的一部分,所以它也被叫做内核模块。
在Linux系统中,若干并发进程会参加不同的任务。
每个进程都要求获得系统资源,可以是计算、内存、网络连接或别的资源。
内核是一整块可执行代码,用它来负责处理所以这样的请求。
尽管在不同的内核任务之间的区别不是总能清楚地标识出来,内核的作用还是可以划分的。
3.2内核的作用
3.2.1进程管理
内核负责创建和终止进程,并且处理它们和外部世界的联系(输入和输出)。
对整个系统功能来讲,不同进程之间的通信(通过信号、管道、进程间通信原语)是基本的,这也是由内核来处理的。
另外,调度器,可能是整个操作系统中最关键的例程,是进程管理中的一部分。
更广义的说,内核的进程管理活动实现了在一个CPU上多个进程的抽象概念。
3.2.2内存管理
计算机内存是主要资源,而使用内存的策略是影响整个系统性能的关键。
内核为每个进程在有限可利用的资源上建立了虚拟地址空间。
内核不同部分通过一组函数与内存管理子系统交互,这些包括从简单的malloc/free到更稀奇古怪的功能。
3.2.3文件系统
Unix系统是建立在文件系统这个概念上的。
Unix里几乎所有东西都可以看作文件。
内核在非结构的硬件上建立了结构化的文件系统,这个抽象的文件被系统广泛应用。
另外,Linux支持多文件系统类型,即物理介质上对数据的不同组织方法。
3.2.4设备控制
几乎每种系统操作最后都要影射到物理设备上。
除了处理器、内存和少数其他实体外,几乎所有设备的控制操作都由设备相关的代码来实现。
这些代码就是设备驱动程序。
内核必须为每个外部设备嵌入设备驱动程序,从硬盘驱动器到键盘和磁带。
3.2.5网络
网络必须由操作系统来管理,由于大多数网络操作不是针对于进程的:
接收数据包是异步事件。
数据包必须在进程处理它们以前就被收集,确认和分发。
系统通过程序和网络接口发送数据包,并且应该可以正确地让程序睡眠,并唤醒等待网络数据的进程。
另外,所有路由和地址解析问题都是在内核里实现的。
3.3Linux内核的模块结构
Linux的一个很好的特性就是,它可以在运行的时候扩展内核代码,也就是说在系统运行的时候你可以增加系统的功能。
每个可以增加到内核中的代码称为一个模块。
Linux内核支持相当多的模块类型(或“类”),但不仅仅只局限于设备驱动程序。
每个模块由目标代码组成(没有连接成完整的可执行文件),通过insmod程序它们可以动态连接到运行着的内核中,而通过rmmod程序就可以去除这些模块。
从用户的角度来看,模块是内核的一个外挂的配件:
需要时可将其挂接到内核上,以完成用户昕要求的任务:
不需要时即可将其删除。
它给用户提供了扩充内核功能的手段。
那我们下面来看看Linux内核模块结构。
1.模块加载函数:
module_init(initialization_funciton);
2.模块卸载函数:
module_exit(cleanup_function);
3.模块参数:
module_param(参数名,参数类型,参数读/写权限)
在模块插入时:
insmod模块名参数名=参数值
eg:
staticchar*book_name="Linux设备驱动";
staticintnum=4000;
module_param(num,int,S_IRUGO);
module_param(book_neme,charp,S_IRUGO);
参数类型:
byte,short,ushort,intuint,long,ulong,charp(字符指针),bool,
4.导出符号(建议有)
EXPORT_SYMBOL(符号名/函数名)
EXPORT_SYMBOL_GPL(符号名/函数命)
5.模块声明
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("XXXXX");
MODULE_DESCRIPTION("XXXXXDRIVER");
MODULE_VERSION("XXXXVERSION");
MODULE_DEVICE_TABLE(TABLE_INFO);
MODULE_ALISA(XXXXXXX);
6.驱动模块的编译
开发好的模块程序可以和内核一起编译,也就是将模块编译进内核,也可以将模块单独编译成一个独立的模块。
为了开发的方便性,我们把驱动程序编译成模块,怎么编译呢?
编译成什么格式呢?
在Linux中我们都是借助顶级目录的Makefile来编译我们写的驱动程序,我可以自己写一个Makefile来编译我们写的驱动:
eg:
obj-m:
=xxx.o
xxx.o-objs:
=xxx1.oxxx2.o
make-C"Linux源码顶级Makefiel路径"M=‘pwd’modules
clean:
rm-rf*.o
在讨论大型而复杂的系统的体系结构时,可以从很多角度来审视系统。
体系结构分析的一个目标是提供一种方法更好地理解源代码。
Linux内核实现了很多重要的体系结构属性。
在或高或低的层次上,内核被划分为多个子系统。
Linux也可以看作是一个整体,因为它会将所有这些基本服务都集成到内核中。
这与微内核的体系结构不同,后者会提供一些基本的服务,例如通信、I/O、内存和进程管理,更具体的服务都是插入到微内核层中的。
随着时间的流逝,Linux内核在内存和CPU使用方面具有较高的效率,并且非常稳定。
但是对于Linux来说,最为有趣的是在这种大小和复杂性的前提下,依然具有良好的可移植性。
Linux编译后可在大量处理器和具有不同体系结构约束和需求的平台上运行。
一个例子是Linux可以在一个具有内存管理单元(MMU)的处理器上运行,也可以在那些不提供MMU的处理器上运行。
Linux内核的uClinux移植提供了对非MMU的支持。
结论
学习Linux需要学习一些操作系统的理论知识,比如:
进程、线程、内存管理、设备管理等。
一定要记住一些常用的命令,这是学习Linux的基础,使用Linux系统命令时非常非常重要的。
Linux的内核空间和用户空间是分离开的,它们通过一些函数调用来交换数据,所以命令就显得格外重要了。
通过学习Linux,我知道了编写程序的时候需要考虑到操作系统的执行情况,这样开拓我们的编程思路,为以后的工作,学习有很大帮助。
参考文献
[1].陈丽君.Linux操作系统原理与应用.北京:
清华大学出版社,2006.1
[2].陈丽君.Linux操作系统内核分析.北京:
人民邮电出版社,2000
[3].王小英.Linux系统与应用.中国电力大学出版社,2009.1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 22 齐天 Linux 作业