第十一章:内核的数据处理

本文介绍了在Linux内核编程中的一些实用技巧,包括如何通过编译选项预防代码缺陷,使用标准C语言类型确保内存地址的一致性,为数据项分配固定大小的空间,以及页分配的常见实践。此外还详细讲解了链表操作的相关API,如初始化、添加、删除等,为开发者提供了实用的指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在编译时使用-Wall –Wstrict-prototypes选项编译可以防止大多数的代码缺陷。

使用标准C语言类型

内核中的普通内存地址通常是unsigned long ,因为:至少在当前linux支持的所有平台上,指针和long整型的大小是一样的。

为数据项分配确定的空间大小

<asm/types.h>中定义若干类型:u8, u16, u32, u64

使用新的编译器可以定义如下类型等等:uint8_t, uint32_t

其他有关移植性的问题

页分配常见代码:假设需要16KB空间来存储临时数据,则分配页的代码是

#include <asm/pages.h>

int order = get_order(16*1024);

buf = get_free_pages(FGP_KERNEL, order);

传给order的值必须是2的幂。

链表

相关类型以及API

struct list_head{struct list_head *next, *prev;};

初始化

sturct list_head todo_list;

INIT_LIST_HEAD(&todo_list);

也可以这样初始化:

LIST_HEAD(todo_list);

API:

list_add(struct list_head *new, struct list_head *head);

list_add_tail(struct list_head *new, struct list_head *head);

list_del(struct list_head *entry);

list_del_init(struct list_head *entry);

list_empty(struct list_head *head);

list_entry(entry, type, name);

list_move(struct list_head *entry, struct list_head *head);

list_move_tail(struct list_head *entry, struct list_head *head);

list_splice(struct list_head *list, struct list_head *head);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值