您的位置:首页 > 运维架构 > Linux

understanding the linux kernel

2012-08-13 10:16 225 查看
这本书买了有3个月了,一直没敢看,怕自己看不懂。最近实在不想看别的书籍了,于是拿起了这本书

书中,代码比较少,不像赵炯的那本书,全是代码

我看的是第三版,中国电力出版社翻译的。

第一章:

1. 自旋锁:在多处理器系统中,信号量并不总是解决同步问题的最佳方案。自旋锁,由此被提出。

2. 内存管理是至今为止unix内核中最复杂的活动。

3. 虚拟内存,就是virtual memory,就是逻辑地址空间,每个程序都是运行在这个空间。这个地址,经过分段和分页机制地址映射后,转换为物理地址。

第二章

1. 物理地址PAE分页机制:改变了32位线性地址到物理地址的转变方式(原来物理地址是32位,现在为36位)

2. linux(内核2.6.11)采用了一种同时适用于32位和64位系统的普通分页模型:Page global directory, Page Upper directory, Page Middle directory, Page table.

3. 把线性地址映射到物理地址虽然有些复杂,但现在已经成为了一种机械式的任务。

4. 当内存<896, 896与4G之间,>4G时,内核页表是不同的

5. 64位linux使用48位线性地址

第三章:

1. linux使用轻量级进程(lightweight process)来对多线程应用程序提供更好的支持。一个轻量级进程组基本上就是实现了多线程应用的一组线程。

POSIX兼容的pthread库使用Linux轻量级进程有3个例子:LinuxThreads,Native Posix Thread(NPTL)和IBM的下一代Posix线程包NGPT(next generation posix threading package)

2. 在多处理器系统中,每个CPU都有自己的运行队列,即它自己的进程链表集

3. MMX指令集使用FPU浮点寄存器,两个不可同时使用

SSE扩展使用自己独立的寄存器,可以和MMX/FPU同时使用!

2012.8.13

1. 内核线程与普通进程的区别:内核线程只运行在内核态,而普通进程既可以运行在内核态,也可以运行在用户态。内核线程只运行在内核态,他们只使用大于page_offset的线性地址空间。而普通进程不管在用户态还是内核态,都可以使用4GB的线性地址空间。

2. 在多处理器系统中,每个CPU都有一个进程0.只要打开计算机电源,计算机的BIOS就启动某一个CPU,同时禁用其他CPU。运行在CPU0上的swapper进程初始化内核数据结构,然后激活其他的CPU,并通过copy_process()函数创建另外的swapper进程,把0传递给新创建的swapper进程作为他们的新PID。此外,内核把适当的CPU索引赋给内核所创建的每个进程的thread_info描述符的cpu字段。

3. 单进程退出调用do_exit(),多线程的进程调用do_group_exit()->do_exit()来退出。

第四章中断与异常:

1. 同步中断:当一条指令终止执行后CPU才会发出的中断,intel叫做异常(exception)

异步中断:由其他硬件设备依照CPU时钟信号随机的产生, intel称谓中断(interrupt)

2. Linux利用中断门来处理中断,利用陷阱门处理异常(Double fault异常是唯一由任务门处理的异常,它表示内核错误)。

2012.8.14

老式中断控制器是8259A, 从Pentium III开始引入APIC,可以将中断传递给多CPU系统中的每个CPU

Intel大于有20种异常,根据具体cpu略有不同。

2012.8.15

这本书,和操作系统原理的书籍思路差不多,但是,进一步的加入了linux x86上的具体实现的一些函数的引用。

这样,就是操作系统原理与实现更近了一步。

如果不是研究内核代码,只想看看linux内核的原理这本书很好,如果要研究内核代码,这本书也是一个很好的参考。

有种从艺术的角度研究linux kernel的感觉。绝对的大师级的作品!

2012.8.20

中断这一章,有许多的不明白,以后再慢慢看吧。这本书值得多读几遍。

第5章 内核同步

优化屏障:保证编译程序不会混淆放在原语操作之前的汇编语言指令和放在原语操作之后的汇编语言指令。linux中,优化屏障就是barrier()宏,展开为as volatile("":::"memory")。volatile关键字禁止编译器把asm指令与程序中其他指令重新组合。

内存屏障:这个用来确保在原语之后的操作开始执行之前,原语之前的操作已经完成。

自旋锁的介绍,各种锁,好多没看懂!!!

内核信号量由内核控制路径使用,System V IPC信号量由用户态进程使用。

第6章 定时测量

各种计数器,但是没看到用户应用程序如何使用这些计数器,通过系统调用??

第7章 进程调度

1. 进程分类1:I/O受限型和CPU受限型

2. 进程分类2:交互式进程,批处理进程,实时进程。

3. 超线程:它包括几个内部寄存器的拷贝,并快速在它们之间切换。这种由intel发明的技术,使得当前进程在访问内存的间隙,处理器可以使用它的机器周期去执行另外一个线程。一个超线程的物理CPU可以被看做几个不同的逻辑CPU。

4. 一个可运行状态的进程通常被限制在一个固定的CPU上。任何一个可运行进程都不可能同时出现在两个或多个运行队列中。

第9章

1. 进程地址空间由允许进程使用的全部线性地址组成。每个进程所看到的线性地址集合是不同的,一个进程所使用的地址与另外一个进程所使用的地址之间没有什么关系。

2. linux实现轻量级进程很简单,即不复制父进程地址空间。创建轻量级的进程比创建普通进程要快的多,而且只要父进程和子进程谨慎的协调他们的访问,就可以认为页的共享是有益的。

第10章 系统调用

内核例程能对内存中现有的所有页进行寻址。系统调用时,检查用户程序的线性地址是否小于PAGE_OFFSET,放在用户程序将内核地址空间的一个地址作为参数来传递,然后还能对内存中现有的任何页进行读写而不引起缺页异常。

2012.8.20

第11章 信号

1. 信号传递就是将信号放入进程描述符中去

2. kill()系统调用不单单是杀死进程,而是向进程传递信号,任意的信号。

3. 这样有信号的原理

第12章 虚拟文件系统

1. VFS虚拟文件系统就是一个抽象层,用于处理各种文件系统,如ext,FAT,NTFS等,提供一个统一的接口

2. 文件系统的函数如read,write等是linux kernel实现的,属于kernel!

3. 目录也是文件,但是是一种特殊的文件。kernel.bin不大,也就3M左右!

4. 特殊文件系统


名字安装点说明
bdev块设备
binfmt_misc任意其他执行格式
devpts/dev/pts伪终端支持
eventpollfs由有效事件轮询机制使用
futexfs由futex快速用户空间加锁机制使用
pipefs管道
proc/proc对内核数据结构的常规访问点
rootfs为启动阶段提供一个空的根目录
shmIPC共享线性区
mqueue任意实现posix消息队列时使用
sockfs套接字
sysfs/sys对系统数据的常规访问点
tmpfs任意临时文件
usbfs/proc/bus/usbUSB设备
5. 安装根文件系统:

安装根文件系统需要两个阶段:

(1) 内核安装特殊rootfs文件系统,该文件系统仅提供一个作为初始安装点的空目录。

(2) 内核在空目录上安装实际根文件系统

为什么内核不怕麻烦,要在安装实际根文件系统之前安装rootfs文件系统呢? 我们知道,rootfs文件系统允许内核容易的改变根文件系统。事实上,在某些时候,内核逐个的安装和卸载几个根文件系统。例如,一个发布版的初始启动光盘可能把具有一组最小驱动程序的内核装入RAM中,内核把存放在ramdisk中的一个最小文件系统作为根安装。接下来,在这个初始根文件系统中的程序探测探测系统的硬件,装入所必须得内核模块,并从物理设备重新安装根文件系统。

2012.8.22

第13章 I/O体系结构和设备驱动程序

1. 这章对于linux设备驱动模型讲得很透彻,极力推荐好好看一看!

linux devices driver中,讲得更加的详细透彻! 当初怎么把linux devices drivers看做一大堆的函数集了呢?

2. linux设备驱动模型中,每个设备是由一个device对象来描述的。内核所支持的每一种总线类型都由一个bus_type对象描述的。每个驱动程序都可由device_driver对象描述。存放在bus_subsys变量中的子系统把潜入在bus_type对象中的所有子系统都集合在一起。bus_subsys子系统与目录/sys/bus对应。每种总线的子系统通常包括两个kset,他们分别是描述符device_driver和描述符device. 因为设备的kobject目录出现在/sys/devices下的sysfs文件系统中,所以每种子系统的devices目录存放了指向/sys/devices下目录的符号链接。

2012.8.23

第14章 块设备驱动程序

关于内核空间与用户空间:

内核空间是系统调用时,系统调用执行分配和使用的一些空间

而User程序使用空间时,也是通过系统调用来分配空间,但是经过内核的内存管理后,分配的是user层空间。这样,内核可通过内存管理分配用户的内存空间。

一些变量之类是编译时确定的,在bin中,loader进入内存时,已经在用户空间了。

第15-18章 讲页高速缓存,访问文件,回收页框,文件系统。没仔细看。!!!!

2012.11.05

第18章 Ext2与Ext3文件系统

1. Ext2系统没有日志

2. 日志系统的目标是避免对整个文件系统进行耗时的一致性检查。日志文件系统只能确保系统调用级的一致性。

3.

这两天又阅读了一遍,大概的翻了翻,对linux内核已经有了基本的理解,现在真的可以花时间来搞具体的东西了,下面花时间研究android的实现...............................

2015.8.9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: