上一页 1 ··· 5 6 7 8 9
摘要: Linux内核中最常见的锁是自旋锁。一个自旋锁就是一个互斥设备,它只能有两个值:"锁定"和"解锁"。如果锁可用,则"锁定"位被设置,而代码继续进入临界区;相反,如果锁被其他进程争用,则代码进入忙循环并重复检查这个锁,直到锁可用为止。这个循环就是自旋锁的"自旋"。自旋锁最多只能被一个可执行的线程持有。如果一个执行线程试图获得一个被争用的自旋锁,那么该线程就会一直进行忙循环-旋转-等待锁重新可用。注意,同一个锁可以用在多个位置。缺点:一个被争用的自旋锁使得请求它的线程在等待锁重新可用时自旋(特别浪费处理器时间)。所以, 阅读全文
posted @ 2013-11-24 21:34 葫芦娃Vs奥特曼 阅读(346) 评论(0) 推荐(0) 编辑
摘要: 2.4.1 内存申请和释放 include/linux/kernel.h里声明了kmalloc()和kfree()。用于在内核模式下申请和释放内存。 void *kmalloc(unsigned int len,int priority); void kfree(void *__ptr); 与用户模式下的malloc()不同,kmalloc()申请空间有大小限制。长度是2的整次方。可以申请的最大长度也有限制。另外kmalloc()有priority参数,通常使用时可以为GFP_KERNEL,如果在中断里调用用GFP_ATOMIC参数,因为使用GFP_KERNEL则调用者可能进入sleep状态, 阅读全文
posted @ 2013-11-24 21:32 葫芦娃Vs奥特曼 阅读(1010) 评论(0) 推荐(0) 编辑
摘要: 1. 序最近在折腾各种.so,碰到了一些问题,一开始对于很多错误也没有头绪,茫然不知所措。索性化了一天多时间将>中部分内容略读了一遍,主要是关于编译,链接和加载这块的。于是顺便做个笔记,方便以后回顾。基本上知道了这些,对于编译,链接和加载过程中产生的各种问题,应该就能从根本上理解并解决了。其实以前上学时也看过那本经典的>,当时还写了篇>,不过此次会更细致深入地了解下整个编译链接和加载过程,并结合经常碰到的问题,提出一些解决方案。2. 编译和链接2.1. 编译过程广义的代码编译过程,实际上应该细分为:预处理,编译,汇编,链接。预处理过程,负责头文件展开,宏替换,条件编译的选择, 阅读全文
posted @ 2013-11-24 21:26 葫芦娃Vs奥特曼 阅读(345) 评论(0) 推荐(0) 编辑
摘要: 1. 在Linux下,如何确认是多核或多CPU:#cat /proc/cpuinfo如果有多个类似以下的项目,则为多核或多CPU:processor : 0......processor : 12. Linux下,如何看每个CPU的使用率:#top -d 1之后按下1. 则显示多个CPUCpu0 : 1.0%us, 3.0%sy, 0.0%ni, 96.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu1 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st3. 如何察看某个进程在哪个CP 阅读全文
posted @ 2013-11-24 21:22 葫芦娃Vs奥特曼 阅读(335) 评论(0) 推荐(0) 编辑
摘要: 内核中有多项用于调试的功能,但这些功能会造成额外输出,并导致性能下降,因此发行版本厂商通过都禁止发行版内核中的这些功能。但作为一名内核开发者,调试需求具有更高的优先级,因此应该构造并安装自己的内核,并打开这些调试选项。一、内核中的调试选项CONFIG_DEBUG_KERNELThis option just makes other debugging options available; it should be turned on but does not, by itself, enable any features.CONFIG_DEBUG_SLABThis crucial option 阅读全文
posted @ 2013-11-23 22:08 葫芦娃Vs奥特曼 阅读(521) 评论(0) 推荐(0) 编辑
摘要: setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理。先来看一下这两个函数的定义吧:setjmp和longjmp的函数原型在setjmp.h中函数原型:int setjmp(jmp_buf envbuf);setjmp函数用缓冲区envbuf保存系统堆栈的内容,以便后续的longjmp函数使用。setjmp函数初次启用时返回0值。void longjmp(jmp_buf envbuf, int val);longjmp函数中的参数envbuf是由setjmp函数所保存的堆栈环境 阅读全文
posted @ 2013-11-23 21:47 葫芦娃Vs奥特曼 阅读(159) 评论(0) 推荐(0) 编辑
摘要: volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。例如:volatile int i=10;int j = i;...int k = i;volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把 阅读全文
posted @ 2013-11-22 21:05 葫芦娃Vs奥特曼 阅读(183) 评论(0) 推荐(0) 编辑
上一页 1 ··· 5 6 7 8 9