日期:2014-05-16  浏览次数:20685 次

Linux学习笔记(linux 0.11完全注释)

Linux学习笔记(linux 0.11完全注释)
2010年11月14日
  GNU计划:旨在开发一个类似UNIX并且是自由软件的完整操作系统。
  POSIX标准:是由IEEE和ISO/IEC开发的一簇标准。该标准基于UNIX的实践和经验,描述了操作系统的调用和服务接口。用来保证编制的应用程序能在源代码一级上在多个操作系统上移植和运行。
  Linux-0.11 版本发布时包括以下文件:
  bootimage.Z     --  具有美国键盘代码的压缩启动映像文件
  rootimage.Z     --  以 1200KB 压缩的根文件系统映像文件
  linux-0.11-tar.Z     --  内核源码文件。大小为 94KB, 展开后也仅有 KB
  as86.tar.Z     --  Bruce Evans' 的二进制执行文件。是 16 位的汇编程序和装入程序
  INSTALL-0.11    --  更新过的安装信息文件
  bootimage.Z 和 rootimage.Z 是 压缩的软盘映像文件。 bootimage 是引导启动 Image 文件,主要包括磁盘引导扇区代码、 操作系统加载程序和内核执行程序。 PC 启动时 ROM BIOS 中的程序会把默认启动驱动器上的引导扇区代码和数据读入内存, 而引导扇区代码负责把操作系统加载程序和内核执行代码读入内存中,然后把操作系统的控制权交给操作系统加载程序去进 一步准备内核的初始化操作,最终加载程序会把控制权交给内核代码。内核若要正常运行就需要文件系统的支持, rootimage 就是用于向内核提供最基本支持的根文件系统。这 2 个盘合起来就相当于一张可启动的 dos 操作系统盘。 这些文件的下载地址如下:
  http://oldlinux.org/Linux.old/images/ 
  http://oldlinux.org/Linux.old/kernels/ 
  http://oldlinux.org/Linux.old/bochs/ 
  http://oldlinux.org/Linux.old/Linux-0.11/ 
  第一部分:1至4章,基础知识部分,包括微机原理和80x86保护模式编程。 
  第 二部分: 5至7章,描述内核引导启动和32位运行方式的准备阶段。 
  第 三部分: 8至13章,内核代码的主要部分。 
  第 四部分: 14至16章,作为第三部分源代码阅读的参考信息。 
  第 五部分:针对linux 0.11内核的各种实验活动。  总线插槽是数据总线、地址总线、控制线与扩展设备控制器的标准连接接口。总线接口标准通常有: ISA 、 EISA 、 PCI 、 AGP 、 PCIE 。 
  现代 PC 机主要使用 2 个超大规模芯片构成的芯片组或芯片集组成: southbridge 、 northbridge 。 Northbridge 用于与 CPU 、内存和 AGP 视频接口,这些接口具有高传输速率; northbridge 还起存储器控制作用,故 Intel 称之为 MCH ( memory controller hub );南桥芯片用于管理中低速器件,如 PCI 总线接口、 IDE 硬盘接口、 USB 端口等,故南桥芯片称之为 ICH ( I/O controller hub );  I/O 控制器包含数据端口、命令端口、状态端口。 I/O 编址分 2 种:统一编址和独立编址。 
  统一编址中访问 I/O 跟访问内存一样,独立编址中有单独的 I/O 地址空间,用专门的指令进行访问。 
  IBM pc 主要使用独立编址, I/O 地址空间为 0~0x3ff; 也部分使用了统一编址,如显存就直接占用了内存空间 0xb800~0xbc00 。 
  在普通 Linux 系统下可以通过查看 /proc/ioports 可以得到相关控制器或设置使用的 I/O 地址范围。 
  接口数据传输有 3 种方式:查询、终端、 DMA 。  当计算机上电初始化时,物理内存被设为从 0 地址开始的连续区域。除了地址从 0XA0000 到 0XFFFFF(640K 到 1M) 和 0XFFFE0000 到 0xffffffff ( 4G 的最后 64K )范围外所有的内存都可以用作系统内存。这 2 个特定范围被特定用作 I/O 设备和 BIOS 程序。 
  当上电或者复位时, CPU 会把程序指针知道 4G 内存空间的最后 64K 的最后 16 字节处。 BIOS 会在这儿存放一条 JMP 指令跳转到 BIOS 代码中 64KB 范围内的某一条指令开始执行。 BIOS 在执行一系列硬件检测和初始化后,就会把原来 pc 兼容的 64KB 的代码和数据复制到内存低端 1M 末端的 64K 处,然后跳转到这个地方进入真正的实地址模式工作,如图 2-5 所示。最后, BIOS 就会从硬盘或者其他存储介质把操作系统引导程序加载到内存 0x7c00 处,并跳转到这个地方继续执行引导程序。 
  注:由于效率原因, Linux 只利用了 BIOS 的一些最基本的信息,并不使用 BIOS 。 
  在 PC/AT 机中,还使用了很小容量(只有 64 到 128 字节)的 CMOS 来存储计算机的实时时钟信息和硬件配置信息。 
  软盘和硬盘控制器 
  ....................   As86汇编器+ld86链接器 boot/bootsect.s boot/setup.s Intel汇编
  GNU as汇编器+GNU链接器 除as针对的2个文件,包括c生成的汇编 AT&T汇编 默认输出为a.out
  
  
  嵌入式汇编基本格式
  
  Linux 0.11目标文件格式
  
  
  标志寄存器:标志寄存器EFLAGS中的系统标志和IOPL用于控制I/O访问、可屏蔽硬件中断、调试、任务切换以及虚拟8086模式。
  
  内存管理寄存器:共4个内存管理寄存器,GDTR、LDTR、IDTR和TR,用于指定分段内存管理所使用的系统表的基地址。
  
  GDTR:记录GDT(全局描述符表)的基地址和表长度。是用指令LGDT和SGDT分别用于load和store。
  LDTR:记录LDT(局部描述符表)的基地址和表长度。是用指令LLDT和SSDT分别用于load和store。在任务切换是改变。
  IDTR:记录IDT(中断描述符表)的基地址和表长度。是用指令LIDT和SIDT分别用于load和store。
  TR:任务寄存器,在任务切换时改变。
  控制寄存器:包括CR0~3
  CR0中含有控制处理器操作模式和状态的系统控制标识;CR1保留不用;CR2含有导致也错误的线性地址。CR3含有页目录表物理内存基地址,故也称作页目录基地址寄存器PDBR.
  
  CR0:PE―protection enable;PG―Paging
  CR3:含有存放页目录表页面的物理地址,因为该地址是页对齐的,所以仅高20位有效。 任何完整的内存管理系统都包含2个关键部分:保护和地址变换。
  
  
  逻辑地址包含段选择符和偏移量,通过段选择符在段描述符表中查到段描述符(段描述符表[段选择符])。段描述符指定:段基址、段大小、访问权限和特权级、段类型。
  分页机制即是把段再分为固定大小(常为4k)的页,存储在2个地方:1 物理内存,需要使用时直接使用; 2 硬盘或flash,需要使用时调入内存。
  保护
  任务之间的保护:全局地址空间,所有的任务都能访问,所有任务使用相同的虚拟地址访问映射到全局地址空间的物理地址,所有段的段描述符存于GDT众。局部地址空间,属于各个任务私有的虚拟地址空间,段描述符存在该私有任务对应的LDT中。
  特权级保护:定义数据段的特权级。 
  
  逻辑地址转成线性地址的步骤:
  
  段描述符表:
  
  
  分页机制是实现虚