![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux kernel 学习笔记
文章平均质量分 64
stone8761
这个作者很懒,什么都没留下…
展开
-
Linux Kernel 学习笔记6:内存申请
在内核中常用kmalloc申请较小的内存块,并用kfree释放所申请的内存。说申请较小的内存块意思是在申请大块内存时kmalloc效率很低,而且kmalloc一般最多只能申请128k-16字节数据。kmalloc与用户空间使用的malloc非常相似,不同之处在于kmalloc不对获取到的内存空间清零,这就意味着我们在使用的时候需要显示的清零。声明如下:static __always_inlin原创 2017-04-27 11:19:41 · 776 阅读 · 0 评论 -
Linux Kernel 学习笔记17:内核与用户层通信之sockopt
(本章基于:Linux-4.4.0-37)sockopt是内核与用户层通信方法中非常简单的一种,其本质是通过copy_to_user/copy_from_user在内核与用户层传递数据,因此效率不高,常用于传递控制、状态等信息;内核层:数据结构:linux/netfilter.hstatic struct nf_sockopt_ops my_sockopt_ops原创 2017-07-25 10:38:01 · 3228 阅读 · 2 评论 -
Linux Kernel 学习笔记16:总线设备驱动模型
(本章基于:Linux-3.13.0-32)Linux总线设备驱动模型结构如下图:设备(device)和驱动(driver)分别挂载在总线(bus)上,总线再通过自身的匹配函数(match)帮助device找到对应driver或者帮助driver找到对应的device;数据结构总线(bus)结构struct bus_type { //总线名 c原创 2017-07-09 15:22:11 · 984 阅读 · 1 评论 -
Linux Kernel 学习笔记15:阻塞IO设计
(本章基于:Linux-3.13.0-32)当一个设备无法立即满足用户的读写请求时应当阻塞该用户程序。例如在socket网络编程时,使用read在一个已经建立好的socket连接上读取对方发送的数据,但此时对方什么都没有发送,这时程序默认进入阻塞状态(即睡眠),等待接收到对方发送的有效数据时再唤醒该程序继续运行。在Linux内核模块中我们使用等待队列实现这种阻塞功能。1、定义等待队原创 2017-07-06 16:59:43 · 477 阅读 · 1 评论 -
Linux Kernel 学习笔记14:工作队列
(本章基于:Linux-3.13.0-32)工作队列是一种将任务推后执行的形式。它把推后的任务交由一个内核线程去执行。此任务运行与进程上下文,它允许重新调度甚至是睡眠。因此工作队列也常用于中断分层设计模型中的下半部分。数据结构工作队列结构:struct workqueue_struct { struct cpu_workqueue_struct原创 2017-07-05 19:48:02 · 478 阅读 · 0 评论 -
Linux Kernel 学习笔记13:混杂设备模型
(本章基于:Linux-4.4.0-37)Linux驱动中把无法归类的五花八门的设备定义为混杂设备(用miscdevice结构体表述),它是一种特殊的字符设备。miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同。 所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备,然后调用其file_operatio原创 2017-07-04 19:19:29 · 489 阅读 · 2 评论 -
Linux Kernel 学习笔记12:定时任务
(本章基于:Linux-4.4.0-37)内核定时器可在用户设定时间到达后调用一段任务,基本数据定义、API如下:struct timer_list { unsigned long expires; void (*function)(unsigned long); unsigned long data原创 2017-06-09 16:16:58 · 942 阅读 · 1 评论 -
Linux Kernel 学习笔记11:时间、延时
(本章基于:Linux-4.4.0-37) jiffies linux内核根据硬件定时器中断来跟踪时间流动,定时器中断始终按照固定的间隔产生,在linux内核中使用宏HZ表示这个间隔的大小。HZ在中定义,表示间隔的频率,即多少次中断表示1秒。 linux内核没发生一次中断,就将64位内核计数器jiffies_64自加1。在32位体系上jiffies是一个32位整型原创 2017-06-09 13:12:16 · 1065 阅读 · 2 评论 -
Linux Kernel 学习笔记1:module的基本结构和编译
Linux module基本结构如下:init、exit函数,init、exit函数加载、GPL和作者声明helloworld.c#include #include static __init int hello_init(void){ printk(KERN_ALERT "helloworld!\n"); return 0;}static原创 2017-04-12 22:06:21 · 2613 阅读 · 0 评论 -
Linux Kernel 学习笔记5:字符设备
本章介绍如何注册一个字符设备,并通过设备节点对这个字符设备进行open、close、read、write等操作。一、字符设备注册相关头文件:linux/cdev.h1、初始化void cdev_init(struct cdev *cdev, struct file_operations *fops);1) 待初始化设备2) Fop原创 2017-04-26 18:05:07 · 739 阅读 · 0 评论 -
Linux Kernel 学习笔记4:自动创建设备节点
Linux内核模块具有自动创建设备模块的功能(需要应用层支持udev)使用class_create()创建一个类,这个类可在/sys/class下找到对应目录,再用device_create()在类中创建设备。当模块被加载时udev会在类目录下发现此设备,并在/dev下创建相应的设备文件。(以下宏、函数均在linux/device.h中定义)创建类:class_原创 2017-04-18 21:28:24 · 4563 阅读 · 0 评论 -
Linux Kernel 学习笔记3:设备编号
Linux中设备编号分为主、次两种。主设备编号表示设备相连的驱动。次设备号决定引用哪个设备,这个由驱动自行定义。在内核中,设备编号类型为dev_t,本质就是一个32位无符号整型的量,在linux/types.h中定义。其中主编号占12位,次编号占20位。通过下面的宏可以获取主次编号:MAJOR(dev_t dev);MINOR(dev_t dev);相反,通过主次编号获取设备编号使原创 2017-04-14 15:55:49 · 840 阅读 · 0 评论 -
Linux Kernel 学习笔记2:模块参数
在用户态下编程可以通过main()来传递命令行参数,而编写一个内核模块则可通过宏module_param()来传递命令行参数.先来看看这个宏的定义(Linux-4.4.0-37)#define module_param(name, type, perm) \ module_param_named(name, name, type, perm)name:参数名type:参数类型,原创 2017-04-13 14:58:40 · 1973 阅读 · 1 评论 -
Linux Kernel 学习笔记9:内核与用户层通信之netlink
(本章基于:Linux-4.4.0-37)内核与用户空间通信有很多种通信方式,netlink是其中一种,其余的还有/proc、ioctl、sockopt、共享内存等等。netlink的特点是异步全双工。netlink使用32位端口寻址,称为pid(与进程号没有关系),其中内核的pid地址为0,。netlink主要特性如下:① 支持全双工、异步通信(当然同步也支持)② 用原创 2017-05-27 15:21:38 · 15043 阅读 · 11 评论 -
Linux Kernel 学习笔记7:同步与互斥之自旋锁
(本章基于:Linux-4.4.0-37)自旋锁是一个互斥设备,具有“锁定”和“解锁”两个状态。在进入临界区代码之前锁定,出临界区后解锁。当一个锁被锁定,其他进程尝试获取该锁时则进入“忙等”状态,即反复检查该锁的状态直到这个锁可用为止。因此在使用自旋锁时,代码临界区应该尽量“短小”,避免可能引起睡眠的操作,如kmalloc()。相关头文件:linux/spinlock.h自旋锁变量原创 2017-04-28 23:24:36 · 1225 阅读 · 1 评论 -
Linux Kernel 学习笔记8:同步与互斥之信号量
(本章基于:Linux-4.4.0-37)内核中信号量的概念与应用层一致,本质是一个整数值,表示当前资源数量。可对这个值进行PV操作。P操作表示如果此信号量大于0,则将信号量减一,进程继续,反之如果信号量小于等于0则等待,等到信号量变为正值,即其他进程释放资源。V操作释放资源,即将信号量值加一,并在必要的时候唤醒正在等待的进程。当信号量资源数量为1时,其实质就是一个互斥体,这与之前原创 2017-05-04 21:18:41 · 695 阅读 · 0 评论 -
Linux Kernel 学习笔记10:hook函数
(本章基于:Linux-4.4.0-37)linux 内核中有一套hook函数机制,可在不同hook点位置监控网络数据包,并执行丢弃、修改等操作。网络防火墙就是通过此机制实现的。注册注销hook函数:linux/netfilter.h注册钩子函数:int nf_register_hook(struct nf_hook_ops *reg);注销:void原创 2017-06-01 10:03:30 · 11893 阅读 · 9 评论