linux内核——7_操作系统的引导和启动程序

作者:GWD 时间:2019.7.30

一、Linux操作系统的引导
(一)、课程内容
1、Linux是如何从硬盘中读出的
2、Linux在启动的时候是如何拿到硬件参数的
3、Linux在初始运行中都做了什么
trap.c trap_init()
mktime.c time_init
sched.c sched_init
4、BIOS/Bootloader:由PC机的BIOS(0xFFFF0是BIOS存储的总线地址)把bootsect从某个固定的地址拿到了内存中的某个固定地址(0x90000),并且进行了一系列的硬件初始化 和 参数设置。
二、内核引导程序.S分析
在这里插入图片描述
(一)、bootsect.S

1、作用:首先bios把bootsect放到了0x7c00的的地方;然后他自己又把自己移到了0x90000的地方;bootsect总共2K大小;它是磁盘引导块程序,在磁盘的第一个扇区中的程序(0磁道 0磁头 1扇区 );将后续的setup.s代码从磁盘中加载到紧接着bootsect.s的地方;在显示屏上显示loading system 再将system(操作系统)模块加载到0x10000的地方;最后跳转到setup.s中去运行;系统大小是在91年,linux自己在bootsect决定的,可以自己改,现在也不能这么小了

SETUPLEN = 4				    ! nr of setup-sectors
BOOTSEG  = 0x07c0			! original address of boot-sector
INITSEG  = 0x9000			    ! we move boot here - out of the way
SETUPSEG = 0x9020			! setup starts here
SYSSEG   = 0x1000			! system loaded at 0x10000 (65536).
ENDSEG   = SYSSEG + SYSSIZE	! where to stop loading
SYSSIZE = 0x3000

在这里插入图片描述
二、setup.s
1、解析BIOS/BOOTLOADER传递来的参数
2、设置系统内核运行的LDT(局部描述符) IDT(中断描述符寄存器) 全局描述符(设置全局描述符寄存器)
3、设置中断控制芯片,进入保护模式运行(svc32保护模式 设置寄存器中的值)跳转到system模块的最前面的代码运行(head.s)
在这里插入图片描述
在这里插入图片描述

mov	[0],dx		! it from 0x90000.		光标位置
mov	[2],ax		extended mem 扩展内存大小
mov	[4],bx		显存大小和信息
mov	[6],ax		
mov	[8],ax		check for EGA/VGA and some config parameters显示的配置参数
mov	[10],bx
mov	[12],cx

三、head.s
1、加载内核运行时的各数据段寄存器,重新设置中断描述符表;
2、开启内核正常运行时的协处理器等资源;
3、设置内存管理的分页机制;
4、跳转到main.c开始运行;

四、系统初始化函数 main.c
在这里插入图片描述
在这里插入图片描述
main.c中读取汇编放入参数的地址就行了。
在这里插入图片描述

main.c
//设置操作系统的根文件
ROOT_DEV = ORIG_ROOT_DEV;
// 设置操作系统驱动参数 
drive_info = DRIVE_INFO;
// 解析setup.s代码后获取系统内存参数
//设置系统的内存大小  系统本身内存(1MB)+扩展内存大小(参数*KB)
memory_end = (1<<20) + (EXT_MEM_K<<10);
//取整4K的内存大小
memory_end &= 0xfffff000;
//控制操作系统的最大内存为16MB
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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值