2018年2月13日

中断唤醒系统流程

摘要: 1. 前言 曾几何时,不知道你是否想过外部中断是如何产生的呢?又是如何唤醒系统的呢?在项目中,一般具有中断唤醒的设备会有一个interrupt pin硬件连接到SoC的gpio pin。一般来说,当设备需要唤醒系统的时候,会通过改变interrupt pin电平状态,而SoC会检测到这个变化,将So 阅读全文

posted @ 2018-02-13 22:51 AlanTu 阅读(5146) 评论(0) 推荐(0)

逆向映射的演进

摘要: 一、前言 数学大师陈省身有一句话是这样说的:了解历史的变化是了解这门学科的一个步骤。今天,我把这句话应用到一个具体的Linux模块:了解逆向映射的最好的方法是了解它的历史。本文介绍了Linux内核中的逆向映射机制如何从无到有,如何从笨重到轻盈的历史过程,通过这些历史的演进过程,希望能对逆向映射有更加 阅读全文

posted @ 2018-02-13 22:50 AlanTu 阅读(1084) 评论(0) 推荐(0)

Linux内存管理基本概念

摘要: 1. 前言 内存(memory)在Linux系统中是一种牵涉面极广的资源,上至应用程序、下至kernel和driver,无不为之魂牵梦绕。加上它天然的稀缺性,导致内存管理(Memory Management,简称MM)是linux kernel中非常重要又非常复杂的一个子系统。 重要性就不多说了,K 阅读全文

posted @ 2018-02-13 22:49 AlanTu 阅读(1070) 评论(0) 推荐(1)

/proc/meminfo分析(一)

摘要: 本文主要分析/proc/meminfo文件的各种输出信息的具体含义。 一、MemTotal MemTotal对应当前系统中可以使用的物理内存。 这个域实际是对应内核中的totalram_pages这个全局变量的,定义如下: unsigned long totalram_pages __read_mo 阅读全文

posted @ 2018-02-13 22:45 AlanTu 阅读(4868) 评论(0) 推荐(1)

Linux页面回收概述

摘要: 本文主要介绍了一些page reclaim机制中的基本概念。这份文档其实也可以看成阅读ULK第17章第一小节的一个读书笔记。虽然ULK已经读了很多遍,不过每一遍还是觉得有收获。Linux内核虽然不断在演进,但是页面回收的基本概念是不变的,所以ULK仍然值得内核发烧友仔细品味。 一、什么是page f 阅读全文

posted @ 2018-02-13 22:45 AlanTu 阅读(1244) 评论(0) 推荐(0)

Dynamic DMA mapping Guide

摘要: 一、前言 这是一篇指导驱动工程师如何使用DMA API的文档,为了方便理解,文档中给出了伪代码的例程。另外一篇文档dma-api.txt给出了相关API的简明描述,有兴趣也可以看看那一篇,这两份文档在DMA API的描述方面是一致的。 二、从CPU角度看到的地址和从DMA控制器看到的地址有什么不同? 阅读全文

posted @ 2018-02-13 22:44 AlanTu 阅读(4939) 评论(0) 推荐(0)

Linux时钟

摘要: 一、前言 时钟或者钟表(clock)是一种计时工具,每个人都至少有一块,可能在你的手机里,也可能佩戴在你的手腕上。如果Linux也是一个普通人的话,那么她的手腕上应该有十几块手表,包括:CLOCK_REALTIME、CLOCK_MONOTONIC、CLOCK_PROCESS_CPUTIME_ID、C 阅读全文

posted @ 2018-02-13 22:43 AlanTu 阅读(2830) 评论(0) 推荐(0)

Linux系统休眠和设备中断处理

摘要: 一、设备IRQ的suspend和resume 本小节主要解决这样一个问题:在系统休眠过程中,如何suspend设备中断(IRQ)?在从休眠中唤醒的过程中,如何resume设备IRQ? 一般而言,在系统suspend过程的后期,各个设备的IRQ (interrupt request line)会被di 阅读全文

posted @ 2018-02-13 22:42 AlanTu 阅读(2090) 评论(0) 推荐(0)

Linux调度器 - 进程优先级

摘要: 一、前言 本文主要描述的是进程优先级这个概念。从用户空间来看,进程优先级就是nice value和scheduling priority,对应到内核,有静态优先级、realtime优先级、归一化优先级和动态优先级等概念,我们希望能在第二章将这些相关的概念描述清楚。为了加深理解,在第三章我们给出了几个 阅读全文

posted @ 2018-02-13 22:40 AlanTu 阅读(4064) 评论(0) 推荐(0)

Linux调度器 - 用户空间接口

摘要: 一、前言 Linux调度器神秘而充满诱惑,每个Linux工程师都想深入其内部一探究竟。不过中国有一句古话叫做“相由心生”,一个模块精巧的内部逻辑(也就是所谓的“心”)其外延就是简洁而优雅的接口(我称之为“相”)。通过外部接口的定义,其实我们也可以收获百分之六七十的该模块的内部信息。因此,本文主要描述 阅读全文

posted @ 2018-02-13 22:39 AlanTu 阅读(1071) 评论(0) 推荐(0)

Linux标识进程

摘要: 一、前言 其实两年前,本站已经有了一篇关于进程标识的文档,不过非常的简陋,而且代码是来自2.6内核。随着linux container、pid namespace等概念的引入,进程标识方面已经有了天翻地覆的变化,因此我们需要对这部分的内容进行重新整理。 本文主要分成四个部分来描述进程标识这个主题:在 阅读全文

posted @ 2018-02-13 22:38 AlanTu 阅读(1969) 评论(0) 推荐(0)

Linux内存初始化(四) 创建系统内存地址映射

摘要: 一、前言 经过内存初始化代码分析(一)和内存初始化代码分析(二)的过渡,我们终于来到了内存初始化的核心部分:paging_init。当然本文不能全部解析完该函数(那需要的篇幅太长了),我们只关注创建系统内存地址映射这部分代码实现,也就是解析paging_init中的map_mem函数。 同样的,我们 阅读全文

posted @ 2018-02-13 22:34 AlanTu 阅读(1864) 评论(0) 推荐(0)

Linux内存初始化(三) 内存布局

摘要: 一、前言 同样的,本文是内存初始化文章的一份补充文档,希望能够通过这样的一份文档,细致的展示在初始化阶段,Linux 4.4.6内核如何从device tree中提取信息,完成内存布局的任务。具体的cpu体系结构选择的是ARM64。 二、memory type region的构建 memory ty 阅读全文

posted @ 2018-02-13 22:31 AlanTu 阅读(3754) 评论(0) 推荐(0)

Linux内存初始化(二)identity mapping和kernel image mapping

摘要: 一、前言 本文没有什么框架性的东西,就是按照__create_page_tables代码的执行路径走读一遍,记录在初始化阶段,内核是如何创建内核运行需要的页表过程。想要了解一些概述性的、框架性的东西可以参考内存初始化文档。 本文的代码来自ARM64,内核版本是4.4.6,此外,阅读本文最好熟悉ARM 阅读全文

posted @ 2018-02-13 22:30 AlanTu 阅读(2785) 评论(0) 推荐(0)

Linux内存初始化(一)

摘要: 一、前言 一直以来,我都非常着迷于两种电影拍摄手法:一种是慢镜头,将每一个细节全方位的展现给观众。另外一种就是快镜头,多半是反应一个时代的变迁,从非常长的时间段中,截取几个典型的snapshot,合成在十几秒的镜头中,可以让观众很快的了解一个事物的发展脉络。对应到技术层面,慢镜头有点类似情景分析,把 阅读全文

posted @ 2018-02-13 22:29 AlanTu 阅读(5219) 评论(3) 推荐(1)

Fix-Mapped Addresses

摘要: 一、前言 某天,wowo同学突然来了一句:如果要在start_kernel中点LED,ioremap在什么时间点才能调用呢?我想他应该是想通过点LED灯来调试start_kernel之后的初始化的代码(例如DTB解析部分的代码)。那天,我们两个花了二十分钟的时间,讨论相关的问题,我觉得很有意思,因此 阅读全文

posted @ 2018-02-13 22:27 AlanTu 阅读(1767) 评论(0) 推荐(0)

Linux内存模型

摘要: 一、前言 在linux内核中支持3中内存模型,分别是flat memory model,Discontiguous memory model和sparse memory model。所谓memory model,其实就是从cpu的角度看,其物理内存的分布情况,在linux kernel中,使用什么的 阅读全文

posted @ 2018-02-13 22:26 AlanTu 阅读(2337) 评论(0) 推荐(2)

文件缓存回写简述

摘要: 1 文件缓存回写的时机 (1)周期性回写,周期为dirty_writeback_interval,默认5s; (2)块设备首次出现脏数据; (3)脏页达到限额,包括dirty_bytes、dirty_background_bytes、dirty_ratio、dirty_background_rati 阅读全文

posted @ 2018-02-13 22:25 AlanTu 阅读(827) 评论(0) 推荐(0)

Linux内核配置解析 - Boot options

摘要: 1. 前言 本文将介绍ARM64架构下,Linux kernel和启动有关的配置项。 注1:本系列文章使用的Linux kernel版本是“X Project”所用的“Linux 4.6-rc5”,具体可参考“https://github.com/wowotechX/linux.git”。 2. K 阅读全文

posted @ 2018-02-13 22:24 AlanTu 阅读(3653) 评论(0) 推荐(0)

Linux内核配置解析 - 概述(基于ARM64架构)

摘要: 1. 前言 对刚接触Linux kernel的同学来说,遇到的第一个问题就是:我该从哪里入手?、 话说Linux kernel的打开方式是多种多样的:从简单的设备驱动入手;从源代码的目录结构入手;从kernel的启动过程入手;从大的功能模块入手;等等。不管怎样,每条都是正途(条条大路通罗马嘛)。 而 阅读全文

posted @ 2018-02-13 22:17 AlanTu 阅读(5775) 评论(0) 推荐(0)

Linux内核同步 - sleepable RCU的实现

摘要: 一、前言 由于曾经在Linux2.6.23上工作了多年,我对这个版本还是非常有感情的(抛开感情因素,本来应该选择longterm的2.6.32版本来分析的,^_^),本文主要就是描述Linux2.6.23内核版本中对RCU有哪些修正。所谓修正主要包括两个部分,一部分是bug fixed,一部分是新增 阅读全文

posted @ 2018-02-13 22:15 AlanTu 阅读(1007) 评论(0) 推荐(0)

slub分配器

摘要: Linux的物理内存管理采用了以页为单位的buddy system(伙伴系统),但是很多情况下,内核仅仅需要一个较小的对象空间,而且这些小块的空间对于不同对象又是变化的、不可预测的,所以需要一种类似用户空间堆内存的管理机制(malloc/free)。然而内核对对象的管理又有一定的特殊性,有些对象的访 阅读全文

posted @ 2018-02-13 22:13 AlanTu 阅读(694) 评论(0) 推荐(0)

Linux进程冻结技术

摘要: 1 什么是进程冻结 进程冻结技术(freezing of tasks)是指在系统hibernate或者suspend的时候,将用户进程和部分内核线程置于“可控”的暂停状态。 2 为什么需要冻结技术 假设没有冻结技术,进程可以在任意可调度的点暂停,而且直到cpu_down才会暂停并迁移。这会给系统带来 阅读全文

posted @ 2018-02-13 22:13 AlanTu 阅读(2244) 评论(0) 推荐(0)

Linux内核同步 - RCU synchronize原理分析

摘要: RCU(Read-Copy Update)是Linux内核比较成熟的新型读写锁,具有较高的读写并发性能,常常用在需要互斥的性能关键路径。在kernel中,rcu有tiny rcu和tree rcu两种实现,tiny rcu更加简洁,通常用在小型嵌入式系统中,tree rcu则被广泛使用在了serve 阅读全文

posted @ 2018-02-13 22:12 AlanTu 阅读(3221) 评论(0) 推荐(0)

linux内存回收机制

摘要: 无论计算机上有多少内存都是不够的,因而linux kernel需要回收一些很少使用的内存页面来保证系统持续有内存使用。页面回收的方式有页回写、页交换和页丢弃三种方式:如果一个很少使用的页的后备存储器是一个块设备(例如文件映射),则可以将内存直接同步到块设备,腾出的页面可以被重用;如果页面没有后备存储 阅读全文

posted @ 2018-02-13 22:10 AlanTu 阅读(4806) 评论(0) 推荐(0)

linux内存碎片防治技术

摘要: Linux kernel组织管理物理内存的方式是buddy system(伙伴系统),而物理内存碎片正式buddy system的弱点之一,为了预防以及解决碎片问题,kernel采取了一些实用技术,这里将对这些技术进行总结归纳。 1 低内存时整合碎片 从buddy申请内存页,如果找不到合适的页,则会 阅读全文

posted @ 2018-02-13 22:09 AlanTu 阅读(2257) 评论(1) 推荐(0)

Linux vm运行参数 - OOM相关的参数

摘要: 一、前言 本文是描述Linux virtual memory运行参数的第二篇,主要是讲OOM相关的参数的。为了理解OOM参数,第二章简单的描述什么是OOM。如果这个名词对你毫无压力,你可以直接进入第三章,这一章是描述具体的参数的,除了描述具体的参数,我们引用了一些具体的内核代码,本文的代码来自4.0 阅读全文

posted @ 2018-02-13 22:07 AlanTu 阅读(752) 评论(0) 推荐(0)

Linux vm运行参数 - overcommit相关的参数

摘要: 一、前言 终于可以进入Linux kernel内存管理的世界了,但是从哪里入手是一个问题,当面对一个复杂系统的时候,有时候不知道怎么开始。遵守“一切以人为本”的原则,我最终选择先从从userspace的视角来看内核的内存管理。最开始的系列文章选择了vm运行参数这个主题。执行ls /proc/sys/ 阅读全文

posted @ 2018-02-13 22:06 AlanTu 阅读(832) 评论(0) 推荐(0)

Linux内核同步 - classic RCU的实现

摘要: 一、前言 无论你愿意或者不愿意,linux kernel的版本总是不断的向前推进,做为一个热衷于专研内核的工程师,最大的痛苦莫过于此:当你熟悉了一个版本的内核之后,内核已经推进到一个新的版本,你曾经熟悉的内容可能会变得陌生(这里主要说的是该模块的内部实现,实际上,内核中的每一个子系统都是会尽量保持接 阅读全文

posted @ 2018-02-13 22:05 AlanTu 阅读(487) 评论(0) 推荐(0)

Linux内核同步 - RCU基础

摘要: 一、前言 关于RCU的文档包括两份,一份讲基本的原理(也就是本文了),一份讲linux kernel中的实现。第二章描述了为何有RCU这种同步机制,特别是在cpu core数目不断递增的今天,一个性能更好的同步机制是如何解决问题的,当然,再好的工具都有其适用场景,本章也给出了RCU的一些应用限制。第 阅读全文

posted @ 2018-02-13 22:04 AlanTu 阅读(400) 评论(0) 推荐(0)

Linux内核同步 - Seqlock

摘要: 一、前言 普通的spin lock对待reader和writer是一视同仁,RW spin lock给reader赋予了更高的优先级,那么有没有让writer优先的锁的机制呢?答案就是seqlock。本文主要描述linux kernel 4.0中的seqlock的机制,首先是seqlock的工作原理 阅读全文

posted @ 2018-02-13 22:01 AlanTu 阅读(484) 评论(0) 推荐(0)

Linux内核同步 - Read/Write spin lock

摘要: 一、为何会有rw spin lock? 在有了强大的spin lock之后,为何还会有rw spin lock呢?无他,仅仅是为了增加内核的并发,从而增加性能而已。spin lock严格的限制只有一个thread可以进入临界区,但是实际中,有些对共享资源的访问可以严格区分读和写的,这时候,其实多个读 阅读全文

posted @ 2018-02-13 22:00 AlanTu 阅读(409) 评论(0) 推荐(0)

Linux内核同步 - spin_lock

摘要: 一、前言 在linux kernel的实现中,经常会遇到这样的场景:共享数据被中断上下文和进程上下文访问,该如何保护呢?如果只有进程上下文的访问,那么可以考虑使用semaphore或者mutex的锁机制,但是现在中断上下文也参和进来,那些可以导致睡眠的lock就不能使用了,这时候,可以考虑使用spi 阅读全文

posted @ 2018-02-13 21:56 AlanTu 阅读(9162) 评论(0) 推荐(1)

Linux内核同步 - memory barrier

摘要: 一、前言 我记得以前上学的时候大家经常说的一个词汇叫做所见即所得,有些编程工具是所见即所得的,给程序员带来极大的方便。对于一个c程序员,我们的编写的代码能所见即所得吗?我们看到的c程序的逻辑是否就是最后CPU运行的结果呢?很遗憾,不是,我们的“所见”和最后的执行结果隔着: 1、编译器 2、CPU取指 阅读全文

posted @ 2018-02-13 21:54 AlanTu 阅读(474) 评论(0) 推荐(0)

Linux内核同步 - Per-CPU变量

摘要: 一、源由:为何引入Per-CPU变量? 1、lock bus带来的性能问题 在ARM平台上,ARMv6之前,SWP和SWPB指令被用来支持对shared memory的访问: SWP <Rt>, <Rt2>, [<Rn>] Rn中保存了SWP指令要操作的内存地址,通过该指令可以将Rn指定的内存数据加 阅读全文

posted @ 2018-02-13 21:53 AlanTu 阅读(971) 评论(0) 推荐(0)

Linux内核同步 - 原子操作

摘要: 一、源由 我们的程序逻辑经常遇到这样的操作序列: 1、读一个位于memory中的变量的值到寄存器中 2、修改该变量的值(也就是修改寄存器中的值) 3、将寄存器中的数值写回memory中的变量值 如果这个操作序列是串行化的操作(在一个thread中串行执行),那么一切OK,然而,世界总是不能如你所愿。 阅读全文

posted @ 2018-02-13 21:52 AlanTu 阅读(1794) 评论(0) 推荐(0)

Linux中断 - softirq

摘要: 一、前言 对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),是全程关闭中断的,另外一部分是deferable task(bottom half),属于不那么紧急需要处理的事情。在执行bottom half的时候,是开中断的。有多种bottom half的 阅读全文

posted @ 2018-02-13 21:50 AlanTu 阅读(1765) 评论(0) 推荐(0)

Linux中断 - tasklet

摘要: 一、前言 对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),属于不那么紧急需要处理的事情被推迟执行,我们称之deferable task,或者叫做bottom half,。具体如何推迟执行分成下面几种情况: 1、推迟到top half执行完毕 2、推迟到 阅读全文

posted @ 2018-02-13 21:50 AlanTu 阅读(355) 评论(0) 推荐(0)

Linux中断 - GIC代码分析

摘要: 一、前言 GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器,其architecture specification目前有四个版本,V1~V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64服务器系统结 阅读全文

posted @ 2018-02-13 21:49 AlanTu 阅读(3270) 评论(0) 推荐(0)

Linux中断 - ARM中断处理过程

摘要: 一、前言 本文主要以ARM体系结构下的中断处理为例,讲述整个中断处理过程中的硬件行为和软件动作。具体整个处理过程分成三个步骤来描述: 1、第二章描述了中断处理的准备过程 2、第三章描述了当发生中的时候,ARM硬件的行为 3、第四章描述了ARM的中断进入过程 4、第五章描述了ARM的中断退出过程 本文 阅读全文

posted @ 2018-02-13 21:48 AlanTu 阅读(4515) 评论(0) 推荐(1)

Linux中断 - High level irq event handler

摘要: 一、前言 当外设触发一次中断后,一个大概的处理过程是: 1、具体CPU architecture相关的模块会进行现场保护,然后调用machine driver对应的中断处理handler 2、machine driver对应的中断处理handler中会根据硬件的信息获取HW interrupt ID 阅读全文

posted @ 2018-02-13 21:47 AlanTu 阅读(1232) 评论(0) 推荐(0)

Linux中断 - 驱动申请中断API

摘要: 一、前言 本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的驱动的时候,如何向Linux Kernel中的中断子系统注册中断处理函数?为了理解注册中断的接口,必须了解一些中断线程化(threaded interrupt handler)的基础知识,这些在第二章描述。第三章主要描述了驱动申请 阅读全文

posted @ 2018-02-13 21:47 AlanTu 阅读(4026) 评论(0) 推荐(0)

Linux中断 - IRQ number和中断描述符

摘要: 一、前言 本文主要围绕IRQ number和中断描述符(interrupt descriptor)这两个概念描述通用中断处理过程。第二章主要描述基本概念,包括什么是IRQ number,什么是中断描述符等。第三章描述中断描述符数据结构的各个成员。第四章描述了初始化中断描述符相关的接口API。第五章描 阅读全文

posted @ 2018-02-13 21:46 AlanTu 阅读(3932) 评论(1) 推荐(0)

Linux中断 - IRQ Domain介绍

摘要: 一、概述 在linux kernel中,我们使用下面两个ID来标识一个来自外设的中断: 1、IRQ number。CPU需要为每一个外设中断编号,我们称之IRQ Number。这个IRQ number是一个虚拟的interrupt ID,和硬件无关,仅仅是被CPU用来标识一个外设中断。 2、HW i 阅读全文

posted @ 2018-02-13 21:45 AlanTu 阅读(2913) 评论(0) 推荐(0)

Linux中断 - 综述

摘要: 一、前言 一个合格的linux驱动工程师需要对kernel中的中断子系统有深刻的理解,只有这样,在写具体driver的时候才能: 1、正确的使用linux kernel提供的的API,例如最著名的request_threaded_irq(request_irq)接口 2、正确使用同步机制保护驱动代码 阅读全文

posted @ 2018-02-13 21:44 AlanTu 阅读(646) 评论(0) 推荐(0)

process credentials(三)

摘要: 主要内容包括: 1、进程描述符中Realtime Mutex相关数据结构的初始化 2、子进程如何复制父进程的credentials 3、per-task delay accounting的处理 4、子进程如何复制父进程的flag 七、初始化Realtime Mutex相关的成员 static voi 阅读全文

posted @ 2018-02-13 21:43 AlanTu 阅读(530) 评论(0) 推荐(0)

process credentials(二)

摘要: 一、前言 为什么要写一个关于进程如何创建的文档?其实用do_fork作为关键字进行索引,你会发现网上的相关文档数以万计。作为一个内核工程师,对进程以及进程相关的内容当然是非常感兴趣,但是网上的资料并不能令我非常满意(也许是我没有检索到好的文章),一个简单的例子如下: static void copy 阅读全文

posted @ 2018-02-13 21:42 AlanTu 阅读(386) 评论(0) 推荐(0)

process credentials(一)

摘要: 一、介绍 当linux系统中的一个进程运行起来的时候,总是要访问系统的资源,访问文件或者向其他的进程发送信号。系统是否允许其进行这些操作?系统是根据什么来判断该进程的权限?这些问题是和进程信任状(process credentials)相关。 process credentials包括一系列的ID, 阅读全文

posted @ 2018-02-13 21:41 AlanTu 阅读(776) 评论(0) 推荐(0)

实模式与保护模式

摘要: 1. 实模式,又叫实地址模式,CPU完全按照8086的实际寻址方法访问从00000h--FFFFFh(1MB大小)的地址范围的内存,在这种模式下,CPU只能做单任务运行;寻址公式为:物理地址=左移4位的段地址+偏移地址,即:物理地址是由16位的段地址和16位的段内偏移地址组成的。 2.保护模式,又叫 阅读全文

posted @ 2018-02-13 21:20 AlanTu 阅读(1466) 评论(0) 推荐(0)

Linux高速缓冲区原理

摘要: 文件系统-高速缓冲区: 首先我们为什么需要高速缓冲区而不是直接访问块设备中的数据。这是因为,IO设备和内存之间的读写速度不匹配而且有一点数据需要写入或者读出磁盘就访问磁盘,磁盘很快就会损坏,而高速缓冲区就起了一个中间过程的作用,把数据存在高速缓冲区中,需要读取磁盘上的数据时,尝试匹配高速缓冲区中的数 阅读全文

posted @ 2018-02-13 21:18 AlanTu 阅读(4053) 评论(0) 推荐(0)

Linux引导启动程序 - boot

摘要: 主要描述 boot/目录中的三个汇编代码文件,见列表 3-1 所示。正如在前一章中提到的,这三个 文件虽然都是汇编程序,但却使用了两种语法格式。bootsect.s 和 setup.s 采用近似于 Intel 的汇编语言语法,需要使用 Intel 8086 汇编编译器和连接器 as86 和ld86, 阅读全文

posted @ 2018-02-13 21:12 AlanTu 阅读(11599) 评论(0) 推荐(0)

Linux内核系统体系概述

摘要: Linux 内核主要由 5 个模块构成,它们分别是: 进程调度模块 用来负责控制进程对 CPU 资源的使用。所采取的调度策略是各进程能够公平合理地访问 CPU,同时保证内核能及时地执行硬件操作。 内存管理模块 用于确保所有进程能够安全地共享机器主内存区,同时,内存管理模块还支持虚拟内存管理方式,使得 阅读全文

posted @ 2018-02-13 20:52 AlanTu 阅读(1259) 评论(0) 推荐(0)

ext2文件系统 - mke2fs

摘要: 上一遍博文的重点其实将ext2整体的组织框架,我们知道了ext2文件系统由块组组成,每个块组里面的组织形式。我们甚至直接把超级块和组描述符里面的内容,用十六进制形式展现了出来。这篇博文主要讲述如何mke2fs生成合适需要的ext2 文件系统,基本就是参数选择的问题。 mke2fs 常用的几个参数有: 阅读全文

posted @ 2018-02-13 20:32 AlanTu 阅读(443) 评论(0) 推荐(0)

ext2文件系统

摘要: 很久以来,就想写一篇关于ext 家族文件系统的文章,源于我刚工作的时候,曾经一不小心rm -rf,误删除了很多文件,当时真想有个数据恢复软件能帮我把数据回复了。当然学习数据恢复,首先要学习文件系统。最近工作原因,好长时间没看学习Linux kernel 相关的东西,感觉面目可憎。扯远了,开始我们的e 阅读全文

posted @ 2018-02-13 20:28 AlanTu 阅读(575) 评论(0) 推荐(0)

与进程相关的文件系统

摘要: 进程是通过文件描述符(file descriptor,fd)来访问文件的,每个进程最多能同时使用NR_OPEN个文件描述符,这个值在include/linux/limits.h中定义为1024。每一个进程用一个打开文件表files_struct来描述进程的文件描述符使用情况。每一个文件都有一个文件指 阅读全文

posted @ 2018-02-13 20:27 AlanTu 阅读(856) 评论(0) 推荐(0)

Linux VFS数据结构

摘要: 先说明一下,linux内核中各种数据结构也不停的在变,所以不同版本的内核各个数据结构的定义可能会差别很大,这一组关于linux 文件系统的文章中的代码都摘自linux-2.6.34.1。 VFS依赖于数据结构来保存其对于一个文件系统的一般表示。 超级块结构:存放已安装的文件系统的相关信息 索引节点结 阅读全文

posted @ 2018-02-13 20:20 AlanTu 阅读(1045) 评论(0) 推荐(0)

虚拟文件系统

摘要: VFS的层次 文件系统实现与用户进程(或C库)之间。 文件系统分类 基于磁盘的文件系统(ext2/3 fat iso9660…)、虚拟文件系统(proc)、网络文件系统(nfs) 通用文件模型 VFS提供一种结构模型,包含了一个强大的文件系统所应具备的所有组件。所有的文件系统实现,都必须提供与VFS 阅读全文

posted @ 2018-02-13 20:19 AlanTu 阅读(1095) 评论(0) 推荐(0)

linux文件系统 - 初始化(三)

摘要: 执行init程序 一、目的 内核加载完initrd文件后,为挂载磁盘文件系统做好了必要的准备工作,包括挂载了sysfs、proc文件系统,加载了磁盘驱动程序驱动程序等。接下来,内核跳转到用户空间的init程序,由init完成创建磁盘设备文件、加载磁盘文件系统、从rootfs切换到磁盘根文件系统等工作 阅读全文

posted @ 2018-02-13 20:16 AlanTu 阅读(1845) 评论(0) 推荐(0)

linux文件系统 - 初始化(二)

摘要: 加载initrd(上) 一、目的 本文主要讲述linux3.10文件系统初始化过程的第二阶段:加载initrd。 initrd是一个临时文件系统,由bootload负责加载到内存中,里面包含了基本的可执行程序和驱动程序。在linux初始化的初级阶段,它提供了一个基本的运行环境。当成功加载磁盘文件系统 阅读全文

posted @ 2018-02-13 20:14 AlanTu 阅读(1019) 评论(0) 推荐(0)

linux文件系统 - 初始化(一)

摘要: 术语表: struct task:进程 struct mnt_namespace:命名空间 struct mount:挂载点 struct vfsmount:挂载项 struct file:文件 struct super_block:超级块 struct dentry:目录 struct inode 阅读全文

posted @ 2018-02-13 20:09 AlanTu 阅读(4504) 评论(0) 推荐(0)

fork()和写时复制

摘要: 写时复制技术最初产生于Unix系统,用于实现一种傻瓜式的进程创建:当发出fork( )系统调用时,内核原样复制父进程的整个地址空间并把复制的那一份分配给子进程。这种行为是非常耗时的,因为它需要: · 为子进程的页表分配页面 · 为子进程的页分配页面 · 初始化子进程的页表 · 把父进程的页复制到子进 阅读全文

posted @ 2018-02-13 16:52 AlanTu 阅读(1181) 评论(0) 推荐(0)

Linux共享内存使用常见陷阱与分析

摘要: 所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如 信号量结合使用,来达到进程间的同步及互斥。其他进程能把同一段共享内存段“连接到”他们自己的地址空间里去。所有进程都能访问共享内存中的地址。如果一 个进程向这段共 阅读全文

posted @ 2018-02-13 16:51 AlanTu 阅读(1148) 评论(0) 推荐(0)

linux可重入、异步信号安全和线程安全

摘要: 一 可重入函数 当一个被捕获的信号被一个进程处理时,进程执行的普通的指令序列会被一个信号处理器暂时地中断。它首先执行该信号处理程序中的指令。如果从信号处理 程序返回(例如没有调用exit或longjmp),则继续执行在捕获到信号时进程正在执行的正常指令序列(这和当一个硬件中断发生是所发生的事情相 似 阅读全文

posted @ 2018-02-13 16:36 AlanTu 阅读(769) 评论(0) 推荐(0)

Linux中断的系统调用

摘要: 早期UNIX系统的一个特性是:如果在进程执行一个低速系统调用而阻塞期间捕捉到一个信号,则该系统调用就被中断不再继续执行。该系统调用返回出错,其errno设置为EINTR。这样处理的理由是:因为一个信号发生了,进程捕捉到了它,这意味着已经发生了某种事情,所以是个好机会应当唤醒阻塞的系统调用。 为了支持 阅读全文

posted @ 2018-02-13 16:32 AlanTu 阅读(3026) 评论(0) 推荐(0)

库与运行库

只有注册用户登录后才能阅读该文。 阅读全文

posted @ 2018-02-13 16:18 AlanTu 阅读(36) 评论(0) 推荐(0)

线程的概念

摘要: 1 什么是线程 线程,有时被称为轻量级进程,是程序执行的最小单元。一个标准的线程由线程ID、 程序计数器(pc)、一组寄存器和堆栈组成。通常,一个进程由多个线程组成,每个线程之间共享进程的内存空间(包括代码段、数据段、堆等)及一些进程级的 资源(如打开的文件描述符和信号)。如下图所示: 2 线程的访 阅读全文

posted @ 2018-02-13 16:15 AlanTu 阅读(533) 评论(0) 推荐(0)

C++ 虚函数表浅析

摘要: 一、背景知识(一些基本概念) 虚函数(Virtual Function):在基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数。 纯虚函数(Pure Virtual Function):基类中没有实现体的虚函数称为纯虚函数(有纯虚函数的基类称为虚基类)。 C++ “虚函数”的存 阅读全文

posted @ 2018-02-13 16:07 AlanTu 阅读(270) 评论(0) 推荐(0)

C++虚函数工作原理

摘要: 一、虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数。典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式。vptr 指向一个被称为 vtbl(virtual table,虚函数表 阅读全文

posted @ 2018-02-13 16:05 AlanTu 阅读(697) 评论(0) 推荐(0)

深入浅出单实例Singleton设计模式

摘要: 单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可 能也是面试中问得最多的一个设计模式了。这个设计模式主要目的是想在整个系统中只能出现一个类的实例。这样做当然是有必然的,比如你的软件的全局配置信 息,或者是一个Factory,或是一个主控类,等等。你希望这个类在整个系统 阅读全文

posted @ 2018-02-13 15:41 AlanTu 阅读(236) 评论(0) 推荐(0)

《角斗士》一个帝国的史诗绝唱

摘要: 公元前27年的世界地理版图如果可以像霍格沃茨里的魔法那样被装裱在一个永远具有生命力的相框里,那么这幅照片注定只有一个名字。是的,罗马。 不可一世的奥古斯都大帝带着他的罗马骑兵将罗马帝国的印记刻在了整个世界近五分之一的地域。埃及女王克莱奥帕特拉那条带领她走向毁灭的毒蛇,见证了一个不 可复制的帝国的诞生 阅读全文

posted @ 2018-02-13 15:36 AlanTu 阅读(1832) 评论(0) 推荐(0)

《妖猫传》大唐盛世背后那些事

摘要: 即使不看服化道,只看剧情,这也是今年国产的最佳电影。理由如下。 《妖猫传》的核心主旨并不是大唐风流的展现、更不是讲述一个无聊的人人都爱杨贵妃的玛丽苏故事。 其实,这个故事并不简单,它真正想要表达的东西就隐藏在片子中,等待有心人的发现。 大家一定记得,白居易和空海刚组队时,曾经看过一场幻术表演:瓜翁用 阅读全文

posted @ 2018-02-13 15:25 AlanTu 阅读(583) 评论(0) 推荐(0)

程序员之路

摘要: 前言 你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍(朋友的抱怨:学校课程总是从理论出发,作业项目都看不出有什么实际作用,不如从工作中的需求出发) 建议: 不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来至少1 阅读全文

posted @ 2018-02-13 13:31 AlanTu 阅读(292) 评论(0) 推荐(0)

职业规划

摘要: 认识自己 人生的规划很重要,从上大学时就要好好规划,这对国人来说尤其重要。因为对于国人来说,人生的头20年都是被别人规划的,导致了自己根本不会给自己做规划。这点是相当危险的。 人生短暂,属于自己黄金的时间不多,如果把太多的时间浪费在寻找道路和方向上,很有可 能会导致一事无成,要及早确定自己的规划,然 阅读全文

posted @ 2018-02-13 12:49 AlanTu 阅读(240) 评论(0) 推荐(1)

一些重要的算法 - 索引

摘要: 下面是一些比较重要的算法,原文罗 列了32个,但我觉得有很多是数论里的,和计算机的不相干,所以没有选取。下面的这些,有的我们经常在用,有的基本不用。有的很常见,有的很偏。不过了解 一下也是好事。也欢迎你留下你觉得有意义的算法。(注:本篇文章并非翻译,其中的算法描述大部份摘自Wikipedia,因为维 阅读全文

posted @ 2018-02-13 11:33 AlanTu 阅读(375) 评论(0) 推荐(0)

面试官如何招聘程序员 - 续

摘要: 谈谈关于招聘和面试这方面的东西,主要是以下这些原因: 近半年来我在进行了大量的招聘工作,对面试有一些新的体会。 酷壳最近发布了几篇趣味面试题(面试题一,面试题二,面试题三),从回复中让我有一些思考。 我有一个同事最近面试了一家公司,他和我分享了一个博士专家对他的面试,也让我思考了一些。 在豆瓣上看到 阅读全文

posted @ 2018-02-13 11:13 AlanTu 阅读(275) 评论(0) 推荐(0)

面试官如何招聘程序员

摘要: 工作这么多年来,即被面试过,也面试过他人,对于程序员的面试,经历过很不错的面试,很专业的面试,也经历过一些BT和令人不爽的面试,我个人觉得 一个好的面试,面试官是很重要的,所以,本文想从“面试官”的角度来阐述一下。于是,有了下面这样一篇的文章,希望本文对你的职场经历有用,特别是那些正 在招聘和面试程 阅读全文

posted @ 2018-02-13 11:11 AlanTu 阅读(384) 评论(0) 推荐(0)

趣味面试题

摘要: 1.“火柴棍式”程序员面试题 有时候,有些面试题是很是无厘头,这不,又有一个,还记得小时候玩的的“火柴棍游戏”吗,就是移动一根火柴棍改变一个图或字的游戏。程序面试居然也可以这么玩,看看下面这个火柴棍式的程序面试题吧。 下面是一个C程序,其想要输出20个减号,不过,粗心的程序员把代码写错了,你需要把下 阅读全文

posted @ 2018-02-13 10:59 AlanTu 阅读(1185) 评论(0) 推荐(0)

导航