linux文献
❶ linux系统中系统文件有什么特点
类似于 Windows下的C、D、E等各个盘,Linux系统也可以将磁盘、Flash等存储设备划分为若干个分区,在不同分区存放不同类别的文件。与Windows的C盘类似,Linux一样要在一个分区上存放系统启动所必需的文件,比如内核映象文件(在嵌入式系统中,内核一般单独存放在一个分区中)内核启动后运行的第一-个程序( init)给用户提供操作界面的 shell程序、应用程序所依赖的库等。这些必需、基本的文件合称为根文件系统,它们存放在一个分区中。Linux 系统启动后首先挂接这个分区,称为挂接( mount)根文件系统。其他分区上所有目录、文件的集合,也称为文件系统。Linux 中并没有C、D、E等盘符的概念,它以树状结构管理所有目录、文件,其他分区挂接在某个目录上,这个目录被称为挂接点或安装点(mount point),然后就可以通过这个目录来访问这个分区上的文件了。比如根文件系统被挂接在根目录“I”上后,在根目录下就有根文件系统的各个目录、文件:/bin、/sbin、/mnt等;再将其他分区挂接到/mnt目录上,/mnt目录下就有这个分区.的各个目录、文件。在一个分区上存储文件时,需要遵循一定的格式,这种格式称为文件系统类型,比如fat16、fat32、ntfs、ext2、ext3、jffs2、yaffs 等。除这些拥有实实在在的存储分区的文件系统类型外,Linux还有几种虚拟的文件系统类型,比如proc、sysfs 等,它们的文件并不存储在实际的设备上,而是在访问它们时由内核临时生成。比如 proc文件系统下的uptime文件,读取它时可以得到两个时间值(用来表示系统启动后运行的秒数、空闲的秒数),每次读取时都由内核即刻生成,每次读取结果都不一样。“文件系统类型”常被简称为“文件系统”,比如“硬盘第二个分区上的文件系统是EXT2”指的就是文件系统类型。所以“文件系统”这个术语,有时候指的是分区上的文件集合,有时候指的是文件系统类型,需要根据语境分辨,在阅读各类文献时需要注意这点。
❷ 请问对于Linux系统,有哪些相关领域可以作为毕业论文和毕业设计的
我可以帮你写的,很简单。
依据学术方向进行选题。论文写作的价值,关键在于能够解决特定行业的特定问题,特别是在学术方面的论文更是如此。因此,论文选择和提炼标题的技巧之一,就是依据学术价值进行选择提炼。
技巧二:依据兴趣爱好进行选题。论文选择和提炼标题的技巧之二,就是从作者的爱好和兴趣出发,只有选题符合作者兴趣和爱好,作者平日所积累的资料才能得以发挥效用,语言应用等方面也才能熟能生巧。
技巧三:依据掌握的文献资料进行选题。文献资料是支撑、充实论文的基础,同时更能体现论文所研究的方向和观点,因而,作者从现有文献资料出发,进行选题和提炼标题,即成为第三大技巧。
技巧四:从小从专进行选题。所谓从小从专,即是指软文撰稿者在进行选则和提炼标题时,要从专业出发,从小处入手进行突破,切记全而不专,大而空洞。
❸ Linux学什么
Linux作为Windows的有力竞争对手,近年来的发展速度令人瞠目结舌,特别是在服务器、桌面、行业定制等领域取得了引人注目的成果.那么,作为初学者,学习Linux的第一步是什么呢?Linux在学什么呢?下一位编辑分享整理的注意事项.
首先,你应该为自己创造一个学习Linux的环境上安装Linux或unix.如何选择版本:北美使用redhat,欧洲使用SuSE,桌面mandrake多,debian是技术最先进的Linux开发者中使用debian的最多,其次是redhat,从世界Linux各应用领域的市场份额来看,redhat确实是最多的.
对于初学Linux的人来说,我建议使用redhat.原因如下.
1)现在很多书都以redhat为例,为了与书协调2)周围的人使用redhat,交流方便3)redhat应用范围广,具有典型性和代表性4)使用方便,我们不必把时间浪费在安装系统上
从现在开始,不要以windows的工作方式考虑问题,应该挖掘Linux身体的天才unix气质.
前期工作准备好后,我们真的要打开Linux世界的大门.首先,你需要做的几件事:至少掌握50个以上的常用命令;理解shell管道“|”,文件重定向“>;“添加”>;”等;熟悉X-windows桌面环境操作;掌握tgz.rpm.biz等软件包的常用安装方法;学习添加外部设备,安装设备驱动程序(例如modem);熟悉Grub/Lilo导航器和简单的修复操作;熟悉系统固有目录的名称和公共设备;学习添加外部设备,安装设备驱动程序(例如modem);熟悉grub/Lilo导航器和简单的修复操作;熟悉系统固有目录的名称和公共设备;学习使用mount命令访问其他文件;了解编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑弊慧、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑老弊、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、侍卜族编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编辑、编
建议:购买不需要太厚的Linux教材,可以大致满足要求.
明确几个概念:Linux的普通操作不能与真正的系统管理相比,后者需要很多知识
1.英语:即使你不学Linux,我也强烈建议你学好英语[u.s.english].实质上,计算机语言是英语和文字,所谓多语言只是外部包装.无障碍地阅读大量的英语技术文件,在搜索引擎中找到的英语网站和网页上熟练的搜索,最好有能力用英语直接交流,摆脱这个障碍,学习和理解速度快,有机会打开和别人的差距.
2.shell[sed/awk]:shell是命令说明器,是核心与用户界面的交流通道,shell写的小脚本与win相似.bat但shell比.bat强大得多,shell不仅是说明命令,也是编程语言,有时数百行的c用shell几十行可以代替完成工作.因为shell的工作方式建立在系统中的许多应用程序上.这也是CS的重要思想.另外,shell可以实现工作自动化,这个概念也很重要,awk用于处理文本,一直很常用.
3.Perl/PHP:美丽的脚本,CGI优先,优于ASP,应用面广.
4.CC:C、C是Linux/unix的核心语言,系统代码是c写的.
5.ASM:需要系统的基础和核心、硬件、设备驱动程序、嵌入式开发.//走核心路线,cc、asm是最重要的.
6.Java、Python、Tcl、XML在熟悉Linux的基础上至少需要掌握一种unix.我第一次推进Solaris,其次是FreeBSD,例如运营级系统一般是Solarisoracle/DB2等学习apache、ssh、sendmail/Qmail、proftp/vsftp、Samba、Squid、MySQL/PostgreSQL/Oracle、Bind等各种应用服务器架构和电子商务应用熟悉TCP/IP协议族,学习如apachephept技术/PhphephtcreSQL/PhtgreSQL/OreSQL/Bacle、Bind等各种应用服务器架构和电子商务器架构
在此基础上掌握路由/交换设备是好的系统管理者.根据Linux的各种解决方案可以参考相关的书籍和文献,必要时可以在google和各大Linux站点内的搜索引擎中找到最新的文档,避免错误和漏洞的技术大全和技术内幕是这方面的好书.
我个人理解的Linux核心所需的基础:在此之前,希望先学习应用层的东西,这样才能理解.
1.c:如果学过潭浩强的大学教科书(数学模型好像什么也做不了),建议再看一遍这本圣经(如果想学习缓冲区溢出,c的功力可能不够,<;c陷阱和缺陷>;c专家编程>;,<;CC层深入探索>;不管怎样,经典书看起来很多都没有坏处.
2.asm(AT&;t语法、保护模式):保护模式下比较复杂,基本上每本核心书都有介绍80x86Intel语法的基础,有兴趣可以看到Intel的官方网站.
3.数据结构(离散数学):计算机专业的核心课程.
4.操作系统的原理:理解这个再读Linux吧.
5.微机原理/构成原理(数字回路):底层直接与硬件交往.
6.了解Linux/unix:了解unix的API
7.软件工程/编译原理
以上是小编整理的Linux学什么相关知识内容,希望对大家有所帮助.
❹ 嵌入式系统Linux内核开发实战指南的目录
第1部分 嵌入式系统硬件开发
第1章 嵌入式系统概述 2
这一章对嵌入式系统的概念及其特点和应用作了概括介绍,笔者根据自己多年的经验阐述了对嵌入式系统的理解,并对一些常见的嵌入式处理器的硬件数据进行了比较。
1.1 嵌入式系统概念 2
1.2 嵌入式处理器 3
1.3 嵌入式系统应用 4
1.4 嵌入式系统发展 4
1.5 一些嵌入式处理器的硬件特性比较 5
第2章 ARM处理器概述 16
为了使本书内容完整,从第2章到第7章中的内容大部分是笔者阅读《ARM体系结构与编程》(详情参见附录中的参考文献)的笔记和心得,把与嵌入式系统开发和Linux内核密切相关的硬件知识进行了概括和整理,本章主要介绍了ARM处理器的特点、ARM处理器的体系架构版本和ARM处理器系列。
2.1 ARM发展历程 16
2.2 ARM处理器特点 17
2.3 ARM处理器应用 17
2.4 ARM体系架构 18
2.4.1 ARM体系架构版本 18
2.4.2 ARM体系架构变种(Variant) 20
2.4.3 ARM体系架构版本命名格式 22
2.5 ARM处理器 22
2.5.1 ARM7系列处理器 23
2.5.2 ARM9系列处理器 24
2.5.3 ARM9E系列处理器 24
2.5.4 ARM10E系列处理器 25
2.5.5 SecurCore系列处理器 25
2.5.6 StrongARM处理器 26
2.5.7 Xscale处理器 26
第3章 ARM指令及其寻址方式 27
本章主要介绍了ARM处理器的指令和寻址方式以及ARM汇编伪指令,这是做ARM处理器应用系统底层软件开发必备的知识。
3.1 ARM处理器的程序状态寄存器(PSR) 27
3.2 ARM指令的条件码 28
3.3 ARM指令介绍 29
3.3.1 跳转指令 29
3.3.2 数据处理指令 30
3.3.3 乘法指令 31
3.3.4 杂类算术指令 32
3.3.5 状态寄存器访问指令 32
3.3.6 Load/Store内存访问指令 33
3.3.7 批量Load/Store内存访问指令 34
3.3.8 LDREX和STREX指令 35
3.3.9 信号量操作指令 37
3.3.10 异常中断产生指令 37
3.3.11 ARM协处理器指令 37
3.4 ARM指令寻址方式 39
3.4.1 数据处理指令的操作数的寻址方式 39
3.4.2 字及无符号字节的Load/Store指令的寻址方式 43
3.4.3 杂类Load/Store指令的寻址方式 47
3.4.4 批量Load/Store指令的寻址方式 49
3.4.5 协处理器Load/Store指令的寻址方式 51
3.4.6 ARM指令的寻址方式总结 52
3.5 ARM汇编伪操作(Directive) 53
3.5.1 符号定义伪操作 54
3.5.2 数据定义伪操作 54
3.5.3 汇编控制伪操作 56
3.5.4 栈中数据帧描述伪操作 57
3.5.5 信息报告伪操作 57
3.5.6 其他伪操作 58
3.6 ARM汇编伪指令 59
3.7 Thumb指令介绍 60
第4章 ARM处理器内存管理单元(MMU) 61
本章主要介绍了ARM处理器内存管理单元(MMU)的工作原理,Linux内存管理功能是通过处理器硬件MMU实现的,在没有MMU的处理器系统中,Linux只能工作在物理地址模式,没有虚拟(线性)地址空间的概念。
4.1 ARM处理器中CP15协处理器的寄存器 61
4.1.1 访问CP15寄存器的指令 61
4.1.2 CP15寄存器介绍 62
4.2 MMU简介 70
4.3 系统访问存储空间的过程 71
4.3.1 使能MMU时的情况 71
4.3.2 禁止MMU时的情况 71
4.3.3 使能/禁止MMU时应注意的问题 72
4.4 ARM处理器地址变换过程 72
4.4.1 MMU的一级映射描述符 73
4.4.2 MMU的二级映射描述符 74
4.4.3 基于段的地址变换过程 75
4.4.4 粗粒度大页地址变换过程 75
4.4.5 粗粒度小页地址变换过程 76
4.4.6 细粒度大页地址变换过程 76
4.4.7 细粒度小页地址变换过程 77
4.4.8 细粒度极小页地址变换过程 77
4.5 ARM存储空间访问权限控制 78
4.6 TLB操作 79
4.6.1 使TLB内容无效 79
4.6.2 锁定TLB内容 79
4.6.3 解除TLB中被锁定的地址变换条目 80
4.7 存储访问失效 80
4.7.1 MMU失效(MMU Fault) 80
4.7.2 外部存储访问失效(External Abort) 81
第5章 ARM处理器的Cache和Write Buffer 82
本章主要介绍了ARM处理器高速缓存(Cache)和写缓存(Write Buffer)的工作原理,使读者了解如何提高处理器的性能。
5.1 Cache和Write Buffer一般性介绍 82
5.1.1 Cache工作原理 82
5.1.2 地址映像方式 83
5.1.3 Cache写入方式原理简介 84
5.1.4 关于Write-through和Write-back 85
5.1.5 Cache替换策略 86
5.1.6 使用Cache的必要性 87
5.1.7 使用Cache的可行性 87
5.2 ARM处理器中的Cache和Write Buffer 88
5.2.1 基本概念 88
5.2.2 Cache工作原理 88
5.2.3 Cache地址映射和变换方法 89
5.2.4 Cache分类 90
5.2.5 Cache替换算法 91
5.2.6 Cache内容锁定 91
5.2.7 MMU映射描述符中B位和C位的含义 92
5.2.8 Cache和Writer Buffer编程接口 93
5.3 ARM处理器的快速上下文切换技术 94
5.3.1 FCSE概述 94
5.3.2 FCSE原理 94
5.3.3 FCSE编程接口 95
第6章 ARM处理器存储访问一致性问题 97
本章介绍了在支持MMU、Cache和DMA的系统中可能出现的存储访问一致性问题,以及Linux中解决类似问题的方法。
6.1 存储访问一致性问题介绍 97
6.1.1 地址映射关系变化造成的数据不一致性 97
6.1.2 指令cache的数据不一致性问题 98
6.1.3 DMA造成的数据不一致问题 99
6.1.4 指令预取和自修改代码 99
6.2 Linux中解决存储访问一致性问题的方法 99
第7章 ARM处理器工作模式与异常中断处理 101
本章主要介绍了ARM处理器的工作模式和异常中断处理过程,这是ARM处理器系统启动程序编写者或Bootloader开发人员的必备知识。
7.1 ARM处理器工作模式 101
7.2 ARM处理器异常中断向量表和优先级 103
7.3 ARM处理器异常中断处理 104
7.3.1 进入异常中断处理 104
7.3.2 退出异常中断处理 105
7.4 ARM处理器的中断(IRQ或FIQ) 109
第8章 ARM处理器启动过程 110
本章根据笔者的开发经验介绍了ARM处理器系统的启动过程以及编写ARM处理器系统启动程序需要注意的事项。
8.1 ARM处理器上电/复位操作 110
8.2 ARM处理器系统初始化过程 111
8.3 ARM处理器系统初始化编程注意事项 111
第9章 嵌入式系统设计与调试 113
本章根据笔者10多年的开发经验介绍了嵌入式系统的设计流程和调试方法,列举了大量笔者工作中碰到的实际案例。本章内容对于嵌入式系统硬件开发和调试有较高的参考、指导价值。
9.1 嵌入式系统设计流程 113
9.2 嵌入式系统硬件原理设计与审核 114
9.3 硬件设计工具软件 117
9.4 嵌入式系统调试仿真工具 117
9.5 嵌入式系统调试诊断方法 118
第10章 自制简易JTAG下载烧写工具 123
本章根据笔者自己制作简易JTAG线缆的经验,介绍了简易JTAG线缆的硬件原理和软件流程,这是初学者必备的最廉价的工具,必须掌握。
10.1 JTAG简介 123
10.1.1 一些基本概念 124
10.1.2 JTAG接口信号 124
10.1.3 TAP控制器的状态机 125
10.1.4 JTAG接口指令集 129
10.2 简易JTAG线缆原理 130
10.2.1 PC并口定义 130
10.2.2 PC并口的寄存器 131
10.2.3 简易JTAG线缆原理图 133
10.2.4 简易JTAG线缆烧写连接图(见图10-5) 134
10.3 简易JTAG烧写代码分析 135
10.3.1 简易JTAG烧写程序(flashp)使用说明 135
10.3.2 flash与CPU连接及flash属性描述文件 136
10.3.3 简易JTAG烧写程序的执行逻辑和流程 138
第2部分 Linux内核开发初步
第11章 Bootloader 142
本章根据笔者的工作经验介绍了流行的几种Bootloader、Bootloader应该具备的基本功能以及Bootloader的裁剪与移植。
11.1 Bootloader的任务和作用 142
11.2 各种各样的Bootloader 143
11.3 Bootloader编译环境 144
11.4 Bootloader的移植与裁减 145
11.5 编译Bootloader 145
11.6 烧写Bootloader 146
11.7 Bootloader使用举例 148
11.8 Bootloader修改举例 149
第12章 创建嵌入式Linux开发环境 151
本章介绍了如何创建嵌入式系统Linux内核交叉开发环境,本章和后续3章的内容是嵌入式系统Linux内核开发的基础,必须掌握。
12.1 安装Linux host 151
12.2 在虚拟机中安装Linux host 152
12.3 安装Linux交叉编译环境 157
12.4 在主机上设置TFTP Server 160
12.5 在主机上设置DHCP Server 161
12.6 在主机上设置Telnet server 161
12.7 在开发过程中使用NFS 162
12.8 设置超级终端 163
第13章 编译Linux内核 166
本章介绍了Linux内核的配置和编译方法。
13.1 获取Linux内核源代码 166
13.2 Linux内核目录结构 166
13.3 配置Linux内核 167
13.4 编译Linux内核 168
第14章 创建Linux根文件系统 170
本章介绍了Linux的根文件系统的结构以及创建根文件系统的方法。
14.1 根文件系统概述 170
14.2 根文件系统目录结构 171
14.3 获取根文件系统组件源代码 171
14.4 编译根文件系统源代码 171
14.5 创建一个32MB的RAMDISK根文件系统 173
14.6 在根文件系统中添加驱动模块或者应用程序 173
第15章 固化Linux内核和根文件系统 174
本章介绍了固化(烧写)Linux内核和根文件系统的方法。
第16章 关于Clinux 176
本章简要介绍了Clinux与标准Linux的区别。
16.1 Clinux简介 176
16.2 Clinux源代码目录结构 177
16.3 Clinux与标准Linux的区别 178
16.4 编译Clinux 179
第3部分 Linux 2.6内核原理
第17章 Linux 2.6.10@ARM启动过程 182
本章以start_kernel()和init()函数中调用到的函数说明的方式,介绍了从Linux汇编代码入口到init内核进程最后调用用户空间init命令的Linux整个启动过程。本章内容是笔者第一次阅读Linux内核源代码时对这些函数的注释,仅供读者了解start_kernel()和init()函数中调用到的每个函数的大致功能时使用。
17.1 Linux 2.6.10中与ARM处理器平台硬件相关的结构和全局变量 182
17.1.1 相关数据结构 182
17.1.2 相关全局变量 187
17.2 Linux汇编代码入口 189
17.3 Linux汇编入口处CPU的状态 189
17.4 start_kernel()函数之前的汇编代码执行过程 190
17.5 start_kernel()函数中调用的函数介绍 192
17.5.1 lock_kernel()函数 192
17.5.2 page_address_init()函数 192
17.5.3 printk(linux_banner) 193
17.5.4 setup_arch(&command_line)函数 193
17.5.5 setup_per_cpu_areas()函数 198
17.5.6 smp_prepare_boot_cpu()函数 199
17.5.7 sched_init()函数 199
17.5.8 build_all_zonelists()函数 200
17.5.9 page_alloc_init()函数 200
17.5.10 printk(Kernel command line: %s
, saved_command_line) 201
17.5.11 parse_early_param()函数 201
17.5.12 parse_args()函数 201
17.5.13 sort_main_extable()函数 202
17.5.14 trap_init()函数 202
17.5.15 rcu_init()函数 202
17.5.16 init_IRQ()函数 203
17.5.17 pidhash_init()函数 203
17.5.18 init_timers()函数 203
17.5.19 softirq_init()函数 204
17.5.20 time_init()函数 204
17.5.21 console_init()函数 205
17.5.22 profile_init()函数 206
17.5.23 local_irq_enable()函数 207
17.5.24 vfs_caches_init_early()函数 207
17.5.25 mem_init()函数 208
17.5.26 kmem_cache_init()函数 210
17.5.27 numa_policy_init()函数 225
17.5.28 calibrate_delay()函数 227
17.5.29 pidmap_init()函数 228
17.5.30 pgtable_cache_init()函数 229
17.5.31 prio_tree_init()函数 229
17.5.32 anon_vma_init()函数 229
17.5.33 fork_init(num_physpages)函数 229
17.5.34 proc_caches_init()函数 230
17.5.35 buffer_init()函数 231
17.5.36 unnamed_dev_init()函数 231
17.5.37 security_init()函数 231
17.5.38 vfs_caches_init(num_physpages)函数 232
17.5.39 radix_tree_init()函数 237
17.5.40 signals_init()函数 237
17.5.41 page_writeback_init()函数 237
17.5.42 proc_root_init()函数 238
17.5.43 check_bugs()函数 240
17.5.44 acpi_early_init()函数 244
17.5.45 rest_init()函数 244
17.6 init()进程执行过程 265
17.6.1 smp_prepare_cpus(max_cpus)函数 265
17.6.2 do_pre_smp_initcalls()函数 265
17.6.3 fixup_cpu_present_map()函数 267
17.6.4 smp_init()函数 267
17.6.5 sched_init_smp()函数 268
17.6.6 populate_rootfs()函数 268
17.6.7 do_basic_setup()函数 283
17.6.8 sys_access()函数 292
17.6.9 free_initmem()函数 301
17.6.10 unlock_kernel()函数 301
17.6.11 numa_default_policy()函数 302
17.6.12 sys_p()函数 302
17.6.13 execve()函数 302
第18章 Linux内存管理 305
从本章开始,笔者将带领读者走进神秘的Linux内核世界。笔者在阅读内核源代码以及两本相关参考书(见参考文献)的基础上,以自己的理解和语言总结概括了Linux内核每个组件的原理。笔者对与每个内核组件相关的关键数据结构和全局变量作了尽量详尽的说明,并且对核心函数进行了详细注释,在向读者灌输理论知识的同时引导读者自己去阅读、分析Linux内核源代码。本章讲解了Linux内核第一大核心组件“内存管理”的原理和实现内幕。
18.1 Linux内存管理概述 305
18.1.1 Linux内存管理的一些基本概念 305
18.1.2 内存管理相关数据结构 309
18.1.3 内存管理相关宏和全局变量 330
18.1.4 Linux内存管理的任务 341
18.1.5 Linux中的物理和虚拟存储空间布局 341
18.2 为虚拟(线性地址)存储空间建立页表 345
18.3 设置存储空间的访问控制属性 348
18.4 Linux中的内存分配和释放 350
18.4.1 在系统启动初期申请内存 350
18.4.2 系统启动之后的内存分配与释放 360
第19章 Linux进程管理 480
本章讲解了Linux内核第二大核心组件“进程管理”的原理和实现内幕。
19.1 进程管理概述 480
19.1.1 进程相关概念 480
19.1.2 进程分类 481
19.1.3 0号进程 481
19.1.4 1号进程 481
19.1.5 其他一些内核线程 482
19.1.6 进程描述符(struct task_struct) 482
19.1.7 进程状态 482
19.1.8 进程标识符(PID) 483
19.1.9 current宏定义 484
19.1.10 进程链表 484
19.1.11 PID hash表和链表 485
19.1.12 硬件上下文(Hardware Context) 485
19.1.13 进程资源限制 485
19.1.14 进程管理相关数据结构 486
19.1.15 进程管理相关宏定义 502
19.1.16 进程管理相关全局变量 514
19.2 进程管理相关初始化 520
19.3 进程创建与删除 529
19.4 进程调度 551
19.4.1 进程类型 553
19.4.2 进程调度类型 554
19.4.3 基本时间片计算方法 555
19.4.4 动态优先级算法 556
19.4.5 交互式进程 556
19.4.6 普通进程调度 557
19.4.7 实时进程调度 557
19.4.8 进程调度函数分析 558
19.5 进程切换 576
19.6 用户态进程间通信 581
19.6.1 信号(Signal) 581
19.6.2 管道(pipe)和FIFO(命名管道) 627
19.6.3 进程间通信原语(System V IPC) 641
第20章 Linux文件管理 651
本章讲解了Linux内核第三大核心组件“文件系统”的原理和实现内幕。
20.1 文件系统概述 651
20.1.1 Linux文件管理相关概念 652
20.1.2 Linux文件管理相关数据结构 657
20.1.3 Linux文件管理相关宏定义 682
20.1.4 Linux文件管理相关全局变量 691
20.2 文件管理相关初始化 699
20.3 文件系统类型注册 711
20.4 挂接文件系统 712
20.5 文件系统类型超级块读取 730
20.5.1 get_sb_single()通用超级块读取函数 731
20.5.2 get_sb_nodev()通用超级块读取函数 737
20.5.3 get_sb_bdev()通用超级块读取函数 738
20.5.4 get_sb_pseudo()通用超级块读取函数 740
20.6 路径名查找 747
20.7 访问文件操作 759
20.7.1 打开文件 759
20.7.2 关闭文件 766
20.7.3 读文件 768
20.7.4 写文件 785
20.8 异步I/O系统调用 792
20.9 Linux特殊文件系统 792
20.9.1 rootfs文件系统 793
20.9.2 sysfs文件系统 797
20.9.3 devfs设备文件系统 800
20.9.4 bdev块设备文件系统 803
20.9.5 ramfs文件系统 804
20.9.6 proc文件系统 804
20.10 磁盘文件系统 813
20.10.1 ext2文件系统相关数据结构 813
20.10.2 ext2文件系统磁盘分区格式 819
20.10.3 ext2文件系统的各种文件 820
20.10.4 创建ext2文件系统 821
20.10.5 ext2文件系统的操作方法 822
20.11 关于initramfs 824
20.11.1 initramfs概述 824
20.11.2 initramfs与initrd的区别 824
20.11.3 initramfs相关全局变量 825
20.11.4 initramfs被编译链接的位置 825
20.11.5 initramfs文件的生成过程 825
20.11.6 initramfs二进制文件格式说明(cpio格式) 828
20.11.7 initramfs二进制文件和列表文件对照示例 829
20.11.8 initramfs利弊 830
20.12 关于initrd 830
20.12.1 initrd概述 830
20.12.2 initrd相关全局变量 831
20.13 关于gzip压缩文件 832
第21章 Linux模块设计 834
本章讲解了Linux内核模块程序与应用程序的区别以及如何编写和加载Linux内核模块程序。
21.1 Linux模块设计概述 834
21.2 Linux的内核空间和用户空间 834
21.3 内核模块与应用程序的区别 835
21.4 编译模块 837
21.5 装载和卸载模块 837
21.6 模块层叠 838
21.7 模块版本依赖 839
21.8 模块编程示例 839
第22章 Linux系统异常中断管理 841
本章讲解了Linux内核如何管理系统异常中断以及Linux系统调用的实现内幕。
22.1 Linux异常中断处理 841
22.2 指令预取和数据访问中止异常中断处理 849
22.2.1 指令预取中止异常中断处理 850
22.2.2 数据访问中止异常中断处理 858
22.3 Linux中断处理 863
22.3.1 内核模式下的中断处理 863
22.3.2 用户模式下的中断处理 867
22.4 从中断返回 868
22.5 Linux中断管理 869
22.5.1 Linux中断管理相关数据结构与全局变量 870
22.5.2 Linux中断管理初始化 872
22.5.3 安装和卸载中断处理程序 874
22.5.4 使能和禁止中断 878
22.6 Linux系统调用 880
22.6.1 Linux系统调用内核实现过程 880
22.6.2 从系统调用返回 889
22.6.3 Linux系统调用用户程序接口函数 890
22.6.4 Linux系统调用用户接口函数与内核实现函数之间参数传递 899
第23章 Linux软中断和工作队列 901
本章讲解了Linux内核中的两种延迟处理机制“软中断”和“工作队列”的原理和实现。
23.1 概述 901
23.2 Linux软中断 902
23.2.1 软中断相关数据结构和全局变量 903
23.2.2 软中断初始化 904
23.2.3 软中断的核心操作函数do_softirq() 908
23.2.4 软中断看护进程执行函数ksoftirqd() 912
23.2.5 如何使用软中断 913
23.3 Linux工作队列 918
23.3.1 Linux工作队列相关数据结构和全局变量 918
23.3.2 Linux工作队列初始化 921
23.3.3 将工作加入到工作队列中 924
23.3.4 工作者进程执行函数worker_thread() 928
23.3.5 使用Linux工作队列 931
第24章 Linux并发与竞态 933
本章讲解了Linux内核同步机制,包括几种锁定技术以及免锁算法。
24.1 并发与竞态概述 933
24.1.1 Linux中的并发源 934
24.1.2 竞态可能导致的后果 934
24.1.3 避免竞态的规则 934
24.2 消除竞态的“锁定”技术 935
24.2.1 信号量(semphore)和互斥体(mutual exclusion) 935
24.2.2 读写信号量(rw_semaphore) 938
24.2.3 完成量(completion) 941
24.2.4 自旋锁(spinlock_t) 942
24.2.5 读写自旋锁(rwlock_t) 946
24.2.6 使用“锁定”技术的注意事项 949
24.3 消除竞态的非“锁定”方法 949
24.3.1 免锁算法 949
24.3.2 原子操作 950
24.3.3 位操作 951
24.3.4 顺序锁 952
24.3.5 读-复制-更新(Read-Copy-Update,RCU) 954
第25章 Linux设备驱动程序 958
本章讲解了Linux内核第四大核心组件“设备驱动”的原理和实现内幕。同时还总结归纳了编写各种设备驱动程序的方法和步骤。
25.1 设备驱动程序概述 958
25.1.1 设备驱动程序组成部分 959
25.1.2 设备号 959
25.1.3 设备文件 960
25.1.4 编写设备驱动程序的关键 961
25.2 字符设备驱动程序 961
25.2.1 字符设备相关数据结构 961
25.2.2 字符设备相关全局变量 963
25.2.3 字符设备驱动程序全局初始化 963
25.2.4 为字符设备分配设备号 964
25.2.5 注册字符设备驱动程序 968
25.2.6 字符设备的操作方法 971
25.2.7 用户对字符设备驱动程序的调用过程 972
25.2.8 如何编写字符设备驱动程序 974
25.2.9 关于TTY设备驱动程序 974
25.2.10 控制台设备驱动程序 975
25.3 块设备驱动程序 986
25.3.1 块设备相关数据结构 986
25.3.2 块设备相关宏定义 997
25.3.3 块设备相关全局变量 999
25.3.4 块设备驱动程序全局初始化 1004
25.3.5 为块设备分配主设备号 1006
25.3.6 注册块设备驱动程序 1009
25.3.7 块设备驱动程序的操作方法 1017
25.3.8 调用块设备驱动程序过程 1017
25.3.9 I/O调度 1031
25.3.10 如何编写块设备驱动程序 1032
25.4 网络设备驱动程序 1033
25.4.1 网络设备驱动程序概述 1033
25.4.2 网络设备相关数据结构 1034
25.4.3 网络设备相关宏定义 1044
25.4.4 网络设备相关全局变量 1045
25.4.5 创建net_device结构 1046
25.4.6 注册网络设备 1048
25.4.7 网络设备的操作方法 1050
25.4.8 网络设备中断服务程序 1051
25.4.9 如何编写网络设备驱动程序 1051
25.5 PCI设备驱动程序 1052
25.5.1 PCI接口定义 1053
25.5.2 PCI设备的三个地址空间 1057
25.5.3 PCI总线仲裁 1058
25.5.4 PCI设备编号 1059
25.5.5 如何访问PCI配置空间 1059
25.5.6 如何配置PCI设备 1061
25.5.7 PCI驱动程序相关数据结构 1062
25.5.8 PCI驱动程序相关宏定义 1068
25.5.9 PCI驱动程序相关全局变量 1068
25.5.10 Bootloader和内核做的事 1069
25.5.11 PCI驱动程序注册 1069
25.5.12 PCI驱动程序接口函数 1071
25.5.13 如何编写PCI驱动程序 1072
第4部分 Linux内核开发高级指南
第26章 Linux系统参数设置 1076
从本章开始的后续章节主要讲解了比较高级或者平时较少关注的Linux内核方面的知识,本章讲解了Linux中的4种系统参数格式和设置方法。
26.1 旗语系统参数(tag) 1076
26.1.1 与旗语系统参数相关数据结构和全局变量 1076
26.1.2 旗语系统参数说明 1082
26.1.3 旗语系统参数设置方法 1084
26.2 前期命令行设置的系统参数 1084
26.2.1 与前期命令行系统参数相关数据结构和全局变量 1084
26.2.2 前期命令行设置的系统参数说明 1085
26.2.3 前期命令行系统参数设置方法 1086
26.2.4 如何添加自己的前期命令行设置的系统参数 1087
26.3 老式命令行系统参数 1087
26.3.1 与老式命令行系统参数相关数据结构和全局变量 1087
26.3.2 老式命令行设置的系统参数说明 1088
26.3.3 老式命令行设置的系统参数设置方法 1089
26.3.4 如何添加自己的老式命令行设置的系统参数 1089
26.4 命令行系统参数 1089
26.4.1 与命令行系统参数相关数据结构和全局变量 1089
26.4.2 命令行设置的系统参数说明 1090
26.4.3 命令行设置的系统参数设置方法 1090
第27章 Linux内核调试 1091
本章介绍了Linux内核的调试方法。
27.1 打开Linux内核及其各模块自带的调试开关 1091
27.2 内核剖析(Profiling) 1093
27.3 通过打印调试(printk) 1095
27.3.1 关于printk() 1095
27.3.2 内核信息级别 1096
27.3.3 打印速度限制 1097
27.3.4 控制台重定向 1098
27.4 使用proc文件系统调试 1098
27.5 oops消息 1098
27.6 通过跟踪命令strace调试 1099
27.7 使用gdb、kdb、kgdb调试 1099
第28章 Linux内核移植 1101
本章介绍了Linux内核的移植方法。
第29章 Linux内核优化 1104
本章介绍了Linux内核的优化方法。
29.1 编译优化 1104
29.2 根据CPU特性进行优化 1105
29.3 对内核进行裁减 1105
29.4 优化系统内存配置 1106
29.5 优化系统启动过程以缩减系统启动时间 1106
29.6 内存映射优化 1107
29.7 工具软件辅助优化 1107
第30章 Linux定时器 1109
本章介绍了Linux内核的软件定时器。
30.1 定时器相关数据结构 1109
30.2 定时器相关宏定义 1111
30.3 定时器相关全局变量 1112
30.4 定时器和时钟初始化 1113
30.5 获取系统时间 1114
30.6 延迟函数 1115
30.7 与定时器相关系统调用 1115
30.8 使用定时器方法 1116
第31章 杂项 1117
本章介绍了PER_CPU变量以及Linux中的数据类型定义。
31.1 per_cpu变量 1117
31.2 Linux中的数据类型定义 1118
第32章 编译链接文件说明 1119
本章注释了ARM处理器系统中Linux内核的链接文件,以帮助读者了解编译出来的Linux内核各区段在内存中的存放位置。
参考文献 1125
❺ LINUX系统介绍
嵌入式Linux系统的设计与应用
摘要:随着嵌入式Linux系统的迅速发展,嵌入式Linux已发展成为嵌入式操作系统的一个重要分支。本文介绍了嵌入式Linux的设计和几种流行的嵌入式Linux系统。
关键词:嵌入式Linux
一、引言
嵌入式系统(Embedded Systems)是根据应用的要求,将操作系统和功能软件集成于计算机硬件系统之中,从而实现软件与硬件一体化的计算机系统。嵌入式系统出现于60年代晚期,它最初被用于控制机电电话交换机,如今已被广泛的应用于工业制造、过程控制、通讯、仪器、仪表、汽车、船舶、航空、航天、军事装备、消费类产品等众多领域。嵌入式系统在数量上远远超过了各种通用计算机系统:计算机系统核心CPU,每年在全球范围内的产量大概在二十亿颗左右,其中超过80%应用于各类专用性很强的嵌入式系统。
一般的说,凡是带有微处理器的专用软硬件系统都可以称为嵌入式系统。和通用的计算平台相比,嵌入式系统往往具有功能单一、体积小、功耗低、可靠性高、剪裁性好、软硬件集成度高、计算能力相对较低等特点。多年来,嵌入式设备中没有操作系统,其主要原因有二:首先,诸如洗衣机、微波炉、电冰箱这样的设备仅仅需要一道简单的控制程序,以管理数量有限的按钮和指示灯,没有使用操作系统的必要;其次,它往往只具有有限的硬件资源,不足以支持一个操作系统。
然而,随着硬件的发展,嵌入式系统变得越来越复杂,最初的控制程序中逐步的加入了许多功能,而这些功能中有很多可以由操作系统提供。于是,在70年代末期出现了嵌入式操作系统(Embedded Operating Systems),它的出现大大简化了应用程序设计,并可以有效的保障软件质量和缩短开发周期。简单的ES一般并不使用操作系统,只包含一些控制流程,但是随着嵌入式操作系统在复杂性上的增长,简单的流程控制就不能满足系统的要求,这是就必须考虑使用操作系统做系统软件。因此,嵌入式操作系统就应运而生。
随着EOS的广泛应用,业界已推出一些应用比较成功的EOS产品。归纳起来EOS应该具有以下几个特点:小巧、实时性、可装卸、固化代码、弱交互性、强稳定性和统一的接口。目前使用最多的EOS产品包括有:Vxwork、QNX、PalmOS、WindowsCE、pSOS、Hopen OS(国内凯思集团公司自主研制开发)等。其中,Vxwork使用最为广泛、市场占有率最高,其突出特点是实时性强(采用优先级抢占和轮转调度等机制),除此之外,其可靠性和可剪裁性也相当不错。QNX是一种伸缩性极佳的系统,其核心加上实时POSIX环境和一个完整的窗口系统还不到一兆。相比之下,Microsoft WinCE的核心体积庞大,实时性能也差强人意,但由于Windows系列友好的用户界面和为程序员所熟悉的API,并捆绑IE、Office等应用程序,正逐渐获得更大的市场份额。而与这些商业化的操作系统相比,Linux已经越来越受到人们的注意。
二、嵌入式Linux概述
Linux是一个成熟而稳定的网络操作系统。将Linux植入嵌入式设备具有众多的优点。首先,Linux的源代码是开放的,任何人都可以获取并修改,用之开发自己的产品。其次,Lirmx是可以定制的,其系统内核最小只有约134kB。一个带有中文系统和图形用户界面的核心程序也可以做到不足1MB,并且同样稳定。另外,它和多数Unix系统兼容,应用程序的开发和移植相当容易。同时,由于具有良好的可移植性,人们已成功使Linux运行于数百种硬件平台之上。
然而,Linux并非专门为实时性应用而设计,因此如果想在对实时性要求较高的嵌入式系统中运行Linux,就必须为之添加实时软件模块。这些模块运行的内核空间正是操作系统实现进程调度、中断处理和程序执行的部分,因此错误的代码可能会破坏操作系统,进而影响整个系统的可靠性和稳定性。Linux的众多优点还是使它在嵌入式领域获得了广泛的应用,并出现了数量可观的嵌入式Linux系统。其中有代表性的包括:uClinux、ETLinux、ThinLinux、LOAF等。ETLinux通常用于在小型工业计算机,尤其是PC/104模块。ThinLinux面向专用的照相机服务器、X-10控制器、MP3播放器和其它类似的嵌入式应用。LOAF是Linux On A Floppy的缩略语,它运行在386平台上。
三、Linux作为嵌入式操作系统的优势
Linux作为嵌入式操作系统的优势主要有以下几点:
1、 可应用于多种硬件平台。Linux已经被移植到多种硬件平台,这对于经费,时间受限制的研究与开发项目是很有吸引力的。原型可以在标准平台上开发后移植到具体的硬件上,加快了软件与硬件的开发过程。Linux采用一个统一的框架对硬件进行管理,从一个硬件平台到另一个硬件平台的改动与上层应用无关。Linux可以随意地配置,不需要任何的许可证或商家的合作关系,源代码可以免费得到。这使得采用Linux作为操作系统不会遇到任何关于版权的纠纷。毫无疑问,这会节省大量的开发费用。本身内置网络支持,而目前嵌入式系统对网络支持要求越来越高。Linux的高度模块化使添加部件非常容易。
2、 Linux是一个和Unix相似、以内核为基础的、具有完全的内存访问控制,支持大量硬件(包括X86,Alpha、ARM和Motorola等现有的大部分芯片)等特性的一种通用操作系统。其程序源码全部公开,任何人可以修改并在GUN通用公共许可证(GNU General Public License)下发行。这样,开发人员可以对操作系统进行定制,适应其特殊需要。
3、 Linux带有Unix用户熟悉的完善的开发工具,几乎所有的Unix系统的应用软件都已移植到了Linux上。Linux还提供了强大的网络功能,有多种可选择窗口管理器(X Windows)。其强大的语言编译器GCC,C++等也可以很容易得到,不但成熟完善,而且使用方便。
四、嵌入式Linux的建立
完整的嵌入式Linux解决方案应包括嵌入式Linux操作系统内核、运行环境、图形化界面和应用软件等。由于嵌入式设备的特殊要求,嵌入式Linux解决方案中的内核、环境、GUI等都与标准Linux有很大不同,其主要挑战是如何在狭小的FLASH、ROM和内存中实现高质量的任务实时调度、图形化显示、网络通信等功能。
1、 精简内核
Linux内核有自己的结构体系,其中进程管理、内存管理和文件系统是其最基本的3个子系统。图1简单表示了它的框架。用户进程可直接通过系统调用或者函数库来访问内核资源。正因为Linux内核具有这样的结构,因此修改内核时必须注意各个子系统之间的协调。
嵌入式Linux内核一般由标准Linux内核裁剪而来。用户可根据需求配置系统,剔除不需的服务功能、文件系统和设备驱动。经过裁剪、压缩后的系统内核一般只有300k左右,十分适合嵌入式设备。同标准Linux不同的是嵌入式Linux必须要实现从FLASH或ROM的启动。标准Linux启动代码实现了系统初始化和从软盘、硬盘O盘区引导内核。嵌入式Linux一般保存在FLASH或ROM中,标准LILO无法引导。在支持直接从FLASH设备引导的系统中,如华恒公司的uClinux,引导程序主要完成对硬件系统的初始化工作和操作系统的解压、移位工作。在不支持直接从FLASH引导的系统中,FLASH设备只能作为非引导磁盘使用。此时,可采用先从硬盘或软盘加载一个小操作系统,如嵌入式DOS,然后再执行"Loadlin"加载程序从FLASH引导嵌入式Linux。
对标准Linux的修改主要是虚拟内存和调度程序部分的改动。因为标准Linux系统使用虚拟内存管理的目的是为了能同时运行多个进程,但是这样每个待运行的进程所能分配的CPU时间片就受限制,资源的使用效率就低。这样对于实时性要求较高的嵌入式系统来说,实时任务往往要求CPU具有很高的突发处理能力,即在有些时候需要极高的处理效率,因此需要屏蔽内核的虚拟内存管理机制。对于无硬盘设备的嵌入式系统,不必采用虚存管理。强实时需求的嵌入式应用可以通过修改任务调度模块实现,主要是在内核和设备驱动程序中加入了许多切换点。在该点处,系统检测是否存在未处理的紧急中断,有则剥夺内核的运行,及时处理中断。实现实时性服务的一个较好的方法是在标准的Linux内核上增加一个实时内核,标准Linux内核作为一个任务运行于实时内核上,强实时性任务也直接运行在实时内核上,如RT-Linux等。
文件系统是嵌入式Linux操作系统必不可少的。但标准Linux支持大量的文件系统,因此除了满足系统的正常运行需要而保留一种外,其它的全部可以删除,利用原有的设置选项可以移除。一般嵌入式设备文件系统主要使用RamDisk技术和网络文件系统技术。RamDisk可驻留于Flash,运行时加载到内存中。
2、 精简运行环境
Linux通常的运行环境指用户运行任何应用的基础设施,主要包括函数库和基本命令集等。标准Linux系统同时向用户提供了静态和动态函数库。静态函数库在生成应用时直接链接到用户应用中。动态库在应用运行时才链接。由于嵌入式系统应用一般都是在开发平台上预先生成的,因此嵌入式系统只需向应用提供动态函数库。Linux应用运行所需的函数库主要有C库、数学库、线程库、加密库、网络通信库等。其中最基本的是C语言的运行库glib。这个库主要完成基本的输入输出,内存访问,文件处理。一个标准的glib库大约要1200kB存储空间,考虑到嵌入式Linux内核往往很小,这种运行库实在太大,我们做了一些精简的工作,方法有两种:(1)、使用静态连接的方法,完全不使用运行库动态连接;(2)、对这个库的函数进行精简。
在一个桌面系统上,使用动态连接可以带来许多好处。使用动态连接库,可以让应用程序跟函数库的更新、升级分离,便于维护,可以让同时运行的多个程序共享一段代码。但是,在嵌入式系统中,很少有多个程序并行的可能,程序的维护,尤其是库函数的维护更新是不常见的。这时,使用静态连接的优势就极为明显。因为静态连接可以只将库中用到的部分连接进程序。在应用程序较少(小于5)的情况下,静态连接可以达到较好的结果。为了便于将来扩充的需要,我们也采用第二种方法,针对我们的需要,对库函数的内容进行精简,只保留一些基本功能,还有一种方法是采用其它的C语言运行库。但是这些库对兼容性影响很大。
基本命令集同样是运行用户应用的基础,主要包括初始化进程init,终端获取getty、Shell和基本命令等。嵌入式系统的启动过程可能与标准Linux不同,例如跳过登录过程直接启动GUI等。这就要求修改init,getty等。标准Linux命令集同样由于体积问题无法直接应用于嵌入式环境。目前,小命令集的解决方法主要有集成方法和汇编方法两种。集成方法采用集成公共部分减少命令集整体体积,用C实现,有较好的平台移植性;汇编方法则采用汇编编程减少每个命令的体积.这样可使体积很小但其平台移植性较差。
3、 嵌入式Linux下的GUI
GUI在嵌入式系统或者实时系统中的地位越来越重要,比如PDA、DVD播放机、WAP手机等,都需要一个完整.漂亮的图形用户界面。这些系统对GUI的基本要求包括:(1)、轻型、占用资源少;(2)、高性能;(3)、高可靠性;(4)、可配置。这些也成为评价嵌入式系统的重要指标。目前,嵌入式Linux上的GUI主要有winCE、Micro Window、紧缩的X Window、MiniGUI(国内做得较好的自由软件之一)。标准Linux的Xfree86由于体积庞大,运行环境要求高,无法运行于嵌入式环境。嵌入式GUI主要通过削减功能,降低性能来实现体积小和占用资源少。目前嵌入式Linux上的GUI环境主要有两类:X类和win32类。X类GUI分为服务方和客户方两方。服务器方提供鼠标、键盘处理和显示功能,客户方是用户应用,服务方和客户方通过socket接口和X协议通信。采用该方式十分有利于远程网络图形化服务,客户方和服务方可通过网络实现X协议和图形显示。典型的X类GUI有Micro Window、紧缩的X Window等。win32类的GUI不存在客户方和服务方,每个任务都自成一体,任何任务间的切换、事件分发由专门的管理任务负责。如wiCE、MiniGUI就是类似于win32类的GUI。
五、当前流行的几种嵌入式Linux系统
除了智能数字终端领域以外,Linux在移动计算平台、智能工业控制、金融业终端系统,甚至军事领域都有着广泛的应用前景。这些Linux被统称为"嵌入式Linux"。
1、RT-Linux
这是由美国墨西哥理工学院开发的嵌入式Linux操作系统。到目前为止,RT-Linux已经成功地应用于航天飞机的空间数据采集、科学仪器测控和电影特技图像处理等广泛领域。RT-Linux开发者并没有针对实时操作系统的特性而重写Linux的内核,因为这样做的工作量非常大,而且要保证兼容性也非常困难。为此,RT-Linux提出了精巧的内核,并把标准的Linux核心作为实时核心的一个进程,同用户的实时进程一起调度。这样对Linux内核的改动非常小,并且充分利用了Linux下现有的丰富的软件资源。
2、uClinux
uCLinux是Lineo公司的主打产品,同时也是开放源码的嵌入式Linux的典范之作。uCLinux主要是针对目标处理器没有存储管理单元MMU(Memory Management Unit) 的嵌入式系统而设计的。它已经被成功地移植到了很多平台上。由于没有MMU,其多任务的实现需要一定技巧。uCLinux是一种优秀的嵌入式Linux版本,是micro-Conrol-Linux的缩写。它秉承了标准Linux的优良特性,经过各方面的小型化改造,形成了一个高度优化的、代码紧凑的嵌入式Linux。虽然它的体积很小,却仍然保留了Linux的大多数的优点:稳定、良好的移植性、优秀的网络功能、对各种文件系统完备的支持和标准丰富的API。它专为嵌入式系统做了许多小型化的工作,目前已支持多款CPU。其编译后目标文件可控制在几百KB数量级,并已经被成功地移植到很多平台上。
3、Embedix
Embedix是由嵌入式Linux行业主要厂商之一Luneo推出的,是根据嵌入式应用系统的特点重新设计的Linux发行版本。Embedix提供了超过25种的Linux系统服务,包括Web服务器等。系统需要最小8MB内存,3MB ROM或快速闪存。Embedix基于Linux 2.2内核,并已经成功地移植到了Intel x86和PowerPC处理器系列上。像其它的Linux版本一样,Embedix可以免费获得。Luneo还发布了另一个重要的软件产品,它可以让在Windows CE上运行的程序能够在Embedix上运行。Luneo还将计划推出Embedix的开发调试工具包、基于图形界面的浏览器等。可以说,Embedix是一种完整的嵌入式Linux解决方案。
4、Xlinux
XLinux是由美国网虎公司推出,主要开发者是陈盈豪。他在加盟网虎几个月后便开发出了基于XLinux的、号称是世界上最小的嵌入式Linux系统,内核只有143KB,而且还在不断减小。XLinux核心采用了"超字符集"专利技术,让Linux核心不仅可能与标准字符集相容,还含盖了1 2个国家和地区的字符集。因此,XLinux在推广Linux的国际应用方面有独特的优势。
5、PoketLinux
由Agenda公司采用、作为其新产品"VR3PDA"的嵌入式Linux操作系统。它可以提供跨操作系统构造统一的、标准化的和开放的信息通信基础结构,在此结构上实现端到端方案的完整平台。PoketLinux资源框架开放,使普通的软件结构可以为所有用户提供一致的服务。PoketLinux平台使用户的视线从设备、平台和网络上移开,由此引发了信息技术新时代的产生。在PoketLinux中,称之为用户化信息交换(CIE),也就是提供和访问为每个用户需求而定制的"主题"信息的能力,而不管正在使用的设备是什么。
6、MidoriLinux
由Transmeta公司推出的MidoriLinux操作系统代码开放,在GUN普通公共许可(GPL)下发布,可以在http://midori.transmeta.com上立即获得。该公司有个名为"MidoriLinux计划"。"MidoriLinux"这个名字来源于日本的"绿色"---Midori,用来反映其Linux操作系统的环保外观。
7、红旗嵌入式Linux
由北京中科院红旗软件公司推出的嵌入式Linux是国内做得较好的一款嵌入式操作系统。目前,中科院计算所自行开发的开放源码的嵌入式操作系统---Easy Embedded OS(EEOS)也已经开始进入实用阶段了。该款嵌入式操作系统重点支持p-Java。系统目标一方面是小型化,另一方面能重用Linux的驱动和其它模块。由于有中科院计算所的强大科研力量做后盾,EEOS有望发展成为功能完善、稳定、可靠的国产嵌入式操作系统平台。
六、结束语
由于Linux是一个内核源代码开放、具备一整套工具链、有强大的网络支持及成本低廉的操作系统,因此嵌入式Linux自诞生起就秉承了这众多独特优势,这使它正在并越来越多地受到人们的关注。据Even Data数据显示,期望使用嵌入式Linux的用户从2001年的11%增到2002年27%,而同期Vxwork只是从16%到18%,Win CE从9%到14%。另外,在嵌入式Linux的各种应用市场中,通信(语音和数据)名列第一,2000年的销售额是1300万美元,而2005年预计将达到1.26亿美元,可以预见,嵌入式Linux将在未来的通信用嵌入式操作系统中占据强有力的地位
Linux是目前十分火爆的操作系统。它是由芬兰赫尔辛基大学的一个大学生Linus B. Torvolds在1991年首次编写的。标志性图标是一个可爱的小企鹅。
Linux是一种类Unix系统,Linus当时编写它的目的是为了替代一种名叫Minix的操作系统。Minix是由一个名叫Andrew Tannebaum的计算机教授编写的,当时由于Unix是一个商业软件,其源代码是不能拿来进行教学的,Andrew教授就自己编写了一个系统用于教学。最
初的Minix用一张软盘就能装下,麻雀虽小、五脏俱全,Minix具有一般操作系统的特征,它同时兼容Unix系统。
Linux是一个免费的操作系统,用户可以免费获得其源代码,并能够随意修改。它是在共用许可证GPL(General Public License)保护下的自由软件,也有好几种版本,如Red Hat Linux、Slackware,以及国内的Xteam Linux等。
Linux具有许多Unix系统的功能和特点,能够兼容Unix,但无需支付Unix高额的费用。比如一个Unix程序员在单位可以在Unix系统上进行工作,回到家里在Linux系统上也能完成同样的工作,而不必重新购买Unix。要知道Unix的价格比常见的Windows要高出若干倍,和Linux的低廉更是相距甚远。
Linux的应用也十分广泛。Sony最新的PS2游戏机就采用了Linux作为系统软件,使PS2摇身一变,成为了一台Linux工作站。着名的电影《泰坦尼克号》的数字技术合成工作就是利用100多台Linux服务器来完成的。
2001年8月17日,Linux发布了最新的Linux 2.4.9版,它也已经十岁了。
Linux的优点
Linux的流行是因为它具有许多诱人之处。
1、完全免费
Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变。这让Linux吸收了无数程序员的精华,不断壮大。
2、完全兼容POSIX 1.0标准
这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。这为用户从Windows转到Linux奠定了基础。许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。
3、多用户、多任务
Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。
4、良好的界面
Linux同时具有字符界面和图形界面。在字符界面用户可以通过键盘输入相应的指令来进行操作。它同时也提供了类似Windows图形界面的X-Windows系统,用户可以使用鼠标对其进行操作。在X-Windows环境中就和在Windows中相似,可以说是一个Linux版的Windows。
5、丰富的网络功能
互联网是在Unix的基础上繁荣起来的,Linux的网络功能当然不会逊色。它的网络功能和其内核紧密相连,在这方面Linux要优于其他操作系统。在Linux中,用户可以轻松实现网页浏览、文件传输、远程登陆等网络工作。并且可以作为服务器提供WWW、FTP、E-Mail等服务。
6、可靠的安全、稳定性能
Linux采取了许多安全技术措施,其中有对读、写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。Linux由于需要应用到网络服务器,这对稳定性也有比较高的要求,实际上Linux在这方面也十分出色。
7、支持多种平台
Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的Linux 2.4版内核已经能够完全支持Intel 64位芯片架构。同时Linux也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。
Linux的不足
由于在现在的个人电脑操作系统行业中,微软的Windows系统仍然占有大部分的份额,绝大多数的软件公司都支持Windows。这使得Windows上的应用软件应有尽有,而其他的操作系统就要少一些。许多用户在换操作系统的时候都会考虑以前的软件能否继续使用,换了操作系统后是否会不方便。虽然Linux具有DOS、Windows模拟器,可以运行一些Windows程序,但Windows系统极其复杂,模拟器所模拟的运行环境不可能完全与真实的Windows环境一模一样,这就使得一些软件无法正常运行。
许多硬件设备面对Linux的驱动程序也不足,不少硬件厂商是在推出Windows版本的驱动程序后才编写Linux版的。但一些大硬件厂商在这方面做得还不错,他们的Linux版驱动程序一般都推出得比较及时。
软件支持的不足是Linux最大的缺憾,但随着Linux的发展,越来越多的软件厂商会支持Linux,它应用的范围也越来越广。这只小企鹅的前景是十分光明的。
❻ Linux内核API完全参考手册的目录
前言 本书使用方法第1章 Linux内核API分析必备知识 1Linux内核编程注意事项 1本书中模块编译Makefile模板 1内核调试函数printk 2内核编译与定制 4温馨提示 10参考文献 11第2章 Linux内核模块机制API 12函数:__mole_address ( ) 12函数:__mole_ref_addr ( ) 14函数:__mole_text_address ( ) 16函数:__print_symbol ( ) 18函数:__symbol_get ( ) 20函数:__symbol_put ( ) 22函数:find_mole ( ) 24函数:find_symbol ( ) 27函数:mole_is_live ( ) 30函数:mole_put ( ) 32函数:mole_refcount ( ) 34函数:sprint_symbol ( ) 36函数:symbol_put_addr ( ) 38函数:try_mole_get ( ) 40函数:use_mole ( ) 42参考文献 44第3章 Linux进程管理内核API 45函数:__task_pid_nr_ns( ) 45函数:find_get_pid( ) 47函数:find_pid _ns( ) 49函数:find_task_by_pid_ns( ) 51函数:find_task_by_pid_type _ns( ) 53函数:find_task_by_vpid( ) 55函数:find_vpid( ) 57函数:get_pid( ) 59函数:get_task_mm( ) 60函数:is_container_init( ) 63函数:kernel_thread( ) 65函数:mmput( ) 67函数:ns_of_pid( ) 69函数:pid_nr( ) 71函数:pid_task( ) 73函数:pid_vnr( ) 75函数:put_pid( ) 77函数:task_active_pid_ns( ) 79函数:task_tgid_nr_ns( ) 81参考文献 83第4章 Linux进程调度内核API 84函数:__wake_up( ) 84函数:__wake_up_sync( ) 87函数:__wake_up_sync_key( ) 89函数:abort_exclusive_wait( ) 91函数:add_preempt_count( ) 95函数:add_wait_queue( ) 97函数:add_wait_queue_exclusive( ) 100函数:autoremove_wake_function( ) 102函数:complete( ) 106函数:complete_all( ) 108函数:complete_done( ) 111函数:current_thread_info( ) 113函数:default_wake_function( ) 115函数:do_exit( ) 118函数:finish_wait( ) 120函数:init_waitqueue_entry( ) 123函数:init_waitqueue_head( ) 125函数:interruptible_sleep_on( ) 127函数:interruptible_sleep_on_timeout( ) 130函数:preempt_notifier_register ( ) 133函数:preempt_notifier_unregister ( ) 136函数:prepare_to_wait( ) 139函数:prepare_to_wait_exclusive( ) 142函数:remove_wait_queue( ) 146函数:sched_setscheler( ) 149函数:set_cpus_allowed_ptr( ) 152函数:set_user_nice( ) 155函数:sleep_on( ) 158函数:sleep_on_timeout( ) 160函数:sub_preempt_count( ) 162函数:task_nice( ) 164函数:try_wait_for_completion( ) 166函数:wait_for_completion( ) 169函数:wait_for_completion_interruptible( ) 172函数:wait_for_completion_interruptible_ timeout( ) 175函数:wait_for_completion_killable( ) 179函数:wait_for_completion_timeout( ) 182函数:wake_up_process( ) 184函数:yield( ) 187参考文献 188第5章 Linux中断机制内核API 189函数:__set_irq_handler( ) 189函数:__tasklet_hi_schele( ) 191函数:__tasklet_schele( ) 194函数:disable_irq( ) 196函数:disable_irq_nosync( ) 196函数:disable_irq_wake( ) 198函数:enable_irq( ) 201函数:enable_irq_wake( ) 203函数:free_irq( ) 205函数:kstat_irqs_cpu( ) 207函数:remove_irq( ) 209函数:request_irq( ) 213函数:request_threaded_irq( ) 216函数:set_irq_chained_handler( ) 219函数:set_irq_chip( ) 221函数:set_irq_chip_data( ) 225函数:set_irq_data( ) 227函数:set_irq_handler( ) 229函数:set_irq_type( ) 232函数:set_irq_wake( ) 234函数:setup_irq( ) 237函数:tasklet_disable( ) 239函数:tasklet_disable_nosync( ) 241函数:tasklet_enable( ) 243函数:tasklet_hi_enable( ) 244函数:tasklet_hi_schele( ) 246函数:tasklet_init( ) 248函数:tasklet_kill( ) 250函数:tasklet_shele( ) 252函数:tasklet_trylock( ) 254函数:tasklet_unlock( ) 255参考文献 257第6章 Linux内存管理内核API 258函数:__free_pages( ) 258函数:__get_free_pages( ) 258函数:__get_vm_area( ) 260函数:__krealloc( ) 262函数:alloc_pages( ) 265函数:alloc_pages_exact( ) 268函数:alloc_vm_area( ) 270函数:do_brk( ) 272函数:do_mmap( ) 273函数:do_mmap_pgoff( ) 276函数:do_munmap( ) 279函数:find_vma( ) 281函数:find_vma_intersection( ) 284函数:free_pages( ) 286函数:free_pages_exact( ) 287函数:free_vm_area( ) 288函数:get_unmapped_area( ) 288函数:get_user_pages( ) 290函数:get_user_pages_fast( ) 292函数:get_vm_area_size( ) 294函数:get_zeroed_page( ) 295函数:kcalloc( ) 297函数:kfree( ) 299函数:kmalloc( ) 299函数:kmap_high( ) 301函数:kmem_cache_alloc( ) 303函数:kmem_cache_create( ) 305函数:kmem_cache_destroy( ) 308函数:kmem_cache_free( ) 308函数:kmem_cache_zalloc( ) 309函数:kmemp( ) 311函数:krealloc( ) 313函数:ksize( ) 315函数:kstrp( ) 318函数:kstrnp( ) 319函数:kunmap_high( ) 321函数:kzalloc( ) 321函数:memp_user( ) 323函数:mempool_alloc( ) 325函数:mempool_alloc_pages( ) 327函数:mempool_alloc_slab( ) 329函数:mempool_create( ) 331函数:mempool_create_kzalloc_pool ( ) 333函数:mempool_destroy( ) 334函数:mempool_free( ) 335函数:mempool_free_pages( ) 335函数:mempool_free_slab( ) 336函数:mempool_kfree( ) 336函数:mempool_kmalloc( ) 337函数:mempool_kzalloc( ) 339函数:mempool_resize( ) 341函数:nr_free_buffer_pages( ) 343宏:page_address( ) 345宏:page_cache_get( ) 346宏:page_cache_release( ) 348函数:page_zone( ) 349宏:probe_kernel_address( ) 352函数:probe_kernel_read( ) 354函数:probe_kernel_write( ) 355函数:vfree( ) 357函数:vma_pages( ) 358函数:vmalloc( ) 359函数:vmalloc_to_page( ) 361函数:vmalloc_to_pfn( ) 363函数:vmalloc_user( ) 365参考文献 366第7章 Linux内核定时机制API 368函数:__round_jiffies( ) 368函数:__round_jiffies_relative( ) 369函数:__round_jiffies_up( ) 371函数:__round_jiffies_up_relative( ) 373函数:__timecompare_update( ) 375函数:add_timer( ) 377函数:current_kernel_time( ) 378函数:del_timer( ) 380函数:del_timer_sync( ) 382函数:do_gettimeofday( ) 384函数:do_settimeofday( ) 386函数:get_seconds( ) 388函数:getnstimeofday( ) 390函数:init_timer( ) 391函数:init_timer_deferrable( ) 393函数:init_timer_deferrable_key( ) 395函数:init_timer_key( ) 398函数:init_timer_on_stack( ) 400函数:init_timer_on_stack_key( ) 402函数:mktime( ) 404函数:mod_timer( ) 406函数:mod_timer_pending( ) 408函数:ns_to_timespec( ) 410函数:ns_to_timeval( ) 412函数:round_jiffies( ) 414函数:round_jiffies_relative( ) 416函数:round_jiffies_up( ) 418函数:round_jiffies_up_relative( ) 420函数:set_normalized_timespec( ) 422函数:setup_timer( ) 424函数:setup_timer_key( ) 426函数:setup_timer_on_stack( ) 428函数:setup_timer_on_stack_key( ) 430函数:timecompare_offset( ) 432函数:timecompare_transform( ) 435函数:timecompare_update( ) 436函数:timer_pending( ) 439函数:timespec_add_ns( ) 441函数:timespec_compare( ) 442函数:timespec_equal( ) 444函数:timespec_sub( ) 446函数:timespec_to_ns( ) 448函数:timeval_compare( ) 450函数:timeval_to_ns( ) 452函数:try_to_del_timer_sync( ) 453参考文献 456第8章 Linux内核同步机制API 457函数:atomic_add( ) 457函数:atomic_add_negative( ) 458函数:atomic_add_return( ) 460函数:atomic_add_unless( ) 461宏:atomic_cmpxchg( ) 463函数:atomic_dec( ) 464函数:atomic_dec_and_test( ) 466函数:atomic_inc( ) 467函数:atomic_inc_and_test( ) 469宏:atomic_read( ) 470宏:atomic_set( ) 471函数:atomic_sub( ) 472函数:atomic_sub_and_test( ) 474函数:atomic_sub_return( ) 475函数:down( ) 477函数:down_interruptible( ) 479函数:down_killable( ) 481函数:down_read( ) 483函数:down_read_trylock( ) 485函数:down_timeout( ) 487函数:down_trylock( ) 489函数:down_write( ) 491函数:down_write_trylock( ) 492函数:downgrade_write( ) 494宏:init_rwsem( ) 496宏:read_lock( ) 498函数:read_seqbegin( ) 499函数:read_seqretry( ) 500宏:read_trylock( ) 503宏:read_unlock( ) 504宏:rwlock_init( ) 505函数:sema_init( ) 508宏:seqlock_init( ) 509宏:spin_can_lock( ) 511宏:spin_lock( ) 513宏:spin_lock_bh( ) 514宏:spin_lock_init ( ) 516宏:spin_lock_irq( ) 518宏:spin_lock_irqsave( ) 520宏:spin_trylock( ) 522宏:spin_unlock( ) 525宏:spin_unlock_bh( ) 526宏:spin_unlock_irq( ) 526宏:spin_unlock_irqrestore( ) 527宏:spin_unlock_wait( ) 527函数:up( ) 529函数:up_read( ) 531函数:up_write( ) 532宏:write_lock( ) 532函数:write_seqlock( ) 534函数:write_sequnlock( ) 534宏:write_trylock( ) 535宏:write_unlock( ) 537参考文献 537第9章 Linux文件系统内核API 539函数:__mnt_is_readonly( ) 539函数:current_umask( ) 541函数:d_alloc( ) 542函数:d_alloc_root( ) 544函数:d_delete( ) 547函数:d_find_alias( ) 547函数:d_invalidate( ) 549函数:d_move( ) 550函数:d_validate( ) 551函数:dput( ) 553函数:fget( ) 554函数:find_inode_number( ) 557函数:generic_fillattr( ) 559函数:get_empty_filp( ) 561函数:get_fs_type( ) 563函数:get_max_files( ) 565函数:get_super( ) 566函数:get_unused_fd( ) 569函数:have_submounts( ) 570函数:I_BDEV( ) 572函数:iget_locked( ) 573函数:inode_add_bytes( ) 575函数:inode_get_bytes( ) 576函数:inode_needs_sync( ) 578函数:inode_set_bytes( ) 580函数:inode_setattr( ) 581函数:inode_sub_bytes( ) 584函数:invalidate_inodes( ) 586函数:is_bad_inode( ) 587函数:make_bad_inode( ) 588函数:may_umount( ) 590函数:may_umount_tree( ) 591函数:mnt_pin( ) 593函数:mnt_unpin( ) 594函数:mnt_want_write( ) 596函数:new_inode( ) 596函数:notify_change( ) 598函数:put_unused_fd( ) 600函数:register_filesystem( ) 602函数:unregister_filesystem( ) 604函数:unshare_fs_struct( ) 604函数:vfs_fstat( ) 606函数:vfs_getattr( ) 608函数:vfs_statfs( ) 610参考文献 613第10章 Linux设备驱动及设备管理API 614函数:__class_create( ) 614函数:__class_register( ) 615函数:cdev_add( ) 616函数:cdev_alloc( ) 617函数:cdev_del( ) 619函数:cdev_init( ) 624宏:class_create( ) 628函数:class_destroy( ) 629宏:class_register( ) 631函数:class_unregister( ) 632函数:device_add( ) 637函数:device_create( ) 638函数: device_del( ) 640函数:device_destroy( ) 640函数:device_initialize( ) 646函数:device_register( ) 652函数:device_rename( ) 652函数:device_unregister( ) 657函数:get_device( ) 663函数:put_device( ) 663函数:register_chrdev( ) 667函数:register_keyboard_notifier( ) 668函数:unregister_chrdev( ) 669函数:unregister_keyboard_notifier( ) 675部分相关函数说明 679参考文献 679附录 Linux内核API快速检索表 680