Linux内核设计与实现
文章平均质量分 94
p0inter
生而自由,爱而无畏,保持热爱奔赴山海
展开
-
用户虚拟地址转化成物理地址,物理地址转换成内核虚拟地址,内核虚拟地址转换成物理地址,虚拟地址和对应页的关系
文章目录1. 用户虚拟地址转换成物理地址2. 内核虚拟地址转换成物理地址3. 物理地址转换成内核虚拟地址4 虚拟地址和对应页1. 用户虚拟地址转换成物理地址2. 内核虚拟地址转换成物理地址3. 物理地址转换成内核虚拟地址4 虚拟地址和对应页...原创 2022-05-23 22:01:45 · 1763 阅读 · 0 评论 -
延迟和定时器管理
文章目录1 内核中时间概念2 标准定时器jiffies和HZ定时器API标准定时器案例3 高精度定时器(HRT)高精度定时器案例4 内核中延迟和睡眠原子上下文非原子上下文1 内核中时间概念时间概念对计算机来说有些模糊,事实上内核必须在硬件的帮助下才能计算和管理时间。硬件为内核提供了一个系统定时器用于计算流失的时间。系统定时器以某种频率自发触发时钟中断,该频率可以通过编程预定,称为节拍率(系统定时器的频率)。因为节拍率对内核来说是可知的,所以内核知道连续两次时钟中断的间隔时间,这个间隔时间就是节拍。内核原创 2022-05-14 22:17:14 · 341 阅读 · 0 评论 -
Linux内存地址管理
在操作系统中,虚拟地址到物理地址转换是由MMU完成的,MMU转换的都是虚拟地址,所以访问数据,必须是虚拟地址,不能是物理地址,否则访问不了数据。进程访问的都是进程内虚拟地址,内核访问的都是内核虚拟地址,进程用不了内核虚拟地址,同样内核用不了进程内虚拟地址。...原创 2022-05-09 19:47:58 · 1147 阅读 · 0 评论 -
进程上下文和中断上下文
文章目录进程的preempt_count变量thread_infopreempt_counthardirq相关softirq相关上下文进程的preempt_count变量thread_info在内核中,上下文的设置和判断接口可以参考 include/linux/preempt.h 文件,整个机制的实现都依赖于一个变量:preempt_count,这个变量被定义在进程struct task_struct的 thread_info域中 ,也就是线程描述符中,线程描述符被放在内核栈的底部,在内核中可以通过转载 2022-05-07 10:28:00 · 595 阅读 · 0 评论 -
内存重映射
#include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); int munmap(void *addr, size_t length);用户空间的mmap()会通过系统调用调用内核的do_mmap()函数。do_mmap()函数会:首先创建一个新的VMA并初始.......转载 2022-05-05 11:24:54 · 1627 阅读 · 0 评论 -
进程虚拟地址管理
文章目录1 地址分布实际使用中的内存区域1 地址分布现在采用虚拟内存的操作系统通常都使用平坦地址空间,平坦地址空间是指地址空间范围是一个独立的连续空间(比如,地址从0扩展到429496729位地址空间),对于32位的操作系统而言,每个进程的虚拟地址空间都是0x00000000~0xC0000000,合计3G大小。进程的3G虚拟地址空间只有映射为物理地址空间,才能够被使用,那么进程是如何管理和分配它的3G虚拟地址空间呢?这就用到了分治思想,进程虚拟地址空间按照不同的访问属性和功能划分为不同的内存区原创 2022-05-05 10:16:19 · 352 阅读 · 0 评论 -
slab下kmalloc内核函数实现
文章目录kmalloc的整体实现获取高速缓存高速缓存获取index总结https://blog.csdn.net/qq_41683305/article/details/124554490,在这篇文章中,我们介绍了伙伴算法、slab机制和常见的内存管理函数,接下来,我们看看kmalloc内核函数的具体实现。kmalloc() 分配连续的物理地址,用于小内存分配。get_free_page() 分配连续的物理地址,用于整页分配。在slab机制下(还有slob、slub),kmalloc() 函数是基于 s原创 2022-05-04 14:11:51 · 803 阅读 · 0 评论 -
伙伴算法、slab机制、内存管理函数
文章目录原创 2022-05-03 18:17:51 · 1861 阅读 · 0 评论 -
同步---自旋锁
1 自旋锁的基本概念自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图获得一个已经被使用的自旋锁,那么该线程就会一直进行自旋,等待锁重新可用。在任何时刻,自旋锁都可以防止多余一个的执行线程同时进入临界区。Linux内核实现的自旋锁是不可递归的,如果你请求一个你已经持有的自旋锁,那么你将会自旋,等待释放这个锁,由于自旋,释放这个锁的操作不会被执行,所以会一直处于自旋忙等待中,于是就被锁死了。自旋锁可以在中断处理程序中使用。在中断处理程序中使用自旋锁时,一定要在获取锁之前,首先禁止本地中断(当前处理原创 2022-04-28 14:34:40 · 1900 阅读 · 0 评论 -
同步---信号量
信号量1 信号量2 驱动程序和测试程序3 内核的具体实现1 信号量Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已经被占用的信号量时,信号量会将其放到一个等待队列,然后让其睡眠,这时处理器去执行其他代码。当持有信号量的进程将信号量释放后,处于等待队列中的那个任务将被唤醒,并获得该信号量。信号量定义在文件include/linux/semaphore.h中/* Please don't access any members of this structure directly */st原创 2022-04-26 14:30:17 · 2086 阅读 · 0 评论 -
linux内核文件描述符fd、文件索引节点inode、文件对象file关系
文件描述符fd、文件索引节点inode、文件对象file关系1 VFS对象1.1 超级块对象1.2 索引节点对象1.3 文件对象1.4 进程描述符1.5 files_struct2 如何根据文件描述符fd找到文件?1 VFS对象在说fd、inode和file关系之前,我们先了解VFS的几个概念。分别是进程描述符、超级块对象、索引节点和文件对象。1.1 超级块对象超级块对象代表一个已安装的文件系统,由super_block结构体表示,定义在文件linux/fs中。1.2 索引节点对象索引节点对象代原创 2022-04-23 15:01:27 · 3428 阅读 · 3 评论 -
编写最简单的字符设备驱动
编写最简单的字符设备驱动1 编写驱动代码2 编写makefile3 编译和加载驱动4 编写应用程序测试驱动1 编写驱动代码驱动代码chardev.c如下:#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/cdev.h>#include <linux/fs.h>#include <linux/wait.h>#include <linux/原创 2022-04-22 10:31:29 · 6733 阅读 · 2 评论 -
Linux内核设计与实现---kobject sysfs
kobject sysfs1 kobject2 ktype3 kset4 subsystem5 别混淆了这些结构体6 管理和操作kobject7 引用计数8 sysfssysfs中添加和删除kobject向sysfs添加文件9 内核事件层1 kobject2 ktype3 kset4 subsystem5 别混淆了这些结构体6 管理和操作kobject7 引用计数8 sysfssysfs中添加和删除kobject向sysfs添加文件9 内核事件层...原创 2022-04-18 15:51:57 · 1173 阅读 · 0 评论 -
Linux内核设计与实现---模块
模块1 构建模块放在内核源代码树中放在内核代码外2 安装模块3 产生模块依赖性4 载入模块5 管理配置选项6 模块参数7 导出符号表Linux内核是模块化组成的,它允许内核在运行时动态地向其中插入或从中删除代码。与开发的内核核心子系统不同,模块开发更接近编写新的应用程序,因为至少要在模块文件中具有入口点和出口点。下面是hello_world内核模块#include <linux/init.h>#include <linux/module.h>#include <原创 2022-04-17 09:49:54 · 1183 阅读 · 0 评论 -
Linux内核设计与实现---页高速缓存和页回写
页高速缓存和页回写1 页高速缓存2 基树3 缓冲区高速缓存4 pdflush后台例程膝上型电脑模式bdflush和kupdated避免拥塞的方法:使用多线程1 页高速缓存2 基树3 缓冲区高速缓存4 pdflush后台例程膝上型电脑模式bdflush和kupdated避免拥塞的方法:使用多线程...原创 2022-04-15 22:02:50 · 388 阅读 · 0 评论 -
Linux内核设计与实现---进程地址空间
进程地址空间1 内存描述符分配内存描述符销毁内存描述符mm_struct与内核线程2 内存区域VMA标志VMA操作内存区域的树形结构和内存区域的链表结构实际使用中的内存区域3 操作内存区域find_vma()find_vma_prev()find_vma_intersection()4 mmap()和do_mmap():创建地址空间5 munmap()和do_munmap():删除地址空间6 页表1 内存描述符分配内存描述符销毁内存描述符mm_struct与内核线程2 内存区域VMA标志VMA原创 2022-04-14 10:55:10 · 920 阅读 · 0 评论 -
Linux内核设计与实现---块I/O层
块I/O层1 解刨一个块设备2 缓冲区和缓冲区头3 bio结构体4 请求队列5 I/O调度程序I/O调度程序的工作Linux电梯最终期限I/O调度程序预测I/O调度程序完全公正的排队I/O调度程序空操作的I/O调度程序I/O调度程序的选择小结1 解刨一个块设备2 缓冲区和缓冲区头3 bio结构体4 请求队列5 I/O调度程序I/O调度程序的工作Linux电梯最终期限I/O调度程序预测I/O调度程序完全公正的排队I/O调度程序空操作的I/O调度程序I/O调度程序的选择小结...原创 2022-04-12 11:22:42 · 1338 阅读 · 0 评论 -
Linux内核设计与实现---虚拟文件系统
虚拟文件系统1 通用文件系统2 文件系统抽象层3 Unix文件系统4 VFS对象及其数据结构5 超级快对象6 索引节点对象7 目录项对象目录项状态目录项缓存目录项操作8 文件对象9 和文件系统相关的数据结构10 和进程相关的数据结构Linux中的文件系统1 通用文件系统2 文件系统抽象层3 Unix文件系统4 VFS对象及其数据结构5 超级快对象6 索引节点对象7 目录项对象目录项状态目录项缓存目录项操作8 文件对象9 和文件系统相关的数据结构10 和进程相关的数据结构Lin原创 2022-04-11 10:52:36 · 1715 阅读 · 0 评论 -
Linux内核设计与实现---内存管理
内存管理1 页2 区3 获得页获得填充为0的页释放页4 kmalloc()gfp_mask标志kfree()5 vmalloc()6 slab层7 slab分配器的接口8 在栈上的静态分配9 高端内核的映射永久映射临时映射10 每个CPU的分配11 新的每个CPU的接口编译时的每个CPU数据运行时每个CPU数据12 使用每个CPU数据的原因13 分配函数的选择1 页2 区3 获得页获得填充为0的页释放页4 kmalloc()gfp_mask标志kfree()5 vmalloc()6 sl原创 2022-04-08 11:09:31 · 478 阅读 · 0 评论 -
Linux内核设计与实现---内核同步方法
内核同步方法1 原子操作原子整数操作原子位操作2 自旋锁其他针对自旋锁的操作自旋锁和下半部3 读-写自旋锁4 信号量创建和初始化信号量使用信号量5 读-写信号量6 自旋锁和信号量7 完成变量8 BKL9 禁止抢占10 顺序和屏障1 原子操作原子整数操作原子位操作2 自旋锁其他针对自旋锁的操作自旋锁和下半部3 读-写自旋锁4 信号量创建和初始化信号量使用信号量5 读-写信号量6 自旋锁和信号量7 完成变量8 BKL9 禁止抢占10 顺序和屏障...原创 2022-04-01 15:37:24 · 1959 阅读 · 0 评论 -
linux内核设计与实现---下半部和推后执行的工作
下半部和推后执行的工作1 下半部为什么要用下半部下半部的环境2 软中断软中断的实现使用软中断3 tasklettasklet的实现使用taskletksoftirqd老的BH机制4 工作队列工作队列的实现使用工作队列老的任务队列机制5 下半部机制的选择6 在下半部之间加锁7 总结1 下半部为什么要用下半部下半部的环境2 软中断软中断的实现使用软中断3 tasklettasklet的实现使用taskletksoftirqd老的BH机制4 工作队列工作队列的实现使用工作队列老的任务原创 2022-03-25 21:31:57 · 1367 阅读 · 0 评论 -
Linux内核设计与实现---中断和中断处理程序
中断和中断处理程序1 中断2 中断处理程序3 注册中断处理程序4 编写中断处理程序共享的中断处理程序中断处理程序实例5 中断上下文6 中断处理机制的实现7 中断控制禁止和激活中断禁止指定中断线中断系统的状态1 中断2 中断处理程序3 注册中断处理程序4 编写中断处理程序共享的中断处理程序中断处理程序实例5 中断上下文6 中断处理机制的实现7 中断控制禁止和激活中断禁止指定中断线中断系统的状态...原创 2022-03-24 10:49:54 · 4303 阅读 · 0 评论 -
Linux内核设计与实现---系统调用
系统调用1 API、POSIX和C库2 系统调用系统调用号系统调用的性能3 系统调用处理程序指定恰当的系统调用参数传递4 系统调用的实现5 系统调用上下文绑定一个系统调用的最后步骤从用户空间访问系统调用为什么不通过系统调用的方式实现小结1 API、POSIX和C库2 系统调用系统调用号系统调用的性能3 系统调用处理程序指定恰当的系统调用参数传递4 系统调用的实现5 系统调用上下文绑定一个系统调用的最后步骤从用户空间访问系统调用为什么不通过系统调用的方式实现小结...原创 2022-03-21 15:17:21 · 1614 阅读 · 0 评论 -
Linux内核设计与实现---进程调度
进程调度1 策略I/O消耗性和处理器消耗性的进程进程优先级时间片进程抢占调度策略的活动2 Linux调度算法可执行队列优先级数组重新计算时间片schedule()睡眠和唤醒负载平衡程序3 抢占和上下文切换用户抢占内核抢占4 实时5 与调度相关的系统调用与调度策略和优先级相关的系统调用与处理器绑定有关的系统调用放弃处理器时间6 调度程序小结1 策略I/O消耗性和处理器消耗性的进程进程优先级时间片进程抢占调度策略的活动2 Linux调度算法可执行队列优先级数组重新计算时间片schedule原创 2022-03-20 20:55:31 · 1282 阅读 · 0 评论 -
linux内核设计与实现---进程管理
进程管理1 进程描述符及任务结构分配进程描述符进程描述符的存放进程状态设置当前进程状态进程上下文进程家族树2 进程创建写时拷贝fork()vfork()3 线程在Linux中的实现4 进程终结删除进程描述符孤儿进程造成的进退微谷5 小结1 进程描述符及任务结构分配进程描述符进程描述符的存放进程状态设置当前进程状态进程上下文进程家族树2 进程创建写时拷贝fork()vfork()3 线程在Linux中的实现4 进程终结删除进程描述符孤儿进程造成的进退微谷5 小结...原创 2022-03-17 17:05:28 · 1006 阅读 · 0 评论 -
linux内核设计与实现---从内核出发
获取内核源码在linux内核官方网站http://www.kernel.org,可以获得当前最新版本Linux源码码。如果想找一些老版本的源代码,可以:https://mirrors.edge.kernel.org/pub/linux/kernel/下载。安装内核源代码内核压缩以GNU zip(gzip)和bzip2两种形式发布。以bzip2形式发布的Linux内核叫做linux-x.y.z.tar.bz2,这里x.y.z是内核源码的具体版本。如果压缩形式是bzip2,则运行:tar rvjf li原创 2022-03-15 14:50:21 · 1807 阅读 · 0 评论