linux 内核库函数:For 驱动程序

linux 内核库函数:For 驱动程序

Where is the Linux kernel source code located after installation?  https://devicetests.com/linux-kernel-source-location#google_vignette

How do I get the kernel source code?  https://askubuntu.com/questions/159833/how-do-i-get-the-kernel-source-code

Where to download Linux Kernel source code of a specific version?  https://unix.stackexchange.com/questions/46077/where-to-download-linux-kernel-source-code-of-a-specific-version

======================================

linux 内核库函数:For 驱动程序

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

函数名: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为格式化字符串,使用@…来对格式化字符串进行格式化,…为可变参数。
类别2:字符串操作

函数名: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,则返回空。
类别3:位操作

函数名: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为要加权的字
备注:一个数的加权平衡是这个数所有位的总和。
————————————————
版权声明:本文为CSDN博主「墨染 锦年」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44710568/article/details/105382670/

Where is the Linux kernel source code located after installation?

  https://devicetests.com/linux-kernel-source-location#google_vignette

Locating the Linux Kernel Source Code

The kernel source code installed by the linux-source package is typically located in the /usr/src directory. After installing the package, you can find a compressed archive of the kernel source code in this directory. The name of this archive will depend on your specific Linux distribution and version. For instance, if you’re using Ubuntu 14.04 LTS, the kernel source archive might be named linux-source-3.13.0.tar.bz2.

Extracting the Linux Kernel Source Code

To view the source code, you’ll need to extract the compressed archive. You can do this using the tar command followed by the jxf option. Here’s what the command looks like:

tar jxf /usr/src/linux-source-3.13.0.tar.bz2

How do I get the kernel source code?

  https://askubuntu.com/questions/159833/how-do-i-get-the-kernel-source-code

This will get the source of the stock kernel:

apt-get source linux-source

    https://help.ubuntu.com/community/Kernel/Compile/

You can check what version of the kernel is running like this:

uname -r