操作系统课程设计初始设置.doc_第1页
操作系统课程设计初始设置.doc_第2页
操作系统课程设计初始设置.doc_第3页
操作系统课程设计初始设置.doc_第4页
操作系统课程设计初始设置.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1 目录目录 第第 1 章章 引言引言 2 第第 2 2 章章 LINUXLINUX 内核的生成过程内核的生成过程 3 第第 3 3 章章 实验内容实验内容 5 3 1 实验题目 5 3 2 具体相关信息 5 第第 4 4 章章 模块整体功能介绍及主要目标模块整体功能介绍及主要目标 12 4 1 模块整体功能介绍 12 4 2 主要目标 13 第第 5 5 章章 函数的分析函数的分析 14 5 1 初始参数设置 14 5 2 保存光标位置 15 5 3 扩展内存大小 16 5 4 取显卡当前显示模式 17 5 5 取硬盘信息 18 5 6 加载段描述符 19 5 7 A20 地址线的开启 20 5 8 设置进入 32 位保护模式运行 22 分析体会分析体会 23 参考文献参考文献 24 2 第第 1 章章 引言引言 Linux 是一种能运行于多种平台 源代码公开 免费 功能强 大 遵守 POSIX 标准 与 UNIX 兼容的操作系统 Linux 最初版本是由 Linus Benedict Torvalds 编写的 为了 能够使 Linux 更加完善 Torvalds 在网络上公开了 Linux 的源码 邀请全世界的志愿者来参与 Linux 的开发 在这些无私的人们的 帮助下 Linux 得到不断的完善 并在短时期内迅速崛起 现在 Linux 内核已经发展到了 2 5 X 版 并还在以相当快的速度不断地 发展着 据报道 它是一个很有发展前途的操作系统 也是为数 不多可以与 Microsoft 旗下操作系统相竞争的操作系统 我国的 IT 产业起步较晚 技术落后于西方经济发达国家 在 我国 由于受知识产权的限制 无论是使用 PC 平台上的 Windows 还是使用应用于大中型机的 UNIX 都无法窥视到其内部 结构 这些系统很可能存在不为我们所知的漏洞 如果这些漏洞 为别有用心者所利用 将会严重危及我国的经济安全和国家安全 操作系统不同于其它软件产品 它是其它应用程序得以运行的平 台 应用软件的开发必须基于对相应平台 操作系统 的技术的理 解和掌握 由于我们的软件企业无法获知这些系统的细节 根本 无法与拥有这些关键技术的国外先进企业相抗衡 长此以往 将 会对我国软件产业产生深远的负面影响 为了打破这种受制于人的局面 我国迫切的需要开发一个具 有自主知识产权的操作系统 由于 Linux 性能优越 属于自由软 件 公开源代码且完全免费 所以拿来作发展自主知识产权的操 作系统的底版是非常合适的选择 只有完全了解当前 Linux 的实 现细节 才能在它的基础上作进一步的开发和完善 因此 分析 Linux 源代码对于在 Linux 现有的基础上开发我们自己的 Linux 就 具有非常现实和重要的意义 本论文主要在源码水平上讨论 Linux 内核进程调度与控制的 实现 其目的是通过对源码的分析与研究 找出 Linux 在本论文 研究方向上的优缺点 作为今后 Linux 系统开发的参考 3 第第 2 2 章章 LinuxLinux 内核的生成过程内核的生成过程 一 引导扇区汇编代码 bootsect s 被预处理成 bbootsect s 或 bootsect s 无论有无 D BIG KERNEL 当然这取决于编译目标 是 bzImage 还是 bImage bbootsect s 被汇编 然后被转化成合法 的二进制文件 通过调用 bbootsect s 或者是 bootsect s 被汇编 然后被转化成合法的二进制文件 通过调用 bootsect s 二 启动代码 setup s include video s 被预处理成 bsetup s 就 bzImage 而言 或者是 setup s 就 zImage 而言 和 bootsect s 一样 不同的是 bzImage 使用 D BIG KERNEL 来标志 结果同样也将被转化成合法的二进制文件 通过调用 bsetup s 或 setup s 三 进入子目录 arch i386 boot compressed 把 usr src linux vmlinux 转变成 tmppiggy gz 临时文件名 合法的二 进制格式 删除 note 和 comment 文件 四 gzip 9 tmppiggy gz gunzip 在 main c 中 被实现 用于解压缩部份 Linux 内核 负责解压缩 Linux 内核的函 数还有 decompressed 五 联接 Link temppiggy gz 使其成为 ELF relocate ld r 文件 piggy 0 六 编译压缩程序 head s 和 misc c 仍然存在于子目录 arch i386 boot compressed 中 成 ELF 的目标文件 head o 和 misc o 七 联接 Link 所有的目标文件 head o misc o piggy o 成 bvmlinux 或者 vmlinux 就 zImage 而言 注意 不要错误地把它 认为是 usr src linux vmlinux 一定要注意到这两者之间的不同 Ttext 0 x1000 调用的是经过压缩的内核镜像 vmlinux Ttext 0 x100000 调用的是未经过压缩的大内核镜像 bvmlinux 还有 bzImage compression loader 将被 high loaded 调到内存高地址处 八 把 bvmlinux 转化成合法的二进制文件 bvmlinux out 删除 note 和 comment 部份 九 最后返回 arch i386 boot 子目录 使用编程工具把 bbootsect bsetup compressed bvmlinux out 编译成 bzImage 也可 以使编译成 zImage 4 bootsect sbootsect s 完成如下功能 完成如下功能 一 bootsect s 将它 自己 从被 ROM BIOS 载入的绝对地 址 0 x7C00 处搬到 0 x9000 处 然后利用一个 jmpi jump indirectly 的指令 跳到新位置的 jmpi 的下一行 go 去执行 二 接着 将其他 segment registers 包括 DS ES SS 都 指向 0 x9000 这个位置 与 CS 看齐 另外将 SP 及 DX 指向一任意 位移地址 offset 这个地址等一下会用来存放磁盘参数表 disk para meter table 设置堆栈段 且开始处为 0 x4000 12 三 读入磁盘参数 并建立参数表 四 接着利用 BIOS 中断服务 int 13h 的第 0 号功能 重置 磁盘控制器 使得刚才的设定发挥功能 五 完成重置磁盘控制器之后 bootsect 就从磁盘上读入紧 邻着 bootsect 的 setup 程序 也就是 setup S 此读入动作是利 用 BIOS 中断服务 int 13h 的第 2 号功能 setup 的 image 将会读 入至程序所指定的内存绝对地址 0 x90200 处 也就是在内存中紧 邻着 bootsect 所在的位置 待 setup 的 image 读入内存后 利用 BIOS 中断服务 int 13h 的第 8 号功能读取目前磁盘的参数 六 再来 就要读入真正 linux 的 kernel 了 也就是你可 以在 linux 的根目录下看到的 vmlinuz 在读入前 将会先 呼叫 BIOS 中断服务 int 10h 的第 3 号功能 读取游标位置 之后 再呼叫 BIOS 中断服务 int 10h 的第 13h 号功能 在萤幕上输出字 串 Loading 这个字串在 boot linux 时都会首先被看到 七 接下来做的事是检查 root device 之后就仿照一开始的 方法 利用 indirectjump 跳至刚刚已读入的 setup s 部份 5 第第 3 3 章章 实验内容实验内容 3 13 1 实验题目实验题目 Setup s 初始设置代码源代码分析 3 23 2 具体相关信息具体相关信息 Setup 函数主要完成以下任务函数主要完成以下任务 1 首先是检测系统可用内存的总量 它是通过 BIOS 程序来完成检测的 2 设置键盘重复延迟时间和重复速度 3 检测视频卡 4 重新初始化硬盘控制器和硬盘参数 5 检测一个 MCA 5 检测一个 PS 2 定点设备 鼠标总线 6 检测高级电源管理器 APM BIOS 支持 7 检测内核在内存中的位置 如果在低地址 0 x00010000 就将其移到高 地址 0 x00001000 如在高地址则不做任何移动 8 设置设备中断描述表 IDT 和全局描述表 GDT 9 如已经有了浮点单位 FPU 则重置之 6 10 重新调用程序中断控制器 11 通过设置 cr0 状态寄存器的 PE 位 把 CPU 从 实模式 切换到 保护 模式 12 跳转到 stratup 32 汇编语言函数 因为在内核中不能做 BIOS 调用 内存信息由 setup 通过 INT 0X15 来加 以查询 并根据获得的信息生成一张物理内存构成图 称为 e820 图 再通过参 数块传给内核 使内核知道系统中内存资源的配置 因为在做 int 0 x15 来查询 内存构成是要把调用参数之一设置成 0 xe820 所以叫 e820 图 l 第一个第一个 stratup 32 函数函数 在启动过程中要用到两个 stratup 32 函数 虽然它们都是汇编语言函数 但 是却是两个完全不同的函数 我们这里所说的函数包含在 usr src linux 2 4 2 arch i386 boot compressed head S 文件里 Setup 文件执行后 这个函数就被加载到物理地址为 0 x00100000 或者物 理地址为 0 x00001000 的内存中 取决于内核是载入高或者低内存 当执行这个函数时 会执行以下的操作 1 初始化段寄存器和一个临时栈 2 内核中没有初始化的数据都用 0 填充 它是通过 symbols edata 和 end 来识别的 3 执行 decompress kernel 函数 这个函数用于对 Linux 内核解压缩 这 个时候 屏幕上将显示 Uncompressing Linux 信息 解压缩完成后 就会显示 OK booting the kernel 信息 现在有一个问题 就是解完压缩的内核被放置在什么位置 答 案是如果 Linux 内核被加载低地址 那么解压缩的内核将被置于物理地址为 0 x00100000 的地方 如果在高地址 则内核会被先解压到一个临时缓冲区中 待 完成后再将其加载到物理地址为 0 x00100000 的地方 7 4 最后 跳转到物理地址为 0 x00100000 的地方执行 到此为止 代码执行操作就由另外一个 startup 32 函数来接管 也就是 说 第二个 startup 32 函数接管了启动过程 第二个第二个 startup 32 函数完成的功能函数完成的功能 解压缩 Linux 内核的工作由另外一个 startup 32 函数来完成 该函数位 于 usr src linux 2 4 2 arch i386 kernel head S 文件中 这时你可能会说两个不同的函数用同一个名字不会出错吗 答案是不会 的 因为两个函数都是到自己初始地址去执行 并且都有自己的执行环境 所以 不会出错 下面我们来看一下第二个 startup 32 函数的功能 当执行这个函数时 实际上是为第一个 Linux 进程 process 0 设置环境 这个函数将执行下面的操 作 1 寄存器将以最后的值进行初始化 2 为 process 0 设置内核模式栈 3 调用并且执行 setup idt 函数 该函数将把所有的 IDT 填充空值 4 把从 BIOS 中获得的参数放在第一页的框架中 5 识别处理器的模式 6 使用 GDT 和 IDT 表加载 gdtr 和 idtr 寄存器 7 最后跳到 start kernel 函数 l start kernel 函数功能函数功能 start kernel 函数完成 Linux 内核的初始化工作 这个函数执行后 所有 的基本内核组件都将被初始化 这也是整个启动过程的最后一步 8 该函数将完成以下的功能 1 输出 Linux 版本信息 printk linux banner 2 设置与体系结构相关的环境 setup arch 页表结构初始化 paging init 3 提取并分析核心启动参数 从环境变量中读取参数 设置相应标志位 等待处理 parse options 4 使用 arch alpha kernel entry S 中的入口点设置系统自陷入口 trap init 5 使用 alpha mv 结构和 entry S 入口初始化系统 IRQ init IRQ 6 核心进程调度器初始化 包括初始化几个缺省的 Bottom half sched init 7 时间 定时器初始化 包括读取 CMOS 时钟 估测主频 初始化定时器中 断等 time init 8 控制台初始化 为输出信息而先于 PCI 初始化 console init 9 初始化可安装模块机制 计算出内核符号表的大小 init modules 10 剖析器数据结构初始化 prof buffer 和 prof len 变量 11 核心 Cache 初始化 描述 Cache 信息的 Cache kmem cache init 12 延迟校准 获得时钟 jiffies 与 CPU 主频 ticks 的延迟 calibrate delay 13 内存初始化 设置内存上下界和页表项初始值 mem init 14 创建和设置内部及通用 cache slab cache kmem cache sizes init 15 创建页 cache 内存页 hash 表初始化 pgtable cache init 9 16 根据物理内存的大小计算出允许创建线程 包括进程 的数量 fork init num mappedpages 17 proc caches init vfs caches init num physpages buffer init num physpages 都是为有关的管理机制建立起专用的 slab 缓冲区队列 18 分配空间建立起缓冲页面杂凑表 page hash table page cache init 19 对 Sys V 进程间通信机制的初始化 ipc init 20 创建信号队列 cache signal queue signals init 21 检查体系结构漏洞 对于 alpha 此函数为空 check bugs 22 SMP 机器其余 CPU 除当前引导 CPU 初始化 对于没有配置 SMP 的内核 此函数为空 smp init 启动 init 过程 创建第一个核心线程 调用 init 函 数 原执行序列调用 cpu idle 等待调度 init 至此 start kernel 结束 基本的核心环境已经建立起来了 init 函数作用函数作用 init 函数作为核心线程 首先锁定内核 仅对 SMP 机器有效 然后调用 do basic setup 完成外设及其驱动程序的加载和初始化 过程如下 总线初始化 比如 pci init 网络初始化 所有协议的初始化过程 sock init 创建事件管理核心线程 start context thread 函数启动 context thread 过程 并重命名为 keventd 10 启动任何使用 initcall 标识的函数 方便核心开发者添加启动函数 do initcalls do initcalls partion setup device init 是所有外设初始化的总 入口 文件系统初始化 filesystem setup 主要是 devfs 安装 root 文件系统 mount root 至此 do basic setup 函数返回 init 在释放启动内存段 free initmem 并给内核解锁以后 init 打开 dev console 设备 重定向 stdin stdout 和 stderr 到控制台 最后 搜索文件系统中的 init 程序 或者由 init 命令行参数指定的程序 并使用 execve 系统调用加载执行 init 程序 init 函 数到此结束 内核的引导部分也到此结束了 这个由 start kernel 创建的第一 个线程已经成为一个用户模式下的进程了 此时系统中存在着六个运行实体 start kernel 本身所在的执行体 这其实是一个 手工 创建的线程 它在创建了 init 线程以后就进入 cpu idle 循环了 它不会在进程 线程 列表中出现 模式转换的控制 x86 保护模式比实模式多了几个寄存器 全局描述符表 寄存器 GDTR 中断描述符表寄存器 IDTR 局部描述符表寄存器 LDTR 和 任务寄存器 TR 另外 一些寄存器的功能得到了扩展 例如指令指针成为 EIP 长度 32 位 标志寄存器 EFLAGS 的更多位得到了利用 四个控制寄存器 CR0 CR3 都得到了利用 GDTR 48 位 在物理存储器地址空间定义了全局描述符 表 GDT 每个描述符 8 字节 IDTR 长度同 GDTR 定义了中断描述符表 IDT 256 个中断 每个中断门 8 字节 在从实模式转到保护模式前必须将 GDTR 的基址 BASE 和限长 limit 16 位 的值装入 GDTR IDTR 也是这两个表 的装入和保存有特殊的指令 LGDT SGDT LIDT SIDT 16 位的 LDTR 并不直接定义一个局部描述符表 他只是一个指向 GDT 中 LDT 描述符的选择符 选择符装入 LDTR 相应的描述符就能从全局存储器 中读出来装入局部描述符表高速缓存 该描述符为当前任务创建了一个 LDT 控制寄存器 CR0 的低五位是机器状态字 MSW 包含保护模式配置和状 态信息 PE 保护模式允许 位重启时清零允许实模式操作 为进入保护模式将 PE 设为 1 一旦处于保护模式就不能再设回到实模式 除非重启 MP 数学协处 理器存在 设为 1 表示该系统有一个数学协处理器 如果用到了软件模拟器执 行数学运算 那么 EM 模拟 位应设为 1 一次只能设置其中的 1 位 R 扩展类 型 表示用的是 80287 还是 80387 R 为 1 表示 80387 TS 任务切换 在做任务 切换的时候自动设置 11 在保护模式下支持分页 CR0 的 PG 位设为 1 表示允许分页 CR3 包含页 目录基址寄存器 PDBR 任务寄存器 TR 是在保护模式下的任务切换中用到 该寄存器存放 16 位 的选择符用来指示全局描述符表 中描述符的位置 当选择符装入 TR 相应的任务状态段 TSS 描述符自动 由存储器读出并装入到任务描述符缓存中 几条重要的系统指令 LGDT SGDT LIDT SIDT LMSW SMSW 指令 LMSW 和 SMSW 分别用于装入和保存机器状态字信息 他们是用 于从实模式转换到保护模式的指令 需要将 MSW 的最右位设为 1 在正常运行时整个内核映像都应该在系统空间 系统空间地址实连续的 线性的 虚拟地址和物理地址间有个固定的位移 0 xC0000000 内核影像的起点 是 stext 引导核压缩后的整个映像放在内存中从 0 x100000 即 1Mb 开始的空 间 CPU 执行内核映像的入口 start 32 就在内核映像开头的地方 因此物理地 址是 0 x100000 虚拟地址就成了 0 xC0100000 相对应的描述项所提供的基地址都是 0 所以实际产生的是线性地址 其 中代码段寄存器 CS 已在进入 start 32 之前设置成 KERNEL CS 数据段寄 存器尚未设置为 KERNEL DS 不过虽然代码段已设置 从而 start 32 的地 址为 0 xC0100000 但是在转入这个入口时使用的指令是 ljmp 0X10000 而不 是 ljmp startup 32 所以装入 COU 寄存器 IP 的地址是物理地址 0 x100000 而 不是虚拟地址 CPU 在进入 startup 32 后会继续以物理地址取指令 只要不在 代码段中引用某个地址 例如项某个地址做绝对转移 或者调用某个子程序 就 可以一直这样运行下去 而与 CS 的内容无关 此外 CPU 的中断已在进入 startup 32 前关闭 12 第第 4 4 章章 模块整体功能介绍及主要目标模块整体功能介绍及主要目标 4 14 1 模块整体功能介绍模块整体功能介绍 Setup s 是一个操作系统加载程序 它的主要作用是利用 ROM BIOS 中断读 取机器系统数据 并将这些数据保存到 0 x90000 开始的位置 覆盖掉了 bootsect 程序所在的地方 所取得的参数和保留的内存位置见下表 3 1 所 示 这些参数将被内核中相关程序使用 例如字符设备驱动程序集中的 ttyio c 程序等 然后setup 程序将system 模块从0 x10000 0 x8ffff 当时认为内核系统模 块system 的长度不会超过此值 512KB 整块向下移动到内存绝对地址 0 x00000 处 接下来加载中断描述符表寄存器 idtr 和全局描述符表寄存器 gdtr 开启A20 地址线 重新设置两个中断控制芯片8259A 将硬件中断 号重新设置为0 x20 0 x2f 最后设置CPU 的控制寄存器CR0 也称机器状态 13 字 从而进入32 位保护模式运行 并跳转到位于system模块最前面部分 的head s 程序继续运行 为了能让head s 在32 位保护模式下运行 在本程序中临时设置了中断 描述符表 idt 和全局描述符表 gdt 并在gdt 中设置了当前内核代码 段的描述符和数据段的描述符 在下面的head s 程序中会根据内核的需要 重新设置这些描述符表 4 24 2 主要目标主要目标 Setup s 模块的功能就是访问 BIOS 来获得内存及硬盘等参数 并 将它们放入安全的地方 0 x90000 0 x901FF 这意味着保护模式系统 在缓冲区覆盖之前就从这儿读取了这些参数 接着 setup 模块的另 一个重要责任就是把 system 模块移动到内存绝对地址 0 x00000 加载中断描述符表寄存器和全局描述符表寄存器 重新设置两个 中断芯片 8259A 最后 setup 模块设置 CPU 的控制寄存器 CR0 为 32 位保护模式 并跳转到 system 模块最前面部分的 head s 程序继 续运行 本次课程设计的主要任务是分析 setup s 初始设置的源代码分 析 主要是阅读电子书 Linux 源代码分析中的有关初始化中的内容 要求对操作系统的启动过程有详细的了解 熟悉启动的基本过程 尤其是对 setup s 模块的基本功能做个详细的了解 阅读电子书 90 页 110 页中有关 Setup s 的内容 仔细研究源代码 了 解其硬件机制 14 第第 5 5 章章 函数的函数的分析分析 5 15 1 初始参数设置初始参数设置 setup s负责从BIOS 中获取系统数据 并将数据放到系统内存的适当 地方 此时setup s 和system 已经由bootsect 引导块加载到内存中 这段代码询问bios 有关内存 磁盘 其它参数 并将这些参数放到一个 安 全的 地方 0 x90000 0 x901FF 也即原来bootsect 代码块曾经在的地方 然后在被缓冲块覆盖掉之前由保护模式的system 读取 这些参数的设置最 好与bootsect s 中的相同 主要流程如下 INITSEG 0 x9000 原原来来bootsect所所处处段段 SYSSEG 0 x9000 System在在 0 x10000 64KB 处处 SETUPSEG 0 x9000 本本程程序序所所在在的的段段地地址址 参参数数设设置置 15 图 5 1 初始参数设置 5 2 保存光标位置保存光标位置 这个模块使用BIOS中断取屏幕当前光标位置 列 行 并保存在内存 OX90000处 2字节 控制台初始化程序会到此处读取该值 BIOS中断0X10 功能号ah OX03 读取光标位置 输入 bh 页号 返回 ch 扫描开始线 cl 扫描结束线 dh 行号 OX00顶端 dl 列号 OX00最左边 并且将ds置成INITSEG OX9000 这已经在bootsect程序中 设置过 但是现在是setup程序 Linux觉得需要重新再设置一下 具体流程 如下 16 BIOS中中断断0 x10 功功能能号号 ah 0 x03 输输入入页页号号 bh 扫扫描描开开始始线线 ch 扫扫描描结结束束线线 cl 行行号号 0 x00顶顶端端 dh 列列号号 0 x00顶顶端端 dl 读读取取光光标标 Cursor 位位置置 取取光光标标位位置置 保保存存致致0 x90000处处 2字字节节 图5 2 保存光标位置 5 35 3 扩展内存大小扩展内存大小 在扩展内存大小的过程中首先是取内存大小的值 调用中断0 x15 功能号ah 0 x88 返回 ax 从0 x100000 1M 处开始的扩展内存大 小 KB 若出错则CF 置位 ax 出错码 将扩展内存数值存在0 x90002 处 1 17 个字 具体流程如下 BIOS中中断断0 x15 功功能能号号 ah 0 x88 AX 从从0 x100000 1M 处处开开始始的的 扩扩展展内内存存大大小小 KB 取取扩扩展展内内存存大大小小 值值 KB 是是否否出出错错 获获取取扩扩展展内内存存大大小小 N AX 出出错错码码 保保存存致致0 x90002处处 2字字节节 Y 图 5 3 扩展内存大小 5 45 4 取显卡当前显示模式取显卡当前显示模式 在取显示卡当前显示模式时 调用BIOS 中断0 x10 功能号 ah 0 x0f 返回 ah 字符列数 al 显示模式 bh 当前显示页 0 x90004 1 字 存 放当前页 0 x90006 显示模式 0 x90007 字符列数 检查显示方式 EGA VGA 并取参数 18 调用BIOS 中断0 x10 附加功能选择 取方式信息 功能号 ah 0 x12 bl 0 x10 返回 bh 显示状态 0 x00 彩色模式 I O 端口 0 x3dX 0 x01 单色模 式 I O 端口 0 x3bX bl 安装的显示内存 0 x00 64k 0 x01 128k 0 x02 192k 0 x03 256k cx 显示卡特性参数 参见程序后的说明 BIOS中中断断0 x10 功功能能号号 ah 0 x0f 字字符符列列数数 ah 显显示示模模式式 al 当当前前显显示示页页 bh 读读取取显显示示模模式式 取取显显卡卡当当前前显显示示 模模式式 保保存存致致0 x90004处处 2字字节节 bh 保保存存致致0 x90007处处 1字字节节 保保存存致致0 x90006处处 1字字节节 al ah 图 5 4 取显卡当前模式 5 55 5 取硬盘信息取硬盘信息 首先复制硬盘参数表 取第一个硬盘信息 第1 个硬盘参数表的首地 址竟然是中断向量0 x41 的向量值而第2 个硬盘 参数表紧接第1 个表的后面 中断向量0 x46 的向量值也指向这第2 个 19 硬盘的参数表首址 表的长度是16 个字节 0 x10 下面两段程序分别复制 BIOS有关两个硬盘的参数表 0 x90080 处存放第1个 硬盘的表 0 x90090 处存放第2 个硬盘的表 检查系统是否存在第2 个硬盘 如果不存在则第2 个表清零 利用BIOS 中断调用0 x13 的取盘类型功能 功能号 ah 0 x15 输入 dl 驱动器号 0 x8X是硬盘 0 x80指第1个硬盘 0 x81 第2个硬盘 输出 ah 类型码 00 没有这个盘 CF置位 01 是软驱 没有change line 支持 02 是软驱 或其它可移动设备 有 change line 支持 03 是硬盘 具体流程如下 20 取取硬硬盘盘信信息息 复复制制硬硬盘盘参参数数表表 第第一一个个硬硬盘盘参参数数 表表中中断断向向量量0 x41 第第一一个个硬硬盘盘参参数数 表表中中断断向向量量0 x42 第第2个个表表清清零零 系系统统检检查查是是否否有有 第第2个个硬硬盘盘 Ah 类类型型码码 00 没没有有该该盘盘 CF 1 01 软软驱驱 无无change line支支持持 02 软软驱驱 有有change line支支持持 03 软软驱驱 硬硬盘盘 Y Y N 输输入入dl驱驱动动器器号号 0 x80指指第第1个个硬硬盘盘 0 x81指指第第2个个 硬硬盘盘 图 5 5 取硬盘当前信息 5 65 6 加载段描述符加载段描述符 在加载段描述符时会遇到32 位保护模式的操作 因此需要Intel 32 位保护模式编程方面的知识 lidt 指令用于加载中断描述符表 idt 寄存器 它的操作数是6 个字节 0 1 字节是描述符表的长度值 字节 2 5 字节是 描述符表的32 位线性基地址 首地址 在219 220 行和223 224 行中有 说明 中断描述符表中的每一个表项 8 字节 指出发生中断时需要调用的 代码的信息 与中断向量有些相似 但要包含更多的信息 lgdt 指令用于 21 加载全局描述符表 gdt 寄存器 其操作数格式与lidt 指令的相同 全局描 述符 表中的每个描述符项 8 字节 描述了保护模式下数据和代码段 块 的信息 其中包括段的最大长度限制 16 位 段的线性基址 32 位 段 的特权级 段是否在内存 读写许可以及其它一些保护模式运行的标志 参 见后面205 216 行 设设置置全全局局描描述述符符表表 GDT lgdt指指令令加加载载全全局局描描 述述符符表表寄寄存存器器 描描述述符符项项 8字字节节 描描述述保保护护模模式式下下数数据据 段段和和代代码码段段的的信信息息 段段的的线线性性地地 址址基基址址 32位位 段段的的特特权权级级 是是否否在在内内存存 读读写写许许可可 段段最最大大限限长长 16位位 包包含含 包包含含 包包含含 设设置置中中断断描描述述符符表表 IDT lidt指指令令加加载载中中断断描描 述述符符表表寄寄存存器器 操操作作数数idt 48 6字字节节 字字节节 0 1 描描述述符符表表的的字字 节节长长度度值值 字字节节 2 5 描描述述符符32位位线线 性性基基地地址址 包包含含 包包含含 设设置置描描述述符符表表 图5 6 加载段描述符 5 75 7 A20A20 地址线的开启地址线的开启 由于在机器启动时 默认条件下 A20 地址线是禁止的 所以操作 系统必须使用适当的方法来开启它 但是由于各种兼容机所使用的芯片集不 22 同 要做到这一点却是非常的麻烦 因此通常要在几种控制方法中选择 对A20 信号线进行控制的常用方法是通过设置键盘控制器的端口值 这里的setup s 程序 138 144 行 即使用了这种典型的控制方式 如果输入缓冲器为空 则表示 A20 选通并且可以进行写命令 开开始始 A20地地址址线线的的开开启启 测测试试8042状状态态寄寄存存器器 缓缓冲冲器器是是否否为为空空 写写命命令令 0 xD1 Data 0 x60 缓缓冲冲器器是是否否为为空空 写写命命令令被被接接受受 选选通通A20线线 Y Y N 测测试试8042状状态态寄寄存存器器 N 加加载载机机器器状状态态字字 C CR R0 0 1 1 跳跳转转到到C CS S段段 偏偏移移0 0处处 键键盘盘命命令令队队 列列是是否否为为空空 N N 输输入入缓缓冲冲器器为为空空 进进行行写写命命令令 Y Y 设设置置描描述述符符表表 加加载载中中断断描描述述符符表表寄寄 存存器器i id dt tr r的的指指令令要要求求 的的6 6字字节节的的操操作作数数 加加载载全全局局描描述述符符表表寄寄 存存器器i id dt tr r的的指指令令要要求求 的的6 6字字节节的的操操作作数数 N N Y Y 进进入入保保护护模模

温馨提示

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

最新文档

评论

0/150

提交评论