Linux学习之旅二:设备环境初始化和激活进程0

本系列是学习《Linux内核设计的艺术》等的读书笔记,有理解错误或不当的地方欢迎指出

        续接上章,从现在开始执行main函数。当前的操作系统大多数抛弃了init进程,采用systemd启动各种服务,而systemd又是一个大坑,感兴趣的可以往坑里跳。Linux0.11是支持多进程的现代操作系统,用户进程在运行的过程中彼此不能互相干扰,才能保证进程的正常运行。因此操作系统人为规定了一套进程管理信息数据结构:task_struct、GDT等,它标识了进程的各项属性:剩余时间片、进程执行状态、局部数据描述符表(LDT)和任务状态描述符表(TSS)等。

2.1设置根设备

        内核首先初始化根设备和硬盘,用bootsect程序写入内存的0x901FC的根设备信息,设置根设备,并用setup程序加载的自0x90080起的32字节的硬盘参数表,设置内核硬盘信息drive_info。

2.2规划物理内存格局,设置缓冲区、虚拟盘、主内存

        对内存的设置从根本上决定了所有进程使用内存的数量和方式,必然会影响到主机中的运算速度。除内核代码和数据所占的内存空间之外,其余物理内存主要分为三个部分:主内存、缓冲区和虚拟盘。主内存区是进程代码运行的空间,也包括内核管理进程的数据结构。缓冲区主要作为主机和外设进行数据交换的中转站。虚拟盘区作为可选项,可用于预加载外设数据,提高系统运行效率。

        先根据内存大小对缓冲区和主内存区的位置和大小进行初步设置,这里具体划就不给出来了。

2.3设置虚拟盘空间并初始化

        检测Makefile文件中“虚拟盘使用标志”是否设置,以此确认系统是否使用虚拟盘。该书假定所用的计算机内存为16MB,有虚拟盘2MB。操作系统从缓冲区末端起开辟2MB内存空间设置为虚拟盘,主内存起始位置后移2MB(即以虚拟盘末端作为主内存起始位置)。调用rd_init()函数,对虚拟盘设置,最后返回虚拟盘的长度值。这个返回值将用来重新设置主内存区的起始位置。

2.4内存管理结构mem_map

        系统调用mem_init()函数,先对主内存区的管理结构进行设置。系统通过mem_map[ ]对1MB以外的内存分页进行管理,记录每一个页面的使用次数。mem_init()函数先将所用的内存页面均设置成USED,然后将主内存中的所有页面计数清零,系统只把计数为0的页面视为空闲页面。(1MB以内的内存是内核空间,采用另外一套分页管理)。

2.5异常处理类中断程序挂接

        trap_init()函数将中断、异常处理的服务程序与IDT进行挂接,重建中断服务体系。大体就是将IDT中断号指向对应的异常处理程序内存地址,但是保留IDT的int 0x11~int 0x2F。

2.6初始化块设备请求项结构

        进程要想与块设备进行沟通,必须经过内存的缓冲区。请求项管理结构是操作系统管理缓冲区中的缓冲块与块设备上逻辑块之间读写关系的数据结构。操作系统根据进程读写任务的优先级,决定缓冲块与块设备之间的读写操作,把需要操作的缓冲块记录在请求项上。得到请求之后,根据请求项中的记录决定当前需要处理哪个设备的哪个逻辑块。

2.7与建立人机交互界面相关的外设的中断服务程序挂接

        初始化各类字符设备:串口、显示器、键鼠等,以及相关的中断服务程序与IDT挂接。

2.8开机启动时间设置

          这里的开机启动时间应该是操作系统获取CMOS存储的时间,操作系统有了当前准确的时间,其他事务(如:文件修改的时间、文件最近访问的时间等)才能正确处理。

2.9初始化进程0

        init进程作为Linux操作系统的0号进程,也是Linux操作系统父子进程创建机制的第一个进程。

        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值