当前位置: 首页 > news >正文

linux0.11源码分析第四弹——操作系统的框架代码

🚀 前言

    本文只是介绍操作系统的框架代码,包括边界计算与设备信号获取,各种初始化,进入用户态,陷入死循环,整个操作系统核心的就是做了这四件事。希望各位给个三连,拜托啦,这对我真的很重要!!!

目录

  • 🚀 前言
  • 🏆 参数的取值和计算
  • 🏆 初始化
  • 🏆 切换用户态
  • 🏆 死循环
  • 🎯总结
  • 📖参考资料

🏆 参数的取值和计算

    首先是参数的取值与计算,下面代码展示了计算了那些东西

void main(void)		/* This really IS void, no error here. */
{
 	ROOT_DEV = ORIG_ROOT_DEV;
 	drive_info = DRIVE_INFO;
	memory_end = (1<<20) + (EXT_MEM_K<<10);
	memory_end &= 0xfffff000;
	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;
	...
}

    拆分来看,首先是前两行,是获取了根设备ROOT_DEV以及之前汇编中获取的设备参数信息drive_info,获取方式如下:

#define DRIVE_INFO (*(struct drive_info *)0x90080)
#define ORIG_ROOT_DEV (*(unsigned short *)0x901FC)

    回顾一下内存的情况:

在这里插入图片描述

    这里面在0x90000处有块地方存放的临时变量,具体可参考linux0.11源码分析第二弹——setup.s内容第一节,存放的顺序和地址如下:

在这里插入图片描述
    依据这个图就可以看到代码中设置根设备号在0x901FC以及设备参数信息从0x90080开始的原因了。

    之后就是划定边界,这部分在下一篇博客细说,这里看看就好。

🏆 初始化

    在完成设备信息以及根设备号的获取后,需要进行一系列初始化,包括内存初始化,中断初始化,块设备请求项初始化,控制台初始化,时间初始化,进程调度初始化,缓冲区初始化,硬盘初始化等,代码如下所示:

void main(void)
{
	...
	mem_init(main_memory_start,memory_end);
	trap_init();
	blk_dev_init();
	chr_dev_init();
	tty_init();
	time_init();
	sched_init();
	buffer_init(buffer_memory_end);
	hd_init();
	floppy_init();
	...
}

🏆 切换用户态

    在CPU指令中,有些指令很危险,如果错用将导致系统崩溃,所以CPU将指令分为特权级指令和非特权级指令。操作系统启动时对内存进行了划分,操作系统的数据都是存放于内核空间的,用户进程的数据是存放于用户空间的。处于用户态级别的程序只能访问用户空间,而处于内核态级别的程序可以访问用户空间和内核空间。说白了目的就是划分权限为了保护操作系统。

void main(void)
{
	...
	sti();
	move_to_user_mode();
	if (!fork()) {		/* we count on this going ok */
		init();
	}
	...
}

    到此处会出现熟悉的终端界面(bochs进行模拟):
在这里插入图片描述

🏆 死循环

    最后就是死循环,让操作系统一直执行。

void main(void)
{
	...
	for(;;) pause();
}

🎯总结

    本节内容较少,主要就是梳理了一下操作系统的代码框架,整个操作系统都做了哪些事情,具体的东西会在后面博客有所讲解

📖参考资料

[1] linux源码趣读
[2] 一个64位操作系统的设计与实现

相关文章:

  • 类和对象—多态—案例2—制作饮品
  • 笔记:如何使用XAML Styler以及在不同的开发环境中使用一致
  • 第7章 wireshark(网络安全防御实战--蓝军武器库)
  • 阿里云 DataWorks面试题集锦及参考答案
  • Visual Studio 2022新建c语言项目的详细步骤
  • 文献学习: 单细胞+肿瘤转移研究的发文思路解析:如何构建核心基因特征,揭示关键调控网络?
  • VB6 调用 JS 函数时数据传输json格式或a=1b=s2字符串
  • 十倍烈火刀刀爆?伪随机分布(PRD)算法详解与C++实现
  • 洛谷P1091
  • 记录排查服务器CPU负载过高
  • 【自学笔记】OpenStack基础知识点总览-持续更新
  • nvidia驱动升级-ubuntu 1804
  • 系统架构设计师—数据库基础篇—关系代数运算
  • FreeRTOS 任务管理与运行时间统计:API 解析与配置实践
  • SQLAlchemy系列教程:集成Pydantic增强数据处理能力
  • 7.自然语言处理(NLP)理论基础——大模型微调的基石
  • 【蓝桥杯集训·每日一题2025】 AcWing 5539. 牛奶交换 python
  • C语言番外篇(4)------------------>VS环境下源码的隐藏
  • Dify部署踩坑指南(Windows+Mac)
  • Spring Boot 项目中 Redis 常见问题及解决方案
  • 沈阳网站优化哪家好/项目平台
  • 番禺建设网站集团/百度seo网站优化
  • 不同类型的购物网站/哈尔滨百度网站快速优化
  • 网站结构怎么做适合优化/云南网站建设百度
  • 忘记网站管理员密码/南宁在哪里推广网站
  • 镇江做网站的/杭州seo排名费用