![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux/kernel
zhoufeng037521
这个作者很懒,什么都没留下…
展开
-
__initdata 的奇怪影响
__initdata 的奇怪影响作者: 宋立新Email:zjujoe@yahoo.com恍然大悟后,当然也就不奇怪了。 不过当时 __initdata 修饰符确实给我们带来很大的困惑。事情的经过是这样的。通常我们设置mfp寄存器是在系统的启动阶段统一设置的, 所以 lc6830.c 中会有一个数组:static mfp_cfg_t saar_mfp_c...转载 2011-07-13 09:39:58 · 472 阅读 · 0 评论 -
关于双向链表的一些分析
跟大家门交流一下:一、插入操作(insert)(一)基本原理 双链表就好像是手拉手站成一排的人,每个人的右手(next)拉着下一个人,左手(prior)拉着前一个人,每两个人之间有两支手互联.插入操作实际是向队伍中增加人员,他需要拉上左右两边的人,即共三个人要发生转载 2011-08-23 13:56:34 · 649 阅读 · 0 评论 -
定时器相关的一些结构体
content: struct timer_list init_timer timer_pending add_timer del_timer del_timer_sync ---------------------------转载 2011-08-23 15:07:25 · 834 阅读 · 0 评论 -
Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)
Linux内核源码分析-链表代码分析分析人:余旭 分析时间:2005年11月17日星期四 11:40:10 AM 雨 温度:10-11度编号:1-4 类别:准备工作Email:yuxu9710108@163.com时代背景:开始在www.linuxforu转载 2011-08-23 15:04:33 · 589 阅读 · 0 评论 -
man函数输入参数分析
main( int argc, char ** argv ) argv: 指针的指针 argc: 整数 char **argv or char *argv[] or char argv[][] 为了能形象的说明这两个参数的含义,我们转载 2011-08-23 15:10:43 · 874 阅读 · 0 评论 -
#define XXX do{...}while(0)
1、函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心。2、调用真正函数的代码和调用函数式宏定义的代码编译生成的指令不同。如果是真正的函数,那么它的函数体要编译生成指令,代码中出现的每次调用也要编译生成传参指令和call指令。而翻译 2011-09-15 11:21:48 · 1034 阅读 · 0 评论 -
Linux 系统内核空间与用户空间通信的实现与分析
2 Linux 内核模块的运行环境与传统进程间通信在一台运行 Linux 的计算机中,CPU 在任何时候只会有如下四种状态:【1】 在处理一个硬中断。【2】 在处理一个软中断,如 softirq、tasklet 和 bh。【3】 运行于内核态,但有进程上下文,转载 2011-09-28 16:31:48 · 822 阅读 · 1 评论 -
什么是进程上下文,什么是中断上下文
进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触、看上去很懂但又说不清楚到底怎么回事。造成这种局面的原因,可能是原来接触到的操作系统课程的教学总停留在一种浅层次的理论层面上,没有深入去研究。处理器总处于以下状态中的一种:转载 2011-10-14 10:49:12 · 833 阅读 · 0 评论 -
中断处理的工作队列机制
工作队列(work queue)是另外一种将工作推后执行的形式 ,它和我们前面讨论的所有其他形式都有不同。工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行。这样,通过工作队列执行的代码能占尽进程上下文的所有优势。最重要的就是工作队列允许转载 2011-10-14 11:03:22 · 1249 阅读 · 0 评论 -
个人对kobject的一点研究(2)
首先是busbus的注册在/drivers/base/bus.c里int __init buses_init(void){ bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL); if (!bus_kset) return -ENOMEM; ...原创 2011-08-01 17:17:31 · 622 阅读 · 0 评论 -
个人对kobject的一点研究(1)
在LINUX中最让人不解的大概就是/sys下面的内容了下面首先让我们来创建一个简单的platform设备,并从这个设备的视角进行深入,在此篇文章的深入过程中,我们只看kobeject的模型我所使用的内核版本号为2.6.26,操作系统的内核版本号为2.6.27-7,暂未转载 2011-08-01 17:11:28 · 888 阅读 · 1 评论 -
clk_get()
struct clk *clk_get(struct device *dev, const char *id),对于SPI时钟,第一个参数必须不能为NULL。函数用于获取时钟信息,函数内部会将传入的“spi”字符串和系统中各时钟的名字进行比较,看是否匹配,看上面的分析可知,SPI控制器时钟注册时的时钟名也是“spi”,这个过程实际上和device,driver的匹配过程是类似的。clk_get源...原创 2011-07-13 11:17:09 · 2733 阅读 · 0 评论 -
文件描述符FD_set FD_zero
FD_SET: 打开类型fd_set的某一位。 FD_ZERO: 初始化fd_set; FD_ISSET:测试结构fd_set中的描述字。 select函数 系统提供了select函数实实现多路复用输入/输出模型。原型 #include #inc转载 2011-07-19 15:21:33 · 2554 阅读 · 1 评论 -
内核中的likely和unlikely宏定义
在内核代码中经常会看到unlikely和likely的踪影。他们实际上是定义在 linux/compiler.h 中的两个宏。 #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __bui转载 2011-07-21 12:20:25 · 489 阅读 · 0 评论 -
个人对kobject的一点研究(3)
在platform的注册中,分为两个部分,一部分是注册到devices中,另一部分是注册到bus中,代码在/drivers/base/platform.c中int __init platform_bus_init(void){ int error; //注册到devices目录中 error = device_register(&...原创 2011-08-01 17:22:15 · 436 阅读 · 0 评论 -
个人对kobject的一点研究(5)
在platform模型设备的建立中,需要2个部分的注册,驱动的注册和设备的注册platform_device_register(&test_device); platform_driver_register(&test_driver);首先看platform_device_register注册参数为test_device,结构如下static stru...原创 2011-08-01 17:31:51 · 555 阅读 · 0 评论 -
个人对kobject的一点研究(4)
现在到bus_register了注册的参数platform_bus_type如下所示struct bus_type platform_bus_type = { .name = "platform", .dev_attrs = platform_dev_attrs, .match ...原创 2011-08-01 17:28:20 · 549 阅读 · 0 评论 -
个人对kobject的一点研究(6)
然后platform_driver_unregister,他的参数 test_driver的结构如下static struct platform_driver test_driver = { .probe = test_probe, .remove = test_remove, ...原创 2011-08-01 17:39:13 · 411 阅读 · 0 评论