今天编译发现一个error: “asm/semaphore.h: No such file or directory” ,发现2.6.19和2.6.31对这个信号量声明并不相同
[patch] include linux/semaphore.h for kernel 2.6.26 and onwards
Description
The kernel/xpp/xpd.h includes <asm/semaphore.h>
As of Linux kernel version 2.6.26, the asm/semaphore.h has been deprecated, favoring an include of <linux/semaphore.h> instead.
When attempting to compile zaptel in Linux 2.6.27, as the current sources are, we get an error 'unable to include <asm/semaphore.h> (because it has been removed now)
This patch performs the check for Linux kernel version 2.6.26, if the version is before this, the existing #include <asm/semaphore.h> is still used,
but if Linux kernel version >= 2.6.26 is found, then #include <linux/semaphore.h> is used instead.
一些参考文章:
声明一个信号量,使用DECLARE_MUTEX(ADC_LOCK)或DEFINE_SEMAPHORE(ADC_LOCK),这很好懂,但是这个宏到底做了些什么呢?这就要深入到这个宏定义所在文件中研究了(在<linux/semaphore.h>文件中)。
对于这两宏,想说几句,因为最近一次移植新版本的内核(2.6.37.3),就是因为DECLARE_MUTEX不再使用而导致我浪费了几天的时间。据本人考查,最早说要将DECLARE_MUTEX改为DEFINE_SEMAPHORE是在08年10月底,参见地址http://lwn.net/Articles/304725/。而在Linux Cross Reference(网站如http://lxr.free-electrons.com/等等)中发现,直到2.6.36才出现DEFINE_SEMAPHORE,而且这个版本中两个宏同时存在。但是到了2.6.37,DECLARE_MUTEX这个宏却不存在了。
不由得想到某个论坛的签名,原文是英文的,原文及出自一时不知道去哪找了。大意是说UNIX最好的地方是什么?答曰有社区,再问UNIX不好的地方是什么?答曰有太多的社区。像Linux内核这东西,版本更新太快了,各种结构体名称变化、成员变化及新增函数、删除函数,让人目不暇接。虽说一味追求新版本不好,但是心理作用,还是选择新的版本来移植。新的东西当然有它的好,像买台android的手机,就得不停的刷机,不断折腾,这跟搞Linux在某种程度上是一样的。
http://www.latelee.org/embedded-linux/127-mutil-channel-adc-of-s3c2410-write.html
Linux 2.6.36以后file_operations和DECLARE_MUTEX 和kmem_cache_create的变化
今天尝试在2.6.39内核上编译一个驱动, 在编译驱动时发现从2.6.36的内核开始,include/linux/semaphore.h 和 include/linux/fs.h中有了两处变化与驱动相关:
1, 在include/linux/semaphore.h 中
在编译阶段初始化的变化:
将#define DECLARE_MUTEX(name) 改成了 #define DEFINE_SEMAPHORE(name)
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36)
DECLARE_MUTEX(led_sem);
#else
DEFINE_SEMAPHORE(led_sem);
#endif
在运行时初始化得变化(动态分配):
以去除:
void init_MUTEX(struct semaphore *sem);
void init_MUTEX_LOCKED(struct semaphore *sem);
可通过以下初始:
void sema_init(struct semaphore *sem, int val);
2,后备缓存:include/linux/slab.h
kmem_cache_t 类型已改为:
struct kmem_cache
创建缓存对象函数
kmem_cache_t *kmem_cache_create(const char *name, size_t size,
size_t offset,
unsigned long flags,
void (*constructor)(void *, kmem_cache_t *,
unsigned long flags), void (*destructor)(void *, kmem_cache_t *, unsigned long flags));
已改为(参数少了一个,返回值内型变化):
struct kmem_cache *kmem_cache_create(const char *name, size_t size,
size_t offset,
unsigned long flags,
void (*)(void ));
2, file_operations结构体有了一些变化,它去掉了:
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
另外添加了:
long (*fallocate)(struct file *file, int mode, loff_t offset,loff_t len);
这是2.6.36的内核里的定义include/linux/fs.h:
struct file_operations {
struct module *owner;
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);