基本c库函数之----内核态

01 AUTOSAR CP标准文档阅读指南 阅读详情

http://www.kerneltravel.net/kernel-book/3%EF%BC%8E%E5%9F%BA%E6%9C%ACC%E5%BA%93%E5%87%BD%E6%95%B0.htm

 

基本C库函数

当编写驱动程序时,一般情况下不能使用C标准库的函数。Linux内核也提供了与标准库函数功能相同的一些函数,但二者还是稍有差别。

 

类别

函数名

功能

函数形成

参数

描述

字符串转换

simple_strtol

把一个字符串转换为一个有符号长整数

long simple_strtol (const char * cp, char ** endp, unsigned int base)

cp指向字符串的开始,endp为指向要分析的字符串末尾处的位置,base为要用的基数。

 

 

simple_strtoll

把一个字符串转换为一个有符号长长整数

long long simple_strtoll (const char * cp, char ** endp, unsigned int base)

cp指向字符串的开始,endp为指向要分析的字符串末尾处的位置,base为要用的基数。

 

 

simple_strtoul

把一个字符串转换为一个无符号长整数

long long simple_strtoul (const char * cp, char ** endp, unsigned int base)

cp指向字符串的开始,endp为指向要分析的字符串末尾处的位置,base为要用的基数。

 

 

simple_strtoull

把一个字符串转换为一个无符号长长整数

long long simple_strtoull (const char * cp, char ** endp, unsigned int base)

cp指向字符串的开始,endp为指向要分析的字符串末尾处的位置,base为要用的基数。

 

 

vsnprintf

格式化一个字符串,并把它放在缓存中。

int vsnprintf (char * buf, size_t size, const char * fmt, va_list args)

buf为存放结果的缓冲区, size为缓冲区的大小,fmt为要使用的格式化字符串,args为格式化字符串的参数。

 

snprintf

格式化一个字符串,并把它放在缓存中。

int snprintf (char * buf, size_t size, const char * fmt, ... ...)

buf为存放结果的缓冲区, size为缓冲区的大小,fmt为格式化字符串,使用@…来对格式化字符串进行格式化,…为可变参数。

 

vsprintf

格式化一个字符串,并把它放在缓存中。

int vsprintf (char * buf, const char * fmt, va_list args)

 

buf为存放结果的缓冲区, size为缓冲区的大小,fmt为要使用的格式化字符串,args为格式化字符串的参数。

 

sprintf

格式化一个字符串,并把它放在缓存中。

int sprintf (char * buf, const char * fmt, ... ...)

buf为存放结果的缓冲区, size为缓冲区的大小,fmt为格式化字符串,使用@…来对格式化字符串进行格式化,…为可变参数。

 

字符串操作

strcpy

拷贝一个以NUL结束的字符串

char * strcpy (char * dest, const char * src)

dest为目的字符串的位置, src为源字符串的位置。

 

strncpy

拷贝一个定长的、以NUL结束的字符串

char * strncpy (char * dest, const char * src, size_t count)

dest为目的字符串的位置, src为源字符串的位置,count为要拷贝的最大字节数

与用户空间的strncpy不同,这个函数并不用NUL填充缓冲区,如果与源串超过count,则结果以非NUL结束

strcat

把一个以NUL结束的字符串添加到另一个串的末尾

char * strcat (char * dest, const char * src)

 

dest为要添加的字符串, src为源字符串。

 

strncat

把一个定长的、以NUL结束的字符串添加到另一个串的末尾

char * strncat (char * dest, const char * src, size_t count)

dest为要添加的字符串, src为源字符串,count为要拷贝的最大字节数

注意,与strncpy,形成对照, strncat正常结束。

strchr

在一个字符串中查找第一次出现的某个字符

char * strchr (const char * s, int c)

s为被搜索的字符串,c为待搜索的字符。

 

strrchr

在一个字符串中查找最后一次出现的某个字符

char * strrchr (const char * s, int c)

s为被搜索的字符串,c为待搜索的字符。

 

strlen

给出一个字符串的长度

size_t strlen (const char * s)

s为给定的字符串

 

strnlen

给出给定长度字符串的长度

size_t strnlen (const char * s, size_t count)

s为给定的字符串

 

strpbrk

在一个字符串中查找第一次出现的一组字符

char * strpbrk (const char * cs, const char * ct)

cs为被搜索的字符串,ct为待搜索的一组字符

 

strtok

把一个字符串分割为子串

char * strtok (char * s, const char * ct)

 

s为被搜索的字符串,ct为待搜索的子串

注意,一般不提倡用这个函数,而应当用strsep

memset

用给定的值填充内存区

void * memset (void * s, int c, size_t count)

 

s为指向内存区起始的指针,c为 要填充的内容,count为内存区的大小

 

I/O空间的访问不能使用memset,而应当使用memset_io。

bcopy

把内存的一个区域拷贝到另一个区域

char * bcopy (const char * src, char * dest, int count)

src为源字符串,dest为目的字符串,而count为内存区的大小

注意,这个函数的功能与memcpy相同,这是从BSD遗留下来的,对I/O空间的访问应当用memcpy_toio或 memcpy_fromio

 

memcpy

把内存的一个区域拷贝到另一个区域

void * memcpy (void * dest, const void * src, size_t count)

dest为目的字符串,Src为源字符串,而count为内存区的大小

对I/O空间的访问应当用memcpy_toio或 memcpy_fromio

 

memmove

把内存的一个区域拷贝到另一个区域

void * memmove (void * dest, const void * src, size_t count)

dest为目的字符串,Src为源字符串,而count为内存区的大小

memcpy和memmove处理重叠的区域,而该函数不处理。

memcmp

比较内存的两个区域

int memcmp (const void * cs, const void * ct, size_t count)

cs为一个内存区,ct为另一个内存区,而count为内存区的大小

 

memscan

在一个内存区中查找一个字符

void * memscan (void * addr, int c, size_t size)

addr为内存区,c为要搜索的字符,而size为内存区的大小

返回c第一次出现的地址,如果没有找到c,则向该内存区传递一个字节。

strstr

在以NUL结束的串中查找第一个出现的子串

char * strstr (const char * s1, const char * s2)

s1为被搜索的串,s2为待搜索的串。

 

 

memchr

在一个内存区中查找一个字符

void * memchr (const void * s, int c, size_t n)

s为内存区,为待搜索的字符,n为内存的大小

返回c第一次出现的位置,如果没有找到c,则返回空。

位操作

set_bit

在位图中原子地设置某一位

void set_bit (int nr, volatile void * addr)

nr为要设置的位,addr为位图的起始地址

这个函数是原子操作,如果不需要原子操作,则调用__set_bit函数,nr可以任意大,位图的大小不限于一个字。

__set_bit

在位图中设置某一位

void __set_bit (int nr, volatile void * addr)

nr为要设置的位,addr为位图的起始地址

 

clear_bit

在位图中清某一位

void clear_bit (int nr, volatile void * addr)

nr为要清的位,addr为位图的起始地址

该函数是原子操作,但不具有加锁功能,如果要用于加锁目的,应当调用smp_mb__before_clear_bit 或smp_mb__after_clear_bit函数,以确保任何改变在其他的处理器上是可见的。

__change_bit

在位图中改变某一位

void __change_bit (int nr, volatile void * addr)

nr为要设置的位,addr为位图的起始地址。

与change_bit不同,该函数是非原子操作。

change_bit

在位图中改变某一位

void change_bit (int nr, volatile void * addr)

nr为要设置的位,addr为位图的起始地址。

 

test_and_set_bit

设置某一位并返回该位原来的值

int test_and_set_bit (int nr, volatile void * addr)

nr为要设置的位,addr为位图的起始地址。

该函数是原子操作

 __test_and_set_bit

设置某一位并返回该位原来的值

 

int __test_and_set_bit (int nr, volatile void * addr)

 

nr为要设置的位,addr为位图的起始地址。

该函数是非原子操作,如果这个操作的两个实例发生竞争,则一个成功而另一个失败,因此应当用一个锁来保护对某一位的多个访问。

 

 test_and_clear_bit

 

清某一位,并返回原来的值

int test_and_clear_bit (int nr, volatile void * addr);

nr为要设置的位,addr为位图的起始地址。

该函数是原子操作

__test_and_clear_bit

 

清某一位,并返回原来的值

int __test_and_clear_bit (int nr, volatile void * addr);

nr为要设置的位,addr为位图的起始地址。

该函数为非原子操作

test_and_change_bit

改变某一位并返回该位的新值

int test_and_change_bit (int nr, volatile void * addr)

nr为要设置的位,addr为位图的起始地址。

该函数为原子操作

test_bit

确定某位是否被设置

int test_bit (int nr, const volatile void * addr)

nr为要测试的第几位,addr为位图的起始地址。

 

 find_first_zero_bit

在内存区中查找第一个值为0的位

int find_first_zero_bit (void * addr, unsigned size)

addr为内存区的起始地址,size为要查找的最大长度

返回第一个位为0的位号

find_next_zero_bit

在内存区中查找第一个值为0的位

int find_next_zero_bit (void * addr, int size, int offset)

addr为内存区的起始地址,size为要查找的最大长度,offset开始搜索的起始位号。

 

ffz

在字中查找第一个0

unsigned long ffz (unsigned long word);

word为要搜索的字。

 

ffs

查找第一个已设置的位

 

int ffs (int x)

 

x为要搜索的字。

这个函数的定义方式与Libc中的一样。

hweight32

返回一个N位字的加权平衡值

 

hweight32 ( x)

 

x为要加权的字

一个数的加权平衡是这个数所有位的总和。

【GEE实战指南】Python本地API配置避坑与一站式环境搭建 本文详细介绍了Google Earth Engine(GEE)Python本地API的配置避坑指南与一站式环境搭建流程。通过conda创建隔离环境、账户认证关键步骤、初始化代码的正确写法以及实战测试案例,帮助开发者快速掌握GEE Python API的配置技巧,避免常见错误,提升地理空间数据分析效率。 阅读详情

相关推荐

一步步指导:在Chrome中安装Vue插件vue-devtools

Vue.js是现代Web开发中最流行的前端框架之一,它以其轻量级、高性能和易于理解的设计理念受到开发者的喜爱。为了更高效地开发和调试Vue应用,Vue.js官方提供了一个强大的开发工具——vue-devtools。

小透明的博客 5618

基本C库函数

网站收藏:(linux)http://oss.org.cn/kernel-book/ 3.基本C库函数 当编写驱动程序时,一般情况下不能使用C标准库的函数。Linux内核也提供了与标准库函数功能相同的一些函数,但二者还是稍有差别。   类别 函数名 功能 函数形成 参数 描述 字符串转换 si

不死亡灵,永垂不朽! 550

【JS】自定义上传组件,文件上传与回显,自定义进度条显示(基于element-plus与axios)

公司是做B 端产品的,有sass平台也有源码交付的项目,最近开发了很多小系统,这里记录一下开发遇到的问题。 需要定制一个上传组件,要求可以自定义文件存储路径,自定义可上传的文件类型,限制文件大小等,并且提供基础的文件回显功能,例如上传一张图片到服务器指定目录的`/file`文件夹下面,并且实现可以查看预览的功能。

余浩的博客 1161

检查成员变量或成员函数是否存在的宏

#include <iostream> #include <type_traits> #include <memory> #include <vector> #include <fstream> #include <memory.h> #define HAS_MEMBER_FUNCTION(member)\ template<typename T, typename... Args>struct has_memb.

hit1524468的专栏 563

机器视觉/将HIK海康面阵相机连接Halcon软件

本文简述了如何将海康面阵相机连接到Halcon软件中进行实时取图的过程。

Dahe.qu 4866

SystemC实战:用C++搞芯片建模的5个典型场景(含代码示例)

本文通过五个典型实战场景,详细介绍了如何使用SystemC这一基于C++的硬件建模库进行芯片设计与系统级建模。内容涵盖从基础并发模块构建、事务级总线建模、跨时钟域验证,到与ModelSim协同仿真及多核系统性能探索,并提供了完整的代码示例,帮助软件工程师利用熟悉的C++工具链高效参与硬件架构设计与验证。

weixin_29191761的博客 314

C语言常用内置函数

#include <stdio.h> #include <ctype.h> //内置函数头文件 int main() { //常用内置函数 - 0 表示假 非0表示真 printf("%d\n", isupper('a'));//判断是否是大写字母 printf("%d\n", islower('a')); //判断是否是小写字母 printf("%d\n", isa

xyphf的博客 1万+

LCL滤波器参数设计实战:从理论约束到工程选型指南

本文提供了LCL滤波器参数设计的实战指南,从理论约束到工程选型逐步拆解。核心在于平衡总电感量、电感比与电容值,确保谐振频率落在安全区间,以满足并网电流谐波标准并维持系统稳定。文章以10kW并网逆变器为例,给出了具体的参数计算流程与选型步骤,并强调了寄生参数、阻尼设计等工程实现细节。

c6d7e8f9g的博客 921

符号函数c语言代码,C代码的符号表是否包含函数名称和类名?

大多数编译器教科书都会告诉您有关符号表的信息,并经常向您展示有关适度复杂语言的详细信息,例如Pascal.您不会在教科书中找到有关C符号表的信息;它太神秘了.我们为DMS软件再造工具包提供完整的C 14前端.它解析C,构建detailed ASTs,并执行名称和类型解析,包括构建精确的符号表.以下是我们的教程中有关如何使用DMS的幻灯片,重点介绍C符号表结构.OP专门询问了关于课程会发生什么的看法...

weixin_28752627的博客 476

GD32F4xx 移植agile_modbus软件包与电能表通信

GD32F4XX 移植agile modbus软件包实现与DTSU电能表通信调试记录

madao1234的博客 1303

微信小程序报错:“errno“:600001,“errMsg“:“uploadFile:fail errcode:-105 cronet_error_code:-105 error_msg:net::

uploadFile:fail errcode:-105 cronet_error_code:-105 error_msg:net::ERR_NAME_NOT_RESOLVED,uniApp微信小程序使用uni.uploadFile出现报错,微信小程序如何解决wx.uploadFile报错,如何解决这个问题,微信小程序真机报错,微信小程序报错"errno":600001,"errMsg":"uploadFile:fail errcode:-105 cronet_error_code:-105 error_m

✅ 精选推荐文章 3826

Linux内核中常用String库函数实现

//只列举了部分常用的 char *strcpy(char *dest, const char *src) { char *tmp = dest; while ((*dest++ = *src++) != '\0') /* nothing */; return tmp; } char *strncpy(char *dest, const char *src, size_t coun

磊啊磊 4261

【错误解决】本地计算机上的mysql服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止

转载请注明出处:http://blog.youkuaiyun.com/qq_26525215 本文源自【大学之旅_谙忆的博客】 在启动mysql服务时出现该错误: 本地计算机上的mysql服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止。mysql 版本 5.7.14 系统 win 7后来经过一系列的百度,谷歌,总算是解决了。首先,你需要把原来的服务删除:mysqld --remove mysq

谙忆-陈浩翔 12万+

linux api是linux操作系统直接提供的函数接口.(,用户程序》C库API》系统调用》内核函数...

关系图总结系统调用接口的主要任务是把进程从用户态切换到内核态。在具有保护机制的计算机系 统中,用户必须通过软件中断或陷阱,才能使进程从用户态切换为内核态。系统调用通过软中断0x80陷入内核,跳转到系统调用处理程序system_call函数,并执行相应的服务例程(内核函数)。用户态——内核态用户态——内核态——底层硬件《Linux内核修炼之道》第5章讲解系统调用,它是应用程序和内核间的桥梁,学习并理...

weixin_34637138的博客 548

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【MOOC EXP】Linux内核分析实验四报告

程涵 原创博客 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 【使用库函数API和C代码中嵌入汇编代码触发同一个系统调用】 知识点整理 一、用户态、内核态和中断 处理过程 1. 通过库函数完成系统调用:库函数将系统调用封装起来。 2. 用户态与内核...

aashao137666的博客 193

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

《Linux内核分析》(四)——扒开系统调用的三层皮(上)

作者:徐恒 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 实验环境:c+Linux64位 (32位系统可能结果会不同) 依照学术诚信条款,我保证此回答为本人原创,所有回答中引用的外部材料已经做了出处标记。

其实我不会编程,只会脸滚键盘 1704

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

扒开系统调用的三层皮(上)

扒开系统调用的三层皮(上) 201...

weixin_30384217的博客 93

《Linux内核分析》第四周学习总结 扒开系统调用的三成皮(上)

第四周 扒开系统调用的三层皮(上) 郝智宇无转载 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一、用户态、内核态和中断处理过程 1.我们与系统调用打交道是通过库函数的方式 2.一般现代CPU都有几种不同的指令执行级别 因为如果所有程序...

weixin_30832351的博客 132

鸟瞰linux的文件读写全过程

http://blog.sina.com.cn/s/blog_61869e800100ek8w.html 读写文件,是作为一个操作系统所提供的最基本接口之一。我们就从写文件过程:open,write,close这几个接口来说起,描述写文件的那些事儿。平时,我们做应用程序的时候,常常用到读写文件的函数接口,就拿写文件来说,我们用C/C++编写时,用到了以下的函数接口:1>

sunnydogzhou的专栏 1671

20135201李辰希 《Linux内核分析》第四周 扒开系统调用的“三层皮”

李辰希无转载 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.用户态、内核态和中断处理过程 1.我们与系统调用打交道是通过库函数的方式 2.一般现代CPU都有几种不同的指令执行级别 因为如果所有程序员写的代码都可以有特权指令的话,系统就会很容易崩溃。 3.区别: 在高级别的状态下,代...

weixin_30633949的博客 111

Linux内核分析——扒开系统调用的三层皮(上)

马悦+原创作品转载请注明出处+《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一、用户态、内核态和中断处理过程 1、用户通过库函数与系统调用联系起来。 2、在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态。而在相应的低级别执行状态下代码的掌控范围受到限制。只能在对应级...

weixin_30300523的博客 249

关于驱动的一次操作流程

5.其实每一步都是无数人花费很长时间逐渐搭建的框架,每一步都值得深入学习,这是我目前所了解的用户如何调用系统资源的流程,会不断更新,不断学习。驱动是一个内核调用设备资源的载体,用户通过系统调用进入内核,然后内核操作驱动动作来操作外设寄存器地址。通过提供的函数分配或者申请设备的主次设备号,主次设备号是设备树的标志,使得内核管理更加方便。open函数的参数有驱动文件指针参数,根据驱动文件指针,执行驱动文件中的open函数。驱动文件中的open函数会操作物理地址映射的虚拟地址,进而操作外设寄存器。

xiaoxuechong的博客 160

Linux常问面试问题之——用户态与内核态、用户态访问内核态资源的方式、用户态到内核态的切换

用户态与内核态用户态与内核态1、背景2、定义3、用户态访问内核态资源的方式3.1、系统调用3.2、库函数3.3、Shell脚本4、用户态到内核态怎样切换?参考 用户态与内核态 1、背景 当我们在写程序是,凡是涉及到IO读写、内存分配等硬件资源的操作时,往往不能直接操作,而是通过一种叫系统调用的过程,让程序陷入到内核态运行,然后内核态的CPU执行有关硬件资源操作指令,得到相关的硬件资源后在返回到用户态继续执行,之间还要进行一系列的数据传输。 假设没有这种内核态和用户态之分,程序随随便便就能访问硬件资源,比如说

JMW1407的博客 1万+

Linux用户态与内核态、系统调用与库函数

一、Unix/Linux的体系架构:   如上图所示,从宏观上来看,Linux操作系统的体系架构f分为用户态和内核态(或者称“用户空间”和“内核空间”)。 内核从本质上说是一种软件 : 控制计算机的 硬件资源,并提供上层应用程序运行的环境。 用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括:CPU资源、存储资源、I/O资源等。 为了使上层应用能够访问这些资源,内核必须为上层应用提供访问的接口:系统调用。   系统调用是操作系统的最小功能单位,这些系统调用根据不同的应用场景可以进

ArtAndLife的博客 1111

linux c程序中内核态与用户态内存存储问题

Unix/Linux的体系架构   如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的

o0o0o0D的博客 1522
上一篇: scsi命令
下一篇: Linux 2.6内核中新的锁机制--RCU
Iphone4
博客等级 码龄17年 17粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值