1,内存映射是一种重要的抽象手段,内核中大量使用,也可以用于用户程序。映射方法把任意来源的数据传输到进程的虚拟地址空间中,作为映射目标的地址空间区域,可以像普通内存那样访问,任何修改都会自动传输到原数据源。、
2,内存在实现设备驱动程序时直接使用了内存映射,外设的输入/输出可以映射到虚拟地址空间区域中。
3,内核在分配内存的时候,必须记录页帧的已分配状态或空闲状态,以避免两个进程使用相同的内存区域。
4,内存分配和释放非常的频繁,为了保证尽快完成,内核还可以只分配完整的页帧,用户空间中的标准库将内存划分为更小的区域,并为进程分配内存。
5,内核有时候需要分配连续页,为了快速检测连续区域,使用一种古老的技术——伙伴系统。
6,系统中的空闲内存总是两两分组,每组中的两个内存块成为伙伴,伙伴的分配是彼此独立的,但是如果两个伙伴都空闲出来,内核就会将其合并为一个更大的内存块,,作为下一层次上某个内存块的伙伴。
7,应用程序释放内存时,内核直接检查地址,判断是否可以创建一组伙伴,并合并为一个更大的内存块,放到伙伴聊表中,这是内存块分裂的逆向过程。
8,在系统的长期运行过程中,频繁的分配和释放页帧可能会导致一种情况,就是若干空闲页帧散布在物理空间的各处,也就是系统缺乏连续页帧组成的较大内存块——称为碎片的内存管理问题。
9,内核本身经常需要比完整页帧小的多的内存块,但内核无法使用标准库函数,必须在伙伴系统的基础上进行额外的内存管理,将页划分为更小的部分,这样不仅可以分配内存,还可以为频繁使用的小对象实现一个一般性缓存——slab缓存。
10,对频繁使用的对象,内核定义了只包含了所需类型对象实例的缓存,slab缓存自动维护与伙伴系统的交互,在缓存用尽时请求刷新页帧。
11,对通常情况下的小内存块分配,内核针对不同大小的对象定义了一组slab缓存,可以像用户空间编程一样,使用相同的函数访问这些缓存,不同的事函数前缀加了看,表明是与内核相关联的:kmalloc,kfree
12,页帧由伙伴系统分配,slab分配器负责分配小内存块及提供一般性内核缓存。
13,通过利用磁盘空间作为扩展内存,从而增大可用内存。内核需要更多内存时,不经常使用的页可以写入硬盘,需要访问相关数据时,内核再将相应的页换回内存——页面交换。
14,换出的页孔毅通过特别的页表项标识,进程试图访问此类页帧时,CPU会启动一个可以被内核截取的缺页异常,此时内核可以将硬盘上的数据切换到内存中,接下来用户进程恢复运行。——缺页异常机制
15,页面回收——用于将内存映射被修改的内容与底层的块设备同步,也简称数据回写。数据刷出后,内核即可将页帧用于其他用途。
16,内核必须能够测量时间以及不同时间点的时差,进程调度就会用到这个功能。jiffies_64和jiffies分别对应64位和32位系统的全局变量,按照恒定的时间间隔递增。
17,每种计算机的底层体系结构都提供了一些执行周期性操作的手段,通常的形式是定时器中断。
18,jiffies的递增频率与体系结构有关,取决于内核中的主要常数HZ。该数值通常介于100和1000中间。换言之,jiffies的值每秒递增次数在100到1000此之间。
19,jiffies的计时相对粒度较粗,在底层硬件允许的条件下,内核可以使用高分辨率的定时器来提供额外的计时手段,以纳秒级的精确度和分辨率来计量时间。
20,系统调用时用户进程与内核交互的经典仿佛。POSIX标准定义了许多系统调用,以及这些系统调用在所有遵从POSIX的系统包括Linux上的语义。
21,传统的系统调用按不同类别分组:进程管理,信号,文件,目录和文件系统,保护机制,定时器函数。
22,详细说明:
进程管理:创建新进程,查询信息,调试
信号:发送信号,定时器以及相关处理机制
文件:创建,打开,和关闭文件,从文件读取以及向文件写入,查询信息和状态。
目录和文件系统:创建,删除和重命名目录,查询信息,连接,变更目录
保护机制:读取和变更UID/GID,命名空间的处理。
定时器函数:定时器函数和统计信息。
23,外设分为两类:字符设备,块设备。
24,字符设备:提供连续的数据流,应用程序可以顺序读取,不支持随即存取。调制解码器是典型的字符设备。
25,块设备:应用程序可以随即访问设备数据,自行确定读取数据的位置,数据的读取只能以块(512B)为单位,不支持基于字符的寻址。硬盘是典型的块设备。
26,网卡也可以通过驱动程序控制,但是在内核中属于特殊状况,因为网卡不能利用设备文件访问。
27,为了支持通过文件接口处理网络连接,Linux使用了源于BSD的套接字抽象。套接字可以看作是应用程序,文件接口,内核的网络实现只见的代理。
28,Linux由成百上千的文件组成,数据存储在硬盘或者其他块设备。存储使用了层次式文件系统。
29,内核提供一个额外的软件层,将底层文件系统具体特征与应用层隔离开来,称为——VFS,既是向上的接口也是向下的接口。
30,模块用于在运行时动态的向内核添加功能,如驱动程序,文件系统,网络协议等,实际上内核的任何子系统都可以模块化。
31,模块的本质不过是普通的程序,只是在内核空间运行而不是在用户空间执行而已。
32,模块必须提供某些代码在初始化和终止时执行(init.text和exit.text),以便向内核注册和注销模块。模块代码可以编译到内核代码中,访问内核中的所有数据和函数。
网友评论