现在的位置: 首页 > 综合 > 正文

读书笔记之《深入理解LINUX内核》10、11、12章

2013年10月12日 ⁄ 综合 ⁄ 共 1855字 ⁄ 字号 评论关闭

第10章:系统调用

    但是这章不是单单讲系统调用的,也不像《UNIX环境高级编程》,因为这是一本内核的书嘛,所以这章讲的还是内核,具体来说就是内核怎么处理用户进程发出的系统调用。    

    第一节POSIX API和系统调用。让我们先强调一下应用编程接口(API)与系统调用之不同。前者只是一个函数定义,说明了如何获得一个给定的服务;而后者是通过软中断向内核发出一个明确的请求。一个API可能不包含系统调用,也可能包含一个或者几个系统调用,另外,几个API可能调用封装了不同功能的同一系统调用。POSIX标准针对API而不针对系统调用。    

    第二节简单讲了系统调用处理程序及服务例程。    

    第三节进入和退出系统调用。调用系统调用可以通过执行int $0x80汇编指令或者执行sysenter指令。从系统调用退出可以执行iret指令或者执行sysexit指令。进入和退出的后一种方法都是在Pentium II 中引入。    

    第四节参数传递。系统调用中从用户态传递到内核态的参数通过CPU寄存器来传递。可用的寄存器有:eax, ebx, ecx, edx, esi, edi, ebp。参数传递时还需要进行参数验证,不过内核采用的是尽量推后检查和粗略检查的策略。本节还讲了修正代码技术,用以处理系统调用产生的某些异常。    

    第五节讲述内核封装例程。

 

第11章:信号 

    信号用于进程间通信。    

    第一节信号的作用。对内核来说,使用信号有两个主要目的:让进程知道已经发生了一件特定的事件;强迫进程执行它自己代码中的信号处理程序。除了86平台中的31个信号外,Linux还另外定义了33个实时信号(32~64)。与信号有关的数据结构包括进程描述符中的某些字段、信号描述符以及信号处理程序描述符。

    第二节产生信号。当发送给进程一个信号时,这个信号可能来自内核,也可能来自另一个进程。specific_send_info()函数向指定进程发送信号,而group_send_sig_info()函数向整个线程组发送信号。

    第三节传递信号。do_signal()函数处理已经产生的信号。若某一个系统调用被信号打断,则要重新执行。

    第四节与信号处理相关的系统调用。kill()系统调用可以向普通进程或多线程应用发送信号;tkill()和tgkill()系统调用向线程组中的指定进程发送信号;sigaction()系统调用允许用户为信号指定一个操作;sigsuspend()系统调用把进程置为TASK_INTERRUPTIBLE状态。

 

第12章:虚拟文件系统

    虚拟文件系统所隐含的思想是把表示很多不同种类文件系统的共同信息放入内核;其中有一个字段或函数来支持Linux所支持的所有实际文件系统所提供的任何操作。对所调用的每个读、写或其他函数,内核都能把它们替换成支持本地Linux文件系统、NTFS文件系统,或者文件所在的任何其他文件系统的实际函数。

    第一节虚拟文件系统(VFS)的作用。VFS支持的文件系统可以划分为三种主要类型:磁盘文件系统,网络文件系统和特殊文件系统。Linux通过把各种不同的文件系统组织成一个通用的文件系统来达到支持它们的目的。通用文件模型包括以下几种对象类型:超级块对象、索引节点对象、文件对象、目录项对象。    

    第二节VFS的数据结构。本节讲解了上节提到的4类对象类型的字段数据结构以及它们的操作函数。然后介绍了为提高性能而设计的“目录项高速缓存”,以及处理与进程相关的文件的数据结构。    

    第四节文件系统处理。这节主要讲文件系统的安装和卸载。最重要的是mount()系统调用。该系统调用的服务例程是sys_mount(),它执行时调用do_mount()、do_kern_mount()函数。卸载文件系统要用到umount()系统调用,对应的服务例程是sys_umount()。    

    第五节路径名查找。通过路径名查找目标文件需要解析路径名,这同时,有很多因素需要考虑,例如目录的访问权、路径名可能跨越不同的文件系统、是否对应进程的命名空间等等。      

    第六节VFS系统调用的实现。对应的系统调用有很多,但本节只透过一个例子讲解了open()、read()、write()和close系统调用。    

    第七节文件加锁。用于文件加锁的锁有几种:劝告锁、强制加锁、租借锁。

 

抱歉!评论已关闭.