亲手实现操作系统:从引导扇区开始

需积分: 3 7 下载量 155 浏览量 更新于2024-08-01 收藏 1.3MB PDF 举报
"Playing.with.OS 是一本介绍操作系统实现的书籍,作者是于渊。书中涵盖了引导扇区的编写、自定义操作系统的应用程序开发、Orange’S的开发过程以及read()系统调用的解析等内容,旨在帮助读者理解操作系统的底层工作原理。书中还提到了一些准备工作,如使用NASM编译器和Bochs虚拟机作为工具。" 在操作系统实现的过程中,引导扇区是整个系统启动的第一步,它是加载操作系统到内存的关键部分。引导扇区通常位于磁盘的首扇区,即0扇区,其作用是加载和执行操作系统的主要部分。书中的示例展示了一个简单的引导扇区代码,使用了汇编语言编写,以NASM编译器进行编译。代码首先将段寄存器CS、DS和ES设置为相同值,以便访问内存。然后调用 DispStr 例程来显示“Hello, OS world!”的欢迎消息,使用了INT 10h BIOS中断来在屏幕上打印文本。最后,代码进入一个无限循环,确保引导过程不会继续执行其他代码。 编写自己的操作系统应用程序意味着从零开始构建系统的核心功能,这包括内存管理、进程调度、设备驱动等。在Orange’S的开发过程中,作者可能详细讲述了如何构建这些核心组件,以及如何将它们集成到操作系统中,形成一个可运行的整体。 read()系统调用解析是操作系统内核的重要组成部分,它允许用户空间的程序读取文件或设备的数据。在大多数操作系统中,read()系统调用会涉及内核中的文件系统模块,通过I/O子系统来处理数据的读取操作。书中这部分内容可能深入讨论了系统调用的工作机制,包括参数传递、内核态切换、文件描述符管理和实际的数据传输过程。 ThreeStories 可能是书中的一章或者一个章节主题,可能包含了一些关于操作系统设计与实现的案例研究,或者是作者对于操作系统开发的三个不同视角或故事,有助于读者从多个角度理解和学习操作系统的设计理念。 "Playing.with.OS" 是一本深度探讨操作系统实现的教程,适合对计算机系统底层原理感兴趣的读者,特别是那些想要自己动手实现操作系统的初学者。书中通过实例和逐步讲解,帮助读者理解引导扇区的编写、应用程序开发以及系统调用的内部运作,从而增进对整个操作系统的全面认识。

package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import android.Manifest; import android.content.pm.PackageManager; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Environment; import java.io.File; import java.util.ArrayList; public class MainActivity extends AppCompatActivity implements MediaPlayer.OnCompletionListener { //获取音频存放路径 String musicfilePate = Environment.getExternalStorageDirectory().getPath() + "/Music/"; //音频播放列表 ArrayList<String> musicPate = new ArrayList<>(); //音频播放类 public static MediaPlayer parser = new MediaPlayer(); //下标 int i = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); } else { //已经授权 File file = new File(musicfilePate); File[] files = file.listFiles(); for (File f : files){ String filePath = f.getAbsolutePath(); musicPate.add(filePath); System.out.println(musicPate); } playing(musicPate.get(i)); } } void playing(String path){ parser.reset(); try { //为播放器对象设置音频 parser.setOnCompletionListener(this); //设置音频流类型 parser.setAudioStreamType(AudioManager.STREAM_MUSIC); //设置播放的音频文件路径 parser.setDataSource(path); //播放准备 parser.prepare(); //开始播放 parser.start(); } catch (Exception e) { e.printStackTrace(); } } @Override public void onCompletion(MediaPlayer mediaPlayer) { //歌曲切换播放 i++; if (i>musicPate.size()-1){ i=0; } playing(musicPate.get(i)); } }

2023-06-01 上传

import cv2 import sys import os import time from PyQt5 import QtGui #重新导入 from PyQt5 import QtCore #重新导入 from showPic import Ui_MainWindow from PyQt5.QtCore import * from PyQt5.QtGui import * #导入的外面 from PyQt5.QtWidgets import * camera_path = 0 # 0:自带摄像头 1:外接摄像头 "xxx.mp4" "rtsp://admin:pwd@192.168.2.10/cam/..." capture = cv2.VideoCapture(camera_path) # 初始化播放器 流媒体 fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V') # XVID/DIVX MPEG MJPG X264 video_writer = cv2.VideoWriter("image/myself.mp4", fourcc, 25, (960, 540)) # 存放路径、、帧率fps、尺寸(且保证下面的frame也是这个尺寸) class videoShow(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.dir_path = r"E:\pycharm\new_subject\image/" self.pushButton_play.clicked.connect(self.play_video) self.pushButton_pause.clicked.connect(self.pause_video) def play_video(self): self.playing = True def pause_video(self): self.playing = False def timer_pic(self): image_name = self.dir_path + self.file_list[self.n] url = image_name pic_image = cv2.imread(url) pic_image = cv2.cvtColor(pic_image, cv2.COLOR_BGR2RGB) # 将BGR格式图像转换成RGB height, width = pic_image.shape[:2] pixMap = QImage(pic_image.data, width, height, width*3, QImage.Format_RGB888) # 将RGB格式图像转换为八位图 pixMap = QPixmap.fromImage(pixMap) ratio = max(width/self.label.width(), height/self.label.height()) pixMap.setDevicePixelRatio(ratio) # 根据图片比例显示 self.label.setAlignment(Qt.AlignCenter) # 设置居中 self.label.setPixmap(pixMap) if self.playing: flag, frame = capture.read() if flag is False: return frame = cv2.resize(frame, (960, 540)) video_writer.write(frame) cv2.namedWindow("video", 0) cv2.imshow("video", frame) key = cv2.waitKey(25) if key == 27: video_writer.release() cv2.destroyAllWindows() sys.exit(0) if __name__ == '__main__': app = QApplication(sys.argv) ui = videoShow() ui.show() sys.exit(app.exec_()) 优化这段代码,实现录制视频以及点击按钮实现录制、播放、暂停

2023-07-15 上传