Linux内核设计艺术笔记(一)

国庆长假,纯宅宿舍了。所谓浪费光阴可耻,而且又正处于找工作的阶段,虽然对自己所学已有几分把握,不过,毕竟尚无offer在手。所以,还是老老实实的啃书本,把知识复习复习,整理整理。一方面温故知新,另一方面当作准备面试工作,一举两得。

从《Linux内核设计的艺术》这本书开始吧。六月底开始入手这本书,花了一个月细读,对内核基本上有了个十分感性的认识,比起之前看的各种枯燥的理论,这本书有个特别的优点,就是线索明确连贯,从开机加电开始,一路缕下来,包括执行main函数之前的准备,进程0,1,2...的依次创建等等,思路很清晰,如果之前有学过操作系统,了解些汇编和C,这本书相对于其他内核书,我觉得通俗易懂,会非常享受。对于linux内核初学者,我也真心推荐下。

下面是本书的一些笔记,谈不上心得,先识记吧。(本书选用Linux0.11系统

一、从开机加电开始

从加电开机到main函数的执行主要分为三部分,目的是实现操作系统程序的加载,完成main函数所需的前期准备工作。

第一步,启动BIOS,准备实模式下的中断向量表和中断服务程序;

第二步,利用第一步中的中断服务程序,加载操作系统程序到内存;

第三步,为执行main函数做过渡工作。

实模式:20位的存储器地址空间,即1MB的存储器可寻址;           保护模式:32位可寻址 

                                              

第一步:CPU硬件逻辑设计加电瞬间强行设置CS、IP值,这样CS : IP指向特定的绝对地址,亦即BISO程序入口。之后,BIOS程序执行,......一些列操作后,在内存中建立中断向量表和中断服务程序,为后序加载系统内核程序服务。

第二步:分三批次逐步加载内核代码,分别是bootsect、setup、system模块。

               第一批:计算机硬件体系结构与BIOS联手,让CPU接收一个int 0x19中断,CPU接收到此中断,利用第一步BIOS程序中建立的中断向量表及对应中断服务程序,启动加载服务程序,即加载系统启动盘(光盘)中的Linux0.11的引导程序(bootsect)。此程序的载入,标志计算机自开机以来,内存中第一次有了Linux0.11操作系统自己的代码。

               第二批:首先,bootsect进行内存规划,即对后续操作所涉及的内存位置进行设置,这些动作主要是为了确保将要载入内存的内核代码与已载入内存的代码及数据各在其位,互不覆盖,并且各自有够用的内存空间(操作系统的设计者要全面地,整体地考虑内存的规划);其次,bootsect启动程序开始加载setup程序,此动作借助BIOS提供的int 0x13中断。

               第三批:继续执行bootsect,仍然使用int 0x13中断加载system模块代码。第三批加载完毕,标志着整个Linux0.11的代码已全部加载至内存,主体工作完成。bootsect程序任务完成,然后,跳转至setup程序加载的位置,由setup程序接替bootsect程序继续执行。接下来的工作就是通过已加载的内存中的内核代码,实现从实模式到保护模式的转变,使Linux0.11真正成为“现代”操作系统。

第三步:向保护模式转变,为main函数调用做准备工作。这一步是执行main函数前的核心部分,包括打开32位寻址空间,打开保护模式,重建保护模式下的中断响应机制,建立内存分页机制等等。

               首先,关中断,系统从此时开始不再对中断事件进行响应,接下来由setup程序将system模块内核代码拷贝复制到起始位置0x00000处(重要)。作用及影响:

               1,废除BIOS中断向量表,等同于废除BIOS提供的实模式下的中断服务机制;

               2,收回刚刚结束使用寿命的bootsect等程序所占的内存空间;

               3,让内核代码占据内存物理地址最开始、天然的、有利的位置。

               然后,setup程序开始初始化设置保护模式下的中断服务机制,并实现32位寻址,至此,setup程序执行完毕,跳转至system模块。

               在system模块中,包含head程序及内核程序。此时,head程序从0x00000开始执行。head程序利用自身代码在程序自身所在内存空间创建内核分页机制,即在0x00000位置创建页目录表、页表、缓冲区,重建中断服务体系等,并将其自身已执行的代码空间覆盖。head程序最后,将main函数地址压栈,在分页机制创建完成后,main函数地址出栈并执行。

内存分布示意图如下:

                                       

重要补充:将system模块移至0x00000处,在内存起始位置创建分页机制,认定页目录表在内存起始位置。这三个动作联合为内核控制用户程序奠定基础。这个位置是内核通过分页机制能够实现线性地址等于物理地址的唯一起始位置。

至此,Linux0.11内核启动的第一个重要阶段完成。注意,此时,系统仍处于关闭中断状态

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值