我linux/list.h在我的代码中用于实现队列/堆栈行为.用于添加头/尾的API如下:
static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
}
Run Code Online (Sandbox Code Playgroud)
类似的是list_add_tail.令人惊讶的是,它不返回任何内容(void),因此它意味着使用此API在内核中添加列表总是成功的.我知道这里没有完整的概念,但如果新节点的内存分配不可用以及其他可能的原因怎么办?
在 Linux 内核编程中,我看到get_user和copy_from_user从用户空间读取,较早的读取固定的 1、2 或 4 个字节,而后者从用户空间读取任意数量的字节。get_user 需要什么?copy_from_user 是否在 get_user 之后出现,因此保留 get_user 是为了向后兼容?get_user是否有特定的应用程序或者它现在已经过时了?put_user 和 copy_to_user 的相同查询。
我在内核代码中使用互斥锁。在 linux/mutex.h 中,我遇到了以下内容:
#define DEFINE_MUTEX(mutexname) \
struct mutex mutexname = __MUTEX_INITIALIZER(mutexname)
extern void __mutex_init(struct mutex *lock, const char *name,
struct lock_class_key *key);
Run Code Online (Sandbox Code Playgroud)
当它们似乎都初始化互斥锁以供使用或者它们完全不同并且我误解了它们时,它们之间有什么区别?在我的代码中,我刚刚使用DEFINE_MUTEX并立即开始使用它,从不费心使用__mutex_init. 如何检查我使用的锁是否正确实现?MUTEX_INITIALIZER定义为:
#define __MUTEX_INITIALIZER(lockname) \
{ .count = ATOMIC_INIT(1) \
, .wait_lock = __SPIN_LOCK_UNLOCKED(lockname.wait_lock) \
, .wait_list = LIST_HEAD_INIT(lockname.wait_list) \
__DEBUG_MUTEX_INITIALIZER(lockname) \
__DEP_MAP_MUTEX_INITIALIZER(lockname) }
Run Code Online (Sandbox Code Playgroud)
我们是否必须同时拥有它们才能使互斥锁正常工作?谢谢。