xv6 源码分析 005

xv6 源码分析 005

今天我们正式进入内核部分。

我们需要明确一个点,kernel目录和我们之前看到的user目录不同,user目录下有多个可以被编译成执行文件的源文件,也就是说在user目录下有个的程序,但是整个kernel只有一个可执行文件,因为整个kernel是作为一个应用程序来运行的。

我们先看看kernel目录中包含了那些部分,想放图片的,但是太模糊了直接打出来吧。

先看看虚拟内存系统,因为我觉得进程也是属于虚拟内存的范畴,所以这里将进程相关的文件页也罗列进来

exec.c				--- 1
kalloc.c			----3
memlayout.h			----3
pipe.c				----1
proc.h				----2
proc.c				----2
swtch.S				----2
syscall.c			----4
syscall.h			----4
sysproc.c			----2
tramloline.S		----3
vm.c				----3
trap.c				----4

我们现在先有个概念即可,不用深入了解,后面我们结合源码在来一块一块的细讲。

1表示是有关某个系统调用的具体实现

2表示进程相关的内容

3表示xv6虚拟内存的管理相关的内容

4表示系统调用涉及到的上下文切换和内核态跟用户态之间的切换

我们在看看文件系统和日志系统,文件系统需要保证可靠性,所以必须依赖日志,所以我们一起讲

bio.c
buf.h
fcntl.h
file.c
file.h
fs.c
fs.h
log.c
stat.h
types.h

ok,现在我们在看看硬件相关的,说实话,硬件我并不是很了解,主要是因为实验也很少涉及,而且操作系统操作硬件是通过硬件映射的方式,将相关硬件的物理地址映射到虚拟空间中来读写的,而且好像还有硬件虚拟化的相关的,太复杂了牛魔。所以硬件我们最后讲,我需要时间去了解一下

console.c
memlayout.h
plic.c
ramdisk.c
riscv.h
uart.c
virtio_disk.c
virtio.h

最后是一些工具,主要是自旋锁和睡眠锁,还是比较有意思滴

sleeplock.h
sleeplock.c
spinlock.c
spinlock.h
string.c

ok,今晚我们先对xv6 kernel有个大概的了解先,明天在进入具体的模块中。

首先我们需要知道,为什么要有操作系统。我们可以假设一下,如果没有操作系统,那么我们的应用程序是直接跑在硬件之上的,我放个图吧

在这里插入图片描述

现在我们看一下,应用程序现在是能够直接看到底层的硬件的,所以它们都能够通过总线来访问各个硬件设备,比如说,能够有多个应用同时通过打印机输出它们需要输出的内容,由于硬件设备一般都会通过一个缓冲区来进行解耦,所以应用程序们就会将它们要输出的内容放到这个缓冲区中,但是我们想一下,那么多个进程同时放,那不是乱套了吗;再举个例子,假设在存储设备(disk/ssd)上,每个应用程序都有自己的分区,用来存储自己的数据,但是由于没有操作系统的文件系统进行管理,应用程序能够直接对存储设备进行读写,比如说,一个恶意软件它一直往存储设备中写0,那么其他应用程序的数据就被清空了,(虽然在主存中还有一部分,但是这个恶意软件依旧能够改写),这就导致其他的应用程序甚至整个主机都不能够运行(因为有可能BIOS也被改写了,这个不是很了解);既然恶意的应用程序能够改写磁盘的内容,那么这些恶意的软件也能够入取到任何在这个计算机上存储的任何信息,因为这个架构下,整个计算机对于应用程序来说是赤裸的(想不到形容词了)。

所以,我们需要一个我们信得过的应用程序来维护我们的硬件,保护我们的硬件不会被非法访问或者非法使用,并且这个应用程序还需要承担监督运行在这个计算机上的其他的我们信不过的应用程序的行为,限制它们能够访问的范围,并且将多个应用程序对硬件的访问进行管理(让他们不要一窝蜂的乱来),,,等等功能,所以,这就有了我们的操作系统,也被称为内核(kernel)。

内核为硬件做了哪些工作呢?

首先,内核不能让应用程序直接看到底层的硬件,所以,内核必须对硬件进行抽象,所以就有了我们的进程(process),进程是对硬件资源的抽象,我们的应用程序是运行在进程之中的。

其次,内核还不能够让其他恶意的进程修改其他进程的数据,内核需要将不同的进程进行隔离,所以,内核需要对物理内存(memory)进行抽象,所以,就有了进程地址空间(process address space)。

而且,由于有操作系统的存在应用程序不能直接处理它们自己的IO,所以,操作系统也需要对不同的应用程序的IO请求进行处理,这个IO包含的范围很广,可以是对内存的IO,可以是磁盘的IO,可以是网络IO,可以是外接设备的IO(也就是上面提到的uart.h。所以,操作系统就需要将这些IO进行统一的处理,在最顶层,linux和xv6都将这些IO统一抽象成了一个文件描述符(file descriptor),所以在应用程序看来,对IO的操作就是对文件描述符的操作,而在操作系统中,内核会通过文件系统来处理在对应文件描述符上产生的请求,并通过文件描述符和相应的进程进行交互。

(兄弟们到点了,讲了个大概,后面的我们以后再细讲了,睡了家人们)。

会通过文件系统来处理在对应文件描述符上产生的请求,并通过文件描述符和相应的进程进行交互。

(兄弟们到点了,讲了个大概,后面的我们以后再细讲了,睡了家人们)。

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值