问题集锦(52-53)
Problem 52 Linux内核启动过程简述?
Ans:
1. BIOS启动阶段
CPU在上电初始化时,指令寄存器CS:EIP总是被初始化为固定值,这就是CPU复位后的第一条指令的地址。对于32位地址总线的系统来说,4GB的物理空间至少被划分为两个部分,一部分是内存的地址空间,另外一部分地址空间用于对BIOS芯片存储单元进行寻址。x86复位后工作在实模式下,该模式下CPU的寻址空间为1MB。CS:IP的复位值是FFFF:0000,物理地址为FFFF0.主板设计者必须保证把这个物理地址映射到BIOS芯片上,而不是RAM上。
Protected 100000 |
… 0A0000 |
Command Line X+10000 |
Stack/Heap X+08000 |
Setup Code X |
Boot Loader 07C00 (bootsect.S) |
… 00000 |
BIOS把Boot Loader加载到0x7C00的地方然后跳转到这里继续执行,之后BootLoader会把实模式代码setup加载到0x07C00之上的某个地址上,其中setup的前512个字节是一个引导扇区,现在这个引导扇区的作用并不是用来引导系统,而是为了兼容及传递一些参数。之后Boot Loader会跳转到setup的入口点,入口点为_start.(根据arch/x86/boot/setup.ld可知)。
注:bzImage由setup和vmlinux两部分组成,setup是实模式下的代码,vmlinux是保护模式下的代码。
2. 实模式setup阶段
用于体系结构相关的硬件初始化工作,涉及的文件有arch/x86/boot/header.S, 链接脚本setup.ld, arch/x86/boot/main.c。
传递bootloader的一些参数信息。
header.S->main.c
main函数先(调用copy_boot_params函数)把位于第一个扇区的参数复制到boot_params变量中,boot_params位于setup的数据段
->go_to_protected_mode(void) (文件arch/x86/boot/pm.c)
->protected_mode_jump(文件arch/x86/boot/pmjump.S)
->startup_32(保护模式下的入口函数)
3. 保护模式startup_32
实模式的protected_mode_jump后,跳出了bzImage的第一部分,BootLoader默认把第二部分放在0x100000处,这个入口处是startup_32,先执行arch/x86/boot/compressed/head_32.S中的startup_32,然后执行arch/x86/kernel/head_32.S中的startup_32。
拷贝boot_params以及boot_command_line, 初始化页表,开启分页机制。
4. 内核启动start_kernel()
文件init/main.c
kernel_init()->do_basic_setup()->do_initcalls()->init_post()
5. 内核启动时的参数传递
内核命令行参数在启动阶段由startup_32复制到init/main.c的boot_command_line数组中,最后由函数start_kernel()对参数进行解析处理。
start_kernel()->parse_early_param()->do_early_param()
->parse_args()(模块参数处理)
注:#define BUILD_BUG_ON_ZERO(e) (sizeof(char[1-2*!!(e)])-1), 定义中的两次(逻辑)取反是为了保证无论e为何值,其结果非0即1.
Problem 53 Some information about regparm?
Ans:
在阅读Linux内核源代码的时候,发现start_kernel函数定义的最前面是一个asmlinkage.虽知它是GNUC的扩展,但并不知其意.所以决定对其做一些研究.
i386的linkage.h里有这样的宏定义:
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
CPP_ASMLINKAGE我们暂时不管,只看asmlinkage,它的主要起作用的部分是__attribute__,它在内核代码里随外可见,我想应该是对GNU编译器的一种指示操作.
在说明__attribute__((regparm(0))用处之前,我们先来看看程序在调用时的参数传递.
不同的硬件平台在默认情况下,参数调用时的参数传递机制是不一样的.如MIPS,SH4等精简指令处理器在进行子程序调用时先从寄存器里取得前几个参数,至于是几个视硬件平台而定.如SH4默认就是使用r4,r5,r6,r7作为前四个整参数的传递寄存器,同时用fr4~fr11传递前四个浮点参数,其他参数都压入栈.当然关于SH4的参数传递还有更多的细节,这里就不多说.而在i386平台上,函数的调用是基于栈的,也就是说,默认情况下,编译器在进行函数编译的时候会从栈里取得函数体需要使用的参数,而不是寄存器.
然而,参数直接从寄存器里取而不是从栈里取,前者相对来说速度要快,所以在linkage.h里也有这样的定义:
#define fastcall __attribute__((regparm(3)))
意思是,最多可以使用3个寄存器(或许是eax,edx,ecx)来传送前3个参数,其他参数则压入栈中,那么
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
的意思就是使用0个寄存器来进行参数传递,顾名思义它是想使得调用这个函数时的所有参数都压入栈中,相对于fastcall的使用方式当然是要慢一些了.
转载于:https://my.oschina.net/fuyajun1983cn/blog/263931
问题集锦(52-53)相关推荐
- URL 是什么?(2007-09-20 23:52:53| 分类: 网络技术)
URL 是什么? URL是Uniform Resource Location的缩写,译为" 统一资源定位符".通俗地说,URL是 Internet上用来描述信息资源的字符串,主要用 ...
- mongodb 超详细的操作集锦
mongodb 超详细的操作集锦 数据库相关操作 集合相关操作 mongo中的操作符 CRUD相关操作 运算符操作 可以直接用命令行进行操作,也可以使用可视化工具,可视化工具推荐使用Robo,Robo ...
- 云炬Android开发笔记 5-3,4Restful请求的处理
2.Restful请求的处理-框架 [说明]首先要考虑网络请求的参数(url传入的值.文件.回调.及loder加载圈) [说明]使用建造者模式,将建造者类和宿主类分开: 2.1[新建建造者类] 2.2 ...
- 第53天:鼠标事件、event事件对象
-->鼠标事件 -->event事件对象 -->默认事件 -->键盘事件(keyCode) -->拖拽效果 一.鼠标事件 onclick ---------------鼠 ...
- 52)PHP,加了单例模式的数据库代码
1 <?php 2 class db 3 { 4 public $host ;//= "localhost";//定义默认连接方式 5 public $User;//= &q ...
- JAVA——JAVA知识点集锦(上)
转自:http://blog.csdn.net/scythe666/article/details/51994770 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽 ...
- 53、Gif 控件GifView 的使用,播放gif图片
GifView 是一个为了解决android中现在没有直接显示gif的view,只能通过mediaplay来显示这个问题的项目,其用法和 ImageView一样,支持gif图片.可监视GIF是否加载成 ...
- conda 换成清华的源_[mcj]conda设置清华源以及更换删除源|conda常用命令集锦
全文包括: 显示目前使用的源channel 增加channel 删除channel 其他命令 1 显示channel: 首先,conda config --show能够显示出所有conda的confi ...
- django进阶04部署上线(nginx,uwsgi,supervisor)
原创博文地址:django进阶04部署上线(nginx,uwsgi,supervisor) django自身服务ok python manage.py runserver,验证可正常访问 uwsgi安 ...
- 海量数据处理相关算法及数据结构【转】
积淀 何谓海量数据处理? 所谓海量数据处理,无非就是基于海量数据上的存储.处理.操作.何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存. 那解决 ...
最新文章
- HttpClient+Jericho HTML Parser 实现网页的抓取
- Ubuntu侧边任务栏自动隐藏
- 宏定义与const的区别
- 完美解决tomcat/springboot启动速度相当慢 快死的状态了
- springCloud Finchley 实战入门(基于springBoot 2.0.3)【三 Eureka-高可用服务注册中心】...
- linux下VI模式中上下左右键和回退键出现字母
- Linux学习总结(四十四)lnmp之php-fpm相关配置
- kaggle比赛语言java_Kaggle调查:2018年数据科学家最常用(和最推荐)的编程语言榜单...
- Ant design pro引入Echarts报错:TypeError: Cannot read property 'x_data' of undefined
- java 8流在另一个流_Java 8流图
- 如何格式化电脑_电脑硬盘不小心格式化如何恢复【恢复方法】
- 《Big Data Glossary》笔记
- Java中File类的separator属性
- 更换卡巴斯基6授权许可文件的方法
- 计算机485通讯原理,串口通信原理详解.ppt
- 计算机网络 第七章 网络安全
- Android源代码标记和细分版本
- 超级计算器android,超级计算器 - 一上线就被AppStore官方推荐的超级计算器 - Android 应用 - 【最美应用】...
- C语言 生产者消费者模型
- 监控系统体系1-数据流监控系统
热门文章
- Thinking in C++ Notes 名字控制
- control.add()
- BZOJ5102:[POI2018]Prawnicy(贪心,堆)
- CCF201803-1 跳一跳(序列处理)
- selector + drawable 多状态图形
- 招人—凡客诚品 数据中心系统工程师(海外及手机业务方向)
- 基于C语言STC89C52单片机电子密码锁的设计与仿真
- mysql处理高并发,防止库存超卖
- centos7 docker 启动报错 Job for docker.service failed 解决办法
- linux centos 丢失 grub.conf 启动系统