linux内核编程
文章平均质量分 74
TONGGETONGGE
这个作者很懒,什么都没留下…
展开
-
container_of宏使用分析
<br /><br />#include <stdio.h><br />#include <stdlib.h><br />#include <stddef.h><br />typedef struct student{<br /> int x;<br /> double y;<br /> char z;<br />}mystudent;<br />//返回结构体的起始地址<br />#define container_of(ptr, type, member) ({ /<br />const typeof(原创 2010-12-08 15:46:00 · 702 阅读 · 0 评论 -
LDD3块设备代码分析
<br />整个块设备抽象的数据结构<br /><br />struct sbull_dev {<br /> int size; /* Device size in sectors */<br /> u8 *data; /* The data array */<br /> short users; /* How many users */<b原创 2011-02-28 16:59:00 · 810 阅读 · 0 评论 -
linux线程浅析
<br />原文:http://hi.baidu.com/_kouu<br /><br />关于linux线程<br /><br /> <br />在许多经典的操作系统教科书中, 总是把进程定义为程序的执行实例, 它并不执行什么, 只是维护应用程序所需的各种资源. 而线程则是真正的执行实体. <br />为了让进程完成一定的工作, 进程必须至少包含一个线程. 如图1.<br /><br />进程所维护的是程序所包含的资源(静态资源), 如: 地址空间, 打开的文件句柄集, 文件系统状态, 信号处理handl转载 2011-01-26 18:27:00 · 837 阅读 · 1 评论 -
linux内核的用户管理
在linux 2-6-14的内核版本中task_struct{/* process credentials */uid_t uid,euid,suid,fsuid;gid_t gid,egid,sgid,fsgid;}所以驱动程序中可以调用 current->uid确定当前进程属于的组。但是在 3-6-36 中task_struct 没有以上项目,只有loginuid,如何确定 进程属于的用户组??原创 2011-01-26 17:59:00 · 1050 阅读 · 1 评论 -
异步通知
要弄明白这个问题,我们得从最基本的原理开始。我们知道,驱动程序运行在内核空间中,应用程序运行在用户空间中,两者是不能直接通信的。但在实际应用中,在设备已经准备好的时候,我们希望通知用户程序设备已经ok,用户程序可以读取了,这样应用程序就不需要一直查询该设备的状态,从而节约了资源,这就是异步通知。<br />好,那下一个问题就来了,这个过程如何实现呢?简单,两方面的工作。<br />一 驱动方面:<br />1. 在设备抽象的数据结构中增加一个struct fasync_struct的指针<br />2. 实转载 2011-01-24 17:01:00 · 546 阅读 · 0 评论 -
wait queue 笔记
1.正在运行的task从run queue上下来后,被放到wait queue上,从而进入睡眠。typedef struct __wait_queue wait_queue_t;typedef int (*wait_queue_func_t)(wait_queue_t *wait, unsigned mode, int sync, void *key);int default_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *k原创 2011-01-17 13:36:00 · 982 阅读 · 0 评论 -
内核循环队列实现fifo
<br /><br />定义相关结构体<br /> 20 LIST_HEAD(task_queue_head);<br /> 21 struct task_queue{<br /> 22 struct task_struct *sleep_task;<br /> 23 int count;<br /> 24 struct list_head list;<br /> 25 };<br /> <br /> 添加fifo节点<br /><br /> struct原创 2011-01-20 16:12:00 · 967 阅读 · 0 评论 -
linux 2.6内核 编译模块Makefile
<br />源文件只要一个,编译模块:<br />obj-m := mytest.o<br />KDIR := /lib/modules/$(shell uname -r)/build<br />PWD := $(shell pwd)<br />default:<br /> $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules<br /><br />就可以了,模块的名称是mytest,最后编译出来是mytest.ko,剩下的系统搞定。当然这里有一些隐含规则了转载 2011-01-18 18:37:00 · 618 阅读 · 0 评论 -
return ERESTARTSYS 作用
ERESTARTSYS is a part of the api between the driver and the signal-handling code in the kernel. It does not reach user-space (provided of course that it's used appropriately in the drivers :) When a driver needs to wait, and get awoken by a signal (as oppo原创 2011-01-16 14:24:00 · 2854 阅读 · 1 评论 -
Linux进程的睡眠和唤醒
<br />1 Linux进程的睡眠和唤醒<br />在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状态标志位为TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux 内核的调度器会剥夺这个进程对CPU的控制权,并且从运行队列中选择一个合适的进程投入运行。<br />当然,一个进程也可以主动释放CPU的控制权。函数schedule()是一个调度函数,它可以被一个进程主动调用,从而调度其它进程占用CPU。一旦这个主动放弃CPU的进程被重新调度占用转载 2011-01-15 16:50:00 · 861 阅读 · 0 评论 -
linux中断底半部机制
<br />tasklet机制:基于softirq,所以处于原子上下文。<br />workqueue机制:处于进程上下文中。原创 2011-02-22 14:47:00 · 1233 阅读 · 0 评论