课程设计论文Linux内核初起代码分析.doc
《课程设计论文Linux内核初起代码分析.doc》由会员分享,可在线阅读,更多相关《课程设计论文Linux内核初起代码分析.doc(20页珍藏版)》请在三一办公上搜索。
1、Linux内核初起代码分析 计算机科学与工程学院课程设计报告题目全称:Linux内核初起代码分析 学生学号: 姓名: 指导老师: 职称: 指导老师评语: 签字: 课程设计成绩:设计过程表现设计报告质量总分目录摘 要1第一章 引 言11.1 问题的提出11.2任务与分析1第二章 代码分析22.1系统初始化过程流程22.2 数据结构22.3常量和出错信息的意义42.4调用关系图42.5各模块/函数的功能及详细框图52.5.1 static void time_init(void)分析62.5.2 void main(void)分析62.5.3 pause()分析82.5.4 static int
2、printf(const char *fmt, .)分析82.5.5 void init(void)分析9第三章 内核调试123.1 运行环境123.2 编译内核过程12第四章 总结与体会15致 谢16参考文献17摘 要随着计算机的普及,计算机发挥着越来越重要的作用,计算机的使用也越来越普遍,所以让更多的人能够更好的使用和掌握一些计算机方法显得十分重要。充分发挥计算机的作用也显得十分重要。操作系统应运而生。操作系统是一种软件,用来帮助其他的程序控制计算机并和用户进行交互。因而,对操作系统的研究是很有必要的。操作系统包含了多个部分或者组件,最核心的部分是内核。其他的部分用来帮助内核完成计算机资源
3、的管理和应用程序的控制。Linux操作系统是使用很广泛的,高质量的一个操作系统。此次起始代码分析,我分析了init/main.c文件中的main()、init()以及编译内核代码。main()中主要是关于起始的调用和设备和系统信息初始化,以及创建进程。此时中断仍被禁止着,做完必要的设置后就将其开启init()是创建进程,并检测是否出错,出错则再次创建执行并打印出出错信息。init()函数运行在任务0 第1 次创建的子进程(任务1)中。它首先对第一个将要执行的程序(shell)的环境进行初始化,然后加载该程序并执行之。对Linux 初起代码的分析有助于了解操作系统的启动,可以更好地理解和认识操作
4、系统是如何管理计算机资源的。关键词:操作系统;Linux;初起代码Linux内核初起代码分析第一章 引 言 1.1 问题的提出 操作系统是一种软件,用来帮助其他的程序控制计算机并和用户进行交互。操作系统包含了众多程序用来控制计算机的核心功能,并且操作系统是链接用户和计算机硬件的桥梁,便于人们有效管理。尽管在过去操作系统取得了长足的进步,但是基本的目标并未改变:通过使用操作系统来处理公共任务,程序员便可以更容易地编写应用程序。应用程序是一种软件,用来向计算机的用户提供某种服务,而不仅仅是控制计算机硬件。尽管在外观上和功能上有所不同,但是所有的操作系统都具有一些相同之处:初始化计算机硬件,以便操作
5、系统和其他持续可以正常工作;为使用操作系统的程序分配系统资源,如内存和处理时间;跟踪调试运行的多个程序;为所有使用系统设备的程序提供规范的访问接口。操作系统包含了多个部分或者组件,最核心的部分是内核。其他的部分用来帮助内核完成计算机资源的管理和应用程序的控制。操作系统控制了计算机上运行的各种应用程序。没有操作系统各类函数的调用,应用程序就无法执行。因而,对操作系统的研究是很有必要的。 Linux操作系统是使用很广泛的,高质量的一个操作系统,而且作为一个开源的系统,可以很方便的查看起代码并进行分析,有利于更好的认识和了解操作系统。此次对Linux 初起代码的分析有助于了解操作系统的启动,可以更好
6、地理解和认识操作系统是如何管理计算机资源的。1.2任务与分析 本课题主要的目的是了解一个操作系统的初起过程。根据操作系统的基础知识,分析init/main.c中关于系统初起的相关代码,了解一个操作系统的初起过程,得到相关的框图,写出设计说明书。1) 代码分析结果, 包括但不限于:2) 数据结构3) 常量和出错信息的意义4) 调用关系图5) 各模块/函数详细框图分析思路:1) 了解基础知识,找到相关的源码;2) 对代码充分阅读,先得到单个函数的数据结构和框图;3) 将多个函数的框图汇总,绘出整体的框图;使用的源代码是Linux/init/main.c (C) 1991 Linus Torvald
7、s第二章 代码分析 2.1系统初始化过程流程系统整个初始化过程见图2.1所示:进程n进程1开始系统初始化对物理内存各部分进行功能划分和分配系统各个部分初始化,包括对任务0初始化移到任务0中执行创建进程1(init)空闲时执行pause()加载根文件系统设置终端标准IO创建进程2循环等待进程2退出创建子进程循环等待进程结束任务进程0终端输入定向到rc执行shell退 出设置终端标准IO执行shell退 出进程2图2.1 内核初始化程序流程示意图2.2 数据结构1) 时间结构:#define CLOCKS_PER_SEC 100/* 系统时钟滴答频率,100HZ */typedef long cl
8、ock_t;/* 从进程开始系统经过的时钟滴答数 */struct tm int tm_sec;/* 秒数 0,59 */ int tm_min;/* 分钟数 0,59 */ int tm_hour;/* 小时数 0,59 */ int tm_mday;/* 1 个月的天数 0,31 */ int tm_mon;/* 1 年中月份 0,11 */ int tm_year;/* 从1900 年开始的年数 */ int tm_wday;/* 1 星期中的某天 0,6(星期天=0) */ int tm_yday;/* 1 年中的某天 0,365 */ int tm_isdst;/* 夏令时标志 */
9、;2) 存放硬盘参数表信息:struct drive_info char dummy32;drive_info;/* 用于存放硬盘参数表信息 */3) tty 等待队列数据结构和tty 数据结构:struct tty_queue unsigned long data;/* 等待队列缓冲区中当前数据指针字符数 */ unsigned long head;/* 缓冲区中数据头指针 */ unsigned long tail;/* 缓冲区中数据尾指针 */ struct task_struct *proc_list; /* 等待进程列表 */ char bufTTY_BUF_SIZE;/* 队列的缓
10、冲区 */;struct tty_struct /* tty 数据结构 */ struct termios termios;/* 终端io 属性和控制字符数据结构 */ int pgrp;/* 所属进程组 */ int stopped;/* 停止标志 */ void (*write) (struct tty_struct * tty); /* tty 写函数指针 */ struct tty_queue read_q;/* tty 读队列 */ struct tty_queue write_q; /* tty 写队列 */ struct tty_queue secondary; /* tty 辅
11、助队列(存放规范模式字符序列) */;/* 可称为规范(熟)模式队列 */1)2)3)4) 请求队列中项的结构和块设备结构:struct request/* 请求队列中项的结构。其中如果dev=-1,则表示该项没有被使用 */ int dev;/* 使用的设备号 */ int cmd;/* 命令(READ或 WRITE) */ int errors;/* 操作时产生的错误次数 */ unsigned long sector;/* 起始扇区(1块=2扇区) */ unsigned long nr_sectors; /* 读/写扇区数 */ char *buffer;/* 数据缓冲区 */ str
12、uct task_struct *waiting; /* 任务等待操作执行完成的地方 */ struct buffer_head *bh;/* 缓冲区头指针(include/Linux/fs.h,68) */ struct request *next;/* 指向下一请求项 */;struct blk_dev_struct/* 块设备结构 */ void (*request_fn) (void); /* 请求操作的函数指针 */ struct request *current_request; /* 请求信息结构 */;2.3常量和出错信息的意义定义系统调用嵌入式汇编宏函数。不带参数的系统调用宏
13、函数。type name(void)。%0 - eax(_res),%1 - eax(_NR_#name)。其中name 是系统调用的名称,与 _NR_ 组合形成上面的系统调用符号常数,从而用来对系统调用表中函数指针寻址。返回:如果返回值大于等于0,则返回该值,否则置出错号errno,并返回-1。#define _syscall0(type,name) type name(void) long _res; _asm_ volatile ( int $0x80 /* 调用系统中断0x80 */:=a (_res) /* 返回值eax(_res) */: (_NR_#name); /* 输入为系统
14、中断调用号_NR_name */ if (_res = 0) /* 如果返回值=0,则直接返回该值 */ return (type) _res; errno = -_res; /* 否则置出错号,并返回-1 */ return -1;/* 有1 个参数的系统调用宏函数。type name(atype a) */* %0 - eax(_res),%1 - eax(_NR_name),%2 - ebx(a) */#define _syscall1(type,name,atype,a) type name(atype a) long _res; _asm_ volatile ( int $0x80
15、: =a (_res) : (_NR_#name), b (long)(a); if (_res = 0) return (type) _res; errno = -_res; return -1; extern int errno;/* 出错号,全局变量 */static inline _syscall0(int,fork)/*这是unistd.h 中的内嵌宏代码。以嵌入汇编的形式调用Linux 的系统调用中断0x80。该中断是所有系统调用的入口。该条语句实际上是int fork()创建进程系统调用。syscall0 名称中最后的0 表示无参数,1 表示1 个参数 */static inli
16、ne _syscall0(int,pause) /* int pause()系统调用:暂停进程的执行,直到收到一个信号 */static inline _syscall1(int,setup,void *,BIOS)/* int setup(void * BIOS)系统调用,仅用于Linux 初始化(仅在这个程序中被调用)*/static inline _syscall0(int,sync) /* int sync()系统调用更新文件系统 */2.4调用关系图在内核源代码的init/目录中只有一个main.c 文件。系统在执行完boot/目录中的head.s 程序后就会将执行权交给main.c
17、。该程序虽然不长,但却包括了内核初始化的所有工作。main.c 程序首先利用前面setup.s 程序取得的系统参数设置系统的根文件设备号以及一些内存全局变量。这些内存变量指明了主内存的开始地址、系统所拥有的内存容量和作为高速缓冲区内存的末端地址。如果还定义了虚拟盘(RAMDISK),则主内存将适当减少。整个内存的映像示意图见图3.1 所示。内核程序高速缓存主内存区虚拟盘图2.1 系统中内存功能划分示意图图中,高速缓冲部分还要扣除被显存和ROM BIOS 占用的部分。高速缓冲区是用于磁盘等块设备临时存放数据的地方,以1K(1024)字节为一个数据块单位。主内存区域的内存是由内存管理模块mm通过分
18、页机制进行管理分配,以4K 字节为一个内存页单位。内核程序可以自由访问高速缓冲中的数据,但需要通过mm 才能使用分配到的内存页面。然后,内核进行所有方面的硬件初始化工作。包括陷阱门、块设备、字符设备和tty,包括人工设置第一个任务(task 0)。待所有初始化工作完成后就设置中断允许标志以开启中断,main()也切换到了任务0 中运行。在整个内核完成初始化后,内核将执行权切换到了用户模式(任务0),也即CPU 从0 特权级切换到了第3 特权级。此时main.c 的主程序就工作在任务0 中。然后系统第一次调用进程创建函数fork(),创建出一个用于运行init()的子进程。2.5各模块/函数的功
19、能及详细框图该程序首先确定如何分配使用系统物理内存,然后调用内核各部分的初始化函数分别对内存管理、中断处理、块设备和字符设备、进程管理以及硬盘和软盘硬件进行初始化处理。在完成了这些操作之后,系统各部分已处于可运行状态。此后程序把自己“手工”移动到任务0(进程0)中运行,并使用fork()调用首次创建出进程1(init 进程)。在init进程中程序将继续进行应用环境的初始化并执行shell 登录程序。而原进程0则会在系统空闲时被调度执行,此时任务0仅执行pause()系统调用,并又会调用调度函数。在init 进程中,如果终端环境建立成功,则会再生成一个子进程(进程2),用于运行shell 程序/
20、bin/sh。若该子进程退出,则父进程进入一个死循环内,继续生成子进程,并在此子进程中再次执行shell 程序/bin/sh,而父进程则继续等待。由于创建新进程的过程是通过完全复制父进程代码段和数据段的方式实现的,因此在首次使用fork()创建新进程init 时,为了确保新进程用户态堆栈没有进程0 的多余信息,要求进程0 在创建首个新进程之前不要使用用户态堆栈,也即要求任务0 不要调用函数。因此在main.c 主程序移动到任务0 执行后,任务0 中的代码fork()不能以函数形式进行调用。程序中实现的方法是采用gcc 函数内嵌的形式来执行这个系统调用。通过申明一个内嵌(inline)函数,可以
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 论文 Linux 内核 代码 分析
链接地址:https://www.31ppt.com/p-4866958.html