首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
深入学习LINUX内核之七(图文讲解)
来源:http://www.unix5.com 作者:riechelr_hl 发布时间:2008-04-15  


任务0的內核态堆栈是在其人工设置的初始化任务资料结构中指定的,而它的用戶态堆栈是在执行move_to_user_mode( )时,在类此iret返回之前的堆栈中设置的,参见图5-22所示。我们知道,当进行特权级会发生变化的控制权转移时,目的代码会使用新特权级的堆栈,而原特权级代码堆栈指标将保留在新堆栈中。因此这里先把任务0用户堆栈指标压入当前处於特权级O的堆栈中,同时把代码指标也压入堆栈,然后执行IRET指令即可实现把控制权从特权级0的代码转移到特权级3的任务O中。在这个人工设置內容的堆栈中,原esp值被设
置成仍然是user_stack中原来的位置值,而原ss段选择符被设置成0x17,即设置成用戶态区域表LDT中的资料段选择符。然后把任务0代码段选择符0xlf压入堆栈作为堆栈中原CS 段的选择符,把下一条指令的指标作为原EIP压入堆栈。这樣,透过执行IRET指令即可“返回”到任务0的代码中继续执行了。


5.8.3 任务內核态堆栈与用戶态堆栈之间的切換

在Linux 0.12系统中,所有中断服务程式部属於內核代码。如果一个中断產生时任务正在用戶代码中执行,那麼该中断就会引起CPU特权级从3级到O级的变化,此时CPU就会进行用戶态堆栈到內核态堆栈的切換操作。CPU会从当前任务的任务状态段TSS中取得新堆栈的段选择符和偏移值。因为中断服务程式在內核中,属於0级特权级代码,所以48Bit的內核态堆栈指标会从TSS的ss0和espO栏位中获得。在定位了新堆栈(內核态堆栈)之后,CPU就会首先把原用戶态堆栈指标ss和esp压入內核态堆栈,随后把标志寄存器eflags的內容和返回位置cs、eip压入核态堆栈。

內核的系统呼叫是一个软件中断,因此任务呼叫系统呼叫时就会进入內核並执行內核中的中断服务代码。此时內核代码就会使用该任务的內核态堆栈进行操作。同樣,当进入內核程式时,由於特权级別发生了改变(从用戶态转到內核态),用戶态堆栈的堆栈段和堆栈指标以及eflags会被保存在任务的內核态堆栈中。而在执行iret退出內核程式返回到用戶程式时,将恢复用戶态的堆栈和eflags。这个过程见图5-27所示。







如果一个任务正在內核态中执行,那么若CPU回应中断就不再需要进行堆栈切換操作,因为此时该任务执行的內核代码已经在使用內核态堆栈,並且不涉及优先级別的变化,所以CPU 直把eflags和中断返回指标cs、eip压入当前內核态堆栈,然后执行中断服务过程。

5.9 Linux 0.12用的档案系统

內核代码若要正常执行就需要档案系统的支援。用於向內核提供最基本资讯和支援的是根档案系统,即Linux系统引导啟动时,预设使用的档案系统是根档案系统。其中包括作业系统最起码的一些配置档和命令执行程式。对於Linux系统中使用的UNIX类档案系釉 其中主要包括一些规定的目錄、配置档、装置驱动程式、开发程式以及所有其他用戶资料或文字档案等。其中一般都包括以下一些子目錄和档案:

etc/ 目錄主要含有一些系统配置档;
dev/ 含有装置特殊档,用于使用档操作语句操作装置;
bin/ 存放系统执行程式。列如sh、mkfs、fdisk等;
usr/ 存放程式库函数、手册和其他一些文件;
usr/bin 存放用戶常用的普通命令;
var/ 用於存放系统执行时可变的资料或者是日誌等资讯。


存放档案系统的装置就是档案系统装置。比如,对于一般使用的Windows 2000作业系统,硬碟C就是档案系统装置,而硬碟上按一定规则存放的档案就组成档案系统,Windows 2000有NTFS或FAT32等档案系统。而Linux 0.12內核所支援的档案系统是MINIX 1.0档案系统。目前Linux系统上使用最广泛的则是ext2或ext3档案系统。

对於第l章中介绍对于在软碟上执行的Linux 0.12系统,它由简单的2张软碟组成:bootimage磁碟和rootimage磁碟。bootimage是开机啟动Image档,其中主要包括磁片开机磁区代码、作业系统载入程式和內核执行代码。rootimage就是用於向內核提供最基本支援的根档案系统。这两个磁碟合起来就相当於一张可啟动的DOS作业系统碟。

当linux啟动磁碟载入根档案系统时,会根据啟动磁碟上开机磁区第509、51O位元组处一个字(ROOT_DEV)中的根档案系统装置号从指定的装置中载入根档案系统。如果这个装置号是0的话,则表示需要从开机碟所在当前驱动器中载入根档案系统。若该装置号是一个硬碟分区装置号的话,就会从该指定硬碟分区中载入根档案系统。


5.10內核原始码的目錄结构

由於Linux內核是种內核模式的系统,因此,內核中所有的程式几乎都有紧密的关联,它们之间的依赖和呼叫关系非常密切。所以在閱读一个原始码档时往往需要参閱其他相关的档案。因此有必要在开始閱读內核原始码之前,先熟悉一下原始码档的目錄结构和安排。

这裡我们首先列出Linux內核完整的原始码目錄,包括其中的子目錄。然后逐一介绍各个目錄中所包含程式的主要功能,使得整个內核原始码的安排形式能在我们的头脑中建立起一 大概的框架,以便於下一章开始的原始码閱读工作。

当我们使用tar命令将linux-0.12.tar.gz解开时,內核原始码档被放到了linux/目錄中。其中的目录结构见图5-28所示:






该內核版本的原始码目錄中含有14个子目錄,总共包括102个代码档。下面逐个对这些子目錄中的內容进行描述。


5.10.1 内核目录linux
linux目錄是原始码的主目录,在该主目錄中除了包括所有的14个子目錄以外,还含有唯一的一个Makefile档。该档是编译辅助工具软体make的参数配置档。make工具软体的主要用途是透过识別哪些档案已被修改过,从而自动地決定在一个含有多个根源程式档的程式系统中哪些档案需要被重新编译。因此,make工具软体是程式专案的管理软件。

linux目錄下的这个Makefile档还巢状呼叫了所有子目錄中包含的Makefile档,这樣,当linux目錄(包括子目錄)下的任何档被修改过时,make都会对其进行重新编译。因此为了编译整个內核所有的原始码档,只要在linux目錄下执行一次make软体即可。


5.10.2 开机啟动程式目录boot
boot目錄中含有3个组合语言档,是內核原始码档中最先被编译的程式。这3个程式完成的主要功能是当计算机加电时开机內核啟动,将內核代码载入到记忆体中,並做一些进入32位元保护执行方式前的系统初始化工作。其中bootsect.s和setup.s程式需要使用as86 软件来编译,使用的是as86的组合语言格式(与微软的类似),而head.s需要用GNU as来编译,使用的是AT&T格式的组合语言。这两种组合语言在下一章的代码注释裡以及代码列表后面的說明中会有简单的介绍。
共12页: 上一页 [1] [2] [3] [4] [5] [6] [7] 8 [9] [10] [11] [12] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux 2.6.11内核文件IO系统调用
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·深入分析 Linux操作系统的内核链
·Linux内核可装载模块对设备驱动
·概述Linux系统的驱动框架及驱动
·详解Linux 2.6内核新文件系统变
·Linux系统可卸载内核模块完全指
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
  相关文章
·深入学习LINUX内核之六(图文讲解
·深入学习LINUX内核之五(图文讲解
·深入学习LINUX内核之四(图文讲解
·Linux系统内核漏洞分析
·深入学习LINUX内核之三(图文讲解
·如何在Linux内核中的实现SYN Coo
·深入学习LINUX内核之二(图文讲解
·简析Linux与FreeBSD的syscall
·深入学习Linux内核文档一(图文讲
·Linux操作系统“警惕”内核汉化
·Linux操作系统核心的汉字显示机
·如何利用异常表处理Linux内核态

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!