Linux内核
文章平均质量分 77
三井申
talk is cheap
展开
-
《Linux内核设计与实现》读书笔记—内核数据结构
链表因为环形双向链表提供了最大的灵活性,所以Linux内核的标准链表就是采用环形双向链表形式实现的。 相比较传统的将数据结构塞入链表的实现,Linux采用将链表节点塞入数据结构的实现方式实现链表,链表的数据结构为struct list_head。 使用container_of(ptr,type,member)或者list_entry(ptr,type,member)宏,便可以返回包含list_head的父类型结构体。 内核提供了一组函数来操作链表,例如list_add()向指定节点后插入一个节点,原创 2022-02-16 22:01:51 · 361 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记—调试
通过打印来调试内核提供的打印函数printk()和C库提供的printf()函数功能几乎相同,printk()在任何地方都能调用它,既可以在进程上下文和中断上下文中被调用,也可以在持有锁时被调用,还可以在多处理器上同时被调用。 printk()可以指定一个日志级别,内核根据这个级别来判断是否在终端上打印消息。内核级别最高位KERN_EMERG,最低位KERN_DEBUG,当调用printk()不指定日志等级时,默认的等级位KERN_WARNING。 内核消息都被保存在一个LOG_BUF_LEN大小的原创 2022-02-15 21:01:30 · 581 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记—设备与模块
内核的成分主要分为四种:设备类型—为了统一普通设备的操作所采取的分类;模块—内核用于按需加载和卸载目标码的机制;内核对象—内核数据结构中支持面向对象的操作,还可以简单维护对象间的父子关系;sysfs—表示系统设备树的一个文件系统。设备类型Linux中的设备类型主要分为三种:块设备,字符设备和网络设备。 块设备缩写为blkdev,其以块为单位进行寻址,不同的设备类型块大小不同。块设备通常支持重定位操作,即支持对数据的随即访问。 字符设备缩写为cdev,字符设备不可寻址,仅提供数据的流式访问,也就是原创 2022-02-13 23:56:59 · 510 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记—页高速缓存和页回写
缓存手段Linux操作系统采用虚拟内存技术,因此系统中的所有进程之间以虚拟方式共享内存。对一个进程而言,它可以访问整个系统的所有物理内存,并且它拥有的地址空间也可以远远大于系统物理内存。...原创 2022-02-10 21:59:37 · 510 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记—进程地址空间
地址空间Linux操作系统采用虚拟内存技术,因此系统中的所有进程之间以虚拟方式共享内存。对一个进程而言,它可以访问整个系统的所有物理内存,并且它拥有的地址空间也可以远远大于系统物理内存。 尽管一个进程可以寻址4GB的虚拟内存(以32位的系统为例),但这并不代表它有权访问所有的虚拟地址,进程只能访问有效内存区域内的内存地址。每个内存区域也具有相关权限控制(可读,可写,可执行),如果一个进程访问了非有效内存区域内的地址,或者以不正确的方式访问了有效地址,那么内核就会终止该进程并返回“段错误”信息。 内存原创 2022-02-07 17:32:22 · 566 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记—块IO层
块设备设备文件通常分为两大类型:块设备和字符设备。块设备指的是可以随机访问固定大小数据片的硬件设备,例如硬盘,软盘,闪存等。字符设备指的是以字符流方式被访问的硬件设备,比如键盘,串口和网卡。 块设备的管理要比字符设备细致复杂得多,因为字符设备仅仅需要控制一个位置—当前位置,而块设备访问的位置可以在介质的不同区间前后移动。所以内核提供了一个专门的子系统来管理块设备,被称为块IO层。 块设备中最小的可寻址单元是扇区,扇区大小一般是2的整数倍,比如最常见的大小为512字节。扇区的大小是设备的物理熟悉,块设原创 2022-01-30 17:23:10 · 807 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记—虚拟文件系统
VFSVFS作为内核子系统,位用户空间提供文件和文件系统相关的接口,如下图所示:VFS使得用户可以直接使用open(),read(),write()这样的系统调用而无需考虑具体文件系统和实际的物理介质。 之所以可以这样使用这种通用接口,是因为内核在底层文件系统接口上建立了一个抽象层,该抽象层提供了一个通用文件系统模型,该模型囊括了任何文件系统的常用功能集和行为。 以用户空间的代码 ret =write(fd,buf,len) 为例,该系统调用的实际行为如下所示:UNIX文件系统Uni原创 2022-01-29 13:15:09 · 1226 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记—定时器和时间管理
jiffiesjiffies是一个记录系统自启动到现在的节拍总数的全局变量。 jiffies可以用来执行一些推后固定时间的处理。由于其定义为unsigned long,因此在32为计算机上为一个32bit无符号整数,有溢出的风险。 使用宏time_before(unknown, known)和time_after(unknown, known)来规避掉jiffies溢出翻转的风险。硬时钟和定时器计算机体系结构一般提供两种设备进行计时,一种是实时时钟,一种是设备定时器。 实时时钟(RTC)原创 2022-01-21 00:08:06 · 428 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记—内核同步技术
同步技术简介在中断处理程序中能避免并发访问的安全代码被称为中断安全代码;在多核处理程序中能避免并发访问的安全代码被称为SMP安全代码;在内核抢占时能避免并发访问的安全代码被称为抢占安全代码。 避免死锁的重点一般如下:按顺序加锁,使用嵌套的锁时必须以相同的顺序获取锁 防止发生饥饿,试问,如果A不发生,B要一直等下去么? 不要重复请求同一个锁 设计应力求简单,却复杂的加锁方案越容易造成死锁设计初期,加锁方案应该力求简单,仅当需要时再进一步优化加锁方案原子操作原子类型的数据定义为atom原创 2022-01-09 17:45:46 · 576 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记—中断下半部
下半部简介下半部的任务就是执行与中断处理密切相关但中断处理程序本身不执行的工作。 如果一个任务对时间非常敏感,则应放到中断处理程序中执行。如果一个任务和硬件相关,将其放在中断处理程序中执行。如果一个任务要保证不被其他中断打断,将其放在中断处理程序中执行。其他所有任务,考虑放置在下半部中执行。 Linux内核常用的下半部机制包括:任务队列,软中断,Tasklet和内核定时器 软中断是一组静态定义的接口,总共有32个,可以在所有处理器上同时执行,即使是同类型的也可以。 Tasklet是一种基于软中断原创 2022-01-09 17:43:42 · 166 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记—中断与系统调用
系统调用简介在Linux中,每个系统调用被赋予一个系统调用号,用户空间的进程执行一个系统调用时,这个系统调用号就用来指明到底是要执行哪个系统调用。 用户空间的程序无法直接执行内核代码,因为内核驻留在受保护的地址空间上。所以,当用户进程执行系统调用时,通过软中断陷入到内核中,内核上该软中断对应的异常处理程序通过读取对应的系统调用号,知道用户进程执行了那种系统调用后,变开始执行对应的系统调用处理程序完成任务。 内核提供了copy_to_user()和copy_from_user()两个函数来分别完成向用原创 2022-01-09 17:42:27 · 343 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记—进程调度
进程调度进程调度程序决定将哪个进程投入运行,何时运行以及运行多长时间。进程调度程序可看做在可运行态进城之间分配有限的处理器时间资源的内核子系统。 多任务系统可以划分为两类:非抢占式和抢占式。Linux提供了抢占式的多任务模式,在此模式下,由调度程序来决定什么时候停止一个进程的运行,以便其他进程能够得到执行机会,这个强制的挂起动作就叫做抢占。 当今众多现代操作系统对程序运行都采用了动态时间片计算的方式,并且引入了可配置的计算策略。不过Linux独一无二的"公平"调度程序本身并没有采取时间片来达到公平调原创 2022-01-09 17:38:36 · 178 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记—进程管理
进程进程并不仅仅局限于一段可执行程序代码。通常进程还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间,一个或多个执行线程,存放全局变量的数据段。 每个线程都拥有一个独立的线程栈,线程寄存器和程序计数器。一般会在栈顶创建一个结构体struct Thread_Info,该数据结构中保存指向进程描述符task_struct的指针。 内核通过一个唯一的进程标识符PID来 标识每个进程 一个进程必然处于五种进程状态中的一种:TASK_RUNN原创 2022-01-09 17:35:34 · 379 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记—内存管理
页页表查询的过程由硬件完成,但是页表的维护需要软件完成,处理器的MMU单元负责把虚拟地址转换成物理地址 当处理器发现虚拟地址无法通过页表映射到对应的物理地址时,就会触发一个缺页异常,挂起出错的进程,操作系统软件需要处理这个缺页异常。 一个页表可以由页缓存使用,可以作为私有数据,也可以作为进程页表中的映射 page结构是和物理页相关联的,而不是和虚拟页相关联的。内核用这一数据结构来知道一个页是否空闲,如果页被分配的话,谁拥有这个页,是用户空间进程、动态分配的内核数据还是静态内核代码或页高速缓存。区原创 2022-01-09 17:23:08 · 407 阅读 · 0 评论