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 内核的源代码非常庞大而复杂,包含了各种各样的功能和模块。

  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。

相关文档
最新文档