
Linux内核设计与实现
文章平均质量分 91
Patarw_Li
在读小白一枚
展开
-
Linux内核学习(十三)—— 设备与模块(基于Linux 2.6内核)
并不是所有设备驱动都表示物理设备。有些设备驱动是虚拟的,仅仅提供访问内核功能而已。这种设备被称为 ”伪设备“ (pseudo device),如内核随机数发生器(/dev/random)、空设备(/dev/null)等。原创 2023-08-29 14:47:51 · 1268 阅读 · 0 评论 -
Linux内核学习(十二)—— 页高速缓存和页回写(基于Linux 2.6内核)
Linux 内核实现了一个被叫做的磁盘缓存,它主要用来减少对磁盘的 I/O 操作。它是通过把磁盘中的数据缓存到中,把对磁盘的访问变为对物理内存的访问。临时局部原理(temporal locality):如果在第一次访问数据时缓存它,那么就极有可能在短时间内再次访问到,因为程序内存在着循环;并且其相邻的数据也可能在短时间内被访问到,因为程序内存放的数据有很多是连续的(如数组)。原创 2023-08-28 11:25:43 · 565 阅读 · 0 评论 -
Linux内核学习(十一)—— 进程地址空间(基于Linux 2.6内核)
进程地址空间由进程可寻址并且允许进程使用的虚拟内存组成, 每个进程都有一个 32 位或 64 位的平坦(flat)地址空间,空间的具体大小取决于体系结构。术语 “平坦(flat)” 指的是地址空间范围是一个独立的连续空间。每个进程都有唯一的这种平坦地址空间,一个进程的地址空间与另一个进程的地址空间即使有相同的内存地址,实际上也彼此互不相干。相对地,能与其他进程共享它们的地址空间的进程,被称为线程。原创 2023-08-27 21:52:51 · 635 阅读 · 0 评论 -
Linux内核学习(十)—— 块 I/O 层(基于Linux 2.6内核)
系统中能够固定大小数据片(chunks)的硬件设备称作,这些固定大小的数据片就称作。最常见的块设备为硬盘,其他的还有软盘驱动器、闪存等,它们都是以安装文件系统的方式使用的。另一种基本的设备类型是。字符设备按照的方式被,像串口和键盘就属于字符设备。对于这两种类型的设备,它们的区别在于是否可以随机访问数据。内核对块设备的管理需要有一个专门提供服务的子系统,对字符设备的管理则不需要。原创 2023-08-26 16:19:48 · 849 阅读 · 0 评论 -
Linux内核学习(九)—— 虚拟文件系统(基于Linux 2.6内核)
虚拟文件系统(VFS)作为内核子系统,为用户空间程序提供了文件和文件系统相关的接口。通过虚拟文件系统,程序可以利用标准的 Unix 系统调用对不同的文件系统(甚至不同介质上的文件系统)进行读写操作。原创 2023-08-25 17:12:57 · 510 阅读 · 0 评论 -
Linux内核学习(八)—— 内存管理(基于Linux 2.6内核)
内核把作为内存管理的基本单位。尽管处理器的最小可寻址单位通常为字或字节,但是,通常以页为单位进行处理。MMU 以页为单位来管理系统中的页表。从虚拟内存的角度来看,页就是最小单位。大多数 32 位体系结构支持 4KB 的页,而 64 位体系结构一般会支持 8KB 的页。内核用结构表示系统中的每个page 结构与物理页相关,而并非与虚拟页相关。内核用这一结构来管理系统中所有的页,因为内核需要知道一个页是否空闲。原创 2023-08-24 16:19:35 · 504 阅读 · 0 评论 -
Linux内核学习(七)—— 定时器和时间管理(基于Linux 2.6内核)
系统定时器是一种可编程硬件芯片,能以固定频率产生定时器中断,它所对应的中断处理程序负责更新系统时间,也负责执行需要周期性运行的任务。原创 2023-08-23 11:17:50 · 435 阅读 · 0 评论 -
Linux内核学习(六)—— 中断(基于Linux 2.6内核)
中断使得硬件得以发出通知给处理器。中断随时都可以产生,如键盘敲击就会触发中断,通知操作系统有按键按下。不同设备对应的中断不同,而每个中断都通过一个唯一的数字标识。这些中断值通常被称为中断请求(IRQ)线。每个 IRQ 线都会关联一个数值量。异常与中断不同,它在产生时必须考虑与处理器时钟同步,异常也常常被称为。在处理器执行到错误指令时候(如除数为0),或者是在执行期间出现特殊情况(如缺页),这些异常需要通过内核来处理,处理器就会产生一个异常。原创 2023-08-21 17:00:00 · 785 阅读 · 1 评论 -
Linux内核学习(四)—— 系统调用(基于Linux 2.6内核)
在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口在应用程序和内核之间扮演了使者的角色。这些接口保证了系统的稳定可靠,避免应用程序肆意妄行。原创 2023-08-20 15:41:15 · 444 阅读 · 0 评论 -
Linux内核设计与实现(七)—— 内核同步方法(基于Linux 2.6内核)
P() 和 V() 操作,P为获得一个信号量,计数减一,如果减一后计数大于等于0,则获得锁,进入临界区,若小于0则放入等待队列;V为释放一个信号量,计数加一,若等待队列不为空,则等待的任务在被唤醒的同时获得该信号量。但是,使用锁可能会导致死锁,比如上面提到的一个线程试图去请求自己已经持有的锁,又或者是每个线程都持有一个锁,并且请求下一个进程所持有的锁,形成一个循环。如果一个线程试图获取自己持有的锁,那么它自己会自旋,并且没有机会释放锁,导致自己被永远锁死。当持有一个mutex时,进程不可退出(exit)。原创 2023-04-23 20:19:28 · 154 阅读 · 0 评论 -
Linux内核学习(三)—— 进程调度(基于Linux 2.6内核)
所有的调度器必须堆进程运行时间做记账,CFS虽然不再有时间片的概念,但是它也必须维护每个进程的运行时间记账,每次系统时钟节拍发生时,时间片都会被减少一个节拍周期,当一个进程的时间片被减少到 0 时,它就会被另一个尚未减到 0 的时间片可运行进程抢占。因此这种进程所需要占用处理器运行的时间很短,因为他们在等待I/O时最后总会自己阻塞(这里说的I/O指任何类型的可阻塞资源,如键盘输入,或网络I/O,实际处理输入的时间很少,大部分时间都在等待输入的到来)。原创 2023-03-22 16:19:09 · 1409 阅读 · 0 评论 -
Linux内核学习(二)—— 进程管理(基于Linux 2.6内核)
通常,创建新的进程是为了立即执行新的程序,而接着调用exec()系统调用就可以创建新的地址空间,把新的程序载入其中。但是传统的fork是直接把父进程的所有资源复制给创建的子进程,这种实现效率过于低下,所以后面的linux系统中的fork使用写时拷贝技术,只有在需要写入的时候,数据才会被复制,在此之前,资源都是以只读的方式共享。PID是一个数,在Linux中的类型为pid_t(实际上就是一个int类型),它同时也限制了进程的上限(默认上限为32768),内核把每个进程的PID存放在它们各自的进程描述符中。原创 2023-03-21 16:23:28 · 1094 阅读 · 0 评论 -
Linux内核学习(包含Linux 2.6内核编译安装流程)
Linux内核官方网站为:http://www.kernel.org或者使用git将源码clone下来(我这里使用的版本为2.6): clone下来的源码目录结构如下: 其中比较重要的目录的官方描述如下: 对应的中文描述如下:2、升级GCC版本由于腾讯云初始gcc版本为4.8.5,而编译内核需要的最低版本为5.1.0,所以需要安装高于5.1.0版本的gcc。 设置devtoolset-7 为默认的gcc编译器 : 再用gcc -v指令查看gcc版本可以看到已经升级到7.3.1了原创 2023-03-05 17:04:17 · 3580 阅读 · 3 评论