操作系统启动过程
操作系统的启动是从加电到用户工作环境准备好的过程。主要包括初始引导、核心初始化、系统初始化等。
初始引导的目的是把OS核心装入内存并使之开始工作接管计算机系统。
其过程可描述为:
- 加电,JUMP POST
- BIOS中的启动程序运行
- 启动程序:读取0面0道第1扇区内容(MBR),加载MBR中的引导程序。
- 引导程序:根据相关参数,读取硬盘指定位置的文件到内存,加载硬盘上OS内核,并初始化基本参数。操作系统内核放在什么地方,如何初始化,其相关参数在这里都可以找到。常见的引导程序有ntldr、GRUB、bootmgr和LILO。其中GRUB最常见。
OS内核逐步加载OS剩余部分,最后完成控制计算机。
核心初始化目的是OS内核初始化系统的核心数据。典型工作是各种寄存器的初始化,存储系统和页表初始化,核心进程构建等。
系统初始化为用户使用系统作准备,使系统处于待命状态。主要工作是初始化文件系统,初始化网络系统,初始化控制台,初始化图形界面。
Windows的启动过程:
- 加电自检(POST)之后BIOS启动主机自检程序。
- 初始引导:BIOS从MBR读入引导程序,装入内存的特定位置。
- 引导程序启动DOS7.0,调入操作系统核心。WINDOWS开始接管系统。
- 核心初始化:资源状态、核心数据等初始化;
- 系统初始化:GUI界面生成,系统处于待命/消息接受状态。
操作系统生成
操作系统是满足特定硬件环境和用户需要(比如有些场景下不需要网络等),组装和构建操作系统的过程。
操作系统生成的主要步骤是:
- 根据硬件环境/用户要求配置功能模块和构造参数。
- 构建
OS
镜像(依据用户需要重新编译操作系统源代码)。
要生成一个操作系统有三个前提:1. 操作系统由可拆装模块构成。2. 有交互式配置工具。3. 有映像构建(build
)工具(把第二步得到的源代码重新编译)。
Linux
操作系统的生成主要可以分为以下六个步骤:
- 获取
Linux
内核的源代码
http://www.kernel.org/ # cd /usr/src # tar zxvf linux-2.6.38-12.tar.gz
- 选择和启动内核配置程序
# cd /usr/src/linux-2.6 # make config(文本界面,不推荐使用) # make xconfig(图形窗口模式,xWindow使用) # make menuconfig(文本选择界面,字符终端)
make menuconfig
命令之后得到的界面如下:
用空格键就可以选择是否需要这个模块。
- 根据需要配置内核模块和参数
在第二步的配置中会遇到类似下图这样的一些选项:
做完之后默认的操作系统源代码就被修改了。接下来重新编译即可。
- 重新编译新的内核
# make dep 生成依赖dependency信息 # make clean 清楚旧的编译结果 # make bzImage ./arch/i386/boot/bzImage
- 编译和安装模块
# make modules # make modules_install 模块被编译且安装到/usr/lib<内核版本号>目录下。
- 启动新内核
让刚刚编译好的操作系统内核生效即可:
cp bzImage /boot/bzImage GRUB:配置/boot/grub/grub.conf title newLinux build by Zhang San Feb 28.2018 root(hd0.1) kernel /boot/bzImage ro root=/dev/had2
用户界面
脚本(Script
)通过类似程序的方式执行具有一定逻辑顺序的命令序列完成较复杂的功能和人机交互。脚本程序保存在文本文件中,脚本程序是Shell命令语句的集合。
如下所示就是一个脚本程序:
#!bin/bash # 创建临时文件 sudo mkdir /usr/temp # 解压安装包到临时文件 sudo echo "正在解压文件" sudo unzip -qd /usr/temp /HUSTLibV30.zip sudo echo "解压完成" # 拷贝安装文件 sudo cp -rf /usr/temp/HUSTLibV30/HUSTLib /usr/lib # 使配置文件生效 sudo ldconfig # 删除临时文件 sudo echo "正在删除临时文件" sudo rm -rf /usr/temp sudo echo "删除临时文件成功" sudo echo "安装完成请重启"
创建完脚本程序之后可以用Chmod
命令来给脚本程序添加可执行权限。
系统调用
系统调用是操作系统内核为应用程序提供的服务/函数等,像printf()
,exit()
都是。系统调用一般涉及核心资源或硬件的操作。系统调用主要运行于核态。每一个系统调用都有一个唯一的编号,操作系统会提供一系列的系统调用给用户。系统调用在调用过程中会产生中断,这个中断是自愿中断。