最近一直在看操作系统以及内核设计的东西,不确定自己有能力会参与到类似的开发之中,但是争取能自己改造这内核玩一下,然后按照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. SQL Performance Analyzer

    SQL Performance Analyzer 系统发生变更,比如升级数据库.增加索引,都会可能导致sql的执行计划发生改变,从而影响sql的性能. 如果能预知系统变更会对sql的性能的影响,就可以 ...

  2. stm32定时器PWM模式和输出比较模式

    pwm模式是输出比较模式的一种特例,包含于输出比较模式中 /** @defgroup TIM_Output_Compare_and_PWM_modes * @{ */ #define TIM_OCMo ...

  3. Spring JavaConfig

    以前,Spring推荐使用XML的方式来定义Bean及Bean之间的装配规则,但是在Spring3.0之后,Spring提出的强大的JavaConfig这种类型安全的Bean装配方式,它基于Java代 ...

  4. SpringApplication初始化

    SpringApplication: private void initialize(Object[] sources) { if (sources != null && source ...

  5. Knockout: 使用CSS绑定和event的blur失去焦点事件, 给未通过校验的输入框添加红色边框突出显示.

    目的:使用knockout提供的机制实现输入框失去焦点后的校验工作,并使用CSS绑定给未通过校验的输入框添加红色边框突出显示. 步骤: 先在htm中添加.error的css样式, 并在输入框中的dat ...

  6. python appium 有道云笔记分享文章到qq

    有道云添加一个笔记,笔记的title为aff 使用appium 把这篇文章分享到qq,前提是android里面有登录qq Python代码 from appium import webdriver i ...

  7. nginx加载字体文件的时候报错

    nginx 下加载配置 location ~* \.(eot|ttf|ttc|otf|eot|woff|woff2|svg)$ {                root /web/static_jr ...

  8. 解决NavicatPremium导入CSV文件中文乱码的问题

    在做数据对接导入的时候对方提供的数据是CSV格式的文件 一开始用Excel打开时发现格式就不对,后来发现只要用Excel打开,就会破坏里面的格式 然后想先用NaviCat导入CSV再转成Excel格式 ...

  9. Atitit tomcat在linux服务器的启动与其他

    Atitit tomcat在linux服务器的启动与其他 1.1. /home/tomcat/tomcat3/bin/startup.sh1 1.2. 判断启动是否成功 ps -ef|grep tom ...

  10. GitBash: 右键添加 Git Bash Here 菜单

    步骤: 1.通过在“运行”中输入‘regedit’,打开注册表. 2.找到[HKEY_CLASSES_ROOT\Directory\Background]. 3.在[Background]下如果没有[ ...