Linux内核设计艺术读书笔记(1)

这本书里提到的操作系统绝大部分是指Linux 0.11

1.1

从开机到main函数执行分三步

  1. 启动BIOS,准备实模式下的中断向量表和中断服务程序
  2. 启动盘加载操作系统到内存
  3. 为执行32位的main函数做过渡
实模式:20位存储器地址空间,1MB的存储器可寻址,可直接通过软件方式访问BIOS及周边硬件,没有硬件支持的分页机制和实时多任务的概念。

Intel 80x86 CPU可以分别在16位实模式和32位保护模式下运行,加电即进入16位实模式状态运行,加电瞬间强行将CS的值置为0xFFFF,IP的值置为0x0000,CS:IP指向0xFFFF0,即BIOS的地址范围。

IP/EIP:指令指针寄存器,记录将要执行的指令在代码段内的偏移地址,与CS组合即为将要执行的指令的内存地址。实模式为绝对地址,指令指针为16位,即IP;保护模式为线性地址,指令指针为32位,即EIP。

CS:代码段寄存器,指向CPU当前执行代码在内存中所在的区域。

如果0xFFFF0上没有可执行代码,计算机就此死机。BIOS固化在一片ROM里,断电仍能保存信息。

中断向量表中有256个中断向量,每个中断向量占4个字节,其中两个是CS,两个是IP,每个中断向量指向一个具体的中断服务程序。

1.2

Linux 0.11,1991年,分三批加载操作系统代码(bootsect、setup、system)。计算机完成自检等操作后,CPU接收到int 0x19中断(BIOS提供),对应的中断服务程序是将软盘(是的,那时还是软盘)的第一个扇区中的程序加载到内存,这个就是Linux 0.11的引导程序,bootsect(代码写在bootsect.s中),作用是把软盘中的操作系统载入内存。

操作系统把最开始执行的程序`定位`在启动扇区,BIOS从启动扇区把代码加载到0x07C00(BOOTSEG),不管从这个扇区中加载的是什么

bootsect首先规划了内存,确保将要载入内存的代码和已经载入内存的代码及数据互不覆盖,并且各自有足够的内存空间。然后将自身(512B)从0x07C00处复制到内存0x90000(INITSEG)。之后bootsect执行int 0x13中断,将setup.s对应的程序加载至内存的SETUPSEG处,将约240个扇区的system模块加载至SYSSEG处往后的120KB空间中。

这时bootsect把根设备号保存在root_dev中,作为机器系统数据之一。Linux 0.11使用Minix操作系统的文件系统管理方式,要求系统必须存在一个根文件系统上,其他文件系统挂接其上。Linux 0.11的启动需要两部分数据,系统内核镜像和根文件系统,这里的文件系统指的是有配套文件系统格式的设备,而不是操作系统内核中的文件系统代码。

下面程序跳转到0x90200处,setup开始执行,首先利用BIOS提供的中断服务程序从设备上提取内核运行所需的机器系统数据,包括光标位置和显示页面等。机器系统数据将覆盖bootsect所在的绝大部分区域(512字节中覆盖了510字节,2字节未覆盖)。

1.3

接下来操作系统要使计算机在32位保护模式下工作。首先,操作系统将CPU的标志寄存器(EFLAGS)中的中断允许标志位(IF)置0,操作系统不再响应BIOS中断,为接下来操作系统进入保护模式做准备。接着setup将位于0x10000的内核程序拷贝至内存地址起始位置0x00000处,覆盖BIOS的中断向量表和数据区。

接下来,setup自身提供的数据信息对IDTR和GDTR进行初始化。

GDT:全局描述符表,系统中唯一存放段寄存器内容(段描述符)的数组,配合程序进行保护模式下的段寻址。GDT可以理解为所有进程的总目录表,存放着每一个任务的局部描述符表(LDT)地址和任务状态段(TSS)地址,用于完成进程中各段的寻址、现场保护与现场恢复。
GDTR:GDT可以存放在内存的任何位置,当程序通过段寄存器引用一个段描述符时,需要取得GDT的入口,GDTR标识的即为此入口。操作系统完成对GDT的初始化后,可以用LGDT指令将GDT基地址加载至GDTR。
IDT:中断描述符表,保存保护模式下所有中断服务程序的入口地址
IDTR:IDT基地址寄存器,保存IDT的起始地址

接下来,打开A20地址线,CPU可以进行32位寻址,最大寻址空间为4GB。

setup对可编程中断控制器8259A重新编程,因为保护模式下和实模式的中断号不同。将CR0寄存器的第0位(PE)置1,即设定了保护模式,后续执行哪里的程序要根据GDT表来决定。

head程序属于system模块的一部分,在main函数之前执行。head创建了页目录表,页表,缓冲区,GDT,IDT,并将自身已执行过的代码所占的内存空间覆盖。

实模式下,CS本身是代码段基址,保护模式下,CS本身是代码段选择符。

head程序现在要对中断描述符表进行设置,废除已有的GDT,并在内核中的新位置重新创建全局描述符表。原本的GDT所在位置是setup里设置的,将来会被缓冲区覆盖。段限长也从原来的8MB变为现在的16MB。

head程序将L6标号和main函数入口地址压栈,栈顶为main函数地址,目的是使head程序执行完后通过ret指令可以直接执行main函数,如果main函数退出,就会返回到L6标号处继续执行,并产生死循环。

接下来head程序跳到setup_paging,开始创建分页机制。首先将页目录表和4个页表放在物理内存的起始位置,从内存起始位置开始的5页空间内容全部清零(每页4KB),重新设置。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Linux内核设计艺术》是一本经典的关于Linux内核设计的书籍,它由林翰著。在这本书中,作者通过对Linux内核的分析和解读,探讨了Linux内核设计的各个方面及其与操作系统理论的关系。这本书深入浅出地介绍了Linux内核的各个方面,包括进程管理、文件系统、内存管理、设备驱动等等。通过对实际的代码进行解析,读者可以更好地理解Linux内核设计原理和实现细节。 《Linux内核设计艺术》一书对于想要深入了解Linux内核的开发人员来说是一本非常有价值的参考书籍。它不仅帮助读者理解Linux内核设计思路,还提供了许多实用的技术和方法。本书中介绍的一些设计原则和技术在Linux内核开发中被广泛应用,成为了解决实际问题的重要工具。 此外,本书还介绍了Linux内核开发的一些实践经验,包括调试技巧、性能优化、安全性等方面的内容。这些实践经验对于初学者和有一定经验的开发人员都非常有帮助,可以帮助开发人员更好地理解和掌握Linux内核设计和开发。 总之,作为一本关于Linux内核设计的重要参考书,《Linux内核设计艺术》深入浅出地介绍了Linux内核设计原理和实现细节。无论是想要深入了解Linux内核的开发人员,还是对操作系统设计感兴趣的读者,都可以从中获得很多宝贵的知识和经验。通过阅读本书,读者可以更好地理解和掌握Linux内核设计艺术。 ### 回答2: 《Linux内核设计艺术》是由美国著名程序员林纳斯·托瓦兹撰写的一本经典著作,对于理解Linux内核设计原理和艺术有着重要的指导意义。 首先,Linux内核是一个模块化、可扩展的操作系统内核。它采用了微内核和宏内核设计思想,在保持内核简洁的同时,通过模块加载的方式提供了丰富的功能扩展。 其次,Linux内核设计注重性能优化和资源管理。通过进程调度、内存管理、IO调度等机制,充分利用计算机硬件资源,提高系统的运行效率和响应速度。同时,内核设计还考虑了系统的稳定性和安全性,通过权限控制、虚拟内存等机制保证了系统的稳定和安全。 另外,Linux内核设计还注重可靠性和可移植性。在不同的硬件平台上能够保持一致的接口和行为,使得应用程序在不同的平台上能够无缝运行,提高了开发和部署的灵活性。 此外,Linux内核设计还强调了开放性和社区参与。通过开源的方式,让更多的开发者参与到内核设计和开发过程中,吸取各种意见和建议,使得内核更加符合用户的需求。 总之,《Linux内核设计艺术》通过深入的剖析和实例讲解,揭示了Linux内核设计的奥妙与艺术。对于理解Linux内核设计原则和实践,以及对于开发人员提供了一个宝贵的参考和学习资料。 ### 回答3: Linux内核设计艺术是一本由林宇翔所著的图书,通过对Linux内核的深入研究和分析,阐述了Linux内核设计原理以及艺术之处。该书从内核存储管理、进程管理、中断处理、文件系统等多个方面进行了详细的讲解。 Linux内核凭借其开源的特性,成为了广大开发者和研究人员的首选平台,被广泛应用于服务器、移动设备、嵌入式系统等各个领域。而正确理解并熟练掌握Linux内核设计艺术,将对开发者在Linux环境下进行软件开发和系统调优提供帮助。 该书首先介绍了Linux内核的运行机制和基本原理,深入分析了Linux内核设计的哲学和设计原则。随后,阐述了内存管理和进程管理的相关内容,包括内存分配、虚拟内存、文件映射等方面。此外,还探讨了中断处理、设备驱动和I/O管理的知识点,以及文件系统、网络协议栈等核心模块的实现细节。 这本书还介绍了一些用户态工具,帮助读者更好地理解Linux内核设计与实现,同时提供了学习和研究Linux内核的一些实践经验和方法。书中的案例分析和示例代码也为读者提供了实践的机会,促使读者通过动手实践进一步加深对Linux内核设计原理的理解。 总之,Linux内核设计艺术是一本深入浅出、全面系统的介绍了Linux内核设计原理和技术细节的图书,对于想要更深入了解和研究Linux内核的开发者和研究人员来说,具有很高的参考价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值