linux kernel常用函数整理

整理一些做驱动常用的函数,包括

1.copy_from_user

2.copy_to_user

3.kzalloc

4.snprintf()

[5.void (*p)() 、 void *p()、void *p](#5.void (*p)() 、 void *p()、void *p)


1.copy_from_user

函数的原型:

复制代码
unsigned long copy_from_user(void *to, const void *from, unsigned long n);

函数的作用是将数据从用户空间复制到内核空间。

to:目标地址(内核空间)

from:源地址(用户空间)

n:要拷贝的字节数

返回值:成功返回0,失败返回未拷贝的字节数

2.copy_to_user

复制代码
unsigned long copy_to_user(void __user *to, const void *from, unsigned long n);

to:目标地址(用户空间)

from:源地址(内核空间)

n:要拷贝的字节数

返回值:成功返回0,失败返回未拷贝的字节数

当目标地址无效时,copy_to_user会将目标内核缓冲区清零,防止信息泄漏。

3.kzalloc

首先了解kmalloc()

函数原型:

复制代码
void *kmalloc(size_t size, gfp_t flags);

  **kmalloc()**申请的内存在物理上是连续的,大小不能超过128KB。对应的内存释放函数为kfree()。

较常用的 flags(分配内存的方法):

GFP_ATOMIC :分配内存的过程是一个原子过程,分配内存的过程不会被(高优先级进程或中断)打断;

GFP_KERNEL :正常分配内存;

GFP_DMA :给 DMA 控制器分配内存,需要使用该标志(DMA要求分配虚拟地址和物理地址连续)。

kzalloc() 实际上只是额外附加了 __GFP_ZERO 标志。所以它除了申请内核内存外,还会对申请到的内存内容清零。

复制代码
/** * kzalloc - allocate memory. The memory is set to zero. * @size: how many bytes of memory are required. * @flags: the type of memory to allocate (see kmalloc). */static inline void *kzalloc(size_t size, gfp_t flags){    return kmalloc(size, flags | __GFP_ZERO);}

kzalloc() 对应的内存释放函数也是 kfree()。

类似的还有vmalloc

函数原型:

复制代码
void *vmalloc(unsigned long size);

  vmalloc() 函数则会在虚拟内存空间给出一块连续的内存区,但这片连续的虚拟内存在物理内存中并不一定连续。由于 vmalloc() 没有保证申请到的是连续的物理内存,因此对申请的内存大小没有限制,如果需要申请较大的内存空间就需要用此函数了。

对应的内存释放函数为:

复制代码
void vfree(const void *addr);

注意:vmalloc() 和 vfree() 可以睡眠,因此不能从中断上下文调用。

4.snprintf()

复制代码
int snprintf ( char * str, size_t size, const char * format, ... );

设将可变参数**(...)** 按照 format 格式化成字符串,并将字符串复制到 str 中,size 为要写入的字符的最大数目,超过 size 会被截断,最多写入 size-1 个字符。

5.void (*p)() 、 void *p()、void *p

  • void(*p)()是一个指向函数的指针,表示一个指向函数入口的指针变量,该函数的返回类型是void类型。

  • void *p()是一个指针型函数,它的函数名为p,因为是void,这个指针没有定义类型,所以返回的是一个通用型指针。

  • void *p表示为"无类型指针"。 由于 void 指针没有特定的类型,因此它可以指向任何类型的数据。如果函数的参数可以是任意类型指针,应该将其参数声明为 void* 例如上文的copy_from_user、copy_to_user函数参数。

相关推荐
程序员-Benothing4 分钟前
Vim编辑器从入门到精通:模式、快捷键、配置、插件
linux·运维·服务器
‎ദ്ദിᵔ.˛.ᵔ₎28 分钟前
linux 进程信号 (上)
linux·服务器
15Moonlight38 分钟前
Linux网络(02):Socket 编程 UDP
linux·网络·udp
wuminyu1 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
liulilittle2 小时前
Linux 下 select 测试函数
linux·服务器·网络·数据库·c++·select·c
Logic1012 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
DongQiShanRen2 小时前
玄龙(上):TICK 主循环——意识心跳怎么跳
linux·jvm·数据库·人工智能·数据挖掘·rust
小此方2 小时前
Linux网络(二十一):深入理解 TCP 异常处理:网线断开、Keepalive 保活机制与 Linux 内核传输层协议源码剖析
linux·网络·tcp/ip
pride.li2 小时前
Python 安装
linux·python·ubuntu
笔墨登场说说2 小时前
centos 8 使用 kafka_2.13-4.3.1.tgz 安装kafka
linux·kafka·centos