抄写Linux源码(Day12:从 MBR 到 C main 函数 (1) )

2023-09-21 21:53:41

回忆我们需要做的事情:
为了支持 shell 程序的执行,我们需要提供:
1.缺页中断(不理解为什么要这个东西,只是闪客说需要,后边再说)
2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的,所以需要这两个东西)
3.fork,execve, wait 这三个系统调用,也可以说是 进程调度 (否则无法 halt shell 程序并且启动另外的程序)
4.键盘驱动、VGA/console/uart 驱动、中断处理 (支持键盘输入和屏幕显示)
5.内存管理 (shell 启动其它进程时,不能共用内存,而是切换其它进程的页表)
6.为了写代码方便,我们需要从 MBR 进入到 main 函数,这也是从 汇编 切换到 C 语言
7.应用程序申请内存的接口

经历了 Day11,看到了 Linux 0.11 中的内存管理代码后。

显然,这样复杂的功能用汇编写会很花时间,所以我们得想办法从汇编转为 C 代码,随后进入一个 C main 函数

直接看闪客文章第十回:https://mp.weixin.qq.com/s?__biz=Mzk0MjE3NDE0Ng==&mid=2247499838&idx=1&sn=6e7335be30fb24b03c54ccaaf135f236&chksm=c2c5ba93f5b23385a21191ea0ba60431340b195a3d63ae4d0e737f8274920d4c372940e4094c&scene=178&cur_album_id=2123743679373688834#rd

在这里插入图片描述
从上图可以看到,进入 C main 之间还要做许多工作,代码为 bootsect.s, setup.s 以及 head.s

为什么要做这么多工作?为什么不能直接 jmp main 呢?

首先 MBR 不能直接 jmp main。因为 MBR 的程序并不是一个和 C 程序链接在一起的程序,也不能是一个和 C 程序链接在一起的程序。因为 MBR 的大小仅为 512 字节,根本不可能和 C 程序链接在一起。

所以 MBR 能做的事情只有:把内核(和 C main 链接的程序) 从磁盘上加载到内存中。

那么 MBR 已经能把内核加载到内存里了,为什么还需要 setup.s 和 head.s 呢?

这个问题后边再思考吧,我们先看看 bootsect.s 是如何把 setup.s 和 内核 从磁盘加载到内存上的

TODO: here

更多推荐

基于SpringBoot的阿博图书馆管理系统

目录前言一、技术栈二、系统功能介绍管理员功能模块用户功能模块前台首页功能模块三、核心代码1、登录模块2、文件上传模块3、代码封装前言随着社会的发展,计算机的优势和普及使得阿博图书馆管理系统的开发成为必需。阿博图书馆管理系统主要是借助计算机,通过对图书借阅等信息进行管理。减少管理员的工作,同时也方便广大用户对所需图书借阅

MongoDB索引

索引支持在MongoDB中高效执行查询。如果没有索引,MongoDB必须扫描集合中的每个文档才能返回查询结果。如果查询存在适当的索引,MongoDB将使用该索引来限制它必须扫描的文档数。尽管索引提高了查询性能,但添加索引对写入操作的性能有负面影响。对于具有高读写比率的集合,索引是昂贵的,因为每次插入都必须更新任何索引。

第四天:gec6818开发板串口蓝牙模块的使用与配置

串口通信串口是一种简单的通信接口,也是单片机中最常用最简单的通信方式通常传感器都是采用串口作为与上位机的通信接口ARM板有三个可外接传感器的串口接口,位于开发板右上角从上到下,分别是串口号串口驱动设备文件CON2“/dev/ttySAC1”CON3“/dev/ttySAC2”CON4“/dev/ttySAC3”将传感器

数据结构和算法(8):搜索树(二叉搜索树和AVL树)

查找所谓的查找或搜索,指从一组数据对象中找出符合特定条件者,这是构建算法的一种基本而重要的操作。其中的数据对象,统一地表示和实现为词条(entry)的形式;不同词条之间,依照各自的关键码(key)彼此区分。循关键码访问:查找的过程与结果,仅仅取决于目标对象的关键码。词条template<typenameK,typena

【MongoDB】docker部署社区版(一)

0、背景介绍项目中使用MongoDB了,服务器挂掉,自己在本地搭一个试试。1、版本选择首先有社区版和和商业版。我选的是社区版。链接:https://hub.docker.com/r/mongodb/mongodb-community-server/tags1.1、标签选择看到标签有两个大类,一个是Ubuntu一个是ub

Spring MongoDB

为什么选择MongoDB,而不是其它的数据库。在SQL和NoSQL之间有一个大的争论。在SQL中,创建Tables。在NoSQL中,我们不维持这个结构。为什么这样重要。因为SQL在19世纪70年代变得流行的时候,在那时存储是昂贵的。我们需要确保使用最小的存储,这样我们可以存储最大量的数据。这是SQL类型表的意义。在当前

网络编程day04(网络属性函数、广播、组播、TCP并发)

今日任务对于newfd的话,最好是另存然后传入给分支线程,避免父子线程操作同一个文件描述符1.广播:接收端代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<sys/types.h>/*SeeNOTES*/#include<sys/socke

如何通过一键导出导入数据实现批量重命名文件名称

在日常办公中,我们经常需要对大量的文件进行重命名,以便更好地管理和查找文件。而且,有时候我们还需要将文件名称翻译成其他语言,以适应不同的工作需求。如何高效地完成这项任务呢?接下来,我将介绍一种方法,让你事半功倍。首先,你需要下载并安装一个名为“固乔文件管家”的软件。这是一款功能强大的文件管理工具,可以帮助你批量改名文件

山洪灾害预警方案(山洪预警解决方案的组成)

​随着气候变化的不断加剧,山洪灾害在许多地区成为了极具威胁性的自然灾害之一。为了帮助地方政府和居民更好地预防和应对山洪灾害,我们设计了一套基于星创易联的SR600工业路由器和DTU200的山洪灾害预警方案,并成功在某地区进行了部署。案例背景:我们选择了某山区作为实际部署的案例。这个地区常年受山洪的威胁,由于地处偏远,传

使用 Verilator 进行 Verilog Lint

FPGA设计是无情的,所以我们需要利用能获得的任何软件进行检查。Verilator是一个Verilog仿真器,还支持linting:静态分析设计中的问题。Verilator不仅可以发现综合工具可能忽略的问题,而且运行速度也很快。Verilator也非常适合使用SDL进行图形仿真。安装VerilatorLinuxVeri

C++ Primer Plus 第七章笔记

目录函数基本知识没有返回值的函数:void函数有返回值的函数:函数原型1.为什么需要函数原型?2.函数原型的语法3.函数原型的功能按值传递函数参数形参和实参局部变量参数问题使用const指针参数调用自身的函数(递归)指向函数的指针1.获取函数的地址2.声明函数指针3.使用函数指针来调用函数函数基本知识要使用C++函数必

热文推荐