最近一直在看操作系统以及内核设计的东西,不确定自己有能力会参与到类似的开发之中,但是争取能自己改造这内核玩一下,然后按照Linux From Scratch那样的把改造后的系统编译运行就心满意足了。正在看的书是《Linux内核设计的艺术》之"图解Linux操作系统架构设计与实现原理",自己看的时候有种恍然大明白的感觉。这本书的特色是图很丰富,看着很爽的感觉,内存地址都画得非常清楚,但是我怕自己只看不动手分析的话,看了很容易遗忘。这里写这篇博客希望能够边看,边学,边分析,边领悟,最好能够提问。


启动原理

从开机到main函数的执行分为三步完成,其目的是实现从启动盘加载操作系统程序,完成执行main函数所需的准备工作。

  1. 第一步,启动BIOS,准备实模式下的中断向量表中断服务程序
  2. 第二步,从启动盘加载操作系统程序到内存,加载操作系统程序的工作就是利用第一步准备的中断服务程序实现的;
  3. 第三步,为执行32位的main函数做过渡工作。

启动盘

如果你有装过操作系统或者玩过BIOS设置的话,会设置操作系统启动的优先顺序,类似下图这样的:

这里我们可以选择多种启动方式,比如,网络,硬盘,软盘或者U盘,当然现在最多的还是从硬盘启动,那么你所设置的第一个就是启动盘。

main函数

main函数这里理解为程序的入口,这里要拿出来说是因为,首先不要想到Linux多么庞大,多么复杂,它就是一个从main函数(不一定叫main)开始执行的程序而已。

BIOS

"基本输入输出系统"(Basic Input/Output System),简称为BIOS,你可以把这里理解为一个提供了很多基本操作的工具程序,util。假设把操作系统比喻为飞奔在高速公路的小汽车,那么BIOS可以看成是把小汽车带向高速公路的辅路。

实模式,32位(保护模式)

实模式和保护模式是intel cpu所提供的功能。

实模式(Real Mode)是Intel 80286和之后的80x86兼容CPU的操作模式。实模式是一个20位的存储器地址空间(2^20=1048576,即1MB的存储器可被寻址),可以直接通过软件的方式访问BIOS以及周边硬件,没有硬件支持的分页机制和实时多任务的概念。从80286开始,所有的80x86 CPU的开机状态都是实模式;8086等早期的CPU只有一种操作模式,类似于实模式。

下面的来自百度百科,发现保护模式和实模式都可以单独写一篇了。

保护模式,是一种80286系列和之后的x86兼容CPU操作模式。保护模式有一些新的特色,设计用来增强多工和系统稳定度,像是内存保护,分页系统,以及硬件支援的虚拟内存。大部分的现今 x86 操作系统都在保护模式下运行,包含 Linux、FreeBSD、以及 微软 Windows 2.0 和之后版本。另外一种286和其之后CPU的运行模式是实模式,一种向前兼容且关闭了保护模式这些特性的CPU运行模式。用来让新的芯片可以运行旧的软件。依照设计的规格,所有的x86 CPU都是在实模式下开机,来确保传统操作系统的向前兼容性。在任何保护模式的特性可用前,他们必须要由某些程序手动地切换到保护模式。在现今的计算机,这种切换通常是由操作系统在开机时候必须完成的第一件任务的一个。它也可能当CPU在保护模式下运行时,使用虚拟86模式来运行设计运行在实模式下的代码。

实模式下CPU的寻址范围为0至0xFFFFF,1MB寻址空间,需要0~19号共20根地址线。进入保护模式后,将使用32位寻址模式,即采用32根地址线进行寻址,第21根至第32根地址的选通,将意味着寻址模式的切换。只能补充这么多,再搞就要跑题了。

中断、中断向量表和中断服务程序(例程)

中断INT(INTerrupt):顾名思义中断就是中途打断一件正在进行中的事。其最初的意思是:外在的事件打断正在执行的程序,转而执行处理这个时间的特定程序,处理结束后,回到被打断的程序继续执行。现在,可以先将中断理解为一种技术手段,在这一点上与C语言的函数调用有些类似。

中断对于操作系统来说意义重大,后面还会深入讨论。

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

准备实模式下的中断向量表和中断服务程序

对于普通玩家来说,按下电源键,电脑就启动了,压根不需要关心怎么启动的。对于一个有志于计算机研究的人而言(装逼。。。),需要熟悉计算机启动过程中,操作系统底层与计算机硬件之间究竟做了哪些复杂的交互动作。

Linux0.11从开机到准备执行main函数的启动学习的更多相关文章

  1. eclipse 中执行 main 函数如何添加参数

    我们通常执行 main 函数都是直接在类界面 右键 选择 Run As --> Java Application 但是如何 执行时带有参数呢? 右键 --> Run As --> R ...

  2. python+unnitest时运行后不执行main函数里面的内容

    1.使用工具pycharm运行unnitest程序遇到的问题 1) 问题:运行后无法生成报告:经print()发现未执行main函数里的内容 2) 原因:使用unnitest测试框架,pycharm运 ...

  3. 第七章之main函数和启动例程

    main函数和启动例程 为什么汇编程序的入口是_start,而C程序的入口是main函数呢?本节就来解释这个问题.在讲例 18.1 “最简单的汇编程序”时,我们的汇编和链接步骤是: $ as hell ...

  4. WPF 用Main函数方式启动程序

    原文:WPF 用Main函数方式启动程序 WPF默认程序启动:新建project后自动生成的App.xaml中指定程序启动方式(StartupUri="MainWindow.xaml&quo ...

  5. Python3 Selenium自动化web测试 ==>FAQ:PyCharm中脚本不执行main函数内容解决方案

    FAQ: 情景:之前写好可以正常执行的python脚本,突然main函数下的代码不运行 原因:pycharm中,会设置py脚本按照unittest的方式运行,也就是只运行用例,不运行main函数下代码 ...

  6. [汇编与C语言关系]2. main函数与启动例程

    为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...

  7. main函数和启动例程

    为什么汇编程序的入口是_start,而C程序的入口是main函数呢?本节就来解释这个问题.在讲例 18.1 “最简单的汇编程序”时,我们的汇编和链接步骤是: $ as hello.s -o hello ...

  8. 关于C/C++中main函数参数的学习

    因为面对对象作业(2018.5.21)的要求,去学习了C/C++中main函数参数的意义,以及一些简单的使用(从命令行指令的接受),不给予赘述.(仅为个人拙见,还望看官指正) 首先,带有参数的main ...

  9. Linux0.11内核--加载可执行二进制文件之1.copy_strings

    从现在开始就是分析最后的核心模块exec.c了,分析完这个文件后,就会和之前的所有分析形成一个环路,从创建进程.加载进程程序到进程调度.内存管理. exec.c的核心do_execve函数很长,而且用 ...

随机推荐

  1. Java – Stream has already been operated upon or closed

    Java – Stream has already been operated upon or closed package com.mkyong.java8; import java.util.Ar ...

  2. FFT节省资源的思路

    作者:桂. 时间:2017-01-18  23:07:50 链接:http://www.cnblogs.com/xingshansi/articles/6298391.html 前言 FFT是信号处理 ...

  3. 安装Flume的时候出现File Channel transaction capacity cannot be greater than the capacity of the channel capacity -解决方案 摘自网络

    部署flume集群时,在启动collector服务器没报错,启动agent服务器报错: File Channel transaction capacity cannot be greater than ...

  4. centos 7 下图形验证码乱码

    工作中遇到一个问题:同样的代码在centos 6.5下图形验证码是正常的 但是在centos 7下面是乱码 centos 6.5 的系统字体库目录 [wwwad@P2P-test2 fonts]$ p ...

  5. php分享二十一:mysql语句

    一.Join语法概述 JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接) RIGHT JOIN(右连接 ...

  6. Android自己定义ViewGroup(二)——带悬停标题的ExpandableListView

    项目里要加一个点击可收缩展开的列表,要求带悬停标题,详细效果例如以下图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fon ...

  7. Shiro系列(3) - What is shiro?

    什么是shiro? Shiro是apache的一个开源权限管理的框架,它实现用户身份认证,权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架 使用shiro来实现权限管理,可以非常有效的提高 ...

  8. 获取IOS屏幕尺寸大小

    转自:http://www.open-open.com/lib/view/open1395752090322.html 1.app尺寸,去掉状态栏 CGRect r = [ UIScreen main ...

  9. # tail -f /var/log/zabbix/zabbix_agentd.log sudo: sorry, you must have a tty to run sudo

    /etc/sudoers 1)Defaults requiretty,修改为 #Defaults requiretty,表示不需要控制终端. 2)Defaults requiretty,修改为 Def ...

  10. Spark Streaming的接收KAFKA的数据

    https://github.com/lw-lin/CoolplaySpark/blob/master/Spark%20Streaming%20%E6%BA%90%E7%A0%81%E8%A7%A3% ...