<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[lonewolfxw的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/lonewolfxw</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; lonewolfxw]]></copyright><item><title><![CDATA[关于vmalloc缺页异常的一个问题]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/8216927</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/8216927</guid><author>lonewolfxw</author><pubDate>Fri, 23 Nov 2012 15:31:29 +0800</pubDate><description><![CDATA[进程页表和vmalloc缺页异常


在新建进程时，新的线程会复制老的线程的页表，复制老线程的文件映射，匿名映射等，而且会复制页表项的全局页表项的内核部分，因为内核部分的页表的映射（除vmalloc）在启动内核时就已经建立好了，因此复制了全局页表项页就相当于复制了内核的页表。



pgd_t *pgd_alloc(struct mm_struct *mm)
{
pgd_t *pgd]]></description><category></category></item><item><title><![CDATA[虚拟文件系统系列(一)--概述]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/8089400</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/8089400</guid><author>lonewolfxw</author><pubDate>Fri, 19 Oct 2012 14:55:50 +0800</pubDate><description><![CDATA[linux的虚拟文件系统为应用程序提供了一个接口层，可以使用统一的接口操作底层设备和文件，从而也就实现了linux所谓的“万物皆文件”的想法。每种文件所包含的操作不一样，例如目录文件包含lookup函数，而普通文件就没有，设备文件可以通过ioctl操作底层设备。不同的文件系统实现方式也不一样，网络文件系统可以通过网络实现文件读写，缓存同步，等等。。为了为各种文件系统，各种文件提供统一操作，linu]]></description><category></category></item><item><title><![CDATA[GDB用法详解]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/8087190</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/8087190</guid><author>lonewolfxw</author><pubDate>Thu, 18 Oct 2012 19:54:58 +0800</pubDate><description><![CDATA[GDB用法详解
GDB是一个强大的命令行调试工具。虽然X
Window提供了GDB的图形版DDD，但是我仍然更钟爱在命令行模式下使用GDB。大家知道命令行的强大就是在于，其可以形成执行序列，形成脚本。
UNIX下的软件全是命令行的，这给程序开发提代供了极大的便利，命令行软件的优势在于，它们可以非常容易的集成在一起，使用几个简单的已有工具的命令，
就可以做出一个非常强大的功能。]]></description><category></category></item><item><title><![CDATA[2013亚马逊笔试题]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/8086115</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/8086115</guid><author>lonewolfxw</author><pubDate>Thu, 18 Oct 2012 19:01:26 +0800</pubDate><description><![CDATA[题目的大概意思是就是，亚马逊有一种配置文件，文件的内容按照如下格式：
A={A=1;B=2;C=3;E={A=100;};};

A+={D=4;E={B=10;C=D;};};

规则A如第一行表示，每条规则用一个字符串表示，可以通过若干条规则向规则A中增加子项，若子项有相同则覆盖之前的值。最后可以通过下面的形式来访问规则A的内容，规则名和相应的值只包含A-z，a-z和0-9：
A.]]></description><category></category></item><item><title><![CDATA[GCC 预处理器选项]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/8054870</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/8054870</guid><author>lonewolfxw</author><pubDate>Wed, 10 Oct 2012 09:26:56 +0800</pubDate><description><![CDATA[GCC 预处理器选项



文章来源： 文章作者： 发布时间：2007-08-09 字体： [大 中 小]


















预处理器选项(Preprocessor Option)
下列选项针对C预处理器,预处理器用在正式编译以前,对C 源文件进行某种处理.
如果指定了`-E'选项, GCC只进行预处理工作.下面的某些选项必须和`]]></description><category></category></item><item><title><![CDATA[小米笔试最后一题]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/8047201</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/8047201</guid><author>lonewolfxw</author><pubDate>Mon, 08 Oct 2012 10:34:22 +0800</pubDate><description><![CDATA[小米笔试的最后一题就是图论的一道题，仔细写了一下答案，结果在gcc和vs下都测试通过：


就是一个找无向图的连通子图问题，通过图上面的dfs和bfs都可以，下面使用二维数组表示图之间的关系。
这个是vs下面的代码：

// xiaomi.cpp : Defines the entry point for the console application.
//

#include "s]]></description><category></category></item><item><title><![CDATA[linux内核定时器]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/8034395</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/8034395</guid><author>lonewolfxw</author><pubDate>Sun, 30 Sep 2012 19:13:36 +0800</pubDate><description><![CDATA[linux的定时器一般分为两种，一种是timeout类型，也就是在指定时间之前完成相应的任务即可，这种定时器对精度要求较低，晚几毫秒执行不会有很大的影响，而且一般这种类型的定时器要处理的任务在超时之前就已经完成，并且从定时器的队列中删除了，用不着真正的等到timeout然后由定时器模块来处理，这种较低精度要求的定时器一般使用timer wheel定时器。另一种类型的就是timer类型定时器，这就要]]></description><category></category></item><item><title><![CDATA[linux内核装载vfs过程]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/8015887</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/8015887</guid><author>lonewolfxw</author><pubDate>Tue, 25 Sep 2012 16:03:52 +0800</pubDate><description><![CDATA[linux虚拟文件系统是设备驱动程序的之上的一个抽象层，致力于提供给应用程序一个统一的操作文件的接口。虚拟文件系统的各个数据结构之间的关系比较复杂，画了一张各个数据结构之间的关系图在 http://download.youkuaiyun.com/detail/lonewolfxw/4588935，这个清晰的给出了各结构的关系。
1. 目录查找
linux的虚拟文件系统最核心的结构就是dentry缓存，每次]]></description><category></category></item><item><title><![CDATA[vi 命令]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/8014176</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/8014176</guid><author>lonewolfxw</author><pubDate>Mon, 24 Sep 2012 19:37:48 +0800</pubDate><description><![CDATA[一、Unix编辑器概述

      编辑器是使用计算机的重要工具之一，在各种操作系统中，编辑器都是必不可少的部件。Unix及其相似的ix 操作系统系列中，为方便各种用户在各个不同的环境中使用，提供了一系列的ex编辑器，包括 ex,
 edit,ed 和 vi.其中ex,edit,ed都是行编辑器，现在已很少有人使用，Unix提供他们的原因是考虑到满足各种用户特别是某些终端用户的需要。值得庆]]></description><category></category></item><item><title><![CDATA[linux fork系统调用]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/7989014</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/7989014</guid><author>lonewolfxw</author><pubDate>Mon, 17 Sep 2012 21:08:36 +0800</pubDate><description><![CDATA[fork系统调用是内核中相当麻烦的一部分，由于进程数据结构struct task_struct包含了进程运行所需的所有的数据结构，包括虚拟地址空间，文件系统，打开的文件，信号处理程序，sys v实例，命名空间和IO上下文等。fork系统调用最后调用do_fork函数处理请求：

/*
 *  Ok, this is the main fork-routine.
 *
 * It copies]]></description><category></category></item><item><title><![CDATA[linux 字符设备驱动程序原理]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/7981325</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/7981325</guid><author>lonewolfxw</author><pubDate>Sat, 15 Sep 2012 12:45:22 +0800</pubDate><description><![CDATA[1. 理解驱动程序
由于unix的万物皆文件的思想，底层的设备也用特殊文件类型，设备文件来操作，通过读写设备文件就可以读写设备内存或者设备端口了，因此需要一个在虚拟文件系统和底层设备之间的一个适配器，这就是设备驱动程序，用于粘合虚拟文件系统和底层的设备，提供上层的虚拟文件系统统一的接口，并且管理和底层设备的交互。
字符设备可以通过一种比较简单的方式管理，因为不需要I/O调度、底层同步、重排请求]]></description><category></category></item><item><title><![CDATA[早上看到的微软笔试题，随便写个答案]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/7970087</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/7970087</guid><author>lonewolfxw</author><pubDate>Wed, 12 Sep 2012 14:11:05 +0800</pubDate><description><![CDATA[微软十五道面试题

1、有一个整数数组，请求出两两之差绝对值最小的值,
记住，只要得出最小值即可，不需要求出是哪两个数。

这个我没找到高效算法，O（n2）算法很好实现，应该都能想到的，另外一个快一点点的就是先排序一下，然后查找最小差的，排序用快排可以在）O（nlg（n））内完成，然后查找可以在线性时间完成，总复杂度O（nlg（n））

2、写一个函数，检查字符是否是整数，如果是，返]]></description><category></category></item><item><title><![CDATA[检测单链表是否有环新解]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/7965428</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/7965428</guid><author>lonewolfxw</author><pubDate>Tue, 11 Sep 2012 08:12:01 +0800</pubDate><description><![CDATA[检测单链表是否有环有好几种方法。


可以设置两个指针前后步遍历链表，但是这个不好确定环的T型交叉点。如果数据结构可以改就直接加个flag变量表示是否已经被遍历就可以，这个是最简单，但是一般要在不能改数据结构的情况下检测出环。我自己还能想到就是初步估计链表的长度，利用链表节点的地址构建一个散列表，访问一个节点就把这个节点的地址放到散列表里面，这个要额外的数据结构来支持算法，在链表节点比较少的]]></description><category></category></item><item><title><![CDATA[linux 基数树]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/7953805</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/7953805</guid><author>lonewolfxw</author><pubDate>Fri, 07 Sep 2012 10:09:28 +0800</pubDate><description><![CDATA[Linux基数树（radix tree）是将指针与long整数键值相关联的机制，它存储有效率，并且可快速查询，用于指针与整数值的映射（如：IDR机制）、内存管理等。


IDR（ID Radix）机制是将对象的身份鉴别号整数值ID与对象指针建立关联表，完成从ID与指针之间的相互转换。IDR机制使用radix树状结构作为由id进行索引获取指针的稀疏数组，通过使用位图可以快速分配新的ID，IDR]]></description><category></category></item><item><title><![CDATA[linux 进程调度器框架]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/7906903</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/7906903</guid><author>lonewolfxw</author><pubDate>Thu, 06 Sep 2012 00:42:59 +0800</pubDate><description><![CDATA[调度器概述

由于现在的计算机系统运行的任务的个数远远超过处理器核心的个数，因此导致了各任务在共享处理器、寄存器资源，为了实现处理器时间在各个任务之间公平的分配，实现程序并行运行的假象，操作系统内核需要进程调度器来尽量公平的在各个进程之间分配运行时间。受到现实问题的影响，调度器实现变得很复杂：


需要在各进程间尽量公平的分配处理器时间由于更重要的进程要比次重要的进程分配更多的处理器时间]]></description><category></category></item><item><title><![CDATA[linux 文件映射]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/7943832</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/7943832</guid><author>lonewolfxw</author><pubDate>Tue, 04 Sep 2012 21:03:19 +0800</pubDate><description><![CDATA[1. 概述
用户进程的虚拟内存管理和内核内存管理比较起来更加复杂，一个对象要在多个数据结构中被管理，而且用户访问内存的不确定性，需要更多的安全检查。下面先看看虚拟内存管理的基本流程。
进程task_struct的struct mm_struct* mm 成员管理进程的虚拟的内存，当需要从文件中映射一块size大小的内存时，文件地址空间的相关操作找到一块连续的虚拟内存空间，文件的地址空间对象ad]]></description><category></category></item><item><title><![CDATA[linux 匿名映射数据组织]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/7943098</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/7943098</guid><author>lonewolfxw</author><pubDate>Tue, 04 Sep 2012 17:25:17 +0800</pubDate><description><![CDATA[During the stabilization phase of the kernel development cycle, the -rc releases typically happen about once every week. 2.6.34-rc4 is
 a clear exception to that rule, coming nearly two weeks after t]]></description><category></category></item><item><title><![CDATA[中断上下文、进程上下文]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/7941345</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/7941345</guid><author>lonewolfxw</author><pubDate>Tue, 04 Sep 2012 11:34:55 +0800</pubDate><description><![CDATA[Interrupt Context
-------------------------------------------
    When executing an interrupt handler or bottom half, the kernel is in interrupt context. Recall that process context is
 the mode of]]></description><category></category></item><item><title><![CDATA[linux不连续页分配和内核映射]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/7933906</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/7933906</guid><author>lonewolfxw</author><pubDate>Sun, 02 Sep 2012 11:52:47 +0800</pubDate><description><![CDATA[1. 不连续页的分配
计算机系统中，随着使用时间的增长，内存碎片越来越严重，导致很多不连续的内存页，linux中伙伴系统能够一定程度上避免不连续的内存页。若要分配一段连续的内存页，而物理内存中又不存在这么多连续的内存页怎么办，可以把多个不连续的内存页映射到连续的虚拟地址空间中，当进程访问内存，进程看到的总是一块连续的空间。下面看看不连续页的分配。
分配不连续内存页的主要思想就是通过伙伴系统每次]]></description><category></category></item><item><title><![CDATA[linux slab精细结构]]></title><link>https://blog.youkuaiyun.com/lonewolfxw/article/details/7932109</link><guid>https://blog.youkuaiyun.com/lonewolfxw/article/details/7932109</guid><author>lonewolfxw</author><pubDate>Sat, 01 Sep 2012 14:50:07 +0800</pubDate><description><![CDATA[1. 数据结构






上面是用visio画的slab缓存的结构示意图，而且对标出了slab结构的成员的含义以及kmem_cache的主要成员的含义。看看如何从slab中获取对象，由上图可以清晰的看到，slab中的对象获取应该是通过free成员和bufctl数组中的索引来取得对象，从索引到对象转换通过s_mem偏移来确定：
static inline void *index_t]]></description><category></category></item></channel></rss>