操作系统

参考pdf 《computer basic》

  • 操作系统环境
    运行环境 = 操作系统 + 硬件
    硬件:处理器(CPU)、显卡(图形处理器GPU)

  • API(application programming interface)
    应用程序向系统传递指令的途径称为API

  • FreeBSD
    (将源代码直接发送给应用程序,而不是发送机器代码)
    存在Ports机制,能够结合当前运行环境的硬件环境来编译应用的源代码。如果目标应用的源代码找不到,自动使用FTP连接到相应站点下载代码。

  • 提供相同运行环境的Java虚拟机
    Java语言编译后生成的不是特定CPU使用的本地机器代码,而是名为字节代码的程序。它的运行环境就叫做java虚拟机。

  • BIOS
    Basic Input/Output System
    BIOS存储在ROM中

参考《cxuan-os》

image.png
image.png
image.png
image.png

参考 Operating System Engineering - MIT

LE1

  • fk: operating system
    需要自己设计一个小型的OS
    对于系统调用,如ls, 在位置 /bin/ls
    A4D69899-B5C4-4AE4-AA60-C4D07D555C53.png

strace命令可以用来监控用户空间进程和内核的交互,如系统调用。
strace /bin/ls

8465F6A7-61C4-4570-9207-58D7AD17D93E.png

fd文件描述符,0是标准输入,1是标准输出
命令dup,复制文件描述符
wc -l统计行数
fork会把子进程的pid父进程,在把0给子进程
execvp The exec() family of functions replaces the current process image with a new process image. 相当于用新的程序覆盖了原来的程序
pipe fd在fork之中是可以继承的,所以可以在程序之间通信。
对于 ls | wc -l, shell需要做的工作:

创建一个pipe
fork
pipe 的 write fd设为1(ls)
exec ls
pipe 的 read fd设为0(wc)
exec wc
wait for wc

& |

&任务在后台执行
&& 上一条执行完,才执行下一条
| 管道,上一条的结果作为下一条的输入
|| 表示上一条命令执行失败后,才执行下一条命令
  • Unix介绍
    参考视频 https://www.youtube.com/watch?v=tc4ROCJYbm0
    kernel/shell/program

  • Assignment:Booting a PC

实验环境配置:
首先安装qemu模拟器
brew install qemu (自动给我安装了opencv和其他很多东西,总之很慢)
brew tap liudangyi/i386-jos-elf-gcc
brew install i386-jos-elf-gcc i386-jos-elf-gdb

brew info qemu 可以查看已经安装的qemu信息

9D7F965A-A4CE-4C56-9F01-3A9D178AD6FD.png

在本机上搭建环境,参考 https://pdos.csail.mit.edu/6.828/2018/tools.html
推荐在虚拟机搭建
Compiler Toolchain

A081962D-283F-4BB7-BA56-E660D76C3FF8.png

00236962-2CA8-4F81-9DE7-72A6472A3FA0.png

如果这两步成功了,就不需要再compile toolchain了

QEMU
git clone https://github.com/mit-pdos/6.828-qemu.git qemu
./configure --disable-kvm --disable-werror [--prefix=/root/os] [--target-list="i386-softmmu x86_64-softmmu"]

出现错误


831C4EF0-CFF9-4D4C-83E4-132EBAD17701.png

解决:


A0C16F83-72FE-4730-9A12-3EEE73806335.png

安装依赖包:apt-get install libpixman-1-dev
还是不行,参考

EC86F595-87BF-43D5-BD84-3D6051125300.png

  • [libsdl1.2-dev] https://blog.csdn.net/WUDIxi/article/details/100170859

    CAE33184-DB9D-4CC6-BBA2-258976462387.png

  • libtool-bin
    apt-get install libtool-bin

    0EE581C0-4A5E-42B3-A5A0-F1958B741B9E.png

  • libglib2.0-dev


    855F80E8-9F53-4004-8E2E-1F9043FE3732.png
  • libz-dev


    983978A0-B9A3-41F1-8D88-8092D77F96F8.png
  • libpixman-1-dev
    apt-get install libpixman-1-dev

    CCFBC1A1-F744-4100-98D7-FB6204F31CE4.png

./configure --disable-kvm --disable-werror [--prefix=/root/os/qemuinstall] [--target-list="i386-softmmu x86_64-softmmu"]

错误更新为如下:


D9683757-29EF-427D-85E3-B74C7B2AD068.png
282DDD3A-9B91-493D-8C6F-96744660971B.png

make && make install

错误:
参考 https://blog.csdn.net/Wu1069444514/article/details/89266183
https://www.jianshu.com/p/ec675f0e1482 (为什么没有早点看到这篇 )
qga/commands-posix.c

E4C0C29E-8DA9-4952-84EC-2276C1B28603.png

CDD5D6B1-9146-4F89-A1D4-7242F673C1D3.png

Werror是把警告都当作错误来看待,把它删掉,再make

其他文件

  • 需要x86的机器


    22EC87DE-D8C0-4A91-AA90-D90C10ED89A8.png
  • git资源下载
    git clone https://pdos.csail.mit.edu/6.828/2018/jos.git lab
    提交答案的方法:

    29B54420-0E3E-4ABC-865D-44FDAF30D588.png

第一部分:熟悉x86嵌入语言,QEMU x86处理器,电脑的开机Bootstrap程序。

881FF67E-EAA8-466E-A3C2-2F8A037C643E.png

报错如上,原因是:没有32-bit gcc multilib。解决方法:安装gcc-multilib 包。参考 https://zoomadmin.com/HowToInstall/UbuntuPackage/gcc-multilib

sudo apt-get update -y
sudo apt-get install -y gcc-multilib

再次make


89BC9D61-019C-4D5B-BC88-DCD7C96A86D8.png

使用obj/kern/kernel.img作为模拟机的虚拟硬盘

make qemu-nox

2BBD4F40-D86D-4F7E-8CC0-779A7A789DC4.png

退出方法:先输出control a,抬起后,再输入x

可用命令


C2B54741-A11E-4628-84CA-059974D01DAC.png

物理空间如下

F92C9F4B-3484-4D5B-80CD-D1CBD99B3A13.png

BIOS,内存64KB
早期:存在ROM,但是现在存在闪存中。
作用:初始化,装载操作系统。

ROM-BIOS

一个:make qemu-nox-gdb
另一个:make gdb

384KB地址空间,从0xA0000 - 0xFFFFF(0x5FFFF),


02378FA0-8406-418B-877D-138EB53E6A2F.png

计算内存空间:

1KB = 1024B, 384KB = 393216B,0x5FFFF转为16进制是393215

BIOS的作用:
操作系统初始化、检查安装内存的数量、load操作系统

最近的x86处理机可以支持超过4GB的物理RAM。

JOS只用前256MB的物理内存

  • ROM BIOS

打开两个终端窗口

窗口1:
开启QEMU make qemu-nox-gdb
但是没有gdb的指令的话不会开始

窗口2:
make gdb


C98A0C7E-2175-4D0F-8708-73C06338F53D.png

上图是启动之后最开始执行的指令的反汇编

第二部分:测试boot loader

  • sector 扇区
    512byte
    是硬盘的最小操作粒度

从硬盘或软盘中:
当BIOS发现一个bootable的软盘或硬盘之后,它会将512byte的扇区装入内存(物理地址0x7c00 - 0x7dff),再通过jmp指令设置CS:IP(0000:7c00),将控制权交给boot loader。

从CD-ROM中:
sector的大小是2048byte,并且BIOS可以load更大的boot image从硬盘到内存中。

  • 本节课程
    采用硬盘boot模式,boot loader的大小需要在512 byte之内。
    boot loader包含:一个汇编语言源文件boot/boot.S,一个C源文件boot/main.c。

第三部分: JOS

  • xv6 源码
    https://pdos.csail.mit.edu/6.828/2018/xv6/xv6-rev11.pdf

  • xv6 手册
    https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf

  • PC嵌入语言
    AT&T与Intel的转换
  • 阅读材料
    https://pdos.csail.mit.edu/6.828/2018/reference.html

总网址:https://pdos.csail.mit.edu/6.828/2018/schedule.html

答案参考1
https://www.jianshu.com/p/782cb80c7690

你可能感兴趣的:(操作系统)