当前位置:文档之家› 3-系统调用

3-系统调用


2 BIOS启动
• 上电自检POST(Power On Self Test) • 对系统内的硬件设备进行监测和连接 • 最后,BIOS将从软盘或硬盘上读入Boot Loader.如果从硬盘启动,BIOS将读入该盘的 零柱面零磁道1扇区(MBR),读取Boot Loader.
2 BIOS启动
• 除了启动程序,BIOS还提供了一组中断以便 于对硬件设备的访问。 • 在操作系统没有被装入以前(Bootsect.S还没 有被读入),中断的响应程序由BIOS提供。
系统访问
错误检测和反馈 系统使用纪录 程序开发
内 容
• • • Linux内核的目录结构 linux启动流程 系统调用
内核目录结构(1/)
内核源程序代码安装在/usr/src/linux目录下 ,核心源代码 主要在kernel和arch/kernel两个目录下。 1. Documentation :这个目录下面没有内核代码,只有一 套有用的文档。 2. arch :包括了所有和体系结构相关的核心代码。它的每 一个子目录都代表一种支持的体系结构,例如i386就是 关于intel cpu及与之相兼容体系结构的子目录。PC机一 般都基于此目录;其下的kernel,存放支持体系结构特 有的诸如信号处理之类特征的实现; 3. Drivers: 放置系统所有的设备驱动程序;每种驱动程序 又各占用一个子目录,它包括显卡、网卡、软盘驱动器 和其他任何你可以说出的Linux支持的外围设备的软件 驱动程序。如 /block 下为块设备驱动程序
3 Boot Loader
• Boot Loader是一段汇编代码,存放在MBR中, 它的主要作用就是将系统启动代码读入内存。 • 因为在启动过程中,BIOS会把Boot Loader读 入内存,并把控制权交给它。MBR(硬盘启 动)内的代码就是Boot Loader或者它的一部 分。
3 Boot Loader
4 进入操作系统
(3)main.c中的初始化
• Head.S调用/init/main.c中的start_kernel函数, 把控制权交给它,这个函数是整个操作系统初 始化的最重要的函数,一旦它执行完,整个操 作系统的初始化也就完成了。
4 进入操作系统
(3)main.c中的初始化
• 计算机在执行start_kernel前进入了保护模式, 使处理器完全进入了全面执行操作系统代码的 状态。 • Start_kernel执行后,就可以以一个用户的身 份登陆和使用
4 进入操作系统
(4)建立init进程
• Linux要建立的第一个进程是init进程 • 启动所需的Shell脚本文件 a.Linux系统启动所必须的 b.用户登陆后自己设定的 • 系统启动所必须的脚本存放在系统默认的配置 文件目录/etc下。首先调用的是/etc/inittab.
例:
#include <linux/unistd.h> Int main(){ int i=getuid(); printf(“Hello Word!This is my uid:%d\n”,i); }
相关数据结构及源代码分析
和系统调用相关的内核代码文件主要有: • arch/i386/kernel/entry.S • arch/i386/kernel/traps.c • include/linux/unistd.h
entry.S汇编文件
其中包含了系统调用和异常的底层处理程序,信号量识 别程序。特别是系统调用和中断处理程序的返回点 (ret_from_sys_call),还有一个系统调用表。 1. 堆栈 2. SAVE_ALL,RESTORE_ALL 3.系统调用表 4. system_call和ret_from_sys_call
• Linux 作为一个典型的现代网络型操作系 统,其中所涉及到的技术实现涵盖了操 作系统技术的最新成果。它是一个多用 户多任务操作系统,支持分时处理和软 实时处理,并带有微内核特征,具有很 好的定制特性。由于它是开放源码的, 全世界很多科学技术人员都在不断对它 完善和改进.
操作系统功能
操作系统是充当计算机用户和计算机硬件之间的一个 中介,并用于管理计算机资源和控制应用程序运行的 计算机程序。 简单的讲,操作系统一般会提供以下服务: 程序运行 I/O 设备访问 文件访问
内核栈 用户空间SS 用户空间esp EFLAGS 用户空间cs 中断后及iret返 回前的esp 用户空间eip 系统调用号
向内中断 向外返回
用户栈 函数返回地址 eip 局部变量 中断前及iret返回 后的esp
可用空间 用户ss
可用空间
Task_struct 内核ss
堆栈切换
entry.S汇编文件
3)其他文件:主要包括用于存放Map Installer记录的map文
件和存放LILO配置信息的配置文件。
4 进入操作系统
• Boot Loader 完成的工作:把操作系统的代码 调入内存,所以当它执行完后,自然该把控制 权交给操作系统,由操作系统的启动程序来完 成剩下的工作。
4 进入操作系统
• 把控制权交给Setup.S这段程序 • 进入保护模式,同时把控制权交给Head.S • Head.S调用/init/main.C中的start_kernel函数, 启动程序从start_kernel()函数继续执行
• 如果是硬盘启动,Boot Loader将查找主分区 表中标记为活动分区的表项,把该表项对应的 分区的引导扇区读入,然后将控制权交给该扇 区内的引导程序。 • 如果计算机上装有不只一个操作系统,仅仅 MS-DOS的Boot Loader无法完成这种工作,需 要一个可以多重起动的工具:LILO或GRUB.
4 进入操作系统(1)Setup.S
首先,Setup.S对已经调入内存的操作系 统代码进行检查,如果没错,它会通过 BIOS中断获取内存容量,硬盘等信息 (实模式),准备让CPU进入保护模式 完成基本设置后,Setup.S设置保护模式 的标志,重取指令,再用一条跳转指令 jmpi 0x100000,KERNEL_CS。进入保护 模式下的启动阶段,控制权交给Head.S.
内核目录结构(3/)
9. lib :包含两部分的内容。lib/inflate.c中的函数能够在系统启 动时展开经过压缩的内核。lib目录下剩余的其他文件实现 一个标准C库的有用子集。 10. mm :包括所有独立于 cpu 体系结构的内存管理代码, 如页式存储管理内存的分配和释放等; 11. net :包含了Linux应用的网络协议代码,例如AppleTalk、 TCP/IP、IPX等等。 12. scripts :该目录下没有内核代码,它包含了用来配置内核的 脚本。当运行make menuconfig或者make xconfig之类的命 令配置内核时,用户就是和位于这个目录下的脚本进行交互 的。
4 进入操作系统
(3)main.c中的初始化
对文件系统的初始化 • Inode_initI() i节点管理机制初始化 • Name_cache_init() 目录缓存机制初始化 • Buffer_init() 块缓存机制初始化
4 进入操作系统
(3)main.c中的初始化
• 启动到了目前这种状态,只剩下运行/etc下的 启动配置文件。 • 这时初始化程序并没有完成操作系统各个部分 的初始化,更关键的文件系统的安装还没有涉 及,这是在init进程建立后完成的。就是 start_kernel()最后部分内容。
linux启动流程
初始化流程 • 加电或复位 • BIOS的启动 • Boot Loader • 操作系统初始化
1 加电或复位
• 冷启动过程开始,中央处理器进入复位状态, 将内存中的所有数据清零,对内存进行校验, 如果没错,CS寄存器置数,IP寄存器置入0000, 这个CS:IP组合指向的是BIOS的入口。系统就 是这样进入BIOS启动过程的。
entry.S汇编文件
2.关于SAVE_AL \ popl %ebx; \ popl %ecx; \ popl %edx; \ popl %esi; \ popl %edi; \ popl %ebp; \ popl %eax; \
内核目录结构(2/)
4. fs :Linux支持的所有文件系统在fs目录下面都有一个对应 的子目录。 5. include :包括编译核心所需要的大部分头文件。 例如:include/scsi/—这个目录供与SCSI控制器和SCSI 设备有关的头文件使用。 6. Init:核心的初始化代码 ,其中比较重要的一个是main.c, 它包含了大部分内核初始化的代码。 7. ipc :这个目录文件实现了System V的进程间通讯(IPC) 8. Kernel:主要的核心代码,此目录下的文件实现平台独 立的基本功能。这部分内容包括进程调度( kernel/sched.c) 及创建和撤销进程的代码(kernel/fork.c和kernel/exit.c); 其中最重要的文件当属sched.c;
4 进入操作系统
(2)Head.S
• 先做屏蔽中断一类的工作 • 然后对中断向量表做一定的处理 • Boot Loader读入内存的启动参数和命令行 参数,Head.S把它们保存在 empty_zero_page页中 • 检查CUP类型 • 对协处理器进行检查 • 页初始化,调用setup_paging这个子函数
entry.S汇编文件
1.关于堆栈 * * 28(%esp) * 2C(%esp) * 30(%esp) * 34(%esp) * 38(%esp)
-
%eip %cs %eflags %oldesp %oldss
注释语句说明:把当前任务的堆栈信息保存 (oldss,oldesp),再依此保存eflags,cs,eip,从用 户堆栈切换到内核堆栈。这几步由硬件完成。
4 进入操作系统
(3)main.c中的初始化
相关主题