linux驱动current关键词
尽管内核模块不象应用程序一样顺序执行, 内核做的大部分动作是代表一个特定进程的. 内核代码可以引用当前进程, 通过存取全局项 current, 它在 <asm/current.h> 中定义, 它产生一个指针指向结构 task_struct, 在 <linux/sched.h> 定义. current 指针指向当前在运行的进程. 在一个系统调用执行期间, 例如 open 或者 read, 当前进程是发出调用的进程. 内核代码可以通过使用 current 来使用进程特定的信息, 如果它需要这样.
实际上, current 不真正地是一个全局变量. 支持 SMP 系统的需要强迫内核开发者去开发一种机制, 在相关的 CPU 上来找到当前进程. 这种机制也必须快速, 因为对 current 的引用非常频繁地发生. 结果就是一个依赖体系的机制, 常常, 隐藏了一个指向 task_struct 的指针在内核堆栈内. 实现的细节对别的内核子系统保持隐藏, 一个设备驱动可以只包含 <linux/sched.h> 并且引用当前进程. 例如, 下面的语句打印了当前进程的进程 ID 和命令名称, 通过存取结构 task_struct 中的某些字段.
printk(KERN_INFO "The process is \"%s\" (pid %i)\n", current->comm, current->pid);
存于 current->comm
的命令名称是由当前进程执行的程序文件的基本名称( 截短到 15 个字符, 如果需要 ).
在linux 中每一个进程都由task_struct 数据结构来定义. task_struct就是我们通常所说的PCB.她是对进程控制的唯一手段也是最有效的手段. 当我们调用fork() 时, 系统会为我们产生一个task_struct结构.然后从父进程,那里继承一些数据, 并把新的进程插入到进程树中, 以待进行进程管理.因此了解task_struct的结构对于我们理解任务调度(在linux 中任务和进程是同一概念)的关键.在进行剖析task_struct的定义之前. 我们先按照我们的理论推一下它的结构. 1, 进程状态 ,将纪录进程在等待,运行,或死锁 2, 调度信息, 由哪个调度函数调度,怎样调度等 3, 进程的通讯状况 4,因为要插入进程树,必须有联系父子兄弟的指针, 当然是task_struct型 5,时间信息, 比如计算好执行的时间, 以便cpu 分配 6,标号 ,决定改进程归属 7,可以读写打开的一些文件信息 8, 进程上下文和内核上下文 9,处理器上下文 10,内存信息 因为每一个PCB都是这样的, 只有这些结构, 才能满足一个进程的所有要求.打开/include/linux/sched.h 找到task_struct 的定义
struct task_struct { /* these are hardcoded - don't touch */ 这里是一些硬件设置对程序原来说是透明的. 其中state 说明了该进程是否可以执行,还是可中断等信息. Flage 是进程号, 在调用 fork() 时给出,addr_limit 是区分内核进程与普通进程在内存存放的位置不同
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
unsigned long flags; /* per process flags, defined below */ int sigpending;
mm_segment_t addr_limit; /* thread address space: 0-0xBFFFFFFF for user-thead 0-0xFFFFFFFF for kernel-thread */
struct exec_domain *exec_domain;
long need_resched;
/* various fields */ count 是 计数器 priorrity 是优先级
long counter;
long priority;
cycles_t avg_slice;
/* SMP&nbs
相关新闻>>
- 发表评论
-
- 最新评论 进入详细评论页>>