Linux内核的一些函数--总结笔记

合集下载

深入理解linux内核笔记1

深入理解linux内核笔记1

郑重声明:未经本人允许,不得用于商业或非商业的转载和使用,如有需要请联系:yrj1978@hotmail.com引子为什么要写这个笔记:1,这本书的中文版翻译了太垃圾,没法阅读。

阅读英文原版,可以很好的理解作者的思路。

作此笔记备忘2,一直以来学习LINUXkernel的知识缺乏系统化,借对这本书的学习,系统化的学习一下LINUXkernel。

3,自己一直在做一个toosmall,toosimple的单进程,特权模式,64bit保护模式的称不上OS的OS,已经做完了bootloader,构思kernel的实现的时候,困惑在内存管理的实现上,阅读这本书,希望能有利于自己的OS的编写。

4,克服惰性,多读书,希望一天能阅读5页,争取半年内阅读完这本原版700多页的巨著。

不足:我不可能完全理解LINUX内存管理的精髓,肯定有很多地方理解错误。

希望大家能够指正,以便提高,谢谢。

学习方法:可能您第一次阅读的时候很多地方都不理解,不用担心。

那您可能需要阅读一些文件系统的知识。

或者阅读全部笔记后,再回头阅读,有些地方您就理解了。

言归正传:一、概要可用工具CodeViz:生成代码调用关系图的工具,这个工具我现在还没有去使用,有兴趣的可以自己试试去建立调用关系图。

http://www.csn.ul.ie/ ̄mel/projects/codeviz/Linuxcrossreference(LXR):以web的方式阅读和查找LINUX内核源代码的工具。

这个工具安装相当麻烦,我建议直接到它的官方网站直接读代码。

http://lxr.linux.no/linux+v2.6.24/模块LINUX内存管理代码模块主要分为4个部分:1.Outofmemory代码在mm/oom_kill.c貌似用于杀进程的时候对内存的操作2.虚拟内存的分配代码在mm/vmalloc.c3.物理内存页面分配代码在mm/page_alloc.cVMA(virtualmemoryaddresses)的创建和进程内的内存区域的管理4.这些模块,贯穿与其他kernel代码之中,形成更复杂的系统模块,如页面替换策略,buffer的输入输出等中间插段广告Linux文化T恤,淘宝销售,有兴趣的可以购买。

linux笔记全(无图版)

linux笔记全(无图版)

linux笔记全(⽆图版)1、ls 查看当前⽬录下的所有内容⿊⾊的是⽂件,蓝⾊的是⽂件夹,也就是⽬录2、rm -f anaconda-ks. cfg 彻底删除⽂件(如不确定,则需要先保存备份,也就是快照)3、ifconfig 查看⽹卡的配置信息(ip地址等)4、ifconfig ens33 192.168.18. 201 /24(⽹络地址/⼦⽹掩码)更改ip地址5、systemctl restart network 重启⽹络服务6、桥接模式,直接可以进⾏通信(同⼀⽹段,配置ip)7、能不能通信的2个条件:在同⼀个物理⽹络内,ip地址也在同⼀⽹段内8、仅主机模式,虚拟机和物理机不能进⾏通信,相当于虚拟机和物理机进⾏了隔离与笔记本(真机)通信截图9、NAT模式,⾃动分配⽹络地址和⽹关,以及dns,可以直接上⽹可以访问互联⽹内的主机,但互联⽹内的主机不能访问本机(max特点)10、route -n 查看⽹关11、cat /etc/resolv. conf 查看dns(注意cat后⾯有⼀个空格,空格不可少)12、验证nat模式可以直接上⽹13、shell:通常指linux的字符界⾯,图形界⾯和字符界⾯都属于shell,但图形界⾯的shell常称为gui,字符界⾯的shell常称为cli14、cat /etc/shells 查看⽂件内容(linux⾥⾯提供的所有的shell)15、linux默认使⽤的shell是bash的shell16、echo $SHELL 查看当前使⽤的shell17、shell默认指的是bash,它的应⽤是最⼴泛的18、linux是彻底的多⽤户多任务,它可以直接多个⽤户同时进⾏操作19、ctrl+alt+f2-f6 对应5个shell ctrl+alt+f1 开始图形界⾯shell 作⽤:如何开始shell(也就是如何打开命令界⾯)20、虚拟终端的缩写为tty, 在字符界⾯下执⾏“tty"命令就可以显⽰⽤户⽬前所在的终端编号(终端名称)。

linux内核驱动中读写磁盘的接口函数

linux内核驱动中读写磁盘的接口函数

linux内核驱动中读写磁盘的接口函数Linux内核驱动中读写磁盘的接口函数在Linux操作系统中,内核驱动程序负责与硬件设备进行通信和控制。

磁盘作为一种常见的外部存储设备,对于内核驱动程序而言,读写磁盘是一项重要的功能。

本文将介绍Linux内核驱动中用于读写磁盘的接口函数。

1. read函数read函数是用于从磁盘读取数据的接口函数。

其原型如下:ssize_t read(struct file *file, char __user *buf, size_t count, loff_t *offset);参数解析:- file:表示要读取的文件对象,包含了文件在磁盘上的位置等信息。

- buf:表示接收读取数据的缓冲区。

- count:表示要读取的字节数。

- offset:表示读取的偏移量。

read函数的返回值表示实际读取到的字节数。

在读取数据时,内核驱动程序会根据文件对象中的位置信息,将数据从磁盘读取到缓冲区中,并更新文件对象的位置信息。

2. write函数write函数是用于向磁盘写入数据的接口函数。

其原型如下:ssize_t write(struct file *file, const char __user *buf, size_t count, loff_t *offset);参数解析:- file:表示要写入的文件对象,包含了文件在磁盘上的位置等信息。

- buf:表示待写入数据的缓冲区。

- count:表示要写入的字节数。

- offset:表示写入的偏移量。

write函数的返回值表示实际写入的字节数。

在写入数据时,内核驱动程序会根据文件对象中的位置信息,将缓冲区中的数据写入磁盘,并更新文件对象的位置信息。

3. open函数open函数是用于打开文件的接口函数。

其原型如下:int open(const char *pathname, int flags, mode_t mode);参数解析:- pathname:表示要打开的文件路径。

(笔记)Linux下的ioctl()函数详解

(笔记)Linux下的ioctl()函数详解

(笔记)Linux下的ioctl()函数详解我这⾥说的ioctl函数是指驱动程序⾥的,因为我不知道还有没有别的场合⽤到了它,所以就规定了我们讨论的范围。

写这篇⽂章是因为我前⼀阵⼦被ioctl给搞混了,这⼏天才弄明⽩它,于是在这⾥清理⼀下头脑。

⼀、什么是ioctlioctl是设备驱动程序中对设备的I/O通道进⾏管理的函数。

所谓对I/O通道进⾏管理,就是对设备的⼀些特性进⾏控制,例如串⼝的传输波特率、马达的转速等等。

它的调⽤个数如下:int ioctl(int fd, ind cmd, …);其中fd是⽤户程序打开设备时使⽤open函数返回的⽂件标⽰符,cmd是⽤户程序对设备的控制命令,⾄于后⾯的省略号,那是⼀些补充参数,⼀般最多⼀个,这个参数的有⽆和cmd的意义相关。

ioctl函数是⽂件结构中的⼀个属性分量,就是说如果你的驱动程序提供了对ioctl的⽀持,⽤户就可以在⽤户程序中使⽤ioctl函数来控制设备的I/O通道。

下表列出了⽹络相关ioctl 请求的request 参数以及arg 地址必须指向的数据类型:类别Request说明数据类型套接⼝SIOCATMARKSIOCSPGRPSIOCGPGRP是否位于带外标记设置套接⼝的进程ID 或进程组ID获取套接⼝的进程ID 或进程组IDintintint⽂件FIONBINFIOASYNCFIONREADFIOSETOWNFIOGETOWN设置/ 清除⾮阻塞I/O 标志设置/ 清除信号驱动异步I/O 标志获取接收缓存区中的字节数设置⽂件的进程ID 或进程组ID获取⽂件的进程ID 或进程组IDintintintintint接⼝SIOCGIFCONFSIOCSIFADDRSIOCGIFADDRSIOCSIFFLAGSSIOCGIFFLAGSSIOCSIFDSTADDRSIOCGIFDSTADDRSIOCGIFBRDADDRSIOCSIFBRDADDRSIOCGIFNETMASKSIOCSIFNETMASKSIOCGIFMETRICSIOCSIFMETRICSIOCGIFMTUSIOCxxx获取所有接⼝的清单设置接⼝地址获取接⼝地址设置接⼝标志获取接⼝标志设置点到点地址获取点到点地址获取⼴播地址设置⼴播地址获取⼦⽹掩码设置⼦⽹掩码获取接⼝的测度设置接⼝的测度获取接⼝MTU(还有很多取决于系统的实现)struct ifconfstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqARP SIOCSARPSIOCGARPSIOCDARP创建/ 修改ARP 表项获取ARP 表项删除ARP 表项struct arpreqstruct arpreqstruct arpreq路由SIOCADDRTSIOCDELRT增加路径删除路径struct rtentrystruct rtentry流I_xxx⼆、 ioctl的必要性如果不⽤ioctl的话,也可以实现对设备I/O通道的控制,但那是蛮拧了。

Linux内核的一些函数--总结笔记

Linux内核的一些函数--总结笔记

Linux内核的一些函数--总结笔记Linux内核的一些函数1、MKDEV(ma, mi)构造设备号,将主设备号和次设备号转换为设备号类型(dev_t)。

MKDEV宏将主设备号(ma)左移20位,然后与次设备号(mi)相与,得到设备号。

dev_t结构主设备号12位次设备号20位2、int register_chrdev_region(dev_t from, unsigned count, const char *name)静态分配设备号,成功时返回0;错误时返回一个负的错误码,并且不能为字符设备分配设备号。

from是要分配的设备号范围的起始值,一般只提供from的主设备号,次设备号通常被设置为0。

count是需要申请的连续设备号的个数。

name是和该范围编号有关的设备名称,该名称不能超过64字节。

3、void unregister_chrdev_region(dev_t from, unsigned count)释放申请的设备号。

from表示要释放的设备号,count表示从from开始要释放的设备号个数。

通常,在模块卸载函数中调用unregister_chrdev_region()函数。

4、static inline void *kmalloc (size_t size, gfp_t flags)在物理内存中为程序分配一个连续的存储空间。

这个存储空间的数据不会被清零,也就是保存内存中原有的数据。

size表示分配内存的大小,flags是分配标志,可以通过这个标志控制kmalloc()函数的多种分配方式。

常用的两种分配标志GFP_KERNEL,GFP_ATOMIC。

GFP_KERNEL:内存分配时最常用的方法。

当内存不足时,可能会引起休眠;GFP_ATOMIC:在不允许睡眠的进程中使用,不会引起睡眠。

5、void cdev_init(struct cdev *cdev, struct file_operations*fops)静态初始化cdev设备。

linux system函数详解

linux system函数详解

linux system函数详解Linux是一个开源的操作系统内核,以稳定、高效和安全性闻名。

在Linux系统中,系统函数是一组用于实现特定功能的函数集合。

这些函数提供了访问操作系统核心功能的接口,使程序能够与操作系统进行交互。

在Linux系统函数的详解中,以下是一些常用的系统函数:1. open()函数:该函数用于打开文件,并返回一个文件描述符。

文件描述符是操作系统分配给打开的文件的整数值,可以用于后续的文件操作,如读取和写入。

2. read()函数:read()函数用于从已打开的文件中读取数据。

它接受三个参数:文件描述符、数据缓冲区的地址和要读取的字节数。

该函数将读取的数据存储在缓冲区中,并返回实际读取的字节数。

3. write()函数:write()函数用于向已打开的文件写入数据。

它接受三个参数:文件描述符、要写入的数据缓冲区的地址和要写入的字节数。

该函数将缓冲区中的数据写入文件,并返回实际写入的字节数。

4. close()函数:close()函数用于关闭先前打开的文件。

它接受一个参数,即要关闭的文件描述符。

该函数将释放文件描述符并断开与文件的连接。

5. fork()函数:fork()函数用于创建一个子进程。

调用该函数后,父进程将创建一个新的子进程,并且子进程将继承父进程的代码段、数据段和堆栈等信息。

可以使用fork()函数来实现并行处理和任务分发。

6. exec()函数:exec()函数用于在当前进程中执行一个新的程序。

它接受两个参数:要执行的程序路径和命令行参数。

调用exec()函数后,当前进程的代码和数据将被替换为新程序的代码和数据,从而实现程序的替换执行。

这些系统函数是Linux系统编程中常用的一部分。

通过熟练使用这些系统函数,我们可以实现文件操作、进程控制、程序执行等功能。

同时,深入了解这些系统函数的原理和底层机制也有助于优化程序的性能和稳定性。

总之,熟悉和理解Linux系统函数是成为一名优秀的系统开发工程师的必备技能之一。

Linux常用数学函数篇

Linux常用数学函数篇
printfangle执行angle0463648ceil取不小于参数的最小整型数相关函数fabs表头文件include定义函数doubleceildouble函数说明ceil会返回不小于参数x的最小整数值结果以double形态返回
Untitled Document
页码,1/9
abs(计算整型数的绝对值)
执行 cos(0.5) = 0.877583
页码,4/9
cosh(取双曲线余玄函数值)
相关函数 sinh,tanh
表头文件 #include<math.h>
定义函数 double cosh(double x);
函数说明 cosh()用来计算参数x的双曲线余玄值,然后将结果返回。数学定义 式为:(exp(x)+exp(-x))/2。
执行 angle = 1.047198
asin(取反正弦函数值)
file://D:\linux_c\function\06.html
2004-1-9
Untitled Document
页码,2/9
相关函数 acos , atan , atan2 , cos , sin , tan
表头文件 #include <math.h>
返回值 返回参数x的底数部分,指数部分则存于exp指针所指的地址。
附加说明 使用GCC编译时请加入-lm。
范例 #include <math.h> main() { int exp; double fraction; fraction = frexp (1024,&exp); printf("exp = %d\n",exp); printf("fraction = %f\n", fraction); }

linux核心函数

linux核心函数

linux核心函数Linux 内核是操作系统的核心部分,它提供了操作系统的核心功能,包括进程管理、内存管理、文件系统等。

Linux 内核的源代码中包含了大量的函数,用于实现各种操作系统的功能。

以下是一些Linux 内核中常见的核心函数,它们扮演着关键的角色:1.进程管理函数:–fork():创建一个新的进程。

–exec():在当前进程中执行一个新的程序。

–wait():等待子进程结束。

–exit():终止当前进程。

2.调度和任务管理函数:–schedule():进行进程调度。

–yield():主动让出CPU,将当前进程移动到就绪队列的末尾。

–wake_up_process():唤醒一个等待中的进程。

3.内存管理函数:–kmalloc():在内核中分配内存。

–kfree():释放内核中的内存。

–vmalloc():在虚拟地址空间中分配内存。

4.文件系统函数:–open():打开一个文件。

–read():从文件中读取数据。

–write():向文件中写入数据。

–close():关闭文件。

5.设备驱动函数:–register_chrdev():注册字符设备。

–unregister_chrdev():注销字符设备。

–request_irq():注册中断处理函数。

6.网络函数:–socket():创建套接字。

–bind():将套接字与地址绑定。

–listen():侦听传入连接请求。

–accept():接受传入的连接请求。

7.定时器和时钟函数:–timer_create():创建一个定时器。

–timer_settime():设置定时器的时间。

–gettimeofday():获取当前时间。

8.同步和互斥函数:–spin_lock():获取自旋锁。

–spin_unlock():释放自旋锁。

–mutex_lock():获取互斥锁。

–mutex_unlock():释放互斥锁。

这些函数仅仅是Linux 内核中众多函数的一小部分,Linux 内核的源代码非常庞大而复杂,包含了各种各样的功能和模块。

linux 载入函数

linux 载入函数

linux 载入函数
Linux 载入函数是指系统启动过程中进行内核初始化和加载一些初始化模块的函数。

这些载入函数通常是存储在Linux 内核映像中的,因此被称为内核函数。

下面是一些常见的Linux 载入函数:
1. start_kernel():Linux 内核启动函数,进行基本设置和初始化。

2. setup_arch():用于设置系统硬件架构相关的信息。

3. reserve_initrd():用于预留初始化RAM 磁盘(INITRD) 的内存区域。

4. paging_init():用于设置虚拟内存管理器,初始化页表等。

5. mem_init():用于初始化物理内存管理器,建立物理内存映射。

6. vfs_caches_init():用于初始化虚拟文件系统缓存。

7. init_post():用于载入一些内核模块,帮助内核完成初始化。

这些函数的具体实现会根据所使用的Linux 内核版本和硬件架构有所不同。

但是,它们都是Linux 系统启动过程的核心组成部分,对系统的正常运行至关重
要。

Linux中select函数学习及实例笔记

Linux中select函数学习及实例笔记

Linux中select函数学习及实例笔记Unix中的函数select和poll用来,支持Unix中I/O复用的功能,在Unix中I/O模型可以分为以一几种:(1)阻塞I/O(2)非阻塞I/O(3)I/O复用(select和poll)(4)信号驱动I/O(SIGIO)(5)异步I/O其中,现在比较流行的I/O模型是阻塞I/O模型.阻塞I/O是当应用程序和内核交换数据时,由于内核还没有准备好数据,那么应用程序必须进行阻塞,不能继续执行,直到内核的数据准备好!应用程序取到数据返回后,阻塞过程结束!但返回的结果也并不一定是正确的!这里只是举一个简单的例子!也许情况会更加的复杂!非阻塞I/O,例如在和内核交换数据时,如果内核的数据没有准备好,那么应用程序不会一真等待,会有一个返回信息,以判断是那里出了问题!这样有助于确认是在那个阶段出了问题!I/O复用,我们就可以调用系统调用select和poll!在这两个系统调用中的某一个阻塞,而不是真正的阻塞I/O系统调用!下面主要介绍I/O复用中的select函数!select函数可以指示内核等待多个事件中的任一个发生,仅在一个或多个事件发生,或者等待一个足够的时间后才唤醒进程!select函数的原型如下:#include <sys/types.h>#include<sys/time.h>int select (int maxfdp1,fd_set *readset,fd_set * writeset,fd_set excpetset,const struct timeval *timeout);返回值:准备好的描述符的正数目 0---超时 -1---出错!其中最后一个参数是一个结构体的指针,它表示等待内核中的一组描述符任一个准备好需要花费多久的时间!其中timeval指定了秒数和微秒数。

struct timeval{long tv_sec;//秒数long tv_usec;//微秒数};将 timeout设置为空指针时,会永远等待下去,等待固定的时间:如果timeout指向的timeval中的具体的值时,会等待一个固定的时间,不等待立刻返回,这时timeval中的tv_sec和tv_usec为0.select有三个可能的返回值。

linux系统函数

linux系统函数

linux系统函数Linux系统函数是在Linux操作系统中使用的函数库。

这些函数提供了许多常用的功能,如文件操作、进程管理、网络通信等等。

本文将介绍一些常用的Linux系统函数及其用法。

一、文件操作函数1. fopenfopen函数用于打开文件。

它的原型如下:FILE *fopen(const char *path, const char *mode);其中,path是文件路径,mode是打开文件的模式。

mode可以是以下之一:- 'r':只读模式,打开文件用于读取。

- 'w':写模式,打开文件用于写入。

如果文件不存在,则创建一个新文件;如果文件已存在,则清空文件内容。

- 'a':追加模式,打开文件用于写入。

如果文件不存在,则创建一个新文件;如果文件已存在,则在文件末尾追加内容。

- 'r+':读写模式,打开文件用于读取和写入。

- 'w+':读写模式,打开文件用于读取和写入。

如果文件不存在,则创建一个新文件;如果文件已存在,则清空文件内容。

- 'a+':读写模式,打开文件用于读取和写入。

如果文件不存在,则创建一个新文件;如果文件已存在,则在文件末尾追加内容。

fopen函数返回一个指向文件的指针。

如果打开文件失败,则返回NULL。

fclose函数用于关闭文件。

它的原型如下:int fclose(FILE *stream);其中,stream是指向要关闭的文件的指针。

如果关闭文件成功,则返回0;否则返回EOF。

3. freadfread函数用于从文件中读取数据。

它的原型如下:size_t fread(void *ptr, size_t size, size_t count, FILE *stream);其中,ptr是一个指向要读取数据的缓冲区的指针;size是每个数据项的大小;count是要读取的数据项数;stream是指向要读取的文件的指针。

linux下常用系统函数

linux下常用系统函数

linux下常用系统函数一、进程控制:fork 创建一个新进程clone 按指定条件创建子进程execve 运行可执行文件exit 中止进程_exit 立即中止当前进程getdtablesize 进程所能打开的最大文件数getpgid 获取指定进程组标识号setpgid 设置指定进程组标志号getpgrp 获取当前进程组标识号setpgrp 设置当前进程组标志号getpid 获取进程标识号getppid 获取父进程标识号getpriority 获取调度优先级setpriority 设置调度优先级modify_ldt 读写进程的本地描述表nanosleep 使进程睡眠指定的时间nice 改变分时进程的优先级pause 挂起进程,等待信号personality 设置进程运行域prctl 对进程进行特定操作ptrace 进程跟踪sched_get_priority_max 取得静态优先级的上限sched_get_priority_min 取得静态优先级的下限sched_getparam 取得进程的调度参数sched_getscheduler 取得指定进程的调度策略sched_rr_get_interval 取得按RR算法调度的实时进程的时间片长度sched_setparam 设置进程的调度参数sched_setscheduler 设置指定进程的调度策略和参数sched_yield 进程主动让出处理器,并将自己等候调度队列队尾vfork 创建一个子进程,以供执行新程序,常与execve等同时使用wait 等待子进程终止wait3 参见waitwaitpid 等待指定子进程终止wait4 参见waitpidcapget 获取进程权限capset 设置进程权限getsid 获取会晤标识号setsid 设置会晤标识号二、文件系统控制1、文件读写操作fcntl 文件控制open 打开文件creat 创建新文件close 关闭文件描述字read 读文件write 写文件readv 从文件读入数据到缓冲数组中writev 将缓冲数组里的数据写入文件pread 对文件随机读pwrite 对文件随机写lseek 移动文件指针_llseek 在64位地址空间里移动文件指针dup 复制已打开的文件描述字dup2 按指定条件复制文件描述字flock 文件加/解锁poll I/O多路转换truncate 截断文件ftruncate 参见truncateumask 设置文件权限掩码fsync 把文件在内存中的部分写回磁盘2、文件系统操作access 确定文件的可存取性chdir 改变当前工作目录fchdir 参见chdirchmod 改变文件方式fchmod 参见chmodchown 改变文件的属主或用户组fchown 参见chownlchown 参见chownchroot 改变根目录stat 取文件状态信息lstat 参见statfstat 参见statstatfs 取文件系统信息fstatfs 参见statfsreaddir 读取目录项getdents 读取目录项mkdir 创建目录mknod 创建索引节点rmdir 删除目录rename 文件改名link 创建链接symlink 创建符号链接unlink 删除链接readlink 读符号链接的值mount 安装文件系统umount 卸下文件系统ustat 取文件系统信息utime 改变文件的访问修改时间utimes 参见utimequotactl 控制磁盘配额三、系统控制ioctl I/O总控制函数_sysctl 读/写系统参数acct 启用或禁止进程记账getrlimit 获取系统资源上限setrlimit 设置系统资源上限getrusage 获取系统资源使用情况uselib 选择要使用的二进制函数库ioperm 设置端口I/O权限iopl 改变进程I/O权限级别outb 低级端口操作reboot 重新启动swapon 打开交换文件和设备swapoff 关闭交换文件和设备bdflush 控制bdflush守护进程sysfs 取核心支持的文件系统类型sysinfo 取得系统信息adjtimex 调整系统时钟alarm 设置进程的闹钟getitimer 获取计时器值setitimer 设置计时器值gettimeofday 取时间和时区settimeofday 设置时间和时区stime 设置系统日期和时间time 取得系统时间times 取进程运行时间uname 获取当前UNIX系统的名称、版本和主机等信息vhangup 挂起当前终端nfsservctl 对NFS守护进程进行控制vm86 进入模拟8086模式create_module 创建可装载的模块项delete_module 删除可装载的模块项init_module 初始化模块query_module 查询模块信息*get_kernel_syms 取得核心符号,已被query_module代替四、内存管理brk 改变数据段空间的分配sbrk 参见brkmlock 内存页面加锁munlock 内存页面解锁mlockall 调用进程所有内存页面加锁munlockall 调用进程所有内存页面解锁mmap 映射虚拟内存页munmap 去除内存页映射mremap 重新映射虚拟内存地址msync 将映射内存中的数据写回磁盘mprotect 设置内存映像保护getpagesize 获取页面大小sync 将内存缓冲区数据写回硬盘cacheflush 将指定缓冲区中的内容写回磁盘五、网络管理getdomainname 取域名setdomainname 设置域名gethostid 获取主机标识号sethostid 设置主机标识号gethostname 获取本主机名称sethostname 设置主机名称六、socket控制socketcall socket系统调用socket 建立socketbind 绑定socket到端口connect 连接远程主机accept 响应socket连接请求send 通过socket发送信息sendto 发送UDP信息sendmsg 参见sendrecv 通过socket接收信息recvfrom 接收UDP信息recvmsg 参见recvlisten 监听socket端口select 对多路同步I/O进行轮询shutdown 关闭socket上的连接getsockname 取得本地socket名字getpeername 获取通信对方的socket名字getsockopt 取端口设置setsockopt 设置端口参数sendfile 在文件或端口间传输数据socketpair 创建一对已联接的无名socket 七、用户管理getuid 获取用户标识号setuid 设置用户标志号getgid 获取组标识号setgid 设置组标志号getegid 获取有效组标识号setegid 设置有效组标识号geteuid 获取有效用户标识号seteuid 设置有效用户标识号setregid 分别设置真实和有效的的组标识号setreuid 分别设置真实和有效的用户标识号getresgid 分别获取真实的,有效的和保存过的组标识号setresgid 分别设置真实的,有效的和保存过的组标识号getresuid 分别获取真实的,有效的和保存过的用户标识号setresuid 分别设置真实的,有效的和保存过的用户标识号setfsgid 设置文件系统检查时使用的组标识号setfsuid 设置文件系统检查时使用的用户标识号getgroups 获取后补组标志清单setgroups 设置后补组标志清单八、进程间通信ipc 进程间通信总控制调用1、信号sigaction 设置对指定信号的处理方法sigprocmask 根据参数对信号集中的信号执行阻塞/解除阻塞等操作sigpending 为指定的被阻塞信号设置队列sigsuspend 挂起进程等待特定信号signal 参见signalkill 向进程或进程组发信号*sigblock 向被阻塞信号掩码中添加信号,已被sigprocmask代替*siggetmask 取得现有阻塞信号掩码,已被sigprocmask代替*sigsetmask 用给定信号掩码替换现有阻塞信号掩码,已被sigprocmask代替*sigmask 将给定的信号转化为掩码,已被sigprocmask代替*sigpause 作用同sigsuspend,已被sigsuspend代替sigvec 为兼容BSD而设的信号处理函数,作用类似sigactionssetmask ANSI C的信号处理函数,作用类似sigaction2、消息msgctl 消息控制操作msgget 获取消息队列msgsnd 发消息msgrcv 取消息3、管道pipe 创建管道4、信号量semctl 信号量控制semget 获取一组信号量semop 信号量操作5、共享内存shmctl 控制共享内存shmget 获取共享内存shmat 连接共享内存shmdt 拆卸共享内存。

linux常用c函数

linux常用c函数

以下是Linux系统下常用的C函数:
printf() -输出函数,常用于打印文本和变量值。

scanf() -输入函数,用于从键盘读取输入数据。

malloc() -内存分配函数,用于在堆上分配指定大小的内存空间。

free() -内存释放函数,用于释放先前分配的内存空间。

strcpy() -字符串复制函数,用于将一个字符串复制到另一个字符串中。

strlen() -字符串长度函数,用于计算一个字符串的长度。

strcmp() -字符串比较函数,用于比较两个字符串是否相等。

memset() -内存设置函数,用于将指定内存区域设置为指定的值。

memcpy() -内存复制函数,用于将一个内存区域的内容复制到另一个内存区域中。

fopen() -文件打开函数,用于打开一个文件以进行读写操作。

fclose() -文件关闭函数,用于关闭先前打开的文件。

fgets() -从文件中读取一行数据的函数。

fputs() -将一行数据写入文件的函数。

fprintf() -格式化输出到文件的函数,类似于printf()。

fscanf() -格式化输入从文件中读取数据的函数,类似于scanf()。

linux内核比大小函数

linux内核比大小函数

linux内核比大小函数在Linux内核中,提供了许多函数用于比较大小。

以下是一些常用的比较大小函数:1. memcmp函数:- 函数原型:int memcmp(const void* ptr1, const void* ptr2, size_t num)-功能:按字节比较两个内存区域的大小- 返回值:若两个内存区域相等,则返回0;若ptr1小于ptr2,则返回一个负整数;若ptr1大于ptr2,则返回一个正整数。

2. strcmp函数:- 函数原型:int strcmp(const char* str1, const char* str2) -功能:按字典顺序比较两个字符串的大小- 返回值:若两个字符串相等,则返回0;若str1小于str2,则返回一个负整数;若str1大于str2,则返回一个正整数。

3. strncmp函数:- 函数原型:int strncmp(const char* str1, const char* str2, size_t num)- 功能:按字典顺序比较两个字符串的大小,最多只比较前num个字符- 返回值:若两个字符串相等,则返回0;若str1小于str2,则返回一个负整数;若str1大于str2,则返回一个正整数。

4. strcasecmp函数:- 函数原型:int strcasecmp(const char* str1, const char*str2)-功能:按字典顺序比较两个字符串的大小,忽略大小写- 返回值:若两个字符串相等,则返回0;若str1小于str2,则返回一个负整数;若str1大于str2,则返回一个正整数。

5. strncasecmp函数:- 函数原型:int strncasecmp(const char* str1, const char* str2, size_t num)- 功能:按字典顺序比较两个字符串的大小,忽略大小写,最多只比较前num个字符- 返回值:若两个字符串相等,则返回0;若str1小于str2,则返回一个负整数;若str1大于str2,则返回一个正整数。

linux内核睡眠函数

linux内核睡眠函数

linux内核睡眠函数Linux内核睡眠函数在Linux内核中,睡眠函数是一种重要的机制,用于控制系统的休眠和唤醒。

睡眠函数的主要作用是在系统空闲时将其置于睡眠状态,以节省能量并延长电池寿命。

本文将探讨Linux内核中常用的睡眠函数,并介绍其工作原理和使用方法。

一、Linux内核睡眠函数的分类Linux内核中的睡眠函数可以分为两类:延时睡眠和条件睡眠。

1. 延时睡眠:延时睡眠函数用于暂停程序的执行一段时间,可以是毫秒、秒或其他时间单位。

常用的延时睡眠函数有msleep()和usleep()。

msleep()函数以毫秒为单位进行延时,而usleep()函数以微秒为单位进行延时。

2. 条件睡眠:条件睡眠函数用于在满足特定条件之前使进程进入睡眠状态。

常用的条件睡眠函数有wait_event()和wait_event_interruptible()。

wait_event()函数会使进程进入睡眠状态,直到某个条件满足为止。

而wait_event_interruptible()函数与wait_event()函数类似,但是可以被信号中断。

二、Linux内核睡眠函数的工作原理Linux内核睡眠函数的工作原理可以简单地描述为:当调用睡眠函数时,进程会被挂起,不再参与CPU的调度,直到睡眠条件满足或指定的时间到达。

1. 延时睡眠的工作原理:延时睡眠函数通过设置进程的状态为TASK_UNINTERRUPTIBLE,并将进程的当前时间加上指定的延时时间,然后将进程插入到延时队列中。

当延时时间到达时,内核会将进程从延时队列中唤醒。

2. 条件睡眠的工作原理:条件睡眠函数通过设置进程的状态为TASK_INTERRUPTIBLE,并检查条件是否满足。

如果条件不满足,进程会被挂起,不再参与CPU的调度。

当条件满足时,内核会将进程从睡眠状态唤醒。

三、使用Linux内核睡眠函数的注意事项在使用Linux内核睡眠函数时,需要注意以下几点:1. 避免长时间的睡眠:长时间的睡眠会导致系统响应变慢,甚至出现卡死的情况。

linux标准库函数

linux标准库函数

linux标准库函数
“Linux标准库函数”这句话的意思是“在Linux操作系统中,由标准C库提供的函数”。

Linux是一个开源的操作系统,它提供了丰富的系统调用和库函数供开发者使用。

这些库函数是标准C库的一部分,它们为开发者提供了基本的输入/输出、内存管理、文件操作等功能。

Linux标准库函数包括但不限于以下一些常见的函数:
1.printf():用于输出格式化的字符串到标准输出(通常是终端)。

2.scanf():用于从标准输入(通常是键盘)读取格式化的输入。

3.malloc():用于动态分配内存。

4.free():用于释放之前分配的内存。

5.fopen():用于打开文件。

6.fclose():用于关闭文件。

7.fprintf():用于向文件写入格式化的字符串。

8.fscanf():用于从文件读取格式化的输入。

9.strlen():用于获取字符串的长度。

10.strcmp():用于比较两个字符串。

这些函数都是C语言标准库中的一部分,在Linux中也有对应的实现。

它们是许多C语言程序的基础,提供了基本的输入/输出、数据操作等功能。

在最后总结,“Linux标准库函数”是指Linux操作系统中提供的标准C库函数,这些函数为开发者提供了基本的工具,以构建和运行各种应用程序。

linux内核库函数【转】

linux内核库函数【转】

linux内核库函数【转】转⾃:当编写驱动程序时,⼀般情况下不能使⽤C标准库的函数。

Linux内核也提供了与标准库函数功能相同的⼀些函数,但⼆者还是稍有差别。

类别函数名功能函数形成参数描述字符串转换simple_strtol把⼀个字符串转换为⼀个有符号长整数long simple_strtol (const char * cp,char ** endp, unsigned int base)cp指向字符串的开始,endp为指向要分析的字符串末尾处的位置,base为要⽤的基数。

simple_strtoll把⼀个字符串转换为⼀个有符号长长整数long long simple_strtoll (constchar * cp, char ** endp, unsignedint base)cp指向字符串的开始,endp为指向要分析的字符串末尾处的位置,base为要⽤的基数。

simple_strtoul把⼀个字符串转换为⼀个⽆符号长整数long long simple_strtoul (constchar * cp, char ** endp, unsignedint base)cp指向字符串的开始,endp为指向要分析的字符串末尾处的位置,base为要⽤的基数。

simple_strtoull把⼀个字符串转换为⼀个⽆符号长长整数long long simple_strtoull (constchar * cp, char ** endp, unsignedint base)cp指向字符串的开始,endp为指向要分析的字符串末尾处的位置,base为要⽤的基数。

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

int vsnprintf (char * buf, size_tsize, const char * fmt, va_list args)buf为存放结果的缓冲区,size为缓冲区的⼤⼩,fmt为要使⽤的格式化字符串,args为格式化字符串的参数。

linux核心函数

linux核心函数

linux核心函数摘要:1.Linux 核心函数简介2.系统调用与用户态和内核态3.进程管理相关核心函数4.内存管理相关核心函数5.文件系统相关核心函数6.设备驱动相关核心函数7.总结正文:Linux 核心函数是操作系统内核中实现各种功能的关键组件。

它们为系统提供了一种抽象层,使得用户和应用程序能够通过系统调用与内核进行交互。

本文将介绍一些重要的Linux 核心函数,包括它们的功能和作用。

首先,我们需要了解Linux 系统中的用户态和内核态。

用户态是用户和应用程序运行的地方,而内核态则是操作系统的核心代码运行的地方。

系统调用是用户态和内核态之间的接口,它允许用户和应用程序请求内核提供的服务。

例如,创建一个新进程、访问硬件设备或者在文件系统中读取数据等。

在进程管理方面,Linux 核心函数负责处理进程的创建、终止、调度等操作。

常见的进程管理相关核心函数包括:fork、exit、waitpid、getpid、scheduler_tick 等。

这些函数使操作系统能够对进程进行有效地管理,从而提高系统的并发性能。

内存管理是操作系统的一个重要功能,负责分配和回收内存资源。

Linux 核心函数提供了多种内存分配和释放的函数,例如:kmalloc、kfree、page_alloc、page_free 等。

这些函数为内核提供了一种高效、可靠的方式管理内存资源。

在文件系统方面,Linux 核心函数实现了文件和目录的创建、删除、读取、写入等操作。

常见的文件系统相关核心函数包括:mkdir、rmdir、open、close、read、write、lseek 等。

这些函数使操作系统能够处理各种文件操作,满足用户和应用程序的需求。

设备驱动是操作系统与硬件设备之间的桥梁,负责控制和访问硬件设备。

Linux 核心函数提供了丰富的设备驱动相关核心函数,例如:request_irq、free_irq、devm_platform_ioremap_resource 等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux内核的一些函数
1、MKDEV(ma, mi)
构造设备号,将主设备号和次设备号转换为设备号类型(dev_t)。

MKDEV宏将主设备号(ma)左移20位,然后与次设备号(mi)相与,得到设备号。

dev_t结构
主设备号12位次设备号20位
2、int register_chrdev_region(dev_t from, unsigned count, const char *name)
静态分配设备号,成功时返回0;错误时返回一个负的错误码,并且不能为字符设备分配设备号。

from是要分配的设备号范围的起始值,一般只提供from的主设备号,次设备号通常被设置为0。

count是需要申请的连续设备号的个数。

name是和该范围编号有关的设备名称,该名称不能超过64字节。

3、void unregister_chrdev_region(dev_t from, unsigned count)
释放申请的设备号。

from表示要释放的设备号,count表示从from开始要释放的设备号个数。

通常,在模块卸载函数中调用unregister_chrdev_region()函数。

4、static inline void *kmalloc(size_t size, gfp_t flags)
在物理内存中为程序分配一个连续的存储空间。

这个存储空间的数据不会被清零,也就是保存内存中原有的数据。

size表示分配内存的大小,flags是分配标志,可以通过这个标志控制kmalloc()函数的多种分配方式。

常用的两种分配标志GFP_KERNEL,GFP_ATOMIC。

GFP_KERNEL:内存分配时最常用的方法。

当内存不足时,可能会引起休眠;GFP_ATOMIC:在不允许睡眠的进程中使用,不会引起睡眠。

5、void cdev_init(struct cdev *cdev, struct file_operations *fops)
静态初始化cdev设备。

将设备结构体与file_operations指针相关联。

事例如下:cdev_init(&my_cdev->cdev, &dsp2arm_fops); // 初始化cedv设备
my_cdev->cdev.owner = THIS_MODULE; // 使驱动程序属于该模块
my_cdev->cdev.ops = &dap2arm_fops; // cdev连接file_operations指针
6、int cdev_add(struct cdev *p, dev_t dev, unsigned count)
将字符设备注册到系统中(加入到内核中)。

传入cdev的指针、起始设备编号、设备编号范围。

如:cdev_add(&my_cdev->cdev, dev, 1)。

7、void cdev_del(struct cdev *p)
注销字符设备。

如cdev_del(&my_cdev->cdev)。

8、void kfree(void *_ptr)
释放内存,释放的内存必须是kmalloc()申请的。

9、void ioremap(unsigned long phys_addr, unsigned long size)
将外部设备的I/O端口物理地址映射到虚拟地址。

ioremap()函数接收一个物理地址和一个整个I/O端口的大小,返回一个虚拟地址,这个虚拟地址对应一个size 大小的物理地址空间。

10、void iounmap(volatile void __iomem *addr)
释放ioremap()函数申请的虚拟地址。

iounmap()函数接收ioremap()函数申请的虚拟地址作为参数,并取消物理地址到虚拟地址的映射。

11、init_waitqueue_head(wait_queue_head_t *q)
一个等待队列必须初始化才能被使用,(动态)初始化一个等待队列。

例如:wait_queue_head_t wait;
init_waitqueue_head(&wait);
12、wait_event_interruptible(wq, condition)
调用该函数在等待的过程中当前进程会被设置为TASK_INTERRUPTIBLE状态,意味着该进程将不会继续运行直到被唤醒,然后被添加到等待队列wq中。

在wait_event_interruptible()中首先判断condition是不是已经满足,如果条件满足则直接返回0,否则调用__wait_event_interruptible(),并用__ret来存放返回值。

13、void wait_up_interruptible(wait_queue_head_t *q)
唤醒q指定的注册在等待队列上的进程。

该函数不能直接的立即唤醒进程,而是由调度程序转换上下文,调整为可运行状态。

q:等待队列变量指针。

该函数只能唤醒TASK_INTERRUPTIBLE状态的的进程。

14、void init_timer(struct timer_list *timer)
初始化timer结构体变量,使其能够注册到内核定时器目录上。

函数init_timer()主要设置该内核定时器归属系统中哪一个处理,并初始化内核定时器链表指针的next 域为NULL。

其中,变量timer为内核定时器上注册的结构体的数据地址。

15、container_of(ptr, type, member)
通过一个结构变量中一个成员的地址找到这个结构体变量的首地址。

ptr、type、member分别代表指针、类型、成员。

例如:
struct test{int i; int j; char k}; struct test temp;
container_of(&temp.j, struct test, j);
通过temp.j的地址找到temp的首地址。

16、int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags,
const char *devname, void *dev_id)
用于申请中断线。

irq表示要申请的中断号;handler表示要注册的中断处理函数指针,当中断发生时,内核会自动调用该函数;irqflags表示关于中断处理的属性,内核通过这个标志可以决定该中断应该如何处理;devname表示设备的名字;
dev_id这个指针是为共享中断线而设立的,如果不需要共享中断线,那么只要将该指针设为NULL即可。

request_irq()函数成功返回0,错误时返回-EINVAL(Invalid argument)或者-ENOMEM(out of memory)。

17、enable_irq(unsigned int irq)
置当前系统指定的中断号可用。

18、void poll_wait(struct file *filp, wait_queue_head_t *queue, poll_table *wait)将当前进程添加到wait参数指定的等待列表(poll_table),这个函数不会引起阻塞,用在select系统调用中。

19、int remap_pfn_range(struct vma_area_struct *vma, unsigned long virt_addr,
unsigned long pfn, unsigned long size, pgprot_t prot)
函数功能是一次性建立新的页表去映射物理地址(创建页表),映射成功时返回0,否则返回一个错误的负数代码。

vma:物理地址被映射到的虚拟内存区域;virt_addr:被映射到用户空间的起始虚拟地址;pfn:对于物理地址的页框号,一般是vma—>vm_pgoff域;size:被映射区域的字节大小;prot:vma—>vm_page_prot。

相关文档
最新文档