1. Linux系统编程的三大基石:系统调用、C语言库、C编译器

系统调用:内核向用户级程序提供服务的唯一接口。在i386中,用户级程序执行软件中断指令 INT n 之后切换至内核空间
用户程序通过寄存器告知内核执行系统调用的所需参数
 

2. API 和 ABI

API:application programming interface 定义源码级接口,必须确保源码级兼容
ABI:application binary interface 定义二进制接口,必须确保二进制兼容
ABI包括:调用约定、字节序、寄存器使用、系统调用、链接、二进制文件格式
调用约定:定义了 函数如何调用、参数如何传递、寄存器使用、调用者恢复返回值
ABI与机器体系结构密切相关,不同体系结构的机器具有不同的ABI
 

3. 文件

文件是在linux中最基本和最基本的抽象。
内核在并发文件访问上没有任何限制条件,多个进程可以对同一个文件同时进行读写操作
用户级程序必须相互协调以确保并发文件访问得到正确的同步
 
每个文件在文件系统内都是通过唯一的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

Linux System Programming 学习笔记(一) 介绍的更多相关文章

  1. Linux System Programming 学习笔记(十一) 时间

    1. 内核提供三种不同的方式来记录时间 Wall time (or real time):actual time and date in the real world Process time:the ...

  2. Linux System Programming 学习笔记(七) 线程

    1. Threading is the creation and management of multiple units of execution within a single process 二 ...

  3. Linux System Programming 学习笔记(六) 进程调度

    1. 进程调度 the process scheduler is the component of a kernel that selects which process to run next. 进 ...

  4. Linux System Programming 学习笔记(四) 高级I/O

    1. Scatter/Gather I/O a single system call  to  read or write data between single data stream and mu ...

  5. Linux System Programming 学习笔记(二) 文件I/O

    1.每个Linux进程都有一个最大打开文件数,默认情况下,最大值是1024 文件描述符不仅可以引用普通文件,也可以引用套接字socket,目录,管道(everything is a file) 默认情 ...

  6. Linux System Programming 学习笔记(十) 信号

    1. 信号是软中断,提供处理异步事件的机制 异步事件可以是来源于系统外部(例如用户输入Ctrl-C)也可以来源于系统内(例如除0)   内核使用以下三种方法之一来处理信号: (1) 忽略该信号.SIG ...

  7. Linux System Programming 学习笔记(九) 内存管理

    1. 进程地址空间 Linux中,进程并不是直接操作物理内存地址,而是每个进程关联一个虚拟地址空间 内存页是memory management unit (MMU) 可以管理的最小地址单元 机器的体系 ...

  8. Linux System Programming 学习笔记(八) 文件和目录管理

    1. 文件和元数据 每个文件都是通过inode引用,每个inode索引节点都具有文件系统中唯一的inode number 一个inode索引节点是存储在Linux文件系统的磁盘介质上的物理对象,也是L ...

  9. Linux System Programming 学习笔记(五) 进程管理

    1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity in ...

随机推荐

  1. HTML5 跨文档消息传输

    对窗口对象的message事件进行监听 window.addEventListener("message", function(event) { // 处理程序代码 }, fals ...

  2. C++ 学习笔记(四)类的内存分配及this指针

    类,是使用C++的最主要的内容.如果将c++与C语言做比较,我感觉类更像是结构体的加强进化版.在刚接触C++不久的时候总是让类,对象,this指针弄得一脸懵逼,我对类有比较清楚的认识是从理解类在内存中 ...

  3. 【动态规划】bzoj1939: [Croatian2010] Zuma

    隐约记得类似的一道JSOI祖玛……然后好像这题不能够把珠子合并成一段?或许是因为这里珠子碰在一起之后可以不消除? Description 有一行 N 个弹子,每一个都有一个颜色.每次可以让超过 K 个 ...

  4. ubuntu14.04搭建LAMP环境(nginx,php,mysql,linux)详解

    最近更换开发环境至ubuntu,整理开发环境和常用软件的安装配置(更新排版) 以下安装过程经过多次操作得出,参照步骤进行操作即可 一.LAMP基本环境搭建 1 切换root账号 sudo su 2,安 ...

  5. DNS预解析 dns-prefetch

    1.DNS 是什么? Domain Name System,域名系统,作为域名和IP地址相互映射的一个分布式数据库. DNS大家都懂,那么浏览器访问域名的时候,是需要去解析一次DNS,也就是把域名 g ...

  6. 基于IAR6或者IAR7建立STM32开发工程(通过实际测试,使用IAR6.30.4)

    IAR和keil两个开发平台都是arm开发当中比较流行的平台,keil4的版本之间,可以兼容,但是版本4和版本5还是不兼容的,但是IAR的兼容性更加差,好像6.30.x之间是能够兼容的吧,没有实测过, ...

  7. stm32L0系列学习(二)HAL-LL库等比较

  8. 常见的Linux目录及其含义

    /                                   系统根目录,通常不会在这里存放文件 . /bin                              二进制目录,存放许多 ...

  9. react技术栈实践(1)

    本文来自网易云社区 作者:汪洋 背景 最近开发一个全新AB测试平台,思考了下正好可以使用react技术开发. 实践前技术准备 首先遇到一个概念,redux.这货还真不好理解,大体的理解:Store包含 ...

  10. ogre3D学习基础10 -- 键盘控制与鼠标控制(缓冲控制)

    带缓冲的鼠标.键盘操作,这里的鼠标.按键事件会被各自的监听器捕获.其中OIS中定义的两个类MouseListener,KeyListener负责对事件的处理.我们需要使用这两个类的接口. 当一个键被按 ...