项目中实际用到的Linux知识点整理
网卡驱动相关
几个重要的结构体
struct net_device_ops {
}
struct net_device {
}
struct sk_buff {
}
几个重要的函数
netif_napi_add()
platform_set_drvdata()
platform_get_resource()
register_netdev()
NCSI相关
共享资源的保护
自旋锁
int spin_lock_init(spinlock_t *lock); //自旋锁初始化
void spin_lock(spinlock_t *lock); //获取自旋锁
void spin_unlock(spinlock_t *lock); //释放自旋锁
int spin_trylock(spinlock_t *lock); //获取自旋锁,没有获取到则返回0。
int spin_is_locked(spinlock_t *lock); //检查自旋锁是否已被获取,返回0则已被获取,其他值未被获取。
void spin_lock_irq(spinlock_t *lock); //禁止本地中断,并获取自旋锁。
void spin_unlock_irq(spinlock_t *lock); //恢复本地中断,并释放自旋锁。
void spin_lock_irqsave(spinlock_t *lock, unsigned long flags); //保存中断状态,禁用本地中断,并获取自旋锁,flags为中断状态。
void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags); //恢复中断至保存的状态,恢复本地中断,并释放自旋锁。
原子操作
#include <linux/types.h> //原子变量结构体头文件
typedef struct{
int counter;
} atomic_t; //原子变量结构体的定义
atomic_t a = ATOMIC_INIT(x); //定义原子变量
int atomic_read(atomic_t *v); //读取v并且返回。
void atomic_set(atomic *v, int i); //把i写入v。
void atomic_add(int i, atomic_t *v); //v的值加上i。
void atomic_sub(int i, atomic_t *v); //v的值减去i。
void atomic_inc(atomic_t *v); //v自增
void atomic_dec(atomic_t *v); //v自减
int atomic_inc_return(atomic_t *v); //v自增并返回
int atomic_dec_return(atomic_t *v); //v自减并返回
信号量
#include <semaphore.h> //头文件
struct semaphore{
raw_spinlock_t lock;
unsigned int count;
struct list_head wait_list;
}; //信号量结构体
void sema_init(struct semaphore *sem, int val); //初始化信号量,设置信号值(同时访问个数)为val。
void down(struct semaphore *sem); //获取信号量,失败时会进入休眠,且不可以被信号打断,