“asm/semaphore.h: No such file or directory”

今天编译发现一个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.

https://issues.asterisk.org/jira/browse/ZAP-353

一些参考文章:

声明一个信号量,使用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

http://71151461.cn/

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值