012内核组织架构_第1页
012内核组织架构_第2页
012内核组织架构_第3页
012内核组织架构_第4页
012内核组织架构_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、0.12 内核有如下几下目录: Boot, Fs, Include ,Mm, Init, Kernel, Lib, Tools, 最外层有一个总 的 MakeFile.各目录文件分布情况如下:Boot: bootsect.S setup.S head.s其中后缀.S大写表明:as使用GNUC编译器的预处理功能引导启动程序bootsect.S将setup.S代码和system模块加载到内存中,并且分别把自己 和setup.S代码移动到物理内存0x90000和0x90200处,就把执行权交给了 setup程序。其中system模块的首部包含 head.s代码。Setup程序的主要作用是利用ROM

2、BIOS的中断程序获取机器的一些基本参数,并保存在 0x90000 开始的内存块中,供后面程序使用。同时把 system 模块往下移动到物理地址 0x00000开始处,这样,system中的head.s代码就处在0x00000开始处了。然后加载描述符 表基地址到描述符表寄存器中,为进行 32位保护模式下的运行作好准备。接下来对中断控 制硬件进行重新设置,最后通过设置机器控制寄存器CR0并跳转到system模块的head.s代码开始处,使CPU进入32位保护模式下运行。Head.s代码主要作用是初步初始化中断描述符表中的2 5 6项门描述符,检查A20地址线是否已经打开, 测试系统是否含有数学协

3、处理器。 然后初始化内存页目录表, 为内存的 分页管理作好准备工作。最后跳转到system模块中的初始化程序init/main.c中继续执行。Init:main.cMain.c利用setup.s取得的系统参数设置系统的根文件设备号以及一些内存全局变量。然后内核进行硬件的初始化工作。包括陷阱门,块设备,字符设备,tty,包括人工设置第一个任务task0.然后设置中断允许标志开中断,main切换到任务0中运行。Tools:build.cBuild.c生成内核磁盘映像文件,单独编绎成可执行文件,在linux/目录下的M akefile文件中被调用运行,用于将所有内核编译代码链接和合并成一个可运行内核

4、映像文件Image.Mm:Swap.c Page.s Memory.c Makefilepage.s 包含页异常的中断处理过程(int 14),主要实现了对缺页和页写保护的处理。Memory.c 是内存页面管理的核心文件,用于内存的初始化操作,页目录和页表的管理和 内核其他部分对内存申请的处理过程。Swap.c 是内存页面交换管理文件, 其中主要包括映射位图管理函数和交换设备访问函数。Lib:write.c wait.c string.c setsid.c open.c malloc.c _exit.c execve.c errno.c dup.c ctype.c close.c_exit.c

5、: 程序调用内核的系统调用函数。 _asm(int 0x80:a(NR_exit),b(exit_code);Close.c:定义了文件关闭函数。_syscall1(i nt,close, in t ,fd)Ctype.c:为ctype.h提供辅助数据结构数据,用于对字符进行类型判断。Dup.c: 复制文件描述符函数。 _syscall1(int,dup,int ,fd)Errno.c:仅定义了一个出错号变量errno.Execve.c: 运 行 执 行 程 序 的 系 统 调 用 函 数 。 _syscall3(int ,execve,const char*,file,char *,argv

6、,char*, envp)Malloc.c: 内存分配函数。Open.c:Open 系统调用可将一个文件名转换成一个文件描述符。Setsid.c:setsid() 系统调用函数。 _syscall0(pid_t,setsid)String.c: 所有字符串操作函数存在于string.h 中。Wait.c: 包含函数 waitpid() 和 wait().wait() 系统调用直接调用 waitpid() 函数。Write.c:write() 函数向文件描述符指定的文件写入 count 字节的数据到缓冲区 buf 中。 _syscall3(int,write,int ,fd,const char

7、*,buf,off_t,count)FS:Truncate.c bitmap.c inode.c super.c buffer.c pipe.c stat.c open.c namei.c ioctl.c file_table.c file_dev.c fcntl.c exec.c block_dev.c char_dev.c read_write.c select.c 其中 file_table.c 是空的。高速缓冲区:Buffer.c :内核实现高速缓冲区的程序是buffer.c 。文件系统中其他程序通过指定需要访问的设备号和数据逻辑块号来调用它的块读写函数。这些接口函数有:块读取函数br

8、ead(),块提前预读函数breada()和页块读取函数 bread_page().文件系统底层函数:Bitmap.c 程序包含对 i 节点位图和逻辑块节点位图进行释放和占用处理函数。操作 i 节点位图的函数是 free_inode() 和 new_inode(), 操作逻辑块位图的函数是 free_block() 和 new_block().Truncate.c程序包括对数据文件长度截断为0的函数truncate().它将i节点指定的设备上文件长度截为 0.并释放文件数据占用的设备逻辑块。Inode.c程序包括分配i节点函数iget()和放回对内存i节点存取函数iput()以及根据i节点信

9、息取文件数据块在设备上对应的逻辑块号函数 bmap();Namei.c程序主要包括函数namei().使用iget(),iput(),bmap()将给定的文件路径名映射到其i节点。Super.c 程序专门用于处理文件系统超级块,包括函数 get_super(),put_super(),free_super(). 还 包括几个文件系统加载、卸载处理函数和系统调用。文件中数据的访问操作:文件数据的访问操作涉及 block_dev.c ,file_dev.c,char_dev.c,pipe.c 和 read_write.c. 前面 4 个文件可以认为是块设备, 字符设备,管道设备和普通文件与文件读写

10、系统调用的接口程序, 它们共同实现了read_write.c中的read()和write()系统调用。通过对被操作文件属性的判断,这两个系统调用会分别调用这些文件中的相关处理函数进行操作。Block_dev.c 中的函数 block_read() block_write() 是用于读写块设备特殊文件中的数据。所使 用的参数指定了要访问的设备号,读写的起始位置和长度。File_dev.c 中 file_read(),file_write() 通过指定文件对应的 i 节点和文件结构, 可以知道文件所 在的设备号和文件当前读写指针。Pipe.c 实现管道读写函数 read_pipe() write_

11、pipe(). 另外还实现了创建无名管道的系统调用 pipe().Char_dev.c:系统调用 read() ,write()通过调用 rw_char()实现Read_write.c: 实现了系统调用 read(),write(),lseek().文件和目录管理系统调用:文件系统调用上层实现: exec.c fcntl.c open.c ioctl.c stat.cOpen.c 实现与文件操作相关系统调用。主要有文件的创建,打开和关闭。文件宿主和属性 的修改,文件访问权限的修改,文件操作时间的修改和系统文件系统root 的变动等。Exec.c 实现对二进制可执行文件和 shell 脚本文件的

12、加载与执行。主要函数 do_execve() 是 系统中断调用(int0x80)功能号_NR_execve()调用的C处理函数,也是 exec()函数簇的主要 实现函数。Fcntl.c实现文件控制系统调用fcntl()和两个文件句柄复制系统调用dup()和dup2().dup2()指定了新句柄的数值,dup()返回当前值最小的未用句柄。Ioctl.c 文件实现了输入输出控制系统调用 ioctl(). 主要调用 tty_ioctl() 函数对终端 IO 进行控制。Stat.c实现取文件状态信息系统调用stat()和fstat().stat()利用文件名取信息fstat()利用文件句柄取信息。(文

13、件句柄即文件描述符)其他:select.c实现select系统调用。Kernel:Blk_drv Chr_drv Math Asm.s exit.c fork.c mktime.c panic.c printk.c sched.c signal.c sys.c sys_call.s traps.c vsprintf.c其中 Blk_drv 子目录: blk.h floppy.c hd.c ramdisk.c ll_rw_blk.cChr_drv 子目录: console.c keybord.s pty.c rs_io.c serial.c tty_io.c tty_ioctl.cMath 子目

14、录: add.c compare.c convert.c div.c ea.c error.c get_put.c mul.c math_emulate.c 中断处理程序:包括asm.s和traps.c文件Asm.s用于实现大部分硬件异常所引起的中断的汇编语言处理过程。Traps.c实现asm.s的中断处理过程中调用的C函数。系统调用处理相关程序: sys_call.s fork.c signal.c sys.c exit.cSys_call.s 主要实现系统调用中断 int0x80 的入口处理过程以及信号检测处理,同时给出了 sys_execve(),sys_fork() 这两个系统调用的底

15、层接口,还给出了协处理器出错,设备不存在, 时钟中断,硬盘中断,软盘中断的中断处理程序。Signal.c 涉及内核中信号处理函数。包括设置和获取信号阻塞码,信号处理系统调用,可靠 信号处理系统调用等。Exit.c 描述进程终止和退出的有关事宜。主要包括进程释放,会话终止和程序退出以及杀死进程,终止进程,挂起进程等系统调用函数。还包括进程信号发送函数sen d_sig()和通知父进程子进程中止的函数 tell_father()Fork.c:该程序是sys_fork()系统调用的辅助处理函数集,给出了 sys_fork()中使用的 find_empty_process ()禾口 copy_proc

16、ess ()函数。还包括内存区域验证 verify_area()禾口内存分酉己 copy_mem() 函数。Sys.c:包含很多系统调用功能实现函数。其他通用类程序: schedule.c mktime.c panic.c printk.c vsprintf.cSchedule.c包含内核调用最频繁的 schedule(),sleep_on(),wakeup()函数,是内核的核心调度程 序,用于对进程的执行进行切换或改变进程执行状态。 另外还包括有关系统时钟中断和软盘 驱动器定时的函数。Mktime.c: 包含内核使用的时间函数 mktime(), 仅在 init/main.c 中使用一次Pa

17、ni c.c:pa nic()函数用于在内核运行出现错误时显示出错信息并停机。Printk.c 以及 vsprintf.c 是内核显示信息的支持程序, 实现了内核专用显示函数 printf() 和字符 串格式化输出函数 vsprintf().块设备驱动程序:blk.h:定义请求等待队列中项的数据结构request,用宏语句定义了电梯搜索算法。Hd.c:提供对硬盘的读写驱动和初始化处理。包含以下函数:1,初始化硬盘和设置硬盘所用数据结构的sys_setup(),hd_init()2, 向硬盘控制器发送命令: hd_out()3, 处理硬盘当前请求项 do_hd_request()4. 硬盘中断处

18、理过程中调用的C 函数 read_intr(), write_intr(), bad_rw_intr(), recal_intr().5. 硬 盘 控 制 器 操 作 辅 助 函 数 controler_ready(), driive_busy(), win_result(),hd_out(), reset_controler() 等。Ll_rw_blk.c: 执行低层块设备读写操作,是块设备与系统其他部分的接口程序,其他程序通 过调用 ll_rw_block() 来读写块设备中的数据。该函数的主要功能是创建块设备读写请求项, 并插入到指定块设备请求队列中。 实际的读写操作则是由设备的请求项处

19、理函数 request_fn() 完成。硬盘 do_hd_request(),软盘 do_fd_request()虚拟盘 do_rd_request()Ramdisk.c:rd_init() 在 init/main.c 调用,用于确定虚拟盘在内存中的位置和 大小。Do_rd_request()是虚拟盘设备的请求项操作函数。Rd_load()是虚拟盘根文件加载函数。Floppy.c:软盘驱动程序,do_fd_request()函数字符设备驱动程序:包括控制终端设备和串行终端设备。控制台驱动程序:Keybord.s: 键盘中断处理程序。Con sole .c:实现终端屏幕写函数con_write(

20、)以及进行终端屏幕显示的控制操作。串行线路驱动程序:Serial.c:实现系统串行端口初始化。Rs_init()中设置默认串行通信参数,设置串行端口的中断向量。 Rw_write() 把串行终端设备写缓冲队列中的字符通过串行线路发送给远端的终端设 备。Rs_io.s :串行通信中断处理过程,对终端的读写缓冲队列进行操作。把从串行线路接收到的 字符存入串行终端读缓冲队列 read_q 中,或把写缓冲队列 write_q 中需要发送出去的字符通 过串行线路发送给串行终端设备。终端驱动程序与上层接口部分:tty_io.c: 含有终端读写函数 tty_read(),tty_write(), 读操作的行

21、规则函数 copy_to_cooked().Tty_ioctl.c: 实现函数 tty_ioctl.c 可修改指定终端 termios 结构中的设置标志等信息。数学协处理器:Math_emulate.c:设备不存在异常处理函数程序接口math_emulate(),浮点指令仿真处理主函数do_emu(), 别外函数为仿真运算辅助类函数。Error.c:用于处理协处理器发出的出错信号,执行math_error()函数。Ea.c:用于在仿真浮点指令时计算其中操作数使用到的有效地址。Convert.c:包含80387仿真操作过程中的数据类型转换函数。Add.c: 处理仿真过程中的加法运算。Compar

22、e.c:用于在仿真过程中比较累加器中两个临时数的大小。Get_put.c:处理所有对用户内存的访问,取得和存入指令,实数值,BCD数值等。Mul.c: 仿真 80387 的乘法运算。Div.c:仿真80387协处理器的除法运算。Include:Asm Linux Sys a.out.h const.h ctype.h errno.h fcntl.h signal.h stdarg.h stddef.h string.h Termios.h time.h unistd.h utime.hASM 子目录: io.h memory.h segment.h system.hLinux 子目录: con

23、fig.h fdreg.h fs.h hdreg.h head.h kernel.h math_emu.h mm.h sched.h sys.h tty.hSys 子目录: param.h resource.h stat.h time.h times.h types.h utsname.h wait.hA.out.h:文件用于定义被加载的可执行文件的结构,主要用于加载程序fs/exec.c中。Const.h:定义了 I节点中文件属性和类型 i_mode字段所用到的一些标志位常量符号。 Ctype.h:关于字符测试和处理的头文件,定义了一些字符类型判断和处理的宏。Errno.h:定义出错号的常量

24、符号Fcntl.h: 文件控制选项头文件, 定义文件控制函数 fcntl() 和文件创建和打开函数中乃至的一些 选项。Sig nal.h :定义内核中使用的所有信号的名称和基本操作函数。Sig nal() sig nactio n()Stdarg.h:标准参数头文件,它以宏的形式定义变量参数列表。主要说明了一个类型va_list和三个宏 va_start,va_arg,va_end,用于 vsprintf,vprintf,vfprintf 函数。Stddef.h:主要用于存放一些标准定义。Strin g.h:文件以内嵌函数的形式定义了所有字符串操作函数,使用了汇编程序。Termios.h:终端

25、接口定义,含有 termios结构和通用终端端口设置函数原型。 Time.h:涉及处理时间和日期的函数。Unistd.h: 标准符号常数和类型头文件,该文件中定义了很多各种各样的常数和类型,以及一 些函数声明。如果程序中定义了符号 _LIBRARY_, 则还包括内核系统调用号和内嵌汇编 _syscallO()等。Utime.h:该文件定义了文件访问和修改时间的结构utimebuf以及utime()函数原型。ASM 子目录: io.h memory.h segment.h system.hIo.h:定义了对硬件端口访问的嵌入式汇编函数:outb(),i nb(),outb_p(),i nb_p()Memory.h:含有内存复制嵌入式汇编宏memcpy(),与string.h中memcpy()相同。Segme nt.h:定义了访问段寄存器或与段寄存器有关的内存操作函数。System.h :定义了设置和修改描述符/中断门等的嵌入式汇编宏。Linux 子目录: config.h fdreg.h fs.h hdreg.h head.h kernel.h math_emu.h mm.h sched.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论