前言:
Linux内核与硬件平台:
1.高效率的内核能够利用硬件可利用的特点,比如寻址技术,caches,处理器exception,专用指令,处理器控制寄存器等。如果我们想使你相信,内核在执行一个特定任务时确实工作的相当好,那我们必须首先告诉你内核工作在一个什么样的硬件平台上。
2.即使UNIX内核大部分源码是独立与处理器的,并且是用c语言编写,但是
也有少数部分使用汇编语言编写的。为了充分理解内核,就必须学习一些设计相关硬件的 汇编语言片段。
研究内核重点是内核的设计,而不是计算机的体系结构。
chap1 绪论
多用户系统:
1.
一台能够“并发”和“独立”执行分别属于两个或多个用户的若干应用程序的计算机。并发是指几个应用程序能同时处于活动状态并竞争各种资源,独立是指每个应
用程序都能执行自己的任务,而无须考虑其它用户的应用程序在作什么。显然,从一个应用程序切换到另一个会使每个应用程序的速度有所减缓,从而有向到达用户
的相应时间。
2.多用户系统必须包含的安全保护机制:
认证机制,呵呵死用户身份
一个保护机制,防止有错误的用户程序阻碍其它应用程序在系统中运行
一个保护机制,防止恶意的用户程序该设或窥视其它用户的活动
计帐机制,限制分配给每个用户的资源数
3.为了去确保这些安全保护机制,OS必须利用与CPU特权模式相关的硬件保护模式,否则,用户程序将直接访问系统电路,克服这些强加于它的限制。UNIX是实施资源硬件保护的多用户系统。
用户和组:
在多用户系统在中,每个用户都有自己的私有空间,OS必须保证,没有用户能够开发出一个用于侵犯其它用户私有空间的系统应用程序。
OS只允许有非抢占式进程,这就意味着,只有当进程资源放弃CPU时,调度程序才被调用。但是,多用户系统中的进程调度必须是抢占式的。OS记录下每个进程占有的CPU时间,并周期性的激活调度程序。
UNIX文件系统概述:
1.同一个目录中的文件名必须不同,而不同目录中的文件名可以相同。
2.硬链接和软链接:
包含在一个目录中的文件名就是一个文件的hard link,简称链接在同一目录或不同的目录中,同一文件可以有几个链接,因此对应几个文件名字。
hanr link有2方面的限制:
一是,不允许给目录创建硬链接,因为这可能把目录树变成环形图,从而不可能通过名字来定位一个文件;
二是,只有同一个文件系统的文件之间才可以创建链接。而现代UNIX系统可能包含了几种文件系统,这些文件系统位于不同的磁盘分区,用户也没有主义到它们的物理划分。
为克服这些限制,引入了symbolic link。
文件类型:
regular file
directory
symbolic link //这3种UNIX文件系统的基本类型
block-oriented device file
character-oriented device file
//设备文件以及I/O设备与继承到内核中的设备驱动程序相关。例如,当程序访问设备文件的时候,它直接作用于与那个文件相关的设备。
pipe ,named pipe
socket
//是用于进程间通信的特殊文件
文件描述符与索引节点:
文件系统用来管理文件的所有信息包含在一个叫做索引节点(inode)的数据结构中,每个文件都有自己的inode,文件系统用inode来标识每个文件。
posix标准指定inode至少包含以下属性:文件类型,硬链接个数,文件长度,设备标识符,索引节点号,文件所有者的UID和GID,时间标记,访问权限和文件模式(mode)。
访问权限和文件模式:
suid:进程执行一个文件的时候通常保持进程所有者的UID,但当设置了可执行文件suid的标志位,进程就获得了该文件所有者的UID。
sgid:进程执行一个文件的时候通常保持进程组的UID,但当设置了可执行文件sgid的标志位,进程就获得了该文件组的GID。
sticky:设置了sticky标志位的可执行文件相应的对内核发出一个请求,当可执行文件执行结束以后,依然将该程序保留在内存中。(该标志已经过时,现在使用基于代码页共享的其它办法)
当进程创建一个文件的时候,文件所有者的ID就是该进程的UID,而文件的组ID既可以是进程创建者的GID,也可以是父目录的GID,这取决于父目录sgid标志位的值。
UNIX内核概述:
可重入内核:
所有UNIX内核都是可重入的(reentrant),这意味着几个进程可以同时在内核态下执行,当然在单处理器系统上,只有一个进程在真正的运行,但是许多进程可以在内核态下阻塞,或者等待CPU,或者等待一些I/O操作的完成。
提供可重入的一种方式是编写函数,这些函数只能修改局部变量,不能修改全局数据结构,这样的函数叫做可重入函数。
但是可重入内核不仅仅局限于这样的可重入函数(尽管一些实时内核正是如此实现的),内核可以包含非重入函数,并且利用锁机制保证一次只有一个进程执行一个非重入函数。处于内核态的每个进程只能作用于自己的内存空间,不能干预其它的进程。
同步和临界区:
当一些计算结果取决于两个或者多个进程如何被调度时,这段代码是不正确的,我们说存在一种竞争条件(race condution)。
临界区是这样的一段代码,进入这段代码的进程必须完成以后,另一个进程才能进入。
UNIX信号提供了把系统事件报告给进程的一种机制。一般有两种系统事件:
异步通知:例如用户按下ctrl+c,即向前台进程发出中断信号SIGINT;
同步错误和异常:例如,当进程访问内存非法地址时,内核向这个进程发送一个SIGSEGV信号。
进程管理:
调用fork()的进程是父进程,而新进程是它的子进程呢个。父子进程能互相找到对方,因为描述每个进程的数据结构都包含两个指针,一个指向它的父进程,一个直接指向它的子进程。
exit()系统调用终止一个进程。内核对这个系统调用的处理是释放进程所拥有的资源,向父进程发送SIGCHILD信号,这个信号的缺省操作是忽略。
虚拟内存:
位于应用程序对内存的申请与硬件管理但愿(MMU)之间。
进程所用的一组内存地址不同于物理内存地址,当进程使用一个虚拟地址时,内核和MMU协作定位其在内存中的实际物理位置。
现在的CPU包含了呢呢个自动把虚拟地址转换成物理地址的硬件电路。
随即访问内存(RAM)的使用:
所有的UNIX操作系统都将RAM明显的分成两部分,其中若干兆的字节用于存储内存映像(也就是内核代码和内核静态数据结构),RAM的其它部分通常由虚拟存储器系统来处理。
内核内存分配器(kernel memory allocator, KMA):
是一个子系统,它试图满足系统中所有部分对内存的请求。其中一些请求来自于内核其它子系统,它们需要一些内存空内核使用,还有一些请求来自于用户程序的系统调用,用来增加用户进程的地址空间。
阅读(1525) | 评论(0) | 转发(0) |