深入理解Linux内核-信号】的更多相关文章

前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linux系统编程为例并且会穿插一些深入理解Linux内核的内容来写. 1 入门与基本概念 本书的背景 Linux内核3.9,gcc编译器4.8,C库2.17 文件和文件系统 文件必须打开才能访问 同一个文件可以由多个进程或者同一个进程多次打开.系统会为每个打开的文件实例提供唯一描述符.进程可以共享文件描述…
深入理解Linux内核 读书笔记 一.概论 操作系统基本概念 多用户系统 允许多个用户登录系统,不同用户之间的有私有的空间 用户和组 每个用于属于一个组,组的权限和其他人的权限,和拥有者的权限不一样.对应的是Linux的文件权限系统 进程 和程序的区别.几个进程能并发执行同一个程序,一个进程能顺序执行几个程序 程序更像是代码片段,进程是执行代码的容器 linux是抢占式操作系统,也就是一个进程只能占用CPU一段时间.非抢占式系统中,进程如果不释放CPU,可以一直占用 内核体系结构 Linux是单…
转自:http://www.cnblogs.com/likeyiyy/p/3837272.html 我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0xC0000000:这是内核地址空间的地址转换关系. 这句话瞬间让我惊呆了,根据我的CPU的知识,开启分页之后,任何寻址都要经过mmu的转换,也就是一个二级查表的过程(386) 难道内核很特殊,当mmu看到某个逻辑地址是内核传来的之后,就不查表了,直接减去0xC0000000,然后就传递给内存控制器…
我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0xC0000000:这是内核地址空间的地址转换关系. 这句话瞬间让我惊呆了,根据我的CPU的知识,开启分页之后,任何寻址都要经过mmu的转换,也就是一个二级查表的过程(386) 难道内核很特殊,当mmu看到某个逻辑地址是内核传来的之后,就不查表了,直接减去0xC0000000,然后就传递给内存控制器了??? 我发现网上也有人和我问了同样的问题,看这个问题 这句话太让人费解了,让人费解到以至于要怀疑…
信号:1.最初被引入作为用户态进程间通信2.内核也使用信号通知进程系统所发生的事件3.信号很短,发送给进程的唯一信息通常是一个数.4.名称通常以SIG为前缀5.信号时可消费资源,每个信号只能被传递一次 使用信号的目标:1.让进程知道已经发送了一个特定的事件2.强迫进程执行它自己代码中的信号处理程序. 信号分两类:1.常规信号(regular signal):编码范围(0-31),同种类型的常规信号并不排队,一个常规信号被发送多次,只有其中一个被收到.2.实时信号(real-time signal…
Linux内核代码查看 http://androidxref.com/ 中断:被定义位一个事件,它能改变处理器执行指令的顺序.它对应硬件(CPU.其他硬件设备)电路产生的电信号. 同步中断:指令执行时CPU控制单元产生:称为同步,是因为只有在一条指令终止执行后CPU才回发出中断.也被称为异常 异步中断:其他硬件设备按照CPU时钟信号随机产生的.也被简称中断 中断的约束:1.中断必须尽快处理完成:中断一般被分两部分执行:关键而且紧急的部分,内核立即执行:其余部分内核稍后执行: 2.中断的处理必须能…
乍一看下边的Linux内核代码,貌似L3389有bug,于是我就绕有兴趣地阅读了一下local_irq_save/local_irq_restore的源代码. /* linux-4.14.12/mm/slab.c#3389 */ static __always_inline void * slab_alloc(struct kmem_cache *cachep, gfp_t flags, unsigned long caller) { unsigned long save_flags; void…
前言说明 本篇为网易云课堂Linux内核分析课程的第七周作业,本次作业我们将具体来分析exec*函数对应的系统调用处理过程,来分析Linux内核如何来执行一个可执行程序,由于有一个在网易云课堂共同学习的朋友,代码部分是我们二人共同完成代码分析注释. 关键词:exec, 系统调用,进程,elf,可执行程序 *运行环境:** Ubuntu 14.04 LTS x64 gcc 4.9.2 gdb 7.8 vim 7.4 with vundle 过程分析 分析说明 在进行详细的分析之前,首先我们来总结一…
Linux的内存管理,实际上是借助80x86的硬件分段和分页电路,将逻辑地址转化为物理地址的. 物理内存中,有一部分是一直(Permanently)映射给内核使用的,这部分主要用于保存内核的代码,以及内核中静态的数据结构体.之所以要一直将这些物理内存映射给内核,是因为这些内容(代码,静态数据结构)是在整个操作系统运行过程中都一直需要不断地引用的,如果是通过动态分配和翻译的方式来维护它们在物理内存中的位置的话,就会耗费太多的CPU时间. 这种方式可以理解为以空间换时间的策略. 物理内存中的其余部分…
3.1 概述 内存管理涵盖了许多领域: 内存中物理内存页的管理: 分配大块内存的伙伴系统: 分配小块内存的slab.slub.slob分配器: 分配非连续内存块的vmalloc机制: 进程的地址空间. Linux内核一般将虚拟地址空间划分为两部分:底部较大的部分用于用户进程,顶部则用于内核.虽然(在两个用户进程之间)上下文切换期间会改变下半部分,但是虚拟地址空间的内核部分中总是不变[这其实很好理解,内核是系统管理员,不能说因为每换一批游客,景区管理员都得跟着换一批?!].在IA-32系统上,虚拟…
1.用户和用户组 每个用户是一个或多个用户组的一名成员,组由唯一的用户组标识符(user group ID)标识.每个文件的相关权限也恰好与一个组相对应. root为超级用户, 2.模块 为了达到微内核理论上的很多优点而又不影响性能, Linux内核提供了模块(module).模块是一个目标文件,其代码可以在运行时链接到内核或从内核解除链接.这种目标代码通常由一~组函数组成,用来实现文件系统.驱动程序或其他内核上层功能.与微内核操作系统的外层不同,模块不是作为一个特殊的进程执行的.就向是一个静态…
linux内核用到了很多数据结构,这些数据结构都是为了提高某些方面的效率. 内核分配给进程的虚拟地址空间由以下内存区组成: 程序的可执行代码 程序的初始化数据 程序的未初始化数据 初始程序栈(即用户态栈) 所需共享库的可执行代码和数据 堆(由程序动态申请的内存) 内核和MMU(内存控制单元)协同定位虚拟地址空间在 内存中的实际物理位置 p89 进程描述符(process descriptor)task_struct类型结构,存在动态内存中,而不是在内核的内存区. 对每个进程来说,Linux都把两…
软中断.tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来.下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,只剩下了前三者.本文重点在于介绍这三者之间的关系.(函数细节将不会在本文中出现,可以参考文献,点这里) (1)上半部和下半部的区别上半部指的是中断处理程序,下半部则指的是一些虽然与中断有相关性但是可以延后执行的任务.举个例子:在网络传输中,网卡接收到数据包这个事件不一定需要马上…
页表:用于建立用户进程空间的虚拟地址空间和系统物理内存(内存.页帧)之间的关联. 向每个进程提供一致的虚拟地址空间. 将虚拟内存页映射到物理内存,因而支持共享内存的实现. 可以在不增加物理内存的情况下,将页换出到块设备来增加有效的可用内存空间. 内核内存管理总是假定使用四级页表. 3.3.1 数据结构 内核源代码假定void *和unsigned long long类型所需的比特位数相同,因此他们可以进行强制转换而不损失信息.即:假定sizeof(void *) == sizeof(unsign…
一段摘自<Linux设备驱动程序>的话: 每种外设都通过读写寄存器进行控制.大部分外设都有多个寄存器,不管是内存地址空间还是I/O地址空间,这些寄存器的访问地址都是连续的. 在硬件层,内存区域和I/O区域没有概念上的区别:它们都通过向地址总线和控制总线发送电平信号进行访问,在通过数据总线读写数据.一些CPU制造厂商在它们的芯片中使用单一的地址空间,而另一些则为外设保留了独立的地址空间,以便和内存区分开来.一些处理器(主要是X86家族的)还为I/O端口的读写提供了单独的线路,并且使用特殊的CPU…
第五章  定时测量 内核必须显式地与三种时钟打交道:实时时钟(Real Time Clock, RTC).时间标记计数器(Time Stamp Counter, TSC)及可编程间隔定时器( ProgrammableIntervalTimer,PIT).前两种硬件设备允许内核跟踪当前的时间;后一种设备由内核编程,以使它能以固定的.预先定义的频率发出中断.对于内核和用户程序使用的定时器来说,这样的周期性巾断是至关重要的. 实时时钟: 所有的PC都包含了一个叫实时时钟(RTC)的时钟.它是独立于CP…
第四章 中断和异常 中断通常被分为同步中断和异步中断,同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断异步中断是由其他硬件设备依照CPU时钟信号随机产生的.分别称为异常和中断,用中断信号指两者. 中断或异常处理执行的代码不是一个进程,而是内核控制路径,中断满足尽快处理完.允许中断嵌套.临界区禁止 Intel文挡把中断和异常分为以下几类:中断: 可屏蔽中断被送到微处理器的INTR引脚.通过清eflag寄存器的IF标志关闭中断.所有I/O…
第三章 进程 可以看到很多熟悉的结构体 进程状态: 可运行状态(TASK_ RUNNING) 进程要么在CPU上执行,要么准备执行. 可巾断的等待状态(TASK_ INTERRUPTIBLE) 进程被挂起(睡眠),直到一些条件变为真,这些条件包括:产生-个硬件巾断,释放进程正等待的系统资源,或传递一个信号,它们都能唤醒进程,即让进程的状态回到TASK RUNNING. 不可中断的等待状态(TASK_ _UNINTERRUPTIBLE) 与前一一个状态类似,但有一个例外,把信号传递到睡眼的进程不能…
进程间通信的基本机制:1.管道和FIFO(命名管道):最适合在进程之间实现生产者/消费者的交互.进程A向管道写入数据,进程B从管道读出数据.2.信号量:内核信号量的用户态版本.3.消息:允许进程在预定义的消息队列中读和写消息来交换消息(小块数据).Linux提供两种不同的消息版本:System V IPC:POSIX消息4.共享内存区:允许进程通过共享内存块来交换信息.在必须共享大量数据的应用中,这可能是最高效的进程间通信.5.套接字:允许不用计算机上的进程通过网络交换数据.同样可以用作相同主机…
1.进程的静态特性 进程:程序执行时的一个实例 进程描述符(task_struct): 进程的基本信息(thread_info).指向内存区描述符的指针(mm_struct).进程相关的tty(tty_struct).当前目录(fs_struct).指向 文件描述符的指针(files_struct).所接收的信号(signal_struct) 进程状态:1.可运行状态(TASK_RUNNING):正在运行或者准备执行 2.可中断的等待状态(TASK_INTERRUPTIBLE):进程挂起,产生硬…
1.中断的作用:中断信号提供了一种方式,使处理器转而去运行正常控制流之外的代码.当一个中断信号到达时,CPU必须停止它当前所做的事,并切换到一个新的活动.为了做到这一点,就要在内核态堆栈保存程序计数器的当前值(即eip和cs寄存器的内容),并把与中断类型相关的一个地址放进程序计数器. 2.异常又分为三种类型: (1).故障(Fault):保存在eip中的值是引起故障的指令地址,因此,当异常处理程序终止时,会重新执行该指令.(例如,缺页异常处理程序). (2).陷阱(Trap):保存在eip中的值…
进程描述符task_struct task_struct { //进程基本信息 pid 进程id号 tgid 线程组id号,与线程组领头线程pid号相同   getpid()返回该值 tasks init_struct链接所有task_struct结构 run_list; //当前进程所处的运行链表 array 指向与进程相关的prio_array_t结构 real_parent当前进程的父进程,没有的话将会变成进程1(init)的描述符 parent 被执行跟踪时的跟踪父进程(ptrace)…
进程的七种状态 在内核源码的 include/linux/sched.h文件中: task_struct的status可表示 #define TASK_RUNNING 0 #define TASK_INTERRUPTIBLE 1 #define TASK_UNINTERRUPTIBLE 2 #define TASK_STOPPED 4 #define TASK_TRACED 8 task_struct和exit_status均可标识 #define EXIT_ZOMBIE 16 #define…
三种不同的内存地址 逻辑地址(logical address)包含在linux实际指令中的地址,即分段式地址,是对应的硬件平台段式管理转换前地址由16位的段选择符(segment selector)和32位的偏移量组成. 线性地址(linear address)(虚拟地址(virtual address))是一个32位无符号整数,可以表示4G的地址,值范围从0x00000000-0xffffffff.线性地址则对应了硬件页式内存的转换前地址. 物理地址(physical address)用32位…
第二章 :内存寻址 略.基本同计算机组成原理中的讲述 内核代码和数据结构会存储在一个保留的页框中. 常规Linux安装在RAM物理地址0x00100000开始的地方.因为:页框0是由BIOS使用,存放加电自测期间检查到的硬件配置:0x000a0000-0x000fffff的范围被留在BIOS程序使用,(并映射到ISA显示卡上的存储器).给BIOS或硬件设备保留的第一个物理地址对应的线性地址保存在i386_endbase中(0x0009f000) 关于进程的页表: 从0x00000000到PAGE…
Linux 系统在为用户态进程和内核分配动态内存的时候,所作的检查是马马虎虎的对内核使用的许多磁盘高速缓存和内存高速缓存大小也同样不作限制. 页框回收算法(PFRA):1.在所有内存使用完之前,就必须执行页框回收算法2.选择目标页,它获取页框,并且使之空闲3.候选回收页:任何属于磁盘和内存高速缓存的页,以及属于进程用户态地址空间的页4.首先释放‘无害’页:先释放没有被任何进程使用的磁盘与内存高速缓存中的页5.将用户态进程的所有页定为可回收页.6.同时取消引用一个共享页框的所有页表项的映射,就可以…
扇区: 1.硬盘控制器将磁盘看成一大组扇区2.扇区就是一组相邻字节3.扇区按照惯例大小设置位512字节4.存放在块设备中的数据是通过它们在磁盘上的位置来标识,即首个扇区的下标和扇区的数目.5.扇区是硬件设备传送数据到基本单位. 块:1.块是VFS和文件系统传送数据到基本单位.它对应磁盘上一个或者多个相邻扇区.2.内核访问一个文件内容时,它先从磁盘上读文件的磁盘索引节点所在的块3.Linux中,块必须是2的幂,且不能超过一个页框(一般4kB),还必须是扇区大小的整数倍.4.对块设备文件的读写操作时…
系统总线:1.链接CPU.RAM.I/O设备之间的数据流动.例如:PCI.ISA.EISA.MCA.SCSI.USB2.任何I\O设备有且仅能链接一条总线. I\O端口:1.每个连接到I\O总线上的设备都有自己的I\O地址集,通常称为I\O端口.2.一共提供了65536个8位的端口3.可以讲2个8位的看作一个16位的(必须从偶数开始),2个16位的看作一个32位的端口(必须从4倍数开始)4.对端口对读写命令 in.ins.out.outs5.为了提高性能提供控制寄存器.状态寄存器.输入寄存器.输…
Linux 成功的关键之一是它具有和其他操作系统和谐共存的能力 5个标准文件类型:1.普通文件2.目录文件3.符号链接文件4.设备文件5.管道文件 虚拟文件系统(Virtual FileSystem):内核软件层,用来处理与Unix标准文件系统相关的所有系统调用.健壮性表现在能为各种文件系统提供一个通用的接口. VFS支持的文件系统可以分为三种主要类型:1.磁盘文件系统: a.Linux使用的Ext2.Ext3,以及Reiser文件系统(ReiserFS): b.Unix家族的文件系统,如sys…
内核如果给自己分配动态内存 动态内存:RAM的某些部分被永久打分配给内核,用来存放内核代码以及静态内核数据结构:剩余的部分被称为动态内存 连续物理内存区管理: 页框管理:1.页大小的选择,通常情况下主存和磁盘之间传输小数据块更高效,所以Linux选择4kb点页框2.页描述符:page结构,32字节:存放在mem_map数组中:占整个RAM的大概1%空间,即每页框(4kB)一个描述符(32B),1/128.3.非一致内存访问(NUMA):CPU对不同内存单元的访问时间不相同:因为CPU和内存的相对…