当前位置: 首页 > 编程日记 > 正文

Mr. Process的一生-Linux内核的社会视角 (2)启动

原文地址:

http://www.manio.org/cn/startup-of-linux-view-of-society.html

其实这才应该是这一系列文章的第一节,因为这篇文章讲的是盘古开天地的事。话说Mr. Process是一个现代人,但是,只要是人,总该有个祖先。人们总想知道自己从哪来,然后才可以估摸算一下自己将去向何方。所以咱也要了解一下Linux的世界里人类的起源。

图1:从上电到BIOS

按下电源开关的那个真实的人就是Linux世界里的上帝,他创造了Linux世界的一切。当他按下机箱上的电源开关时,主板开始供电,CPU上的Reset Pin被拉高,这会引起CPU的一系列动作,这些动作是芯片设计时就决定的。CPU中的一些寄存器被置为固定的值,因为这些寄存器可能在启动的过程中要使用,比如CS(代码段寄存器)和EIP(指针指令寄存器)。这一步完成之后,CPU就可开执行地址为0xfffffff0里的ROM中的程序。这段程序就是BIOS(Basic Input Output System)。

BIOS完成下面的功能:

1.POST(Power-On Self Test):顾名思名,就是查查有什么设备,这些设备是不是正常。要是CPU有Advanced Configuration and Power Interface(ACPI )的支持,也在这个时候进行。ACPI是用来对电源进行管理的,用来节电之类的。

2.初始化设备:确保没有IRQ和IO冲突。

3.寻找OS/Bootloader。这一步后面点再细说

我们在BIOS的设置菜单里能够设置从何处启动,比如软盘,硬盘,光驱…BIOS会按我们设定的顺序搜索OS。

4.把Bootloader复制到RAM里(地址为0x00007c00),然后那个地址开始执行。

什么是Bootloader?

现在,我们只要关心的是:bootloader会找到OS,把OS内核COPY到RAM中。

图2:boot loader的加载

如上图所示,在硬盘的第一个sector,有一个分区表(记录了哪些分区上有操作系统)和一个小版的Bootloader。当这个BIOS被设置为从这里启动时,这个小版的bootloader被复制到RAM的0x00007c00。然后它会把自己又移动到0x00096a00。在这之后,它再把另一段Bootloader从硬盘上复制到0x00096c00,然后从那里开始执行。分作两段的原因是因为现在的bootloader太大了,在MBR上存不完那么多。

Bootloader会把OS的内核映像复制到RAM中。

Bootloader的工作

1. 调用BIOS以显示“Loading Image”的消息。

2. 调用BIOS,把内核映像的前512字节复制到0×00090000,setup()函数在0×00090200。

3. 调用BIOS,把剩下的内核映像加载到0×00010000(小内核zImage)或0×00100000(大内核bzImage)

4. 跳到setup()开始执行。

Setup()的工作

setup()用来初始化设备。虽然BIOS已经做了一些初始化的工作,但是Linux关不依赖于他。setup()会初始化键盘,FPU等设备,并设置一些寄存器。在Setup()的最后,会调用startup_32()。

startup_32()

Linux里有两个startup_32()。

首先会执行的是arch/i386/boot/compressed/head.S里的那个。这个startup_32()的作用主要是解压内核。

第二个startup_32()是在arch/i386/kernel/head.S的。这个startup_32()的工作就是为Linux的第一个进程(就是Mr. Process的祖先)设置生存环境。最后跳到start_kernel()中去。

在Understanding the Linux Kernel 3rd 中的描述如下

  1. Initializes the segmentation registers with their final values.
  2. Fills the bss segment of the kernel (see the section “Program Segments and Process Memory Regions” in Chapter 20) with zeros.
  3. Initializes the provisional kernel Page Tables contained in swapper_pg_dir and pg0 to identically map the linear addresses to the same physical addresses, as explained in the section “Kernel Page Tables” in Chapter 2.
  4. Stores the address of the Page Global Directory in the cr3 register, and enables paging by setting the PG bit in the cr0 register.
  5. Sets up the Kernel Mode stack for process 0 (see the section “Kernel Threads” in Chapter 3).
  6. Once again, the function clears all bits in the eflags register.
  7. Invokes setup_idt( ) to fill the IDT with null interrupt handlers (see the section “Preliminary Initialization of the IDT” in Chapter 4).
  8. Puts the system parameters obtained from the BIOS and the parameters passed to the operating system into the first page frame (see the section “Physical Memory Layout” in Chapter 2).
  9. Identifies the model of the processor.

10.  Loads the gdtr and idtr registers with the addresses of the GDT and IDT tables.

11.  Jumps to the start_kernel( ) function.

start_kernel()的工作

完成所有组件的初始化工作。

Understanding the Linux Kernel对这一段工作的描述如下:

¨    The scheduler is initialized by invoking the sched_init( ) function (see Chapter 7).

¨    The memory zones are initialized by invoking the build_all_zonelists( ) function (see the section “Memory Zones” in Chapter 8).

¨    The Buddy system allocators are initialized by invoking the page_alloc_init( ) and mem_init( ) functions (see the section “The Buddy System Algorithm” in Chapter 8).

¨    The final initialization of the IDT is performed by invoking trap_init( ) (see the section “Exception Handling” in Chapter 4) and init_IRQ( ) (see the section “IRQ data structures” in Chapter 4).

¨    The TASKLET_SOFTIRQ and HI_SOFTIRQ are initialized by invoking the softirq_init( ) function (see the section “Softirqs” in Chapter 4).

¨    The system date and time are initialized by the time_init( ) function (see the section “The Linux Timekeeping Architecture” in Chapter 6).

¨    The slab allocator is initialized by the kmem_cache_init( ) function (see the section “General and Specific Caches” in Chapter 8).

¨    The speed of the CPU clock is determined by invoking the calibrate_delay( ) function (see the section “Delay Functions” in Chapter 6).

¨    The kernel thread for process 1 is created by invoking the kernel_thread( ) function. In turn, this kernel thread creates the other kernel threads and executes the /sbin/init program, as described in the section “Kernel Threads” in Chapter 3.

以上几个函数的执行过程如下图:

图3:启动函数的执行过程

第二个startup_32()和start_kernel()揭示了Linux一生的真谛。从这里面咱看到了Mr. Process(一个普通的进程)所拥有的一切是怎么得到的。弄清楚了这些,也就弄清楚了Linux。Really清楚。

BTW,我做的图怎么那么好看~美感天生在那里,你挡都挡不住,怎么搞怎么好看加专业!

相关文章:

深入研究ConcurrentHashMap 源码从7到8的变迁

ConcurrentHashMap是线程安全且高效的HashMap 1 为什么要使用ConcurrentHashMap 线程不安全的HashMap HashMap是Java中最常用的一个Map类,性能好、速度快,但不能保证线程安全,它可用null作为key/value HashMap的线程不安全主要体现在resize时…

IANA定义的常见服务的端口号列表

最新明细:http://www.iana.org/assignments/port-numbers 几个重要常见端口: 21 FTP 22 SSH 80 HTTP 443 HTTPS 1433 MSSQLserver 3306 MySQL 11211 memcached

oracel 服务详细介绍

中的方法成功安装Oracle 11g后,共有7个服务, 这七个服务的含义分别为: 1. Oracle ORCL VSS Writer Service: Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service)能够让存储基础设备&…

使用 Python 开发一个恐龙跑跑小游戏,玩起来

作者 | 周萝卜 来源 | 萝卜大杂烩 相信很多人都玩过 chrome 浏览器上提供的恐龙跑跑游戏,在我们断网或者直接在浏览器输入地址“chrome://dino/”都可以进入游戏 今天我们就是用 Python 来制作一个类似的小游戏 素材准备 首先我们准备下游戏所需的素材,比…

了解和入门注解的应用

2019独角兽企业重金招聘Python工程师标准>>> 一、概述 jdk的java.lang包中提供的最基本的annotation 1、SuppressWarnings("deprecation") package staticimport.annotation;SuppressWarnings("deprecation") public class AnnotationTest {pub…

Linux下开发优秀链接

不得不说CSDN博客这次改版变化很大,但是友情链接功能太脆弱了。 只有自己写个帖子,不断更新吧。Linux基础 Linux内核mirrors163LVS中文站点 孙海龙 howtoforge.com 地中海东岸的蒲公英 服务器运维与网站架构 Nginx中文维基 ACME Bory.Chan Tim[后端技术]…

Q 版老黄带着硬核技术再登场,有点可爱,很有东西

编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 看到下面这个老黄是不是觉得很Q~ 11月9日,GTC 大会再次来了,英伟达创始人兼CEO黄仁勋再次从自己虚拟厨房走出来。 本次 GTC 大会都有哪些亮点呢? Q 版黄仁勋 英伟达展…

linux第七章《档案与目录管理》重点回顾

转载于:https://www.cnblogs.com/wubingshenyin/p/4514969.html

Effective java 43返回零长度的数组或者集合而不是null

转载于:https://www.cnblogs.com/limingxian537423/p/8391285.html

《Unix网络编程卷1-套接字联网API》第一个例子编译 不通过问题解决

《Unix网络编程卷1-套接字联网API》是本好书。 但是第一个例子不是很好编译。 需要如下步骤: 本人机器CentOS 5.4 1.下载源码 unpv13e解压到任意目录 然后按其readme文件操作./configure # try to figure out all implementation differencescd lib # bu…

angularJs的学习笔记-01(创建项目)

1&#xff0c;进入angular-phonecat目录 执行下面命令 git checkout -f step-0 然后访问 http://localhost:8000/app/ 页面出现 “Nothing here yet!” 现在就可以自己创建HTML&#xff0c;编写angular了 app/index.html <!doctype html> <html lang"en"…

一文搞定深度学习建模预测全流程(Python)

作者 | 泳鱼来源 | 算法进阶本文详细地梳理及实现了深度学习模型构建及预测的全流程&#xff0c;代码示例基于python及神经网络库keras&#xff0c;通过设计一个深度神经网络模型做波士顿房价预测。主要依赖的Python库有&#xff1a;keras、scikit-learn、pandas、tensorflow&a…

第163天:js面向对象-对象创建方式总结

面向对象-对象创建方式总结 1、 创建对象的方式&#xff0c;json方式 推荐使用的场合&#xff1a; 作为函数的参数&#xff0c;临时只用一次的场景。比如设置函数原型对象。 1 var obj {};2 //对象有自己的 属性 和 行为3 // 属性比如&#xff1a; 年龄、姓名、性别4 // 行…

一个从四秒到10毫秒,花了1年的算法问题?

原文:一个从四秒到10毫秒&#xff0c;花了1年的算法问题&#xff1f;五一后的第一周&#xff0c;由于搬家腰扭伤了&#xff0c;没注意导致压迫神经&#xff0c;躺在床上休息了好几天。所以没事就挂 QQ&#xff0c;一个网友突然问了我一个算法问题。所以有了这篇文章。感触很深&…

xinetd 说明

xinetd 是什么在linux中一些不长期使用的服务&#xff08;不重要的服务&#xff1f;&#xff09;没有被作为单独的守护进程在开机时启用&#xff0c;linux把这些服务监听端口全部由一个独立的进程xinetd集中监听&#xff0c;当收到相应的客户端请求之后&#xff0c;xinetd进程就…

英特尔携手中科院计算所建立中国首个 oneAPI 卓越中心

11月12日&#xff0c;在第三届中国超级算力大会&#xff08;ChinaSC 2021&#xff09;上&#xff0c;英特尔与中国科学院计算技术研究所共同建立中国首个 oneAPI 卓越中心&#xff0c;来扩大 oneAPI 对中国本土国产硬件的支持及使用oneAPI来开发全栈式开源软件。 在上个月刚结…

前端学习资源分享

2019独角兽企业重金招聘Python工程师标准>>> 推荐大神文章(文字教程) 1 综合类 前端知识体系前端知识结构Web前端开发大系概览Web前端开发大系概览-中文版智能社 - 精通JavaScript开发JavaScript中的this陷阱的最全收集--没有之一JS函数式编程指南腾讯移动Web前端知…

Nginx源码分析链接

nginx-0.8.38源码探秘&#xff1a;http://blog.csdn.net/ccdd14/article/details/5872312nginx源码分析&#xff1a; http://blog.sina.com.cn/s/blog_677be95b0100iiv7.html

基于聚类的图像分割(Python)

作者 | 小白来源 | 小白学视觉了解图像分割当我们在做一个图像分类任务时&#xff0c;首先我们会想从图像中捕获感兴趣的区域&#xff0c;然后再将其输入到模型中。让我们尝试一种称为基于聚类的图像分割技术&#xff0c;它会帮助我们在一定程度上提高模型性能&#xff0c;让我…

4月第4周全球域名商TOP15:万网第四 增势减弱

IDC评述网&#xff08;idcps.com&#xff09;05月21日报道&#xff1a;据WebHosting.info公布的最新数据显示&#xff0c;在4月第4周&#xff0c;全球十五强域名商中&#xff0c;域名总量成功实现净增长的有7家。其中&#xff0c;中法各1家&#xff0c;即中国万网与OVH.NET&…

PXE全自动安装操作系统--centos7.3学习笔记

PXE服务器&#xff1a;192.168.110.110 环境准备 安装软件 # yum -y install dhcp tftp-server tftp vsftpd lftp DHCP配置 # cd /var/dhcp # cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf # vim /etc/dhcp/dhcpd.conf subnet 192.168.110.0 netmask…

无事“自动驾驶”,有事“辅助驾驶”?

近日来&#xff0c;智能汽车事故频发&#xff0c;且事故原因多与所谓的“自动驾驶”功能有关&#xff0c;这不由得引起了人们对“自动驾驶”发展前景的担忧。实际上&#xff0c;大众理解的“自动驾驶”与官方的定义可能有所出入。全球公认的标准一般是由SAE International&…

九、数据库群集部署、配置 (二)

九、 数据库群集部署、配置&#xff08;二&#xff09;配置DTC 角色高可用在群集管理器对话框&#xff0c;选择"配置角色"&#xff0c;如图2. 选择"下一步"&#xff0c;如图3. 在选择角色对话框&#xff0c;选择"分布式事务协调器&#xff08;DTC&a…

Linux下怎么诊断网站性能异常

网站如果突然慢了&#xff0c;怎么样诊断&#xff1f; 先用Top命令查看进程 #top选择Haporxy代理的进程 #strace -p 25054进程在干什么看的一清二楚。

[Java面试五]Spring总结以及在面试中的一些问题.

2019独角兽企业重金招聘Python工程师标准>>> 1.谈谈你对spring IOC和DI的理解&#xff0c;它们有什么区别&#xff1f; IoC Inverse of Control 反转控制的概念&#xff0c;就是将原本在程序中手动创建UserService对象的控制权&#xff0c;交由Spring框架管理&#…

一次完整的抓包分析 Reserved TCP/IP Port List

抓包如图所示&#xff1a; 本机IP被粉色遮住。。。http://www.skynet.ie/~colinmac/Programming/port_listing.htmlReserved TCP/IP Port List This is an complete list of the TCP/IP ports that are IANA registered and so are not for general use in network programming…

关于Centos下Clamv反病毒软件包更新问题

最近一直在研究学习Centos下搭建Postfix实现邮件网关的内容&#xff0c;以便后期邮件平台网关的灾备做一些准备&#xff0c;今天安装Postfix到了对Clamv反病毒软件包更新的安装配置部分&#xff0c;遇到了个小的插曲。 具体遇到问题看着不是什么大问题&#xff0c;就是Clamv之前…

Meta 研发触觉手套助力元宇宙,虚拟世界也可以有触觉

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 你不能戴着 Meta 的新型高科技虚拟现实手套抚摸狗。 但研究人员可以让它越来越接近。 Meta&#xff08;前身为 Facebook&#xff09;伴随着对于虚拟世界和元宇宙的领域而闻名。然而&#xff0c;七年…

如何判断哪个商城系统好?

现在市面上很多商城系统&#xff0c;如果开发者有商城系统的需求&#xff0c;那么可以用&#xff0c;可以缩短开发周期&#xff0c;网站更快速上线&#xff1b;可降低开发成本。但是正因为系统很多&#xff0c;怎么选择就是个问题了。因为一个商城所使用的商城系统也会产生对一…

TCP/IP中 3688端口是什么?

原文英文&#xff1a;http://www.corrupteddatarecovery.com/Port/3688udp-Port-Type-simple-push-s-simple-push-s.asp 翻译的不好将就看吧。 一个软件端口&#xff08;通常只是被称为一个“口”&#xff09;是一个虚拟的数据连接&#xff0c;可以通过程序用于直接交换数据&a…