linux kernel basic
文章平均质量分 61
lamdoc
这个作者很懒,什么都没留下…
展开
-
container_of()
container_of()函数 1.该宏定义在include/linux/kernel.h中 439/** 440 * container_of - cast a member of a structure out to the containing structure 441 * @ptr: the pointer to the member. 4原创 2012-06-14 09:20:25 · 276 阅读 · 0 评论 -
printk _dmesg 打印显示等级
要将linux内核的带级别控制的printk内容打印出来,在命令行 输入 dmesg -n 8 就将所有级别的信息都打印出来Linux命令:dmesg 功能说明:显示开机信息。 语 法:dmesg [-cn][-s ] 补充说明:kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息亦保存在/var/log目录中,原创 2012-06-18 17:56:59 · 466 阅读 · 0 评论 -
链表 - list
链表是一种存放和操作可变数量元素(常称为节点)的数据结构。链表与数据结构的区别:链表所包含的元素可以动态的创建并插入链表,各个元素无须占用连续内存。1.链表分类 a. 单向链表: 这其实是一个递归。struct list_element { void *data; struct list_element *next;}b. 双原创 2012-06-13 16:52:16 · 321 阅读 · 0 评论 -
队列 -- fifo
linux 内核通用队列称为 kfifo. 定义于中linux 的 kfifo 和多数其他队列一样,也提供了两个主要函数,enqueue(入队列) 和 dequeue(出队列)kfifo 对象 维护了两个偏移量,入口偏移 和 出口偏移。入口偏移 指下一次入队列时的位置出口偏移 指下一次出队列的位置。出口偏移 总是小于等于 入口偏移,否则就意味着要出队列的元素根本没有入队列。原创 2012-06-14 11:31:32 · 1087 阅读 · 4 评论 -
驱动中platform resource 和 porbe 之间的关系
1. platform_device 会包含platform_data 和 resource定义:一般platform device信息,会定义在 arch/arm/mach-xxx/board-xxx.c 中。如这里的sarac模块,被定义在arch/arm/mach-cartesio/core-sta2065.c中static struct platform_device sa原创 2012-12-11 10:55:35 · 466 阅读 · 0 评论 -
module_param除了在加载模块时,另外一种传递参数的方法
module_param 最后的字段是一个权限值,表示此参数在sysfs文件系统中所对应的文件节点的属性。你应当使用 中定义的值,这个值控制谁可以存取这些模块参数在 sysfs 中的表示.当perm为0时,表示此参数不存在 sysfs文件系统下对应的文件节点。 否则, 模块被加载后,在/sys/module/ 目录下将出现以此模块名命名的目录, 带有给定的权限.。sys/mo原创 2013-02-20 15:58:10 · 351 阅读 · 0 评论 -
BSS段_数据段_代码段_堆_栈
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。代码段:代码段(code segment/text segment)通常是指用原创 2012-08-17 15:50:22 · 565 阅读 · 0 评论 -
wait, WIFEXITED, WEXITSTATUS
wait的函数原型是: #include /* 提供类型pid_t的定义 */ #include pid_t wait(int *status)进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有转载 2013-04-07 13:42:55 · 388 阅读 · 0 评论 -
mmap读写/dev/mem设备,可用于读取物理内存内容
mmap操作提供了一种机制,让用户程序直接访问设备内存,这种机制,相比较在用户空间和内核空间互相拷贝数据,效率更高。在要求高性能的应用中比较常用。mmap映射内存必须是页面大小的整数倍,面向流的设备不能进行mmap,mmap的实现和硬件有关。mmap原型:#include void *mmap(void *start, size_t length, int prot, int flags原创 2012-12-05 15:11:53 · 875 阅读 · 2 评论 -
Altera CPLD maxII 的 JTAG 编程
最近在调试JTAG,通过对ATOM的GPIO 操作,把ATOM的GPIO口模拟成JTAG信号,然后把CPLD的firmware,从ATOM平台烧进CPLD中。这里主要是使用了Altera的 STAPL工具, 叫jamplayer, 这是一个开源的工具,再source下,直接make就能生成jamplayer工具。还需要在quartusII中把xxx.pof 格式的CPLD firmware原创 2013-04-21 07:12:23 · 1804 阅读 · 0 评论 -
返汇编-objdump
arm-none-linux-gnueabi-objdump -d vmlinux >111objdump -d原创 2013-07-31 18:43:51 · 477 阅读 · 0 评论 -
模块的使用计数
linux2.6内核 提供了模块计数接口:int try_module_get(struct module *module);该函数用于增加模块使用计数;若返回0,表示调用失败,希望被使用的模块没有被加载或正在卸载中。void module_put(struct module *module);该函数用于减少模块使用计数。 linux2.6内核为不同类型的设备定义了stru原创 2012-06-22 13:57:56 · 279 阅读 · 0 评论 -
注册字符设备时的 class_create() 与 device_create()
在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点,当然前提条件是用户空间移植了udev。内核中定义了struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_cre转载 2012-07-25 15:19:42 · 454 阅读 · 0 评论 -
copy_from_user() and copy_to_user()
Defined in /arch/arm/include/asm/uaccess.h1. copy_from_user() and copy_to_user() 调用了__*** static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned l原创 2012-06-14 09:21:24 · 626 阅读 · 0 评论 -
uboot 和 kernel 中的分区修改
1.uboot中修改分区,在/uboot/include/configs/pdk7105.h 中: #ifdef CONFIG_CMD_NAND /* NAND flash present ? */# define CFG_MAX_NAND_DEVICE 1# define NAND_MAX_CHIPS CFG_MAX_NAND_DEVICE# define CFG原创 2012-06-18 18:03:00 · 790 阅读 · 0 评论 -
linux下错误的捕获:errno和strerror的使用
经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因。这个时候使用errno这个全局变量就相当有用了。 在程序代码中包含 #include ,然后每次程序调用失败的时候,系统会自动用用错误代码填充errno这个全局变量,这样你只需要读errno这个全局变量原创 2012-06-25 11:38:54 · 347 阅读 · 0 评论 -
pid_uid_gid
pid: process id,进程IDppid: parent process id,父进程IDuid: real user id, 用户IDeuid: effective user id,有效用户IDgid: real group id,组IDegid: effictive group id,有效组ID下面来看一下简单程序的输出:#include #inclu原创 2012-06-25 11:36:59 · 336 阅读 · 0 评论 -
printk 参数
#ifdef DEBUG#define PRINTK(fmt, arg...) printk(KERN_NOTICE fmt, ##arg)#else#define PRINTK(fmt, arg...)#endif/* KERN_EMERG 用于紧急事件,一般是系统崩溃前的提示信息 KERN_ALERT 用于需要立即采取动作的场合 KERN_CRIT原创 2012-06-25 11:33:16 · 115 阅读 · 0 评论 -
helloworld.ko
helloworld模块:xxha@xxha-OptiPlex-780:~/share/learning/songbaohua/4_char_device_driver/helloworld$vim hello.c1 /*====================================================================== 2 A simple原创 2012-06-22 13:56:11 · 307 阅读 · 0 评论 -
模块参数 --- parameters
为模块定义一个参数:module_param(参数名,参数类型,参数读/写权限) //可定义各种类型参数,该参数可由加载模块时,外部传入。以下示例定义了一个整型参数和一个字符指针参数:static char *bookname = "dissecting linux device driver";static int num = 4000;module_param(num, i原创 2012-06-22 13:48:41 · 414 阅读 · 0 评论 -
导出符号 --- EXPORT_SYMBOL()
linux2.6的 /proc/kallsyms 文件对应着内核符号表,它记录了符号及符号的内存地址。模块可以使用如下宏 导出符号到内核符号表:EXPORT_SYMBOL(name);EXPORT_SYMBOL_GPL(name); //只适用于包含GPL许可权的模块。示例:export_symb.c导出整数加,减运算函数符号的内核模块。xxha@xxha-Op原创 2012-06-22 13:51:53 · 447 阅读 · 0 评论 -
模块的声明与描述
1. 模块的许可证明 (MODULE_LICENSE): 声明描述内核模块的许可权限。如果不声明LICENSE,模块被加载时,会收到内核被污染(kernel tainted)的警告。linux2.6内核中,可接受的MODULE_LICENSE包括:"GPL""GPL v2""GPL and additional rights""Dual BSD/GPL""Dual MPL/原创 2012-06-22 13:54:53 · 644 阅读 · 0 评论 -
IS_ERR() 与 PTR_ERR()
像struct class *cls = class_create();这种语句,其中返回的指针值并不行kmalloc一样这么简单,只判断是否为NULL就可以了,内核是返回其错误值。那么我怎么来判断它呢,总不能用if()来将每个错误例出来吧,这里我们的IS_ERR()宏就发挥作用了。先看源代码,再讲原理,看看内核中的巧妙设计思路。/* include/linux/err.h *转载 2012-07-25 15:07:32 · 440 阅读 · 0 评论 -
错误: 初始值设定项里有未知的字段‘ioctl’
这个错误网上搜索发现3.0.0.15版本内核 file_operation结构体已经删除了ioctl函数,取代的是:long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);long (*compat_ioctl) (struct file *, unsigned int, unsigned long);fi原创 2012-07-24 16:10:01 · 513 阅读 · 0 评论