Linux0.11从开机到准备执行main函数的启动学习
最近一直在看操作系统以及内核设计的东西,不确定自己有能力会参与到类似的开发之中,但是争取能自己改造这内核玩一下,然后按照Linux From Scratch那样的把改造后的系统编译运行就心满意足了。正在看的书是《Linux内核设计的艺术》之"图解Linux操作系统架构设计与实现原理",自己看的时候有种恍然大明白的感觉。这本书的特色是图很丰富,看着很爽的感觉,内存地址都画得非常清楚,但是我怕自己只看不动手分析的话,看了很容易遗忘。这里写这篇博客希望能够边看,边学,边分析,边领悟,最好能够提问。
启动原理
从开机到main函数的执行分为三步完成,其目的是实现从启动盘加载操作系统程序,完成执行main函数所需的准备工作。
- 第一步,启动BIOS,准备实模式下的中断向量表和中断服务程序;
- 第二步,从启动盘加载操作系统程序到内存,加载操作系统程序的工作就是利用第一步准备的中断服务程序实现的;
- 第三步,为执行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函数的启动学习的更多相关文章
- eclipse 中执行 main 函数如何添加参数
我们通常执行 main 函数都是直接在类界面 右键 选择 Run As --> Java Application 但是如何 执行时带有参数呢? 右键 --> Run As --> R ...
- python+unnitest时运行后不执行main函数里面的内容
1.使用工具pycharm运行unnitest程序遇到的问题 1) 问题:运行后无法生成报告:经print()发现未执行main函数里的内容 2) 原因:使用unnitest测试框架,pycharm运 ...
- 第七章之main函数和启动例程
main函数和启动例程 为什么汇编程序的入口是_start,而C程序的入口是main函数呢?本节就来解释这个问题.在讲例 18.1 “最简单的汇编程序”时,我们的汇编和链接步骤是: $ as hell ...
- WPF 用Main函数方式启动程序
原文:WPF 用Main函数方式启动程序 WPF默认程序启动:新建project后自动生成的App.xaml中指定程序启动方式(StartupUri="MainWindow.xaml&quo ...
- Python3 Selenium自动化web测试 ==>FAQ:PyCharm中脚本不执行main函数内容解决方案
FAQ: 情景:之前写好可以正常执行的python脚本,突然main函数下的代码不运行 原因:pycharm中,会设置py脚本按照unittest的方式运行,也就是只运行用例,不运行main函数下代码 ...
- [汇编与C语言关系]2. main函数与启动例程
为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...
- main函数和启动例程
为什么汇编程序的入口是_start,而C程序的入口是main函数呢?本节就来解释这个问题.在讲例 18.1 “最简单的汇编程序”时,我们的汇编和链接步骤是: $ as hello.s -o hello ...
- 关于C/C++中main函数参数的学习
因为面对对象作业(2018.5.21)的要求,去学习了C/C++中main函数参数的意义,以及一些简单的使用(从命令行指令的接受),不给予赘述.(仅为个人拙见,还望看官指正) 首先,带有参数的main ...
- Linux0.11内核--加载可执行二进制文件之1.copy_strings
从现在开始就是分析最后的核心模块exec.c了,分析完这个文件后,就会和之前的所有分析形成一个环路,从创建进程.加载进程程序到进程调度.内存管理. exec.c的核心do_execve函数很长,而且用 ...
随机推荐
- 利用css如何让嵌套的div层不继承父div层的透明度?
http://zhidao.baidu.com/link?url=cvQhh0Q7_ah0qg9tc-2zP0cjB_PoIiIq6t6RFpp4aZPPNoVJUqyy7TT41TU5pWzRtRY ...
- Nginx错误提示:504 Gateway Time-out解决方法
朋友说504 Gateway Time-out的错误提示与nginx本身是没有任何关系的我们可以通过fastcgi配置参数的调整进行解 决. 修改 php-fpm 配置文件: 1.把 max_chil ...
- [转]Http Message结构学习总结
最近做的东西需要更深入地了解Http协议,故死磕了一下RFC2616-HTTP/1.1协议,主要是了解Http Message结构及每部分含义,在此总结一下,写一个模拟发送HTTP请求的工具,由于时间 ...
- easyui中combobox的值改变onchang事件
今天在公司里,那jquery中的easy-ui-里面的combobox,真的郁闷死了! 把郁闷的事情记下来,下次就不会犯错了! 首先,肯定少不了,引入jquery的js文件!请大家注意了! 下面是代码 ...
- 幽灵漏洞(Ghost gethost)
幽灵漏斗简介: 编号CVE-2015-0235的GHOST(幽灵)漏洞是Qualys研究员发现的一个Linux服务上非常严重的安全漏洞,可以被利用来远程代码执行及本地权限提升. 漏洞简要描述 该漏洞存 ...
- python yield的解释
链接地址: http://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html https://www.jians ...
- [Unity3D]Unity3D游戏开发之跑酷游戏项目解说
大家好,我是秦元培.我參加了CSDN2014博客之星的评选,欢迎大家为我投票,同一时候希望在新的一年里大家能继续支持我的博客. 大家晚上好.我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.c ...
- 关于的 recorder robotium 的Eclipse插件(URL:http://recorder.robotium.com/updates/或者说不可用)
最近在学robotium.看到别人说robotium的Eclipse的插件非常好用. 打算安装时.发现死活都无法连接http://recorder.robotium.com/updates/ 过程是 ...
- webBrowser获取cookie
private void BtnOpenUrl_Click(object sender, EventArgs e) { if (txtUrl.Text != "") { Myweb ...
- 常用的NodeJS模块
图片处理 1.Manipulate images 官网:http://github.com/aheckmann/gm ImageMagick和GraphicsMagick主要用于图片的创建.编辑.合成 ...