day7-操作系统的引导和启动程序流程

1.Linux操作系统的引导

1.1Linux是如何从硬盘中读出的

1.2Linux在启动的时候是如何拿到硬件参数的

1.3Linux在初始运行中都做了什么

BIOS/BOOTLOADER

由PC机BIOS(0xffff0是BIOS存储的总线地址)把bootsect从某个固定的地址拿到了内存中某个固定地址(0.11版本为0x90000),并且进行了一系列硬件初始化和参数设置

bootsect.s

磁盘引导块程序,在磁盘的第一个扇区中的程序(0磁道 0磁头 1扇区)

作用:首先将后续的setup.s代码从磁盘中加载到紧接着bootsect.s的地方

在显示屏上显示Loading system 再将system模块(操作系统)加载到0x10000的地方

最后跳转到setup.s中去运行

setup.s

解析BIOS/BOOTLOADER传递来的参数

设置系统内核运行的LDT(局部描述符) IDT(中断描述符寄存器)全局描述符(设置全局描述符寄存器)

设置中断控制芯片,进入保护模式运行(SVC32保护模式)

跳转到system模块的最前面的代码运行(head.s)

bash 复制代码
mov	[0],dx		! it from 0x90000
mov	[2],ax
mov	[4],bx		! bh = display page
mov	[6],ax		! al = video mode, ah = window width
mov	[8],ax
mov	[10],bx
mov	[12],cx
两个硬盘参数表
根文件系统

head.s

加载内核运行时的各数据寄存器,重新设置中断描述符表

开启内核正常运行时的协处理器等资源

设置内存管理的分页机制

跳转到main.c开始运行

系统初始化函数main.c

cs 复制代码
    //mark 设置操作系统的根文件
 	ROOT_DEV = ORIG_ROOT_DEV;
	//mark 设置操作系统的驱动参数
 	drive_info = DRIVE_INFO;
    // 解析setup.s代码后获取系统内存参数
    // 设置系统的内存大小 系统本身内存(1M),扩展内存大小(参数*kb)
	memory_end = (1<<20) + (EXT_MEM_K<<10);
    // 内存4k对齐
	memory_end &= 0xfffff000; 
    // 控制操作系统的最大内存为16M
	if (memory_end > 16*1024*1024)
		memory_end = 16*1024*1024;
    // 设置高速缓冲区的大小
	if (memory_end > 12*1024*1024) 
		buffer_memory_end = 4*1024*1024;
	else if (memory_end > 6*1024*1024)
		buffer_memory_end = 2*1024*1024;
	else
		buffer_memory_end = 1*1024*1024;
    //主内存的开始就是高速缓冲区的结束
	main_memory_start = buffer_memory_end;
    #ifdef RAMDISK
	    main_memory_start += rd_init(main_memory_start, RAMDISK*1024);
    #endif
相关推荐
无敌最俊朗@18 小时前
通过Ubuntu和i.MX 6ULL开发板实现网络共享
服务器·数据库·ubuntu
zhaotiannuo_199819 小时前
【Linux CentOS 7 版本更换yum源】
linux
利刃大大19 小时前
【高并发服务器:前置知识】一、项目介绍 && 模块划分
运维·服务器·高并发·项目·cpp
aitav019 小时前
⚡ WSL2 搭建 s5p6818 Linux 嵌入式开发平台(part 1):环境准备与架构设计
linux·嵌入式·wsl·wsl2
init_236120 小时前
路由策略和流量策略的常见配置
运维·服务器·网络
一袋米扛几楼9820 小时前
【软件安全】fgets / strncpy / gets(不安全) / snprintf的对比
linux·服务器·安全
cpsvps21 小时前
海外云服务器压力测试,如何评估服务器性能与稳定性
运维·服务器·压力测试
防搞活机21 小时前
ubuntu 服务器(带NVLink)更新显卡驱动 (巨坑!!)
linux·服务器·深度学习·ubuntu·gpu算力·显卡驱动
不是编程家21 小时前
Linux第二十二讲:数据链路层 && NAT && 代理服务 && 内网穿透
linux·运维·服务器
---学无止境---21 小时前
Linux中读写自旋锁rwlock的实现
linux