
Kernel
文章平均质量分 73
Decisiveness
这个作者很懒,什么都没留下…
展开
-
Linux内核中的IS_ERR()、PTR_ERR()和ERR_PTR()
下面我们就来具体分析一下这段代码,看看内核中的巧妙设计思路。要想明白IS_ERR(),首先理解要内核空间。所有的驱动程序都是运行在内核空间,内核空间虽然很大,但总是有限的,而在这有限的空间中,其最后一个page是专门保留的,也就是说一般人不可能用到内核空间最后一个page的指针。换句话说,你在写设备驱动程序的过程中,涉及到的任何一个指针,必然有三种情况:有效指针;NULL,转载 2015-04-14 23:26:26 · 666 阅读 · 0 评论 -
solutions to errors occured when compiling kernel linux-2.6.31.14
solutions to errors occured when compiling kernel linux-2.6.31.14-----------------------------------------------------------------------------------------------------PROBLEM:-1------------------转载 2016-01-01 00:45:04 · 991 阅读 · 0 评论 -
linux添加一个kernel
在update-grub之后,需要修改/boot/grub/grub.cfg以在开机时选择新添加的kernel, 如下:********************************************************************************terminal_output gfxtermif [ "${recordfail}" = 1 ] ; th原创 2016-01-01 15:00:51 · 631 阅读 · 0 评论 -
cpu_to_le32()
http://www.csse.uwa.edu.au/~chris/uwasp/endian.htmlNAMEFunctions to manipulate the byte-ordering (the endianness) of captured dataSYNOPSIS#include uint16_t le16_to_cpu( uint16_t value );转载 2015-12-21 13:47:36 · 4274 阅读 · 0 评论 -
HZ jiffies tick linux
linux HZ<div class="goog-ws-content goog-ws-content-ie goog-ws-clear" id="jot-content0">Linux核心几个重要跟时间有关的名词或变数,底下将介绍HZ、tick与jiffies。HZ Linux核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来定义每转载 2015-12-25 14:55:32 · 856 阅读 · 0 评论 -
linux模块导出符号 EXPORT_SYMBOL_GPL EXPORT_SYMBOL
一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。在模块mod1中,EXPORT_SYMBOL(func1);在模块mod2中,extern int func1();就可以在mod2中调用func1了。=================================EXPORT_SYMBOL只出现在2.6内核中转载 2015-12-25 17:01:56 · 629 阅读 · 0 评论 -
linux mutex lock: pthread_mutex_t mutex_lock
#include #include pthread_mutex_t mutex_lock; static volatile int count = 0; void *test_func(void *arg) { int i = 0; for(i = 0; i < 2000000; i++) { pthread_原创 2016-01-12 17:26:34 · 800 阅读 · 0 评论 -
pthread_cond_t, pthread_cond_broadcast()与 pthread_mutex_t
pthread线程使用小结1.奇怪的线程参数初始化for( i=0; i{//会有什么问题?pthread_create(&tid,NULL, &thread_client_function, (void*)&i );}上面代码应该很容易明白,创建多个线程,传入序列号作为线程id。基实这里存在一个大bug, 传递的参数会不成功!!示例代码:01.#include转载 2016-01-12 18:07:02 · 579 阅读 · 0 评论 -
tests or sets bit of a u8 type array
tests or sets bit of a u8 type arraystatic inline int uvc_test_bit(const __u8 *data, int bit){return (data[bit >> 3] >> (bit & 7)) & 1;}static inline void uvc_clear_bit(__u8 *data, int b原创 2016-01-14 21:44:11 · 590 阅读 · 0 评论 -
tasklet机制和工作队列
原文link:http://blog.chinaunix.net/uid-28236237-id-3450753.html1. Tasklet机制分析 上面我们介绍了软中断机制,linux内核为什么还要引入tasklet机制呢?主要原因是软中断的pending标志位也就32位,一般情况是不随意增加软中断处理的。而且内核也没有提供通用的增加软中断的接口。其次内,软中断处理函数要求可重转载 2016-05-24 10:21:51 · 3087 阅读 · 0 评论 -
Linux workqueue工作原理
1. 什么是workqueue Linux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的创建,方便了用户的编程. 工作队列(workqueue)是另外一种将转载 2016-05-24 09:37:32 · 460 阅读 · 0 评论 -
device_create_file函数
int device_create_file(struct device *, struct device_attribute *); 在/sys/devices/xxx/目录下创建device属性文件 void device_remove_file(struct device *, struct device_attribute *); 移除转载 2016-05-27 11:25:43 · 7049 阅读 · 0 评论 -
Linux内核module_param的使用
1.定义模块参数的方法:module_param(name, type, perm);其中,name:表示参数的名字; type:表示参数的类型; perm:表示参数的访问权限; 2. 数组类型模块参数的定义:用逗号间隔的列表提供的值;声明一个数组参数:module_param_array(name, type, num, p转载 2016-05-22 20:38:25 · 676 阅读 · 0 评论 -
about macros fs_initcall and module_init
一、macro fs_initcall,以fs_initcall(usb20_init)为例1. fs_initcall(usb20_init) macro展开*******************************************************************************fs_initcall(usb20_init);expanding原创 2016-06-18 14:48:14 · 541 阅读 · 0 评论 -
对Linux的进程内核栈的认识
在重游《LDD3》的时候,又发现了一个当年被我忽略的一句话:“内核具有非常小的栈,它可能只和一个4096字节大小的页那样小” 针对这句话,我简单地学习了一下进程的“内核栈”什么是进程的“内核栈”? 在每一个进程的生命周期中,必然会通过到系统调用陷入内核。在执行系统调用陷入内核之后,这些内核代码所使用的栈并不是原先用户空间中的栈,而是一个内核空间的栈,这个称作进程的转载 2016-07-18 21:05:37 · 1987 阅读 · 0 评论 -
wait_event_interruptible 使用方法
1. 关于 wait_event_interruptible() 和 wake_up()的使用 读一下wait_event_interruptible()的源码,不难发现这个函数先将 当前进程的状态设置成TASK_INTERRUPTIBLE,然后调用schedule(), 而schedule()会将位于TASK_INTERRUPTIBLE状态的当前进程从runqueue转载 2015-12-30 17:42:56 · 580 阅读 · 0 评论 -
Module.symvers and make modules
when making a myuvc.c to generate a myuvc.ko module or ins, some warnings reported of some funcs not defined(they are defined in drivers/media/video/uvc/*.c and there are references of them in myuvc.c原创 2016-01-16 23:55:01 · 960 阅读 · 0 评论 -
kernel中的函数__request_region()
下图为示意图,读者可以参考该图来阅读代码。个人认为对Linux下I/O资源的管理如掌握__request_region函数就能掌握其精髓。Linux下对I/O资源主要用结构体resource来管理,管理的方法就是用resource来描述使用的I/O资源的状态,并将这些resource用如下两个resource作为表头按地址大小的顺序链接起来。struct r转载 2015-04-15 16:13:09 · 2932 阅读 · 0 评论 -
__iomem
Most reasonably current cards for the PCI bus (and others) provide one or more I/O memory regions to the bus. By accessing those regions, the现在绝大多数PCI总线卡(和其他人)提供一个或多个I / O总线的内存区域。通过访问这些内存区域,转载 2015-04-14 21:20:36 · 1453 阅读 · 0 评论 -
关于__init、__initdata和__exit、__exitdata的学习笔记
__initdata用法例子:static struct init_tags {struct tag_header hdr1;struct tag_core core;struct tag_header hdr2;struct tag_mem32 mem;struct tag_header hdr3;} init_tags __initdata = {{ ta转载 2015-04-17 17:31:45 · 568 阅读 · 0 评论 -
linux内核中__acquires用来检查什么、Sparse
linux内核中__acquires用来检查什么*******************************************************************************************************************************************#ifdef __CHECKER__ ……转载 2015-05-13 21:58:07 · 2426 阅读 · 0 评论 -
EXPORT_SYMBOL
linux2.6的“/prob/kallsyms”文件对应着内核符号表,记录了符号以及符号所在的内存地址。模块可以使用如下宏导出符号到内核符号表:[c-sharp] view plaincopyEXPORT_SYMBOL(符号名); EXPORT_SYMBOL_GPL(符号名) 导出的符号可以被其他模块使用,不转载 2015-05-14 20:17:13 · 437 阅读 · 0 评论 -
linux内核部件分析(三)——记录生命周期的kref
kref是一个引用计数器,它被嵌套进其它的结构中,记录所嵌套结构的引用计数,并在计数清零时调用相应的清理函数。kref的原理和实现都非常简单,但要想用好却不容易,或者说kref被创建就是为了跟踪复杂情况下地结构引用销毁情况。所以这里先介绍kref的实现,再介绍其使用规则。 kref的头文件在include/linux/kref.h,实现在lib/kref.c。闲话少说,上代码。转载 2015-06-16 13:56:07 · 435 阅读 · 0 评论 -
task_rq(p)
task_rq(p) 获取进程p所在的runqueue的首地址--------------------------------------------#define task_rq(p) cpu_rq(task_cpu(p))#define cpu_rq(cpu) (&per_cpu(runqueues, (cpu)))task_cpu(p) 获取进程p转载 2015-05-18 20:18:23 · 501 阅读 · 0 评论 -
在Linux下改变进程的优先级. normal_prio
在Linux下改变进程的优先级作者:曾老师,华清远见嵌入式学院讲师。作为多任务的操作系统,Linux内核为每个创建的进程分配时间片并根据其优先级进行调度。当进程被创建时,其对应的task_struct里包含了四个优先级:struct task_struct { …… int prio, static_prio, nor转载 2015-05-22 12:19:30 · 2546 阅读 · 0 评论 -
linux内核调度算法(2)--CPU时间片如何分配
内核在微观上,把CPU的运行时间分成许多分,然后安排给各个进程轮流运行,造成宏观上所有的进程仿佛同时在执行。双核CPU,实际上最多只能有两个进程在同时运行,大家在top、vmstat命令里看到的正在运行的进程,并不是真的在占有着CPU哈。所以,一些设计良好的高性能进程,比如nginx,都是实际上有几颗CPU,就配几个工作进程,道理就在这。比如你的服务器有8颗CPU,那么nginx work转载 2015-05-22 16:29:09 · 781 阅读 · 0 评论 -
启动内核,运行到Freeing init memory: 120K卡死的解决方法
问题描述:启动内核,运行到Freeing init memory: 120K卡死,具体如下:......yaffs: dev is 32505858 name is "mtdblock2"yaffs: passed flags ""yaffs: Attempting MTD mount on 31.2, "mtdblock2"yaffs: a转载 2015-05-19 19:08:27 · 5804 阅读 · 1 评论 -
关于 wait_event_interruptible() 和 wake_up()的使用
1. 关于 wait_event_interruptible() 和 wake_up()的使用 读一下wait_event_interruptible()的源码,不难发现这个函数先将 当前进程的状态设置成TASK_INTERRUPTIBLE,然后调用schedule(), 而schedule()会将位于TASK_INTERRUPTIBLE状态的当前进程从runqueue 队转载 2015-06-05 14:20:54 · 572 阅读 · 0 评论 -
根文件系统挂载
1) 在RamDisk为initramfs时start_kernel()->vfs_caches_init()->mnt_init()->init_rootfs()->init_mount_tree()注册了类型为rootfs的fs 然后:start_kernel 最后 rest_init->kernel_initkernel_init->do_basic_setup->do_in转载 2015-10-04 15:47:35 · 718 阅读 · 0 评论 -
prepare_namespace()函数 挂载rootfs
今天发现sqashfs制作的根文件系统不需要像jffs2那样需要增加内核命令行:rootfstype=jffs2。看了一下内核挂载根文件系统个过程,发现是JFFS2注册文件系统时少设置了一个标志:FS_REQUIRES_DEV。修改点: fs/jffs2/super.cstatic struct file_system_type jffs2_fs_type = { .ow转载 2015-10-04 15:52:45 · 1702 阅读 · 0 评论 -
编译linux外部驱动模块时的基础知识
linux内核模块编译引言为了清晰的编译Linux内核,内核编译系统使用Kbuild规则对编译的过程以及依赖进行规约。在内核模块的编译中,为了保持与内核源码的兼容以及传递编译链接选项给GCC,也使用Kbuild规则。内核模块的源代码可以在内核源码树中,也可以在内核源码树外,当使用Kbuild时,两种情况的编译方式也大致相似。一般的内核模块在开发时,都是放在源码树外的。本文主转载 2016-01-17 00:00:29 · 1513 阅读 · 0 评论 -
Android/Linux Kernel 内存管理-入门笔记
Android/Linux Kernel上下層的記憶體管理機制,由於牽涉到基礎,核心與使用者空間的Framework,這系列的文章會分為幾個單元,依據筆者自己的時間安排,逐一分享出來,並希望對各位有所助益.相對於整理Kernel 排程,FileSystem,與相關核心模組的知識,重新再去彙整Kernel記憶體機制的Topics,會發現表現上看似簡單的Malloc/Free,背後的諸多細節都转载 2017-02-12 22:06:18 · 2982 阅读 · 0 评论