linux内核工具
GNU toolchain工具链
包含binutils/gcc/glibc
binutils包含链接器,汇编器等处理obj文件的工具
gcc是编译器
glibc是GNU的标准C库
这是一个最小集合,除此之外工具链还有其他的一些工具,比如:
make,tar,ncurses等等
参考资料是如何从源代码构造Linux(LFS)关于工具链的说明
B. 详细介绍Linux内核开发工具都有哪些
1、Source Insight
Source Insight是Windows平台下一款流行度极高的源码阅读和编辑工具。不少Linux开发人员还是习惯于在Windows下进行源码编辑,甚至查看和编辑Linux内核源码,依然在Source Insight中完成。
说明:Source Insight是一款版权软件,需要自行解决版权问题。
安装Source Insight软件后,新建一个工程,取名并指定数据存放位置,如图 1.1所示。
图 1.1 新建工程
点击OK按钮,进入工程设置界面,如图 1.2所示。
图 1.2 工程设置
然后添加源码。浏览选中Linux内核源码文件夹后,点击“Add Tree”按钮,将内核源码树的全部文件添加到工程中,如图 1.3所示。
图 1.3 添加内核源码
添加完成,即可在Source Insight中进行源码阅读和编辑了,如图 1.4所示。
图 1.4 在Source Insight中阅读源码
2、Eclipse
Eclipse是一个跨平台IDE,既能运行于Windows平台,也能在Linux下运行。不少习惯于图形界面操作的开发人员,在Linux下则习惯于用Eclipse来查看和编辑Linux源码。
如果仅仅是在Eclipse中查看Linux内核源码,则可以不必事先安装交叉编译器,否则则须事先安装好交叉编译器。
创建内核源码工程。点击FileàNewàProject,开始创建工程,在工程创建界面选择创建C工程,如图 1.5所示。
图 1.5 创建C工程
点击Next,在C Project界面的Project name栏中填写工程名称,去掉“Use default location”的勾,点击Browse将Location设置为Linux内核源码目录,如图 1.6所示。如果不在Eclipse中编译内核,则使用Linux GCC即可,否则请使用安装好的Cross GCC。
图 1.6 导入Linux内核源码
然后点击Finish,完成Linux内核源码导入,在Eclipse中即可进行代码阅读和编辑了,如图 1.7所示。
图 1.7 在Eclipse中浏览内核源码
在Eclipse中进行源码跟踪,只需选择函数、变量或者宏定义后按F3即可。更多的操作可在Navigate中找到。
3、vim+ctags+cscope
Vi/Vim是一个文本编辑器,在Vim中能高效的实现代码编辑。但Vim的功能不仅仅是一个文本编辑器,借助ctags和cscope的配合,Vim能实现堪比图形IDE环境的源码编辑和阅读功能,在某种程度上甚至比图形IDE更方便。
Vi/Vim的安装不再介绍了。如果不是通过远程登录在远程服务器上工作,而是在本地桌面系统操作,还可以用gvim启动Vi编辑器。
Taglist
Taglist是Vim的一个源码浏览插件,可从http://www.vim.org网站获得。下载到压缩包后,在本地解压,然后将解压得到目录中的plugin目录复制到~/.vim目录。如果用户主目录下没有.vim目录,则建立一个这样的目录即可。
Ctags
Ctags是一个用于产生tags文件的软件,可以下载源码进行编译安装,在Ubuntu下,可通过apt-get进行安装:
sudo apt-get install exuberant-ctags
源码阅读和跟踪
进入准备查看的源码所在目录,首先生成tags文件:
ctags -R
执行时间长短取决于源码数量的多少,执行完毕,在当前目录下可看到一个tags文件。源码越多,执行时间越长,产生的tags文件也越大。
注意:如果修改了源码,代码行号发生了变化,需要重新生成tags文件。
(1)查看函数等定义。用Vi/Vim打开一个C文件。若想知道某个函数、变量、结构或者宏定义在什么地方定义,先将光标移动到函数(变量、结构或者宏定义)上,然后按CTRL+]即可。查看后,按CTRL+o可回到原来所在位置。
(2)查看文件函数列表。打开C文件后,在Vi/Vim的命令状态下输入:TlistToggle(Vi/Vim的命令输入支持补全),在Vi/Vim左边就会出现函数列表侧栏,如图 1.8所示。按CTRL+ww(2次w),可在列表和代码查看区间切换。
图 1.8 Vi/Vim的函数列表侧栏
如果在本地桌面,用Gvim打开C文件,使用起来比较接近IDE集成环境。用鼠标双击函数即可跳转到函数定义的地方,CTRL+鼠标右键即可回退到原来所在位置。更多实用特性,还需要在实际操作中体验。
4、LXR
LXR是Linux Cross Referencer的缩写,是一个比较流行的Linux源码查看工具,当然也不仅仅局限于查看Linux源码。LXR的下载地址为:http://lxr.sourceforge.net,参考该网站的安装说明,很容易在本机搭建一个本地LXR用于源码查看。
如果不想搭建本地LXR,可以直接浏览已经搭好的LXR网站,推荐两个网站:一个是开源中国网站提供的Linux源码在线阅读http://lxr.oss.org.cn,另一个是http://lxr.free-electrons.com网站,前者速度较快,但是提供的Linux内核版本较少,后者则提供的版本较多。网站提供了源码阅读、关键字搜索和自由文本搜索功能。两者的网页快照分别如图 1.9和图 1.10所示。
C. linux内核探索
对待知识领域,我们总喜欢去下一个定义。操作系统是我们每天工作都要使用的东西,由于现代商业操作系统的复杂性和没有统一的标准,若对一个操作系统下定义并不能精确的描述操作系统所属领域。根据经验我们可以认为操作系统就是在整个应用系统中负责最基本功能和系统管理的那部分。包括内核、设备驱动程序、启动引导程序、命令行Shell或者GUI界面、基本文件管理工具和系统工具。
严格的来讲linux只是操作系统内核本身,广义上的linux则常用来指基于linux内二的完整的操作系统,它包括GUI组件和其它许多工具。
GUI其实只是操作系统的表象,内核才是操作系统内在的核心。系统的其它部分必须依靠内核所提供的服务,像管理硬件设备、分配系统资源等,内核有时候被称为管理者或者操作系统核心。
通常一个内核由负责响应中断的中断服务程序,负责进程调度的CPU调度程序,负责管理进程地址空间的内存管理程序以及网络、进程间通信等系统服务共同组成的。
内核在有安全机制的操作系统中不同于普通程序,一般处于系统态(内核态),拥有受保护的内存空间和访问硬件设备的所有权限。这种系统状态和被保护起来的内存空间,统称为 内核空间 。
与内核空间相对的,用户所执行的应用程序在用户空间执行。用户态的应用程序只能访问允许它们使用的系统资源,并且只使用某些特定的系统功能,不能直接访问硬件,也不能访问内核划分给其它应用程序的内存空间。
应用程序通过系统调用来和内核通信,当一个应用程序发起系统调用时,内核便代其执行。在这种情况下应用程序通过系统调用在内核空间运行,而内核被称为运行在进程上下文中。应用程序通过系统调用进入内核空间时应用完成其工作的基本方式。
操作系统内核可分为两大阵营:单内核和微内核。
单内核是一种较为简单的设计,通常以单个静态二进制文件存储在磁盘中,整体上作为一个单独的大过程,所有的内核服务都在这样的一个大内核地址空间上运行。内核服务都处于内核态,并身处同一内核地址空间,之间可以几乎无性能损耗的相互通信。
单内核具有简单和高性能等特点。
微内核根据功能被分割成多个独立的过程,每个过程都叫做一个服务器。所有的服务器都运行在各自的地址空间上(大部分处于用户空间),只有强烈请求特权服务的服务器才运行在特权模式下。
微内核服务器之间不能直接调用函数通信,而是通过 消息传递 通信。系统采用进程间通信(IPC)机制,服务之间各自独立,通过IPC互换消息,有效的避免了服务之间的失败传染。
IPC机制的开销远高于函数调用,而且在运行时还会牵扯到内核空间和用户空间上下文切换,所以消息传递需要一些开销。所以在内核的实际实现上大部分微内核的操作系统也会让大部分的服务放置与内核中,这样就可以直接调用函数,消除消息传递的开销。
windows NT和Mach(Mac OS X)都是典型的微内核,不过在实际实现上,其所有服务都运行在内核空间。
linux是一个单内核,不过linux汲取了微内核的精华,并拥有模块化设计、抢占式内核、支持内核线程以及动态装载内核模块等特性。
linux内核在设计时充分参考了已有的很多UNIX的内核实现,并且有一些创新方案。linux内核和传统的UNIX系统之间存在一些显着的差异:
本文的写作和学习中参考了以下资料
1.《Linux Kenel Development ~ Thrid Edition 》
D. linux内核
这个因该是2.2以后的版本有了ia64,上面写的1992,可能不是正式版本,不好认