1. Linux系统编程的三大基石:系统调用、C语言库、C编译器
系统调用:内核向用户级程序提供服务的惟一接口。在i386中,用户级程序执行软件中断指令 INT n 以后切换至内核空间
用户程序经过寄存器告知内核执行系统调用的所需参数
2. API 和 ABI
API:application programming interface 定义源码级接口,必须确保源码级兼容
ABI:application binary interface 定义二进制接口,必须确保二进制兼容
ABI包括:调用约定、字节序、寄存器使用、系统调用、连接、二进制文件格式
调用约定:定义了 函数如何调用、参数如何传递、寄存器使用、调用者恢复返回值
ABI与机器体系结构密切相关,不一样体系结构的机器具备不一样的ABI
3. 文件
内核在并发文件访问上没有任何限制条件,多个进程能够对同一个文件同时进行读写操做
用户级程序必须相互协调以确保并发文件访问获得正确的同步
每一个文件在文件系统内都是经过惟一的inode编号来引用,
inode节点包含了文件绝大部分信息,对应于系统调用stat
经过inode编号来存取文件很是繁琐,所以 用户级程序都是经过文件名而不是文件的inode编号来访问
目录就是用来将人类可读的文件名映射为 文件系统内相应的inode编号,目录项(dentry)就是存储诸对映射的哈希表
目录仅仅包括文件名到inode编号的映射,内核使用这个映射来执行 finename-to-inode 决议
例如打开 /home/blackbeard/concorde.png
内核顺沿路径名的目录项(内核里称为 dentry) 来查找 下一个entry的inode
内核首先从 / 开始,获取 home 的inode,而后从home的目录项获取 blackbeard 的inode,最后从blackbeard的目录项获取concorde.png的inode,经过最后获得的inode打开文件
内核一般使用 dentry cache (目录项缓存) 来加速 目录决议
硬连接:
多个不一样的文件名映射到同一inode
硬连接容许咱们多个路径名指向同一数据,每一个inode记录一个指向它本身的连接数,只有当连接数减小至0时,才能从文件系统移除inode
硬连接不能跨文件系统,由于在inode自身的文件系统以外,inode编号是没有意义的。
符号连接:能够跨文件系统的连接
字符设备:相似字节队列,按照队列顺序依次读取字符,键盘就是字符设备
块设备:相似字节数组
命名管道:进程间通讯机制
套接字:提供不一样机器之间的进程间通讯
文件系统是组织文件和目录造成的合理的层次体系。文件系统能够独自地从全局命名空间中添加或移除,称为 挂载 和 卸载
4. 进程
进程是正在执行的目标代码。
进程开始于可执行目标代码,Linux最经常使用的格式为 ELF
ELF中最重要的是 文本段、数据段 和 bss段:
文本段包括 可执行代码和只读数据,好比 常量
数据段包括 初始化数据
bss段包括 未初始化的全局数据。
当bss段加载进内存时,内核会对该段映射 zero page(a page of all zero)
进程只能经过系统调用来请求和管理资源(包括计时器、信号、打开文件、网络链接、硬件、IPC机制)
进程是虚拟化抽象,Linux内核经过 抢占式多任务 和 虚拟内存 来提供 处理器虚拟化 和 内存虚拟化
从进程角度来看,进程独占cpu,每一个进程都有单一的线性地址空间
Linux中,进程遵循严格的层次体系,即 进程树
进程树的根节点是 init 进程,新进程经过fork建立, 若是父进程在子进程以前结束,那么内核将该子进程挂在 init 父进程之下
一个子进程终止时,并不当即从内核移除,而是等待其父进程经过wait查询其终止状态。
只有父进程wait以后,该进程才彻底消亡。
一个已经终止,可是仍未被父进程wait的进程称为 僵死进程
5. 用户权限
6. 信号
信号是一种异步通知机制
SIGKILL:always terminates the process
SIGSTOP:always stops the process