- 博客(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
Linux_C高级程序员指南.pdfLinux_C高级程序员指南.pdf
2011-04-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人