操作系统启动实验

简单的操作系统
汇编代码
; hello-os
; TAB=4ORG		0x7c00			; 指明程序装载地址; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy codeJMP		entryDB		0x90DB		"HELLOIPL"		; 启动扇区名称(8字节)DW		512				; 每个扇区(sector)大小(必须512字节)DB		1				; 簇(cluster)大小(必须为1个扇区)DW		1				; FAT起始位置(一般为第一个扇区)DB		2				; FAT个数(必须为2)DW		224				; 根目录大小(一般为224项)DW		2880			; 该磁盘大小(必须为2880扇区1440*1024/512)DB		0xf0			; 磁盘类型(必须为0xf0)DW		9				; FAT的长度(必??9扇区)DW		18				; 一个磁道(track)有几个扇区(必须为18)DW		2				; 磁头数(必??2)DD		0				; 不使用分区,必须是0DD		2880			; 重写一次磁盘大小DB		0,0,0x29		; 意义不明(固定)DD		0xffffffff		; (可能是)卷标号码DB		"HELLO-OS   "	; 磁盘的名称(必须为11字?,不足填空格)DB		"FAT12   "		; 磁盘格式名称(必??8字?,不足填空格)RESB	18				; 先空出18字节; 程序主体entry:MOV		AX,0			; 初始化寄存器MOV		SS,AXMOV		SP,0x7c00MOV		DS,AXMOV		ES,AXMOV		SI,msg
putloop:MOV		AL,[SI]ADD		SI,1			; 给SI加1CMP		AL,0JE		finMOV		AH,0x0e			; 显示一个文字MOV		BX,15			; 指定字符颜色INT		0x10			; 调用显卡BIOSJMP		putloop
fin:HLT						; 让CPU停止,等待指令JMP		fin				; 无限循环msg:DB		0x0a, 0x0a		; 换行两次DB		"hello, world"DB		0x0a			; 换行DB      "hello MYOS,K1T000"DB		0x0a			; 换行DB		0RESB	0x7dfe-$		; 填写0x00直到0x001feDB		0x55, 0xaa

利用工具构建
makefile

  1. Makefile 的功能

Makefile 是一种用于自动化构建过程的脚本文件,通常与 make 工具一起使用。在开发中,它定义了如何编译和链接代码,如何生成目标文件,如何处理依赖关系等。通过 make 命令,开发人员可以根据 Makefile 中的指令自动执行任务,比如编译源代码、创建可执行文件、生成镜像文件等。

具体来说,Makefile 包含:

  • 目标(target):如 helloos.imghelloos.bin 等生成的文件。
  • 规则(rule):定义如何生成目标文件的步骤。
  • 依赖关系(dependency):指定哪些文件或目标是当前目标的依赖。
  • 命令(command):用于生成目标文件的具体操作。
采用汇编
  1. 为什么用汇编语言写操作系统?

写操作系统时,选择使用汇编语言通常有以下几个原因:

(1) 操作系统对硬件的直接控制

操作系统,尤其是引导程序、内核的早期部分,需要直接控制硬件资源(如 CPU、内存、硬盘等)。汇编语言提供了极低级别的控制,使你能够精确地操作硬件,比如设置中断向量、控制内存映射等。

在操作系统启动的早期阶段(引导加载程序),需要与硬件打交道,这时 C 语言的抽象就不再合适,汇编提供的直接访问硬件的能力是必要的。

(2) 性能和效率

汇编语言是一种低级语言,通常比高级语言(如 C 语言)更高效。对于内核的某些关键部分,使用汇编可以实现非常高效的操作,如上下文切换、任务调度等。

(3) 学习和理解底层原理

通过汇编语言写操作系统的早期部分,你可以深入了解计算机的底层架构,包括 CPU 寄存器、栈操作、中断机制等。这对理解操作系统的工作原理非常有帮助。

  1. 为什么不直接用 C 语言写操作系统?

虽然 C 语言在编写操作系统时非常流行,但它并不是完全适合于操作系统所有部分的语言。操作系统的早期阶段(如引导加载程序)确实需要使用汇编语言。以下是一些原因,解释为什么 C 语言通常不会在操作系统的整个开发过程中取代汇编语言:

(1) 操作系统的启动过程

在操作系统启动的初期阶段,CPU 和硬件设备的控制非常直接。你必须配置中断、设置段寄存器、初始化内存等,这些操作 C 语言通常做不到。C 语言对硬件的抽象非常强,它需要操作系统提供的运行时环境来支持,而在操作系统的引导加载过程中(也就是 bootloader 阶段),这些环境尚未建立。

(2) C 语言依赖于运行时库

C 语言虽然非常接近硬件,但它依赖于操作系统的运行时库(例如标准库、系统调用等),这些库在操作系统本身没有完成之前无法使用。操作系统内核的开发必须考虑到这些库在编译时没有定义的情况,因此,直接使用 C 语言的执行环境并不适合操作系统的最初开发。

(3) 操作系统设计中的低级任务

有些操作系统的设计任务需要处理直接与硬件相关的低级任务。例如,操作系统的中断处理、设备驱动、任务调度等,需要非常精确的控制和高效的代码。这些任务用汇编语言编写时更为简单和高效,而在 C 语言中,编译器的优化有时会使代码变得不够高效,特别是与硬件交互时。

(4) 更好的移植性和可维护性

尽管操作系统开发时可能会用汇编语言,但现代操作系统的核心部分通常还是会用 C 语言开发。因为 C 语言具备较好的移植性、可维护性和易读性,尤其是相对于汇编语言。汇编语言的代码是与硬件架构紧密耦合的,因此难以移植,而 C 语言能够在不同的硬件平台上进行相对容易的移植。

关于 Make 的使用

Make 是一个自动化工具,主要用于自动化编译和构建过程。它可以让你通过一个 Makefile 文件定义如何从源代码生成目标文件(如 .o 文件、可执行文件等)。让我们来看一下如何使用 Make 来编译一个汇编语言编写的操作系统。

基本的 Makefile 结构

一个简单的 Makefile 包含以下几个基本部分:

  • 目标(target):你希望生成的文件,比如 .o 文件、最终的可执行文件。
  • 依赖(dependency):生成目标所需要的源文件。
  • 规则(rule):从依赖生成目标的命令。

假设你有一个简单的操作系统源码,包含以下文件:

  • boot.asm:引导程序(使用汇编语言编写)
  • kernel.asm:操作系统内核(使用汇编语言编写)
  • link.ld:链接脚本,用于将生成的目标文件链接成最终的可执行镜像

make 工具不仅仅用于编译操作系统项目,它实际上是一个非常通用的自动化构建工具,广泛应用于各种编程项目中,无论是 C 语言、C++、汇编语言,还是其他语言的项目。它的核心功能是通过 Makefile 自动化地管理源代码的编译、链接等过程,使得项目的构建变得更加高效和可重复。

make 的应用场景

make 工具可以用于编译许多类型的项目,常见的包括:

  • C/C++ 项目:这是 make 最常见的应用场景,尤其是在大型项目中,可以帮助管理多个源文件的编译与链接。
  • Python 项目:虽然 Python 本身不需要编译,但 make 可以用于自动化测试、打包、清理等任务。
  • Java 项目:尽管 Maven 或 Gradle 是更常用的构建工具,但 make 也可以用于编译 Java 源文件。
  • 汇编语言项目:正如你在操作系统开发中看到的,make 也可以用来自动化汇编语言文件的编译过程。
  • 其他脚本语言:对于 Bash 脚本、Ruby 脚本等,make 可以用来执行特定任务,如运行测试、部署应用等。
编译

make file 或者直接 nask.exe helloos.nas helloos.img

2、虚拟机启动操作系统

Step1:启动VMware,创建一个新的虚拟机MyOS(注意加上软盘驱动器);

Step2:设置从软盘镜像文章中启动系统,文件为刚做好的helloos.img

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
Step3:启动该虚拟机
image.png

系统调用

Linux系统中,用户程序可以通过隐式调用或显示调用使用系统调用。

隐式调用——用户通过封装了系统调用的API使用系统调用

显式调用——使用syscall()函数实现调用,int syscall(int number,…),number是系统调用号

基础

syscall 并不仅仅用于获取进程 ID(PID),它是用于直接与操作系统内核交互的一种方式,允许你调用任何支持的系统调用。syscall 函数是一个低级接口,通过它你可以直接发起操作系统的系统调用。

syscall 的基本用法

syscall 函数是一个系统调用接口,允许你通过系统调用号来调用操作系统内核提供的底层功能。它的基本签名通常如下:

c

long syscall(long number, ...);

  • number 是系统调用的编号,也就是操作系统为每个系统调用分配的一个唯一的数字(如 SYS_getpidSYS_read 等)。
  • 后面的 ... 是系统调用的参数,具体取决于你要调用的系统调用。
syscall 支持的系统调用

syscall 函数是通用的,可以用来调用几乎所有的系统调用,不仅仅是 getpid。以下是一些常见的可以通过 syscall 调用的操作系统系统调用:

  1. 进程管理相关的系统调用

    • SYS_getpid:获取当前进程的 PID(进程 ID)。
    • SYS_fork:创建一个新的进程(子进程)。
    • SYS_exit:使当前进程退出。
    • SYS_getppid:获取父进程的 PID。
    • SYS_waitpid:等待子进程的状态改变。
  2. 文件操作相关的系统调用

    • SYS_open:打开文件。
    • SYS_read:从文件描述符中读取数据。
    • SYS_write:向文件描述符写入数据。
    • SYS_close:关闭文件描述符。
    • SYS_lseek:设置文件指针的位置。
  3. 内存管理相关的系统调用

    • SYS_brk:改变数据段的结束地址。
    • SYS_mmap:内存映射文件或设备到进程的虚拟内存。
    • SYS_munmap:解除内存映射。
  4. 信号和中断相关的系统调用

    • SYS_kill:发送信号给进程。
    • SYS_signal:设置信号处理程序。
  5. 网络操作相关的系统调用

    • SYS_socket:创建一个新的网络套接字。
    • SYS_connect:连接到远程主机。
    • SYS_sendto:向指定的地址发送数据。
    • SYS_recvfrom:从指定的地址接收数据。
  6. 时间和日期相关的系统调用

    • SYS_time:获取系统的当前时间。
    • SYS_gettimeofday:获取当前时间戳。

隐式调用实际上是指别人已经为你封装好了底层的功能,你不需要手动调用底层的系统调用(如 syscall),而是通过更高级的接口来实现相同的功能。这种封装不仅让你在编程时更加方便,也提高了代码的可读性和可维护性。

libc

libc(C 语言标准库,lib 是 “library” 的缩写)是一个包含 C 语言标准函数的库。它为开发者提供了许多标准功能,诸如输入输出(I/O)、内存管理、字符串操作、数学函数等。在类Unix 操作系统中,libc 通常是一个包含系统调用封装的共享库。

实验
#include <syscall.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>int main (viod) {long ID1, ID2;ID1=syscall(SYS_getpid);     /*显式系统调用*/printf(syscall(SYS_getpid)=%ld\n”, ID1);ID2=getpid();                /*使用libc封装的隐式系统调用*/printf(getpid()=%ld\n”, ID2);return(0);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/19692.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

助力模型训练,深度学习的经典数据集介绍

想要训练出效果好的模型&#xff0c;高质量的数据集必不可少。深度学习的经典数据集包括MNIST手写数字数据集、Fashion MNIST数据集、CIFAR-10和CIFAR-100数据集、ILSVRC竞赛的ImageNet数据集、用于检测和分割的PASCAL VOC和COCO数据集等&#xff0c;本文将对这些数据集进行介绍…

Spring基础——针对实习面试

目录 Spring基础什么是Spring框架&#xff1f;列举一些重要的Spring模块Spring Core 核心模块Spring AOP 模块Spring MVC 模块Spring Data 模块Spring Security 模块Spring Boot 模块 Spring&#xff0c;Spring MVC&#xff0c;Spring Boot之间什么关系&#xff08;区别&#x…

PH热榜 | 2024-11-17

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 在线预览 1. Octokit 标语&#xff1a;人人都能用的无代码游戏和AR滤镜制作工具 介绍&#xff1a;Octokit 是一款无需编程技能就能使用…

分享本周所学——三维重建算法3D Gaussian Splatting(3DGS)

大家好&#xff0c;欢迎来到《分享本周所学》第十二期。本人是一名人工智能初学者&#xff0c;刚刚读完大二。前几天自学了一下3D Gaussian Splatting&#xff08;3DGS&#xff09;&#xff0c;觉得非常有意思。写这篇文章主要是因为网上大部分关于3DGS的文章都比较晦涩&#x…

Python-简单病毒程序合集(一)

前言&#xff1a;简单又有趣的Python恶搞代码&#xff0c;往往能给我们枯燥无味的生活带来一点乐趣&#xff0c;激发我们对编程的最原始的热爱。那么话不多说&#xff0c;我们直接开始今天的编程之路。 编程思路&#xff1a;本次我们将会用到os,paltform,threading,ctypes,sys,…

技术成长战略是什么?

文章目录 技术成长战略是什么&#xff1f;1. 前言2. 跟技术大牛学成长战略2.1 系统性能专家案例2.2 从开源到企业案例2.3 技术媒体大V案例2.4 案例小结 3. 学习金字塔和刻意训练4. 战略思维的诞生5. 建议 技术成长战略是什么&#xff1f; 1. 前言 在波波的微信技术交流群里头…

哪家云电脑便宜又好用?ToDesk云电脑、顺网云、达龙云全方位评测

陈老老老板&#x1f934; &#x1f9d9;‍♂️本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f9d9;‍♂️本文简述&#xff1a;讲一下市面上云电脑的对比。 &#x1f9d9;‍♂️上一篇文…

(五)自定义组件

&#xff08;五&#xff09;自定义组件 1、 VS插件推荐2、开始创建自定义的组件2.1、 快速添加基础页面内容: vbase2.2、 随便写上内容 3、使用该组件3.1、具体步骤3.2、其他说明 1、 VS插件推荐 开始前&#xff0c;如果大家使用的是VS Code&#xff0c;我推荐安装Vue VSCode S…

Springboot+Vue的项目搭建(一)

一、JDK配置环境变量 1、在官网下载jdkJava Downloads | Oracle 中国 2、下载之后双击安装。 3、配置环境变量&#xff0c;做法&#xff1a;此电脑->右键->属性->高级系统设置 然后点击确定即可 点击winr java -version 检查一下是否配置成功 二、maven包管理器…

如何从微软官网下载运行库解决?微软官网教你如何获取最新运行库支持

当您在运行某些应用程序或游戏时遇到缺少运行库文件的问题&#xff0c;例如“unityplayer.dll文件丢失”&#xff0c;访问微软官方网站下载并安装最新的运行库是一个可靠且安全的解决方案。微软提供的运行库包含了多种语言环境下的库文件和支持&#xff0c;如Visual C Redistri…

tdengine学习笔记-整体架构及docker安装

官方文档&#xff1a;用 Docker 快速体验 TDengine | TDengine 文档 | 涛思数据 整体架构 TDENGINE是分布式&#xff0c;高可靠&#xff0c;支持水平扩展的架构设计 TDengine分布式架构的逻辑结构图如下 一个完整的 TDengine 系统是运行在一到多个物理节点上的&#xff0c;包含…

多线程——单例模式

目录 前言 一、设计模式 二、饿汉模式 三、懒汉模式 1.单线程版 2.多线程版 结尾 前言 前面的几篇文章中介绍了多线程编程的基础知识&#xff0c;在本篇文章开始&#xff0c;就会利用前面的多线程编程知识来编写一些代码案例&#xff0c;从而使大家可以更好的理解运用多…

关于Web Component

2024年8月14日 引言 Web Component 是一种用于构建可复用用户界面组件的技术&#xff0c;开发者可以创建自定义的 HTML 标签&#xff0c;并将其封装为包含逻辑和样式的独立组件&#xff0c;从而在任何 Web 应用中重复使用&#xff0c;并且可以做到无框架跨框架。 不同于 Vue…

【进阶系列】python的模块

模块 创建一个 .py 文件&#xff0c;这个文件就称之为 一个模块 Module 如何使用 import 想要B.py文件中&#xff0c;使用A.py文件&#xff0c;只需要在B.py文件中使用关键字import导入即可。 import A# 若A是一个包的话&#xff0c;可以这样写 import A.函数名from impor…

全志T113双核异构处理器的使用基于Tina Linux5.0——RTOS编译开发说明

3、RTOS编译开发说明 3.1、RTOS SDK与TinaLinux开发环境 RTOS SDK相关代码已集成到Tina Linux开发环境&#xff0c;Tina Linux开发环境下的rtos子目录即为RTOS开发环境。 ├──brandy ├──bsp ├──build ├──buildroot ├──build.sh >build/top_build.sh ├──…

十六.SpringCloudAlibaba极简入门-整合Grpc代替OpenFeign

前言 他来了他来了&#xff0c;停了快2个月了终于又开始更新文章啦&#xff0c;这次带来的绝对是干货&#xff01;&#xff01;&#xff01;。由于公司项目进行重构的时候考虑到&#xff0c;OpenFeign做为服务通信组件在高并发情况下有一定的性能瓶颈&#xff0c;所以将其替换…

【Linux】环境变量详解

Linux环境变量 1.环境变量分类2.环境变量相关指令3.常用的环境变量4.环境变量的组织方式5.获取环境变量6.命令行参数 1.环境变量分类 按生命周期划分&#xff1a; 永久的&#xff1a;在环境变量脚本文件中配置&#xff0c;用户每次登录时会自动执行这些脚本&#xff0c;相当于永…

SpringBoot项目搭建IEDA2023.1.2

导入依赖 ——————————————————

L0G1000 Linux基础知识(包含ssh报错处理)

1.vscode通过ssh链接云服务器 按教程https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/linux 出现报错&#xff0c;是ssh配置原因 [23:40:18.788] Log Level: 2 [23:40:18.807] SSH Resolver called for “ssh-remotessh.intern-ai.org.cn”, attempt 1 [23:40:18.8…

使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程

当涉及到图数据时&#xff0c;复杂性是不可避免的。无论是社交网络中的庞大互联关系、像 Freebase 这样的知识图谱&#xff0c;还是推荐引擎中海量的数据量&#xff0c;处理如此规模的图数据都充满挑战。 尤其是当目标是生成能够准确捕捉这些关系本质的嵌入表示时&#xff0c;…