kernel
文章平均质量分 61
tmkeepgood
这个作者很懒,什么都没留下…
展开
-
从spin_lock到spin_lock_irqsave
Spinlock的目的是用来同步SMP中会被多个CPU同时存取的变量。在Linux中,普通的spinlock由于不带额外的语义,使用起来反而要非常小心。 在Linux kernel中执行的代码大体分normal和interrupt context两种。tasklet/softirq可以归为normal因为他们可以进入等待;nested interrupt是interrupt context的一种特转载 2013-05-01 14:51:33 · 476 阅读 · 0 评论 -
tasklet、wait_queue、completion、work_queue用法总结
对于内核中常用的中断处理机制tasklet/work_queue/wait_queue/completion做一些总结,方便在合适的时候采用合适的机制。原创 2014-11-07 17:21:29 · 2274 阅读 · 1 评论 -
工作队列的使用
由于在中断中不能进行阻塞型操作,而有时候确实需要在中断时读取某些内存单元的值,此时可以考虑利用工作队列来实现。 struct work_struct xxx_wq;//定义工作队列......INIT_WORK(&xxx_wq,read_data);//初始化工作队列,在工作队列中需要执行的是函数read_data......schedule_work(&read_busm原创 2013-12-16 11:03:42 · 901 阅读 · 0 评论 -
linux 添加系统调用的方法(arm架构)
在linux中,系统调用是非常重要的一个机制。本文首先探讨了系统调用需要哪些文件的支持,之后讨论如何增加自己的系统调用。原创 2014-08-16 22:54:10 · 2705 阅读 · 0 评论 -
利用mmc_test.c研究mmc模块
mmc初始化流程研究及mmc_test.c的使用不清楚mmc_test.c的作者希望大家如何利用该模块,通过向该模块的probe函数传入一个合法的mmc_card指针,便可完成对该模块的使用。原创 2014-09-16 20:12:20 · 3181 阅读 · 2 评论 -
内核通知链机制的原理及实现
转自:http://blog.sina.com.cn/s/blog_6683e49d0100tovr.html一、概念: 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣。为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子系统,Linux内核提供了通知链的机制。通知链表只能够在内核的子系统之间使用,而不能够在内核与用户空间之间进行事件的通知转载 2014-02-24 13:10:12 · 534 阅读 · 0 评论 -
Linux中的工作队列
转自 http://tanatseng.blog.163.com/blog/static/174991629201132734828701/工作队列一般用来做滞后的工作,比如在中断里面要做很多事,但是比较耗时,这时就可以把耗时的工作放到工作队列。说白了就是系统延时调度的一个自定义函数。 工作队列是实现延迟的新机制,从 2.5 版本 Linux内核开始提供该功能。不同于微线程一步转载 2014-02-24 13:06:04 · 908 阅读 · 0 评论 -
u-boot 到 kernel 传递参数的流程
u-boot部分:normal_mode -> vlx_nand_boot -> vlx_entry 8f860134 :8f860134: e92d4008 push {r3, lr}8f860138: eb000869 bl 8f8622e4 8f86013c: e30017de原创 2014-01-22 22:01:43 · 1024 阅读 · 0 评论 -
解密module_init
在Linux底下写过driver模块的对这个宏一定不会陌生。module_init宏在MODULE宏有没有定义的情况下展开的内容是不同的,如果这个宏没有定义,基本上表明阁下的模块是要编译进内核的(obj-y)。1.在MODULE没有定义这种情况下,module_init定义如下:#define module_init(x) __initcall(x);因为#define __ini转载 2014-01-08 17:34:26 · 521 阅读 · 0 评论 -
通过mmap将连续物理地址映射到用户空间
由于MMU对用户空间的内存采用页式管理,用户空间的内存都是虚拟的,只有当真正写入物理内存时,系统才会判断是否为该虚拟内存分配物理内存,如果未分配就会触发缺页中断,然后分配一整页的内存给应用程序。所以用户空间的内存表面上连续,但是实际的物理内存不一定连续。 由于种种原因,我们有时候会需要用户空间的虚拟内存在物理上面也连续。按照MMU的管理方式,虚拟内存最多只能有一页——409原创 2013-12-13 20:40:54 · 6633 阅读 · 4 评论 -
strtol的用法
该函数可用于将ASCII码转换为各种进制的数。 unsigned long value = strtol("0x12345678",NULL,16);第一个参数用于设定待转换的字符串(会自动识别0x),第二个参数和起始位置有关,第三个参数用于设定需要的进制。结果:12345678原创 2013-12-04 08:26:41 · 655 阅读 · 0 评论 -
ffs的另外一种实现方法
kernel中有个宏ffs,是用于从一个数中找出第一个为1的位(由低到高),为了提高效率,用了汇编指令实现。在其它应用中,由于不需要考虑效率问题,可以采用其他方式实现:原创 2013-12-03 14:12:30 · 1822 阅读 · 0 评论 -
Linux内核中ioremap映射的透彻理解
几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结构的不同,CPU对IO端口的编址方式有两种: (1)I/O映射方式(I/O-mapped) 典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如X86的IN和O转载 2013-11-28 13:22:01 · 539 阅读 · 0 评论 -
__builtin_constant_p(x)
gcc的内建函数,当x为常数时返回1, x为变量时返回0. 不过这并不完全准确。linux kernel的代码中经常有这样的代码:if (__builtin_constant_p(x)) {do1;} else {do2;}可以认为这个函数的求值在编译时就完成了。从而外面的条件跳转语句的两个分支,只有其中一个会出现在目标代码中。准确的定义应该是:如果x的值在编译时能转载 2013-11-26 15:41:50 · 2287 阅读 · 0 评论 -
使用__builtin_return_address获得程序运行栈情况
项目中遇到了一个多线程的问题,系统总是莫名其妙的崩溃,而且bug不可重现,后来发现是接收到某些信号的问题,于是乎就加入了信号处理函数,想获得是什么地方触发了这个信号,因为感觉多线程调试比较麻烦,于是就想到了使用利用__builtin_return_address来获得函数运行栈的方法。直接上测试代码: #include #include #include转载 2013-11-26 15:42:36 · 859 阅读 · 0 评论 -
物理内存的分配
物理内存的分配在内核分配内存时,必须记录页帧的已分配或空闲状态,以免两个进程使用同样的内存区域。由于内存分配和释放非常频繁,内核还必须保证相关操作尽快完成。内核可以只分配完整的页帧。将内存划分为更小的部分的工作,则委托给用户空间中的标准库。标准库将来源于内核的页帧拆分为小的区域,并为进程分配内存。1. 伙伴系统内核中很多时候要求分配连续页。为快速检测内存中的连续区域,内核采用了一种古老而历转载 2013-11-22 13:32:49 · 1158 阅读 · 0 评论 -
typecheck()
typeof是取变量的类型如果 int x;typecheck(double,x);展开之后就是double __dummy;int __dummy2; (void)(&__dummy == &__dummy2); & 是取地址;这样的话,上面那句比较就会出错或编译器给出警告,因为是讲一个double型的指针和一个int型的指针比较,没法编译的,编译器会提示如原创 2013-05-01 15:19:28 · 978 阅读 · 0 评论 -
linux中通过等待队列来实现阻塞
linux中,可以用wait_queue来实现阻塞。原创 2014-08-16 22:27:36 · 741 阅读 · 0 评论