linux 内核库函数

当编写驱动程序时,一般情况下不能使用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为要加权的字
备注:一个数的加权平衡是这个数所有位的总和。

优秀的,完整的BIOS 代码 page ,132 title . PROCESSOR_TIMER_PARITY_REFRESH_NMI TEST ;*****************************************************************; ;*****************************************************************; ;** **; ;** (C)Copyright 1985-1996, American Megatrends Inc. **; ;** **; ;** All Rights Reserved. **; ;** **; ;** 6145-F, Northbelt Parkway, Norcross, **; ;** **; ;** Georgia - 30071, USA. Phone-(770)-246-8600. **; ;** **; ;*****************************************************************; ;*****************************************************************; ;---------------------------------------; include mbiosequ.equ ; bios global constants include mbiosmac.mac ; bios coding macro definition include cf.equ ;---------------------------------------; extrn check_point_no_stack:near extrn check_point_stack:near public bios_suru public shutdown_0 public shutdown_77 public shutdown_88 extrn shutdown_1:near ; shutdown after memory error extrn shutdown_2:near ; v_mode exception intr error extrn _shutdown_33:near ; shutdown after memory test extrn shutdown_4:near ; boot loader request shutdown extrn shutdown_5:near ; user defined shutdown routine extrn _shutdown_66:near ; shutdown during memory test to display memory size extrn shutdown_7:near ; unused, (chipset memory detection) extrn shutdown_8:near ; unused, (soft reset) extrn shutdown_9:near ; shutdown after block move extrn shutdown_a:near ; user defined shutdown routine extrn init_8259_80287:near ; shut 4/5, init 8259, 80287 extrn disable_video:near extrn clear_64k_memory:near extrn int_isr:near extrn _power_on_delay:byte extrn _software_delay:byte extrn ram_segment:word extrn flush_all_cache:near extrn power_on_init:near public power_on_init_end extrn hreset_clear:near public hreset_clear_end extrn sreset_clear:near public sreset_clear_end extern StopUsbHostController(dummy_ret):near extrn dummy_ret:near extrn disable_all_cache:near extrn shutdown_init:near public shutdown_init_end extrn decompress_post_init:near ;---------------------------------------; ; C O D E S E G M E N T ; ;---------------------------------------; cgroup group _text _text segment word public 'CODE' assume cs:cgroup .486p ;---------------------------------------; public _BIOS_STARTS _BIOS_STARTS label byte ; marks start of module ;---------------------------------------; ; FLAGS TEST (SF,ZF,PF,CF) ; ; ;---;---;---;---;---;---;---;---; ; ; ; S ; Z ; x ; A ; x ; P ; x ; C ; ; ; ;---;---;---;---;---;---;---;---; ; ; HARD RESET OR SHUTDOWN RESET ; ;---------------------------------------; ; SHUTDOWN PROCESSING ; ;---------------------------------------; bios_suru: cli ; test under CLI mode cld ; ensure direction mov ax,cs mov ss,ax ; $$$CORE0036+ >>> extern wake_up(wake_up_end):near public wake_up_end jmp wake_up ; check for wakeup wake_up_end: ; control will come here only if wake up is not needed ; $$$CORE0036+ <<< jmp power_on_init power_on_init_end: in al,kb_stat_port ; if sys_flag bit is set test al,00000100b ; then soft reset else power on jnz shut_5 ; not power-on ;---------------------------------------; ; VANILLA MEMORY PATCH ; ;---------------------------------------; ifdef VANILLA_BIOS ;---------------------------------------; ; save CPUID in cmos 35h(DL), 36h(DH) extrn cmos_data_out:near extrn _refresh_value:byte mov ebp,edx mov al,0b5h mov ah,dl ret_sp cmos_data_out mov al,0b6h mov ah,dh ret_sp cmos_data_out ; start memory refresh.. mov al,00h ; initialise DMA-PAGE reg. out 8fh,al ; (used in MEMORY REFRESH) io_delay mov al,01010100b ; start CH_1 (REFRESH) out 43h,al ; one byte count used io_delay mov al,cgroup:_refresh_value; low byte count out 41h,al mov cx,100h ; 400h..01/11/95 xor di,di mov es,di wpulse1: stosb loop wpulse1 ;---------------------------------------; extrn vanilla_patch_offset:near cmp cgroup:word ptr vanilla_patch_offset,0ffffh jz ret_off ; no routine mov sp,offset cgroup:sp_ret_off jmp vanilla_patch_offset-1 even sp_ret_off: dw offset cgroup:ret_off dw 0f000h ret_off: endif ;---------------------------------------; jmp hreset_clear ; hard reset init (if any) ;;;;hreset_clear_end: ;;;; jmp shutdown_0x ; hard reset, goto regs. test shut_5: jmp sreset_clear ; GA20 disable and other.... sreset_clear_end: mov al,8fh ; shutdown address out cmos_addr_port,al ; mask NMI & select shut byte jcxz short $+2 ; i/o delay jcxz short $+2 ; i/o delay in al,cmos_data_port ; read shutdown code mov ah,00 mov si,ax ; save in (SI) mov al,8fh ; shutdown address jcxz short $+2 ; i/o delay out cmos_addr_port,al mov al,00 ; clear shutdown byte jcxz short $+2 ; i/o delay jcxz short $+2 ; i/o delay out cmos_data_port,al mov ax,cs mov ss,ax mov ax,si ; restore shutdown code cmp al,04h ; for BOOT loader shutdown jz shut_1 ; & for USER defined shutdown cmp al,05h ; initialize 8259 (#1, #2) jz shut_1 ; and (DS), (SS), (SP), STI cmp al,0ah ; if shut code > 10 jbe shut_2 ; bypass intr. init jmp short shutdown_0 ; then hard reset ;---------------------------------------; ; INIT 8259 for SHUTDOWN 04, 05 ; ;---------------------------------------; shut_1: mov bx,level_2_int*256+level_1_int ret_sp init_8259_80287 ; shut 4/5, init 8259, 80287 ;---------------------------------------; ; INTERNAL CACHE IS ALWAYS ON ; ;---------------------------------------; shut_2: jmp shutdown_init shutdown_init_end: mov ax,40h ; global data segment (ah) = 0 mov ds,ax ; setup (DS) mov al,00h ; global extra segment (ah) = 0 mov es,ax ; setup (ES) mov al,30h ; global stack segment (ah) = 0 mov ss,ax ; setup (SS) mov sp,0100h ; setup (SP) shl si,1 ; prepare index jmp [si+cgroup:shut_jmp_tbl]; brunch with intr. disabled ;---------------------------------------; ; SHUTDOWN JMP TABLE ; ;---------------------------------------; even shut_jmp_tbl label word dw offset cgroup:shutdown_0; hard reset dw offset cgroup:shutdown_1; used for block move internal shutdown dw offset cgroup:shutdown_2; v_mode exception intr error dw offset cgroup:_shutdown_33; shutdown after memory test dw offset cgroup:shutdown_4; shutdown for boot loader dw offset cgroup:shutdown_5; shutdown (with intr. init) dw offset cgroup:_shutdown_66; shutdown during memory test to display memory size dw offset cgroup:shutdown_7; unused, (chipset memory detection) dw offset cgroup:shutdown_8; unused, (soft reset) dw offset cgroup:shutdown_9; shutdown after block move dw offset cgroup:shutdown_a; shutdown (w/o intr. init) ;---------------------------------------; hreset_clear_end: shutdown_0x: ; hard reset mov al,8dh out cmos_addr_port,al ; NMI OFF ;---------------------------------------; shutdown_0: ; hard reset shutdown_77: ; unused shutdown_88: ; unused check_point_si 03h ; ======== 03 mov ax,cs mov ss,ax xor bp,bp mov ds,bp ; set (DS) = 0 mov es,bp ; set (ES) = 0 jmp_di disable_video in al,kb_stat_port ; if sys_flag bit is set test al,00000100b ; then soft reset else power on jz not_cnt_alt_del ; power on cmp ds:word ptr [0472h],1234h jnz cnt_alt_del yes_cnt_alt_del: or bp,soft_reset_bit ; msb used for soft reset jmp short cnt_alt_del not_cnt_alt_del: cmp ds:word ptr [0472h],1234h jz yes_cnt_alt_del or bp,power_on_bit cnt_alt_del: ;;;; ret_sp clear_64k_memory ; clear segment 0 mov ax,30h mov ss,ax ; set stack mov sp,100h check_point 05h ; ======== 05 ;; call StopUsbHostController ; disable USB host controller ;; call disable_all_cache ; disable all cache call disable_all_cache ; disable all cache call StopUsbHostController ; disable USB host controller mov ax,cs mov ss,ax ret_sp clear_64k_memory ; clear segment 0 mov ax,30h mov ss,ax ; set stack mov sp,100h check_point 06h ; ======== 06 call decompress_post_init extrn _bios_to_rm:near jmp _bios_to_rm ;---------------------------------------; ;*****************************************************************; ;*****************************************************************; ;** **; ;** (C)Copyright 1985-1996, American Megatrends Inc. **; ;** **; ;** All Rights Reserved. **; ;** **; ;** 6145-F, Northbelt Parkway, Norcross, **; ;** **; ;** Georgia - 30071, USA. Phone-(770)-246-8600. **; ;** **; ;*****************************************************************; ;*****************************************************************; ;-----------------------------------------------------------------------; ; COPY_CONTROL_TO_RAM ; ; this routine copies 64k code to ram segment and give control to ram. ; ; input : ; ; none ; ; stack available ; ; output: ; ; none ; ; register destroyed..ALL except DS, ES, BP ; ;-----------------------------------------------------------------------; extrn copy_64k_memory:near public copy_control_to_ram copy_control_to_ram proc near push es push ds mov es,cgroup:ram_segment push cs pop ds ; source segment call copy_64k_memory ; transfer control to ram segment.. push es ; ram_segment push offset cgroup:xxx retf xxx: pop ds pop es xxx_exit: ret copy_control_to_ram endp ;-----------------------------------------------------------------------; ; COPY_TO_SHADOW ; ;-----------------------------------------------------------------------; ; this routine copies the code to asked shadow. ; ; input : ; ; ES:DI destn seg:off ; ; DS:SI source segment:offset ; ; CX #of bytes to move ; ; 0000 = 64k copy ; ; stack available ; ; output: ; ; none ; ; register destroyed..ALL except DS, ES, BP ; ;-----------------------------------------------------------------------; extrn move_bytes:near extrn enable_shadow_write:near extrn disable_shadow_write:near public copy_to_shadow copy_to_shadow proc near pushf cli ; disable interrupt call enable_shadow_write ; enable write to shadow call move_bytes ; move bytes call flush_all_cache ; flush all cache call disable_shadow_write ; enable write to shadow popf ret copy_to_shadow endp ;-----------------------------------------------------------------------; extrn e000_read_rom_write_x:near extrn e000_read_ram_write_rom:near extrn e000_read_x_write_ram:near extrn f000_read_rom_write_x:near extrn f000_read_ram_write_rom:near extrn f000_read_x_write_ram:near public do_f000_read_rom_write_x public do_f000_read_ram_write_rom public do_f000_read_x_write_ram public do_e000_read_rom_write_x public do_e000_read_ram_write_rom public do_e000_read_x_write_ram ;---------------------------------------; ifdef VANILLA_BIOS do_f000_read_rom_write_x: call f000_read_rom_write_x mov al,15 ; offset to table of fn# jmp short vanilla_patch do_f000_read_ram_write_rom: call f000_read_ram_write_rom mov al,18 ; offset to table of fn# jmp short vanilla_patch do_f000_read_x_write_ram: call f000_read_x_write_ram mov al,21 ; offset to table of fn# jmp short vanilla_patch do_e000_read_rom_write_x: call e000_read_rom_write_x mov al,24 ; offset to table of fn# jmp short vanilla_patch do_e000_read_ram_write_rom: call e000_read_ram_write_rom mov al,27 ; offset to table of fn# jmp short vanilla_patch do_e000_read_x_write_ram: call e000_read_x_write_ram mov al,30 ; offset to table of fn# vanilla_patch: push bx mov bx,cgroup:word ptr vanilla_patch_offset inc bx jz dop_00 ; no routine dec bx cbw ; AX = offset to jmp table add bx,ax push cs push offset cgroup:dop_00 push cs push bx retf dop_00: pop bx ret ;---------------------------------------; else ; NORMAL BIOS CODE do_f000_read_rom_write_x: jmp f000_read_rom_write_x do_f000_read_ram_write_rom: jmp f000_read_ram_write_rom do_f000_read_x_write_ram: jmp f000_read_x_write_ram do_e000_read_rom_write_x: jmp e000_read_rom_write_x do_e000_read_ram_write_rom: jmp e000_read_ram_write_rom do_e000_read_x_write_ram: jmp e000_read_x_write_ram endif ;-----------------------------------------------------------------------; ;*****************************************************************; ;*****************************************************************; ;** **; ;** (C)Copyright 1985-1996, American Megatrends Inc. **; ;** **; ;** All Rights Reserved. **; ;** **; ;** 6145-F, Northbelt Parkway, Norcross, **; ;** **; ;** Georgia - 30071, USA. Phone-(770)-246-8600. **; ;** **; ;*****************************************************************; ;*****************************************************************; ;---------------------------------------; public _BIOS_ENDS _BIOS_ENDS label byte ; marks end of module ;---------------------------------------; _text ends end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yasin墨染锦年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值