Linux kernel
进哥说Java面试
这个作者很懒,什么都没留下…
展开
-
字符设备驱动程序
#include #include #include //#include #include #include MODULE_LICENSE("GPL");int globalvar_open(struct inode *inode,struct file* filp);int globalvar_release(struct inode *i原创 2013-09-25 16:32:13 · 684 阅读 · 0 评论 -
线程栈和进程栈 区别
要搞清线程栈和进程栈的区别,首先要弄清线程和进程之间的关系。线程和进程有很多类似的地方,人们习惯上把线程称为轻量级进程,这个所谓的轻量级是指线程并不拥有自己的系统资源,线程依附于创建自己的进程。我们可以从l两个个方面来理解线程的轻量级1. 调度由于进程之间的线程共享同一个进程地址空间,因此在进程的线程之间做进程切换,并不会引起进程地址空间的切换,从而避免转载 2014-09-18 16:40:14 · 1135 阅读 · 0 评论 -
多个commit 合并为一个patch
有时候开发一个功能需要commit 很多次才能有一个比较精简的版本。 但是此时只允许打一个patch,如果这样就要把这几个commit 信息合并。可以通过git reset + git merge 命令来搞定。对于一个test 工程 git log 看其提交的过程:[plain] view plaincopyprint?转载 2014-08-26 15:20:50 · 3705 阅读 · 0 评论 -
Hello World 模块以及对应的内核makefile详解
hello.c:#include linux/module.h> //所有模块都需要的头文件#include linux/init.h> // init&exit相关宏MODULE_LICENSE("GPL");MODULE_AUTHOR("feifei");MODULE_DESCRIPTION("hello world module");转载 2014-09-22 11:13:50 · 825 阅读 · 0 评论 -
中断VS异常
原创 2014-12-17 13:14:09 · 988 阅读 · 0 评论 -
进程与线程的比较
传统进程相当于一个线程的任务。通常一个进程都拥有若干个线程,至少有一个线程。调度:传统中:进程是拥有资源的基本单位和独立调度分配的基本单位。引入线程后:线程作为调度和分派的基本单位,进程作为资源拥有的基本单位。线程基本上不再拥有资源,提高系统的并发程度。通过一个进程中的线程切换不会引起进程的切换,但是一个进程中的线程切换到另一个进程中的线程时将会引起进程的切换。并发性:在引入线程的转载 2014-12-05 19:46:03 · 766 阅读 · 0 评论 -
Linux内存管理之mmap详解
一. mmap系统调用1. mmap系统调用 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用.转载 2014-12-07 19:36:54 · 734 阅读 · 0 评论 -
Linux 虚拟内存和物理内存
首先,让我们看下虚拟内存: 第一层理解1. 每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构2. 一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的task_struct记录,task_struct中记录中一条链表,记录中内存空间的分配情况,哪转载 2015-01-13 21:25:30 · 745 阅读 · 0 评论 -
多队列网卡
多队列网卡是一种技术,最初是用来解决网络IO QoS (quality of service)问题的,后来随着网络IO的带宽的不断提升,单核CPU不能完全处满足网卡的需求,通过多队列网卡驱动的支持,将各个队列通过中断绑定到不同的核上,以满足网卡的需求。常见的有Intel的82575、82576,Boardcom的57711等,下面以公司的服务器使用较多的Intel 82575网卡为例,分析转载 2015-09-02 18:25:25 · 518 阅读 · 0 评论 -
Linux系统中RPS/RFS介绍
1 RPS/RFS 介绍1.1 RPS/RFS出现的原因RPS/RFS 功能是在Linux- 2.6.35中有google的工程师提交的两个补丁,这两个补丁的出现主要是基于以下两点现实的考虑:(1) 这两个补丁的出现,是由于服务器的CPU越来越强劲,可以到达十几核、几十核,而网卡硬件队列则才4个、8个,这种发展的不匹配造成了CPU负载的不均衡。(2) 上面转载 2015-09-04 23:53:37 · 1056 阅读 · 0 评论 -
Linux技巧:多核下绑定硬件进程到不同CPU
硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大量硬件中断分配给不同的 CPU (core) 处理显然能很好的平衡性能。现在的服务器上动不动就是多 CPU 多核、多网卡、多硬盘,如果能让网卡中断独占1个 CPU (core)、磁盘 IO 中断独占1个 CPU 的话将会大大减轻单一 CPU 的负担、提高整体处理效率。我前天收到一位网友的邮件提到了 SMP IRQ转载 2015-09-05 08:57:35 · 2033 阅读 · 0 评论 -
自旋锁spin_lock和raw_spin_lock
1. 临界区(Critical Section)我们知道,临界区是指某个代码区间,在该区间中需要访问某些共享的数据对象,又或者是总线,硬件寄存器等,通常这段代码区间的范围要控制在尽可能小的范围内。临界区内需要对这些数据对象和硬件对象的访问进行保护,保证在退出临界区前不会被临界区外的代码对这些对象进行修改。出现以下几种情形时,我们需要使用临界区进行保护:(1) 在可以抢占(p转载 2014-07-05 22:21:26 · 705 阅读 · 0 评论 -
内核地址空间分布和进程地址空间
inux内核内核地址空间分布直接映射区:线性空间中从3G开始最大896M的区间,为直接内存映射区,该区域的线性地址和物理地址存在线性转换关系:线性地址=3G+物理地址。动态内存映射区:该区域由内核函数vmalloc来分配,特点是:线性空间连续,但是对应的物理空间不一定连续。vmalloc分配的线性地址所对应的物理页可能处于低端内存,也可能处于高端内存。永久内存映射区:该转载 2014-05-29 19:37:53 · 998 阅读 · 0 评论 -
详解内核list_head结构
struct list_head{ struct list_head *prev; struct list_head *next;};链表的定义与初始化,宏的参数用小括号括起来防止出现扩展异常#define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) \转载 2013-12-31 14:38:27 · 760 阅读 · 0 评论 -
DMA学习资料
http://blog.chinaunix.net/uid-26941022-id-3525539.html http://www.oschina.net/code/explore/linux-2.6.36/drivers/dma/ioat/dca.c原创 2013-12-19 21:17:37 · 860 阅读 · 0 评论 -
Linux程序编译速度提高方法
1. 使用tmpfs来代替部分IO读写 2. ccache,可以将ccache的缓存文件设置在tmpfs上,但是这样的话,每次开机后,ccache的缓存文件会丢失 3.distcc,多机器编译 4.将屏幕输出打印到内存文件或者/dev/null中,避免终端设备(慢速设备)拖慢速度。 项目越来越大,每次需要重新编译整个项目都是一件很浪费时间的事情。Resear转载 2013-12-20 21:14:34 · 1255 阅读 · 0 评论 -
DMA Engine
#include #include #include #include #include #include #include //#include #define PAGE_SIZE 1 #define SIZE 10MODULE_LICENSE("GPL");void callback(void *param){ struct compl原创 2013-12-22 22:16:25 · 1619 阅读 · 0 评论 -
insmod加载模块错误分析
1.no symbol version for module_layout 原因: Makefile 中include 指向 Module.symvers 版本不符解决方法:找到与内核版本相同源文件夹,其下须包含Module.symvers文件2.insmod: error inserting '*.ko': -1 Unknown symbol in module dmes原创 2013-12-23 17:27:29 · 6335 阅读 · 0 评论 -
浅谈Linux PCI设备驱动
浅谈Linux PCI设备驱动(一) 要弄清楚Linux PCI设备驱动,首先要明白,所谓的Linux PCI设备驱动实际包括Linux PCI设备驱动和设备本身驱动两部分。不知道读者理不理解这句话,本人觉得这句话很重要,对于PCI、USB这样的驱动来说,必须要理解这个概念,才能明白该如何看待Linux下的PCI和USB以及类似的总线型的驱动。理由也很简单,就是Linux PCI驱动是内核自带转载 2013-12-26 15:52:38 · 1233 阅读 · 0 评论 -
Linux 中的零拷贝技术
为什么要扩展 Linux I/O API传统的 Linux 输入输出接口,比如读和写系统调用,都是基于拷贝的,也就是说,数据需要在操作系统内核和应用程序定义的缓冲区之间进行拷贝。对于读系统调用来说,用户应用程序呈现给操作系统内核一个预先分配好的缓冲区,内核必须把读进来的数据放到这个缓冲区内。对于写系统调用来说,只要系统调用返回,用户应用程序就可以自由重新利用数据缓冲区。为了支持上面转载 2014-01-21 21:18:34 · 864 阅读 · 0 评论 -
自旋锁在抢占(或非抢占)单核和多核中的作用
(1) linux上的自旋锁有三种实现: 1. 在单cpu,不可抢占内核中,自旋锁为空操作。 2. 在单cpu,可抢占内核中,自旋锁实现为“禁止内核抢占”,并不实现“自旋”。 3. 在多cpu,可抢占内核中,自旋锁实现为“禁止内核抢占” + “自旋”。(2) 关于抢占式内核与非抢占式内核: 在非抢占式内转载 2014-05-18 08:58:54 · 7265 阅读 · 0 评论 -
netlink实例
#include #include #include #include #include #include #include #include #include #include #define MAX_PAYLOAD 1024 /* maximum payload size*/struct sockaddr_nl src_addr, dest_原创 2014-06-04 16:38:18 · 917 阅读 · 0 评论 -
中断处理程序、中断上下文中处理延时及一些函数的调用规则
1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,msleep等,理由是中断程序并不是进程,没有进程的概念,因此就没有休眠的概念;2,中断处理程序中的延时可以用忙等待函数来代替,如ndelay,udelay,mdelay等,这些函数在实现上本质是根据CPU频率进行一定次数的循环;最好不要使用mdelay,因为毫秒延时对内核来说已经是非常大了。但是在中断处理程序中转载 2014-06-29 20:53:36 · 2113 阅读 · 0 评论 -
linux异步IO浅析
知道异步IO已经很久了,但是直到最近,才真正用它来解决一下实际问题(在一个CPU密集型的应用中,有一些需要处理的数据可能放在磁盘上。预先知道这些数据的位置,所以预先发起异步IO读请求。等到真正需要用到这些数据的时候,再等待异步IO完成。使用了异步IO,在发起IO请求到实际使用数据这段时间内,程序还可以继续做其他事情)。假此机会,也顺便研究了一下linux下的异步IO的实现。linux下转载 2016-09-17 20:23:54 · 673 阅读 · 0 评论