最近开始看ULK(深入理解Linux内核, Understanding the Linux Kernel, 3rd), 以条目式(entry)的方式记下相关内容以备忘:
1. 在arch和include目录下各有23个和硬件对应的文件夹
2. UNIX是以文件系统为中心进行设计的。
3. UNIX文件的类型不:常规文件,目录,符号链接,块设备文件,字符设备文件,管道和命名管道,套接字。
4. UNIX严格区分文件的内容和文件的控制信息。一般地,控制信息存储在inode结点里面,一个文件对应一个inode结点。
5. 根据POSIX标准, inode结点至少要提供以下信息:文件类型,文件关联的硬链接的数量,以字节为单位的文件的长度,设备标志符, inode在当前文件系统中的编号,文件所有者的UID, 文件所有者的组ID,标明inode修改、文件最后一次访问和最后一次修改的时间戳,访问权限,文件模式。
6. 文件模式(File Mode)包括suid, sgid和sticky(废弃)。若设置了suid, 则进程执行该文件时的UID为文件所有者的UID,反之则为进程所有者的UID;若设置了sgid, 则进程执行该文件时的group ID为文件的group ID,反之则为进程组的group ID。
7. 一些CPU提供多种执行状态, UNIX内核只使用了其中的两种:内核模式(Kernel Mode)和用户模式(User Mode)。
8. 内核线程的特性:a. 运行在内核地址空间和内核模式中。 b.不跟用户进行交互,不需要终端。 c.通常在系统启动时创建,在系统关闭时销毁。
9. 内核例程(Kernel routine)可以被以下几种方式激活: a.系统调用。b. 执行异常,非法指令。 c. 外围设备的抛出的中断。d. 内核线程。
10. 暂停进程执行时,内核会存储相关的进程寄存器的信息到进程描述符中(process descriptor),包括: a. 程序计数器(PC)和堆栈指针寄存器(SP);b. 通用寄存器; c. 浮点寄存器;d. 处理器状态字(Processor Status World);e. 内存管理寄存器。
11. 内核控制路径(kernel control path)指的是内核处理系统调用、异常或者中断时执行的一系列的指令。
12. 在以下情况, CPU会交错内核控制路径:a. 在用户态运行的进程调用了一个无法立即满足的系统调用;b. CPU检测到异常发生,如缺页。 c. 开启中断使能情况下,发生硬件中断。 d. 开启抢占模式下,调试更高优先级的进程。
13. Linux提供了mmap()系统调用,用来将文件的一部分或者块设备上存储的信息映射到进程地址空间(process address space),这提供了读写数据的另一种方式。
14. 可重入(reentrant)内核的实现需要使用同步(synchronization)。
15. 关键区域(critical region)指的是只允许一个进程进入的代码片段(code section)。
16. 信号量(semaphores)包括以下元素:a. 整型变量;b. 等待的进程列表;c. 两个原子操作down()和up()。其中,当整型变量小于0时,想要访问该semaphores保护的数据结构的进程会被添加到信号量的进程等待队列中,当整型变量大于等于0时,激活进程等待队列中的一个或者多个进程。 down()用于原子地递减整型变量, up()用于原子地递增整型变量。
17. 自旋锁(spin locks)类似于信号量,但它没有进程等待队列,它采用的是让暂时不能获得资源的里程执行一段空循环直到占用该资源的进程释放锁。它只适应用于多处理器结构,单处理器结构不能使用自旋锁,因为单处理器不能同时让其中占用资源的进程执行,又让另一个等待资源的进程执行循环。
18. 按照顺序加锁,可以避免死锁(deadlocks), Linux和许多操作系统都是这样做的。
19. 系统事件(system events)包括两类异步通知,如发送一个SIGINT信号给前台进程;同步通知,如非法地址访问时的段错误(SIGSEGV)。
20. 对于一个信号,内核可能的缺省操作包括:a. 终止进程;b. 保存进程上下文和进程地址空间信息到一个文件(如coredump),并终止进程;c. 忽略信号;d. 挂起进程;e. 唤醒停止执行的进程。
21. System v IPC包括信号量、消息队列(message queues)、共享内存。
22. 现代的操作系统实现fork()时采用带复制写(copy-on-write)策略。即一开始不复制父进程的信息,只赋予子进程读权限,只在必要时刻复父进程的信息给子进程,如子进程要修改某些信息时,则从父进程中复制该信息到子进程并进行修改。
23. init进程用来回收父进程已经死亡的子进程的信息。
24. 进程组(或叫作业),如在shell里执行ls | sort | more。进程组有相应的组ID,并且有一个group leader。
25. 登录会话(login session)包括在某个终端上开始第一个工作会话的进程的所有子孙进程。