自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 资源 (8)
  • 收藏
  • 关注

原创 linux内核模块的加载过程

前段时间为了解决内核模块无法卸载的问题,对模块的加载过程详细地学习了一番。加载模块时常用的命令是insmod和modprobe,这两个命令主要是通过系统调用sys_init_module()来完成主要的工作,用户层做的更多的是对参数的处理,以及将插入的模块加入到内存中。系统调用sys_init_module()将大部分工作委托给load_module()函数来完成,load_module()中的操

2013-01-30 22:44:06 3760 1

原创 算法学习笔记----确定n个元素的任何排列中逆序对的数目

题目:设A[1...n]是一个包含n个不同数的数组。如果在iA[j],则(i,j)就称为A中的一个逆序对(inversion)。给出一个算法,它能用Θ(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目。解题思路: ①比较直观的方法是循环从数组中取出一个元素k,然后从k之后的元素中找到比k小的元素个数,最后统计所有的个数即为排列中逆序对的数目。从数组中取元素的次数为n,每次

2013-01-29 18:11:10 2331 1

原创 算法学习笔记----判断集合S中是否存在有两个其和等于x的元素

题目:请给出一个运行时间为Θ(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。解题思路:直观的方法是直接计算集合中两两元素的和,然后判断是否存在x,但时间复杂度为Θ(n^2),不符合题目的要求,也不是一个好的解决问题的方法,下面两种方法要好一些: 第一种是《算法导论》的教师手册上提供的思路,构建一个辅助集合S',通过查

2013-01-29 10:32:47 2711

原创 算法学习笔记----递归式证明

题目:利用数学归纳法证明:当n是2的整数次幂时,递归式的解为T(n)=nlgn。  证明如下:  当n=2时,T(n)=2*lg2=2。  假设递归式的解为T(n)=nlgn,有T(n/2)=(n/2)lg(n/2),将T(n/2)带入递归式,过程如下所示:T(n) = 2*(n/2)*lg(n/2) + n = nlg(n/2) + n = n

2013-01-28 12:08:26 1972 1

原创 算法学习笔记----归并排序

一、算法描述  归并排序算法完全遵循分治模式,将问题分解为若干子问题,如果子问题的规模足够小,则直接求解,否则递归地求解各子问题。算法步骤如下所示:    1)将待排序的n个元素的序列分解为各具n/2个序列的两个字序列    2)使用归并排序递归地将两个子序列排序   3)将两个已排序的子序列合并,生成排好序的序列。二、算法实现  1、递归版本   为了避免在合并两个子

2013-01-27 14:46:03 1268

原创 算法学习笔记----插入排序

一、算法描述    插入排序是一种比较直观的排序算法,其思想是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,直到找到一个合适和位置并插入。具体算法描述如下(升序排列):    1. 从第一个元素开始,该元素可以认为已经是排好序的了    2.取出下一个元素,在已经排序的元素序列中从后向前扫描    3.如果该元素(已排序)大于新元素,将该元素移到下一个位置

2013-01-26 18:27:57 1152

原创 内核线程中获取接收到的信号

在测试开发的内核模块时,发现了一个BUG:在模块没有卸载时使用reboot命令重启系统的话,系统重启不了,查看日志发现在创建的内核线程中陷入了死循环,导致系统无法重启。检查了代码,发现产生问题的原因是当系统调用返回-EINTR(也就是被信号中断),内核线程中的循环没有退出,而是继续循环操作,这个逻辑跟业务是相符合的并没有错误。问题就在于没有检查接收到的是什么信号,如果是在系统重启时发送的信号或者执

2013-01-26 00:43:27 4368 1

原创 LVS-DR模式配置详解

每次配置LVS时,都要重新上网去找配置方法,这些方法有些是错误的,而且大多数讲解的不是很全面,每次都要花些时间来排错,所以决定自己写一篇,记录下来,以免以后再浪费时间。LVS的安装就不说了,在linux下开发如果不会安装类似LVS这样的软件,也太说不过去了,这篇文章只记录怎样配置LVS。LVS的DR方式是最常用,因此只介绍这一种方式。  配置环境说明:系统CentOS6.2,虚拟IP(VIP)

2013-01-24 22:04:51 8025 2

原创 cpu_relax()-----对自选循环等待(spin-wait loops)操作的优化

在lock_timer_base()函数中看到在for循环操作中调用了cpu_relax(),本来以为是要让出CPU,调度其他进程运行,但是看代码之后发现完全不是这么回事。cpu_relax()中只有一条调用语句,调用的是rep_nop函数。rep_nop()函数如下:static inline void rep_nop(void){ asm volatile("rep; nop" :

2013-01-23 15:27:16 11711

原创 SKB包的接收-----从网卡驱动到TCP层的处理流程

在开发模块过程中,遇到一个问题:在NF_INET_LOCAL_IN钩子处截获数据包后,如果操作失败,还要把这些截获的数据包重新传递到TCP层处理。但是这个操作是在内核线程中完成,不知道会不会对正常的数据包接收过程产生影响?因此,需要知道数据包在从网络层传递到传输层时的上下文环境(指的是是否禁止内核抢占、是否需要获取锁等)。为了解决这个问题,决定将数据包的接收过程从驱动程序到TCP层的处理流程梳理了

2013-01-20 22:50:38 6780 6

原创 epoll源码分析---sys_epoll_wait()函数

一、sys_epoll_wait()函数源码及分析如下所示:/* * Implement the event wait interface for the eventpoll file. It is the kernel * part of the user space epoll_wait(2). */SYSCALL_DEFINE4(epoll_wait, int, epfd

2013-01-16 21:31:32 12865 2

原创 TCP协议发送SKB时ip_summed成员的设置

tcp_send_ack()函数是内核用来发送ACK的函数,该函数比较简单,就是先分配一个SKB包,然后简单的初始化(初始化操作中没有设置ip_summed)后,调用tcp_transmit_skb()来将SKB包传递到IP层。tcp_transmit_skb中先做一些操作后(仔细看过,到计算校验和之前,没有更改过ip_summed),会调用tcp_v4_send_check(语句是:icsk->

2013-01-16 10:57:01 5758

原创 内核模块中错误调用kernel_thread创建内核线程导致模块无法卸载

先介绍一下创建线程的大致流程:在模块的初始化函数中,调用netlink_kernel_create来注册自己的netlink协议,然后返回,接收netlink消息的函数为fcluster_netlink_recv,真正的初始化操作是在接收到netlink报文后才做,创建线程的操作也是在fcluster_netlink_recv中,如下图所示:调用kernel_thread的语句为:

2013-01-16 10:53:57 2554

原创 定位内核模块中导致内核崩溃的代码位置

开发内核模块时,个人认为kdump+crash是必备的工具,kdump用于在内核崩溃时生成转储文件(core文件),crash用来分析core文件,查看崩溃时的栈信息、调用信息、出错的执行路径等。  如果出错的位置是在内核函数中(当然大部分是由于模块不正确地调用内核函数),则很容易看到内核的代码位置。假设出错的函数是blk_requeue_request,出错的位置在blk_requeue_r

2013-01-16 10:48:07 4612 1

原创 linux下用GDB调试可加载模块

参考文章:http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/developers-handbook/kerneldebug-kld.html这篇文章主要是对参考文章的简单整理,大同小异。首先,需要在编译模块时加入调试信息。两种方式,一种是编译时使用“make COPTS-g”,另一种是用“gcc -g”作为“gcc”的别名。

2013-01-16 10:39:49 7266 1

原创 发现一个gcc的“BUG”?

代码如下:#include struct list { struct t *next; int i;};int main(void){ struct list l; printf("len = %lu.n", sizeof(l)); return 0;}上面的list类型中next成员的类型是struct t,但是struct t是未

2013-01-16 10:35:51 1533 1

原创 epoll源码分析---sys_epoll_create()函数

eventpoll的优点就不用说了,网上的资料很多,eventpoll的使用也很广泛,特别是在Web服务器中。因为最近要用到epoll,所以好好地看了一下它的实现,把学到的一些东西做下整理,做个记录。一、sys_epoll_create()  其源码如下:SYSCALL_DEFINE1(epoll_create, int, size){ if (size <= 0)

2013-01-15 18:34:01 5358 1

原创 epoll源码分析---sys_epoll_ctl()函数

一、sys_epoll_ctl()函数 源码和注释如下:/* * @epfd: epool_create创建的用于eventpoll的fd * @op: 控制的命令类型 * @fd: 要操作的文件描述符 * @event:与fd相关的对象. */SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd, str

2013-01-15 18:26:07 5626

深入理解计算机系统

国外经典教程, 经典的讲解操作系统底层原理的好书!

2013-01-15

SQL语句经典大全SQL语句经典大全SQL语句经典大全

SQL语句经典大全 SQL语句经典大全 SQL语句经典大全

2011-04-22

Linux_C高级程序员指南.pdfLinux_C高级程序员指南.pdf

Linux_C高级程序员指南.pdf Linux_C高级程序员指南.pdf Linux_C高级程序员指南.pdf

2011-04-19

经典算法大全,学习算法的好东东

经典的算法大全,对于初学者很好哦。经典的算法大全,对于初学者很好哦。经典的算法大全,对于初学者很好哦。

2011-04-14

C#读取配置文件详细教程

用C#读取配置文件,很详细的哦,而且使用的方法也是比较优化的

2011-04-14

进程线程的概念,讲的很详细

介绍进程线程很详细的资料哦,对学习编程语言很有帮助。面试的时候也会经常被问到这样的问题

2011-04-14

用C#操作数据库用C#操作数据库,很多很全哦

用C#操作数据库,很多很全哦 用C#操作数据库,很多很全哦 用C#操作数据库,很多很全哦

2011-04-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除