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

<]inux/head.h> head标头档,定义了段描述符的简单结构,和几个选择符常数。
內核标头档。含有一些內核常用函数的原形定义。
记忆体管理标头档。含有页面大小定义和一些页面释放函数原型。
程式标头档,定义了任务结构task_struct、初始任务0的资料。
还有一些有关描述符参数设置和获取的嵌入式组合函数巨集式。
系统呼叫标头档。含有72个系统呼叫C函数处理程式,以‘sys_’开头。
tty标头档,定义了有关tty_io,串列通信方面的参数、常数。


系统专用资料结构子目录include/sys

档案状态标头档。含有档或档案系统状态结构stat{ }和常数。
定义了行程中执行时间结构tms以及times( )函数原型。
类型标头档。定义了基本的系统资料类型。
系统名称结构标头档o
等待呼叫标头档。定义系统呼叫wait( )核waitpid( )及相关常数符号。


5.10.5 內核初始化程式目錄init

该目錄中仅包含一个档main.c。用于执行內核所有的初始化工作,然后移到用戶模式建立新行程,并在控台装置上执行shell程式。

程式首先根据机器记忆体的多少对缓冲区记忆体容量进行分配,如果还设置了要使用虛拟碟,则在缓冲区记忆体后面也为它留下空间。之后就进行所有硬件的初始化工作,包括人工建立第一个任务(task 0) ,並设置了中断允许标志。在执行从核心态移到用戶态之后,系统第一次呼叫建立行程函数fork( ),建立出一个用於执行init( )的行程,在该子行程中,系统将进行主控台环境设置,並且在生成一个子行程用来执行shell程式。


5.10.6 內核程式主目黪kernel

Linux/kernel目錄中共包含12个代码档和一个Makefile档,另外还有3个子目錄。所有处理任务的程式都保存在kernel/目錄中,其中包括象fork、exit、调度程式以及一些系统呼叫程式等。还包括处理中断異常和陷阱的处理过程。子目錄中包括了低层的装置驱动程式,如get_hd_block和try_write等。由于这些档中代码之间呼叫关系复杂,因此这裡就不详细列出各档之间的引用关系图,但仍然可以进行大概分类,见图5-30所示。







asm.s程式是用於处理系统硬件异常所引起的中断,对各硬件異常的实际处理程式则是在traps.c档中,在各个中断处理过程中,将分別呼叫traps.c中相应的C语言处理函数。

exit.c程式主要包括用於处理行程终止的系统呼叫。包含行程释放、会话(行程组)终止和程式退出处理函数以及杀死行程、终止行程、掛起行程等系统呼叫函数。

fork.c程式给出了sys_fk( )系统呼叫中使用了两个C语言函数:
find_empty_process( )和copy ocess( )。

mktime.c套件程式含一个内核使用的时间函数mktime( ),用於计算从1970年1月l日0时起到开机当日的秒数,作为开机秒时间。仅在init/main.c中被呼叫一次。

panic.套件程式含一个显示内核出错资讯並停机的函数panic( )。
printk.c套件程式含一个内核专用资讯显示函数printk( )。
sched.c程式中包括有关调度的基本函数(sleep_on、wakeup、schedule等)以及一些简单的系统呼叫函数。另外还有几个与定时相关的软碟操作函数。

signal.c程式中包括了有关信号处理的4个系统呼叫以及一个在对应的中断处理程式中处理信号的函数do_signal( )。
sys.c程式包括很多系统呼叫函数,其中有些还沒有实现。
system_call.s程式实现了Linux系统呼叫(int Ox80)的介面处理过程,实际的处理过程则包含在各系统统呼叫相应的C语言处理函数中,这些处理函数分佈在整个Linux內核代码中。

vsprintf.c程式实现了现在已经归入标準程式库函数中的字串格式化函数。

区块装置驱动程式子目录kernel/blk_drv

通常情況下,用戶是透过档案系统来存取装置的,因此装置驱动程式为档案系统实现了呼叫介面。在使用区块装置时,由於其资料吞吐量大,为了能夠高效率地使用区块装置上的资料,在用戶行程与区块装置之间使用了高速缓冲机制。在存取区块装置上的资料时,系统首先以资料块的形式把区块装置上的资料读入到高速缓冲区中,然后在提供给用戶。blk_drv子目錄共包含4个c档和标头档。标头档blk.h由于是区块装置程式专用的,所以与C档放在一起。这几个档之间的大致关系,见图5-3l所示。







字元装置驱动程式子目錄kernel/chr_drv

字元装置程式子目錄共含有4个C语言程式和2个组合语言程式档。这些档案实现了对序列端口rs-232、串列终端、键盘和主控台终端装置的驱动。图5-32是这些档案之间的大致呼叫层关系。







tty_iov.c程式中包含tty字装置读函数tty_read( )和写函数tty_write( ),为档案系统提供了上层存取介面。另外还包括在串列中断处理过程中呼叫的C函数do_tty_interrupt( ),该函数将会在中断类型为读字元的处理中被呼叫。

Console.c档主要包含主控台初始化程式和主控台写函数con_write( ),用於被tty装置呼叫。还包含对显示器和键盘中断的初始化设置程式con_init( )。

rs_io.s组合语言程式用于实现两个串列介面的中断处理程式。该中断处理程式会根据从中断标识寄存器(端口0x3fa或0x2fa)中取得的4种中断类型分別进行处理,並在处理中断类型为读字元的代码中呼叫do_tty_interrupt( )。

serial.c用於对非同步串列通信晶片UART进行初始化操作,並设置两个通信端口的中断向量。另外还包括tty用于往串口输出的rs_write( )函数。

tty_ioctl.c程式实现了tty的io控制介面函数tty_ioctl( )以及对termio(s)终端io结构的读写函数,並会在实现系统呼叫sys_ioctl( )的fs/ioctl.c程式中被呼叫。

keyboard.s程式主要实现了键盘中断处理过程keyboard_interrupt。

辅助运算器模拟和操作程式子目录kernel/math

该子目錄中目前仅有一个C程式式math_emulate.c。其中的math_emulate( )函数是中断int7的中断处理程式呼叫的C函数。当机器中沒有数学辅助运算器,而CPU卻又执行了辅助运算器的指令时,就会引发该中断。因此,使用该中断就可以用软体来模拟辅佐算器的功能。本文章所讨论的內核版本还沒有包含有显辅助运算器的模拟代码。本程式中只是列印一条出错资讯,並向用戶程式发送一个辅助运算器错误信号SIGFPE。
共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
转载本站内容请注明原作者名.谢谢!