一.Linux内核中的一些基本概念 内核空间:内核可独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限.这种系统态和被保护起来的内存空间,称为内核空间. 进程上下文:当应用程序执行一条系统调用,通过系统调用运行在内核空间,而内核被称为运行在进程上下文中. 当你开发内核代码时,有一个重要的论坛是linux kernel mailing list(常缩写为lkml),你可以在http://vger.kernel.org上订阅邮件. 二.内核的一些常用的准备和操作 2.…
在使用共享内存的应用程序中,程序员必须特别留意保护共享资源,防止共享资源并发访问. 一.临界区和竞争条件 1.1 临界区和竞争条件 所谓临界区就是访问和操作共享数据代码段.多个执行线程并发访问同一个资源通常是不安全的,为了避免在临界区中并发访问,编程者必须保证这些代码原子地执行. 如果两个执行线程有可能处于同一个临界区中同时执行,如果这种情况确实发生了,我们就称它是竞争条件.因为竞争引起的错误非常不易重现,所以调试这种错误才会非常困难. 避免并发和防止竞争条件称为同步. 为什么要保护? 有些事务…
<Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵塞或者睡眠状态,实际不被投入执行,这些任务尽管位于内存,但是并不处于可运行状态. 多任务系统分为两种: 抢占式多任务:Linux提供了抢占式的多任务模式,由调度程序来决定什么时候停止一个进程的运行. 现代操作系统提供:动态时间片计算的方式:可配置的计算策略 非抢占式多任务:除非进程自己主动停止运行,否则会一直…
<Linux内核设计与实现>课本第三章自学笔记 进程管理 By20135203齐岳 进程 进程:处于执行期的程序.包括代码段和打开的文件.挂起的信号.内核内部数据.处理器状态一个或多个具有内存映射的内存地址空间或执行线程等其他资源. 线程:是在进程中活动的对象.每个线程都有一个独立的程序计数器.进程栈和一组进程寄存器.内核调度的对象是线程而非进程.操作系统中进程提供两种虚拟机制:虚拟存储器和虚拟内存. 程序:本身并不是进程,进程是处于执行期的程序以及相关的资源的总称.不同的进程可以执行同一个程…
<Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保证了系统的稳定和安全. 实现多任务和虚拟内存.保证良好的稳定性和安全性. 系统调用是用户空间访问内核的唯一手段:除异常和陷入外,是内核唯一合法的入口. API.POSIX和C库 应用程序通过在用户空间实现的应用编程接口(API)而非直接通过系统调用来编程. POSIX是应用编程接口的一个国际标准,C库提供了P…
Linux内核设计与实现  读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://blog.csdn.net/yrj/article/category/718110 Linux内存管理和性能学习笔记(一) :内存测量与堆内存  第一篇 内存的测量 2.1. 系统当前可用内存 # cat /proc/meminfoMemTotal:        8063544 kBMemFree:      …
<Linux内核设计与实现>第一.二章学习笔记 姓名:王玮怡  学号:20135116 第一章 Linux内核简介 一.关于Unix ——一个支持抢占式多任务.多线程.虚拟内存.换页.动态链接和TCP/IP网络的现代化操作系统 1.主要发展过程   1969年,贝尔实验室的程序员们设计了一个文件系统原型,最终发展演化成了Unix 1971年,Unix被移植到PDP-11型机中 1973年,整个Unix系统使用C语言进行重写,为后来Unix系统的广泛移植铺平了道路 Unix第六版(V6)被贝尔实…
第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的task_struct连在一起组成了一个双向链表 3. 2.6内核的内核栈底放的是thread_info结构,其中有指向task_struct的指针: 4. current宏可以找到当前进程的task_struct:X86是通过先找到thread_info结构,而PPC是有专门的寄存器存当前task_s…
内核简介  本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核   原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单.2. 高效:所有内核都在一个大的地址空间上,所以内核各个功能之间的调用和调用函数类似,几乎没有性能开销. 一个功能的崩溃会导致整个内核无法使用. 微内核 内核按功能被划分成各个独立的过程.每个过程独立的运行在自己的地址空间上. 1. 安全:内核的各种服务独立运行,一种服务挂了不会影响其他服务. 内核各个服务之…
第一章 Linux内核简介 (一)Unix是一个强大.健壮和稳定的操作系统,特点是: Unix很简洁,仅仅提供几个几百个系统调用并且有一个非常明确的设计目的 在Unix中,所有的东西都被当作文件对待,通过一套相同的系统调用接口来进行:open(),read(),write(),lseek(),close() Unix的内核和相关的系统工具软件是用C语言编写而成 Unix的进程创建非常迅速 Unix系统具备清晰的层次化结构 (二)操作系统和内核简介:操作系统是指在整个系统中负责完成最基本功能和系统…
第一章 Linux内核简介 一.Unix 1.Unix的特点 简洁 绝大部分东西都被当做文件对待.这种抽象使对数据和对设备的操作都是通过一套相同的系统调用借口来进行的:open(),read(),write(),lseek()和close() 出色的平台可移植性——内核和相关的系统工具软件用C语言编写而成 进程创建迅速 进程间通信原语简单稳定 2.Unix的现状 发展成为支持抢占式多任务.多线程.虚拟内存.换页.动态链接和TCP/IP网络的现代化操作系统. 3.linux简介 被广泛移植到Alp…
一.Linux内核相对于传统的UNIX内核的比較: (1):Linux支持动态内核模块. 虽然Linux内核也是总体式结构,但是同意在须要的时候动态哦卸除(rmmod xxx)和载入内核模块(insmod  xxx.ko). (2):Linux支持对称多处理(SMP)机制,虽然很多UNIX的变体也支持SMP.可是传统的UNIX并不支持这样的机制. (3):Linux内核能够抢占(preemptive).在Linux 2.4以及曾经的版本号都是不支持内核抢占的.在Linux 2.6以及以后就支持了…
页高速缓存是Linux内核实现磁盘缓存.磁盘告诉缓存重要源自:第一,访问磁盘的速度要远远低于访问内存. 第二,数据一旦被访问,就很有可能在短期内再次被访问到.这种短时期内集中访问同一片数据的原理称作临时局部原理. 一.缓存手段 1.1 写缓存 通常来讲缓存一般实现成三种策略: ①不缓存 ②写操作将自动更新内存缓存 ③Linux采用的回写.程序写进缓存 1.2 缓存回收 1.最近少用原则:简称LRU,LRU回收需要跟踪每个页面的访问踪迹,以便能回收最老时间戳的页面. 2.双链策略:Linux实现的…
一.原子操作 原子操作可以保证指令以原子的方式执行----执行过程不被打断. 1.1 原子整数操作 针对整数的原子操作只能对atomic_t类型的数据进行处理. 首先,让原子函数只接收atomic_t类型的操作数,可以确保原子操作只与这种特殊类型数据一起使用,并且不会被其他人使用. 使用atomic_t类型确保编译器不对,相应的值进行访问优化. 在不同体系结构上实现原子操作的时候,使用atomic_t可以屏蔽其间的差异 atomic_t类型定义在文件<linux/types.h> 中 type…
中断和中断处理 处理器的速度跟外围硬件设备的速度往往不再一个数量级上,因此,如果内核采取让处理器向硬件发出一个请求. 然后专门等待回应的办法,如果专门等待回应,明显太慢.所以等待期间可以处理其他事务,等待完成了请求操作后,再回来进行处理. 所以内核提供了一种机制,让内核在需要的时候再向内核发出信号.这就是中断机制. 一.中断 硬件中断可以随时产生,因此,内核随时可能因为新到来的中断而被打断. 不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标志. 这些中断值通常被称为中断请求(IRQ)线…
内核数据结构 Linux内核实现了这些通用数据结构,而且提倡大家在开发时重用. 内核开发者应该尽可能地使用这些数据结构,而不要自作主张的山寨方法. 通用的数据结构有以下几种:链表.队列.映射和二叉树 一.链表 1.1 单向链表和双向链表 链表是Linux中最简单.最普通的数据结构. 最简单的数据结构表示一个链表: /* 一个链表中的一个元素 */ struct list_element { void *data; /* 有效数据 */ struct list_element *next; /*…
模块 1.概念:  如果让LINUX Kernel单独运行在一个保护区域,那么LINUX Kernel就成为了“单内核”.    LINUX Kernel是组件模式的,所谓组件模式是指:LINUX Kernel在运行时,允许“代码”动态的插入或者移出Kernel.    所谓模块是指:相关的一些子程序,数据.入口点和出口点共同组合成的一个单一的二进制映像,也就是一个可装载的Kernel目标文件.    模块的支持,使得系统可以拥有一个最小的内核映像,并且通过模块的方式支持一些可选的特征和驱动程序…
内核里的内存分配不像其他地方分配内存那么容易,内核的内存分配不能简单便捷的使用,分配机制也不能太复杂. 一.页 内核把页作为内存管理的基本单位,尽管处理器最小寻址坑是是字或者字节.但是内存管理单元MMU通常以页为单位进行处理. 从虚拟内存的角度来看,页就是最小单位.大多数32位系统支持4KB的页,而64位系统结构一般会支持8KB的页. 内核用struct page结构表示系统中每个物理页,在<linux/mm_types.h>中 struct page { unsigned long flag…
时间管理在内核中占用非常重要的地位,内核中有大量的函数都需要基于时间驱动的,内核对相对时间和绝对时间都非常需要. 一.内核中的时间概念 内核必须在硬件的帮助下才能计算和管理时间,系统定时器以某种频率自行触发(击中hitting或者射中popping)时钟中断,该频率可以通过编程预定,称作节拍率. 因为预编的节拍率对内核来说是可知的,所以内核知道连续两次时钟中断的间隔时间,这个间隔时间称为节拍(tick),它等于节拍率分之一. 下面是利用时间中断周期执行的工作: 更新系统运行时间 更新实际时间 在…
系统调用 内核提供了用户进程和内核交互的接口,使得应用程序可以受限制的访问硬件设备. 提供这些接口主要是为了保证系统稳定可靠,避免应用程序恣意妄行. 一.内核通信 系统调用在用户空间进程和硬件设备之间添加中间才能.作用有三: 为用户空间提供一种硬件的抽象接口.无需理会物理结构是怎么样的. 系统调用保证了系统的稳定和安全.内核可以有选择的对其访问进行控制. 每个进程都运行在虚拟系统中,用户空间和系统的其余部分提供这样一层公共接口. 二.API.POSIX和C库 API:应用程序不需要访问内核,编程…
转自:http://blog.chinaunix.net/uid-10469829-id-2953001.html 1.原子操作可以保证指令以原子的方式执行——执行过程不被打断.内核提供了两组原子操作接口,一组针对整数进行操作,一组针对单独的位进行操作.       2.针对整数的原子操作只能对atomic_t类型的数据进行处理.引入这个特殊数据类型主要是出于三个原因:首先,让原子函数只接受atomic_t类型的操作数可以确保原子操作只与这种特殊类型的数据一起使用.同时这也保证了该类型的数据不会…
1.进程: (1)处于执行期的程序,但不止是代码,还包括各种程序运行时所需的资源,实际上进程是正在执行的 程序的实时结果. (2)程序的本身并不是进程,进程是处于执行期的程序及其相关资源的总称. (3)两个或两个以上并存的进程可以共享诸如打开的文件,地址空间等共享资源. (4)在Linux中通常是调用fork()系统函数的结果,通过复制一个现有的进程来创建一个新的子进程. fork()系统函数 (5)fork在这个系统调用结束时,在同一位置上返回两次(从内核返回两次),父进程恢复运行,子进程开始…
一.地址空间 进程地址空间由进程可寻址的虚拟内存组成,内核允许进程使用这种虚拟内存中的地址. 每个进程都有一个32位或64位的平坦地址空间,空间的具体大小取决于体系结构.“平坦”指的是地址空间范围是一个独立的连续区间. 现代采用虚拟内存的操作系统通常都使用平坦地址空间而不是分段式的内存模式. 一个进程的地址空间与另一个进程的地址空间即使有相同的内存地址,实际上也彼此互不相干.这样的进程为线程. 一个进程可以寻址4GB虚拟内存(32位地址空间中),但这不代表能访问所有虚拟地址.可以被合法访问的地址…
一.剖析一个块设备 块设备最小的可寻址单元是扇区. 扇区大小一般是2的整数倍,最常见的是512字节. 因为各种软件的用途不同,所以他们都会用到自己的最小逻辑可寻址单元----块.块只能基于文件系统,是一种抽象. 而扇区是设备的最小可寻址单元,所以块不能比扇区还小,只能数倍于扇区大小.此外内核要求块是2的整数倍. 至此,块最终要求是:必须是扇区大小的2的整数倍,并且要小于页面大小.所以通常块是512字节.1KB或4KB. 扇区:设备最小寻址单元.别名:硬扇区.设备块 块:文件系统的最小寻址单元.别…
一.通用文件系统接口 Linux通过虚拟文件系统,使得用户可以直接使用open().read().write()访问文件系统,这种协作性和泛型存取成为可能. 不管文件系统是什么,也不管文件系统位于何种介质,采用策略是统一的. 二.文件系统抽象层 为了支持多文件系统,VFS提供了一个通用文件系统模型, 囊括了任何文件系统的常用功能集和行为. 用户空间的write()将调用VFS的sys_write(),然后调用文件系统中文件系统的写方法,最后写进物理介质中去. 三.Unix文件系统 Unix使用了…
上半部分的中断处理有一些局限,包括: 中断处理程序以异步方式执行,并且它有可能打断其他重要代码的执行. 中断会屏蔽其他程序,所以中断处理程序执行的越快越好. 由于中断处理程序往往需要对硬件进行操作,所以它们通常又很高的时限要求. 中断处理程序不在进程上下文中运行,所以它们不能阻塞.这限制它们所做的事情. 一.下半部 下半部的任务就是执行与中断处理密切相关但中断处理程序本身不执行的工作. 中断处理程序会异步执行并且在最好的情况下也会锁定当前的中断线. 如果一个任务对时间非常敏感,将其放在中断处理程…
进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间. 调度程序没有太复杂的原理,最大限度地利用处理器时间的原则是,只要有可以执行的进程,那么就总会有进程正在执行. 一.多任务 多任务系统可以划分为两类:非抢占式多任务和抢占式多任务. Linux提供了抢占式的多任务模式,在此模式下,有调度程序来决定什么时候停止一个进程的运行,以便其他进程能够得到执行机会. 这个强制挂起的动作就叫抢占.进程在被抢占之前,能够运行的时间是预先设置好的,叫进程的时间片. 二.Linux 的进程调度…
进程管理 进程:处于执行期的程序. 线程:在进程中活动的对象 虚拟机制 虚拟处理器:多个进程分享一个处理器 虚拟内存:多个线程共享虚拟内存 一.进程描述符和任务结构 进程存放在双向循环链表中(队列),链表中的项为task_struct,称为进程描述符.在头文件<linux/sched.h>中. struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack;…
内核:有的时候被称管理者或者操作系统核心,通常内核负责响应中断的中断服务程序, 负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间德内存管理程序 和网络,进程间通信等系统服务程序共同组成.…
进程调度 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统. 多任务系统分为两种: 抢占式多任务:Linux提供了抢占式的多任务模式,由调度程序来决定什么时候停止一个进程的运行. 现代操作系统提供:动态时间片计算的方式:可配置的计算策略 非抢占式多任务:除非进程自己主动停止运行,否则会一直执行. 调度程序无法躲每个进程该执行多长时间作出统一规定,所以进程独占的处理器时间可能会超过用户的预料 4.2 Linux的进程调度 O(1)调度器:对大服务器的工作负载很理想:但是缺少…