首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
join
post
md5
javascript
typescript
heap
char
byte
substring
subset
js
triggers
solr
object
bash
blob
search
node.js
netty
dockerfile
foreach
input
regex
jar
vba
main
require
vbscript
utf-8
python
actionscrip
nodejs
erlang
request
settings
config
copy
callback
chat
perl
httprequest
format
schema
go
php8
uri
hashcode
hash
audio
loops
command
cmd
timezone
eval
dagger
version
frameworks
random
instance
yaml
process
range
cpython
default
install
plugins
php7
match
jsp
list
select
controller
runtime
filter
replace
int
sum
php5
ip
当前位置:
开发笔记
>
编程语言
> 正文
《linux内核完全剖析》第六章引导启动程序笔记
作者:小文662502914775 | 来源:互联网 | 2023-10-12 12:53
1、简介引导启动程序部分主要在boot子目录下,该目录包含三个汇编代码文件bootsect.S、head.S和setup.S。由于目前没有对汇编进行系统的学习
1、简介
引导启动程序部分主要在boot/子目录下,该目录包含三个汇编代码文件bootsect.S、head.S和setup.S。由于目前没有对汇编进行系统的学习,所以本文不对代码细节实现做讲解,主要描述代码的功能。
2、操作系统启动执行流程
PC电源打开后,80x86结构CPU进入实模式,从地址0xFFFF0执行程序代码,这个地址通常是BIOS中的地址。随后BIOS开始执行系统检测,在物理地址0处开始初始化中断向量,然后BIOS将启动设备的第一个扇区读入内存绝对地址0x7C00处,并跳转到此处。
从系统加电起所执行程序的顺序
3、bootsect.S程序功能描述
bootsect.S代码是磁盘引导块程序,驻留在磁盘的第一个扇区中,bootsect代码执行期间,它会将自己移动到内存绝对地址0x90000开始处并继续执行。该程序把从磁盘的第二个扇区开始的四个扇区的setup模块(setup.S编译而成)加载到内存紧接着bootsect后面位置处(0x90200),然后利用BIOS中断0x13取磁盘参数表中当前启动引导盘的参数,在屏幕上显示“Loading system...”字符串。再把磁盘上setup模块后面的system模块加载到内存0x10000开始的地方。随后确定根文件系统的设备号,如果没有指定,则根据所保存的引导盘的每磁道扇区数判别出盘的类型和种类并保存设备号于root_dev(引导块的508地址处)中最后长跳转到setup程序开始处(0x90200)去执行setup程序。磁盘上,引导块、setup模块和system模块的扇区位置如下。
Linux 0.12 内核在 1.44MB 磁盘上的分布情况
4、setup.S程序功能描述
setup是一个操作系统加载程序,它利用BIOS中断读取机器系统数据并把数据保存到0x90000开始的位置(覆盖了bootsect程序的位置)。然后setup程序把system模块从0x10000~0x8ffff整块下移到内存绝对地址0x00000处。接下来加载中断描述符标寄存器(idtr)和全局描述符表寄存器(gdtr),开启A20地址线,重新设置两个中断控制芯片8259A,把硬件中断号重新设置为0x20~0x2f。最后设置cpu的控制寄存器CR0,进入32位保护模式运行,并跳转到位于system模块最前面部分的head.s程序继续运行。
5、head.s程序功能描述
head.s程序在被编译生成目标文件后会与内核其他程序一起被链接成system模块,位于system模块的最前面开始部分。从这里开始,内核完全都是在保护模式下运行了。这段程序位于内存绝对地址0处开始的地方。head.s程序功能单一,首先加载各个数据段寄存器,重新设置中断描述符表idt,共256项,并使各个表项都指向一个只报错误的哑中断子程序ignore_int。然后重新设置全局段描述符表gdt,只是修改gdt的段限长。接着使用物理地址0与1MB开始处的字节内容相比较的方法,检测A20地址线是否开启。接着设置管理内存的分页处理机制,把页目录表放在绝对物理地址0开始处,紧随后面放置共可寻址16MB内存的4个页表并设置它们的表项。最后head.s程序利用返回指令把预先放置在堆栈中的/init/main.c程序的入口地址弹出,去运行main()程序。
linux
文件
x86
cpu
ios
编译
int
main
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
main
Android 构建基础流程详解
Android 构建基础流程详解 ...
[详细]
蜡笔小新 2024-11-10 15:45:20
main
面试中如何回答“零拷贝”技术问题?
零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ...
[详细]
蜡笔小新 2024-11-13 02:03:52
main
c/c++常用代码doc,ppt,xls文件格式转PDF格式[转]
[转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ...
[详细]
蜡笔小新 2024-11-12 16:19:40
main
在Linux系统中避免安装MySQL的简易指南
在Linux系统中避免安装MySQL的简易指南 ...
[详细]
蜡笔小新 2024-11-11 13:22:28
python
深入解析C语言中结构体的内存对齐机制及其优化方法
为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ...
[详细]
蜡笔小新 2024-11-11 11:53:59
main
单片微机原理P3:80C51外部拓展系统
外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ...
[详细]
蜡笔小新 2024-11-12 19:51:29
main
C语言检测
字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ...
[详细]
蜡笔小新 2024-11-12 19:23:53
main
单片机入门指南:基础理论与实践
本文介绍了单片机的基础知识及其应用。单片机是一种将微处理器(类似于CPU)、存储器(类似硬盘和内存)以及多种输入输出接口集成在一块硅片上的微型计算机系统。通过详细解析其内部结构和功能,帮助初学者快速掌握单片机的基本原理和实际操作方法。 ...
[详细]
蜡笔小新 2024-11-11 23:53:26
input
在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ...
[详细]
蜡笔小新 2024-11-11 18:27:44
main
Xcode 多项目联合调试技巧与实践
在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ...
[详细]
蜡笔小新 2024-11-11 18:24:27
main
Java并发编程指南:深入理解信号量机制
本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ...
[详细]
蜡笔小新 2024-11-11 15:49:02
byte
性能测试中的关键监控指标与深入分析
在软件性能测试中,关键监控指标的选取至关重要。主要目的包括:1. 评估系统的当前性能,确保其符合预期的性能标准;2. 发现软件性能瓶颈,定位潜在问题;3. 优化系统性能,提高用户体验。通过综合分析这些指标,可以全面了解系统的运行状态,为后续的性能改进提供科学依据。 ...
[详细]
蜡笔小新 2024-11-11 01:42:16
byte
如何在Linux中通过编程手段禁用硬件预取功能?
本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ...
[详细]
蜡笔小新 2024-11-10 14:02:38
js
线程能否先以安全方式获取对象,再进行非安全发布?
线程能否先以安全方式获取对象,再进行非安全发布? ...
[详细]
蜡笔小新 2024-11-09 09:21:53
main
最详尽的4K技术科普
什么是4K?4K是一个分辨率的范畴,即40962160的像素分辨率,一般用于专业设备居多,目前家庭用的设备,如 ...
[详细]
蜡笔小新 2024-11-12 18:25:39
小文662502914775
这个家伙很懒,什么也没留下!
Tags | 热门标签
join
post
md5
javascript
typescript
heap
char
byte
substring
subset
js
triggers
solr
object
bash
blob
search
node.js
netty
dockerfile
foreach
input
regex
jar
vba
main
require
vbscript
utf-8
python
RankList | 热门文章
1
优秀网页翻译:一个智能旋钮:DIY haptic input knob: BLDC motor + round LCD
2
django中ImageField的使用2020.12.19
3
Linux下搭建SVN服务器遇到的问题及解决方法,
4
动态添加的文本框验证_看腻了普通的PPT封面?手把手教你制作“动态”封面,震惊全场!...
5
测试苹果手机主板软件,iphone手机硬件检测工具使用方法
6
有没有比我更倒霉的,有的话请进来比一比!!!
7
python3 opencv截取视频_python opencv 按一定间隔截取视频帧
8
Protobuf import文件导入其他proto
9
MS RDP协议
10
使用CompletableFuture高速提高程序性能
11
20212027全球与中国高模量碳纤维市场现状及未来发展趋势
12
react组件的分类大全,以及受控组件和非受控组件
13
bzoj4551 [TJOI2016HEOI2016]树
14
svn:is not known to exist in the repository and is not part of the commit, yet its child解决办法
15
rabbitmq实战(五)——RabbitMQ集群(镜像集群)
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有