
Linux操作系统入门学习
文章平均质量分 86
显微镜下的内核
这个作者很懒,什么都没留下…
展开
-
Linux内核中锁的总结
锁描述问题经典自旋锁在同一时刻只能被一个内核代码路径持有刚刚释放锁的CPU更有机会马上又获得锁,没有考虑在锁外面等待了很久的CPU,导致在锁争用激烈场景下性能低下;在多处理器和NUMA系统中,所有等待自旋锁的线程都在同一个共享变量上自旋,申请和释放都在同一个变量上修改,高速缓存一致性原理导致参与自旋的CPU中的高速缓存行变得无效,在锁正用激烈的过程中,可能导致严重的CPU高速缓存行颠簸现象基于排队的FIFO算法的自旋锁解决了在锁争用激烈场景下性能低下的问题无法解决CPU高速缓存行颠簸现象。原创 2023-10-30 15:04:48 · 248 阅读 · 0 评论 -
Linux中的地址转换
CR3寄存器用来保存当前进程的页全局目录的地址,寻页的开始就是从页全局目录开始的。 第一个参数是当前进程的mm_struct结构,mm_struct结构是用来描述进程的虚拟地址空间的,在mm_struct中有个字段PGD就是用来保存该进程的页全局目录的物理地址的。可以看到PGDIR_SHIFT和P4D_SHIFT都是39的,这也就意味着在线性地址中,P4D这个字段是为空的,也可以看到在页目录项中,P4D的页目录项也是为1的,这也就说明了,虽然Linux采用了五级页表模型,但实际上使用的页表也只有四个。原创 2023-10-19 10:12:25 · 220 阅读 · 0 评论 -
Linux内核模块大扩展
attribute((aligned(sizeof(long))))属性保证了红黑树中的每个结点的首地址都是32位对齐的(在32位机上),也就是说每个结点首地址的bit[1]和bit[0]都是0,因此就可以使用bit[0]来存储结点的颜色属性而不干扰到其双亲结点首地址的存储。指令lsmod是显示所有内核模块的信息,这里我们加上参数查看刚插入的内核模块test_hello,执行指令lsmod |grep ‘test_hello’//加载的时候,如果传递参数,则变量值就是传递过来的值,否则就是默认的初始化值。原创 2023-10-19 10:01:17 · 393 阅读 · 0 评论 -
生产者消费者内核模块调试
(1)不可以,如果初始化信号量sem_producer为锁定的互斥信号量,sem_consumer为未锁定的互斥信号量,那么在这样的初始化状态下,生产者线程无法进行生产,会进入一个信号量等待的过程,而消费者线程会因为缺少产品在if条件语句处退出循环,结束运行,这样将会导致生产者线程永远等不到信号量,进而出现“死锁”的情况。牛奶生产厂家接到订单后,才开始生产下一批牛奶。(2)(3)(4)思路:由于线程是并发执行的,所以可以把多个仓库看做成一个仓库,因此所有的情况都可以看成是“多生产者、多消费者、一个缓冲区”原创 2023-10-19 09:55:54 · 121 阅读 · 0 评论 -
设备驱动入门学习
其二是因为性能,一个慢的字符设备驱动程序虽然不受欢迎,但仍可以接受,但一个慢的块驱动程序将影响整个系统的性能。(2)数据经过块设备相比操作字符设备需要经历一个数据缓冲层,也就是说应用程序与块设备传递数据时不同于操作字符设备那样直接打交道,而必须经过一个中间缓冲层来存储数据,然后才可使用数据,这是为了提高系统整体性能(吞吐量)。 (3)当操作系统需要使用某个硬件时,比如让声卡播放音乐,它会先发送相应指令到声卡驱动程序,声卡驱动程序接收到后,马上将其翻译成声卡才能听懂的电子信号命令,从而让声卡播放音乐。原创 2023-10-19 09:55:20 · 87 阅读 · 0 评论 -
同步问题大讨论
所谓原子操作,就是在执行期间不可分割,要么全部执行,要么一条也不执行。在Linux下如何进行原子操作?gcc从4.1.2开始提供了__sync _*系列的build-in函数,用于提供加减和逻辑运算的原子操作,其声明如下:原创 2023-10-19 09:54:53 · 62 阅读 · 0 评论 -
中断机制以及中断上下部运行和内核代码分析
中断也称外中断,指来自CPU执行指令以外的事件发生(这里的中断是狭义上的中断)异常也称内中断、例外或陷入,指源自CPU执行指令内部的事件。原创 2023-10-19 09:54:21 · 1061 阅读 · 0 评论 -
通过中断控制终端设备
*体会:**这个过程看起来很复杂,但是听了李治军老师的课程后,感觉思路特别的清晰,也没有想象中的那么复杂了,仅作两处修改便可完成实验。原创 2023-10-18 22:39:34 · 98 阅读 · 0 评论 -
中断机制(5.3和5.4)
高精度定时器可以实现ns级的定时,不过,实际的定时周期粒度与CPU的主频有关,比如,桌面级的CPU一般都是GHZ级别,那么,其定时粒度可以达到ns级别,而对于嵌入式CPU,其主频一般在百兆级别,那么定时粒度就只能达到us级别了。RTC处于最底层,提供最原始的时钟数据,而OS时钟建立在RTC之上,初始化完成后将完全由操作系统控制,操作系统通过OS时钟提供给应用程序所有和时间有关的服务,因为OS时钟完全是一个软件问题,其所能表达的时间由操作系统的设计者决定。(更改系统时间对它没有影响)原创 2023-10-18 22:17:25 · 141 阅读 · 0 评论 -
编写字符设备驱动程序
字符设备驱动也可以采用misc机制来进行注册,也就是Linux将一些不符合预先确定的字符设备划分为杂项设备,这类设备的主设备号是10,内核中使用miscdevice结构体来描述,如果使用misc机制来创建设备,就需要定义miscdevice结构体。linux的设备驱动程序可以由两种形式来定义,一种是全局静态变量,另一种是使用内核提供的API,这里采用第二种方法来实现一个简单的虚拟设备的驱动,并且实现它的读写功能。实现了对已注册的字符设备区间的管理,并完成与cdev的关联。打印出了open和read的方法。原创 2023-10-18 22:11:56 · 1083 阅读 · 0 评论 -
编写并分析简单的块设备驱动程序
块设备也和字符设备一样可以通过/dev目录下的设备文件来访问,而网络设备不可以。此外块设备(例如磁盘)上能够容纳文件系统。原创 2023-10-18 22:08:24 · 440 阅读 · 0 评论 -
打开文件源码分析及调试
对于一个路径来说,经过link_path_walk()的处理,nd将保存最后一个目录项的信息,但是最后一个目录项代表的文件(或目录)是否存在并不知晓,需要通过调用link_path_walk()的path_openat()做最后的处理。**do_last():**在path_openat()中,经过link_path_walk()对open路径的查找,将进入do_last()对路径中最后一个目录项做处理。”,即当前要walk的目录项为上一次已经walk的目录项的父目录,也就是需要向上获取当前目录的父目录。原创 2023-10-18 22:01:38 · 183 阅读 · 0 评论 -
文件系统设计之数据结构
所谓"文件", 就是按一定的形式存储在介质上的信息,所以一个文件其实包含了两方面的信息,一是存储的数据本身,二是有关该文件的组织和管理的信息。Ext2 inode的信息位于EXT2文件系统的划分的块组中,在每个块组中包含相应的inode位图、inode表指定具体的inode信息,每个inode对应Ext2_inode结构。磁盘上的inode:EXT2通过使用inode来定义文件系统的结构以及描述系统中每个文件的管理信息,每个文件都有一个inode且只有一个,即使文件中没有数据,其索引结点也是存在的。原创 2023-10-18 21:59:05 · 217 阅读 · 0 评论 -
从inode看文件系统的设计
后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。依次执行下图中指令,创建硬链接,源文件与目标文件的inode号码相同,都指向同一个inode。文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。原创 2023-10-18 21:57:29 · 119 阅读 · 0 评论 -
Linux 下创建一个文件系统
文件系统中的块是包含文件,二进制文件,dll,元数据等数据的数据段。块用于存储有关文件的信息。一些块包含有关文件系统的元数据,称为超级块。 由上图可知:我创建的文件系统块大小为4096,总块数为256。原创 2023-10-18 21:53:36 · 587 阅读 · 0 评论 -
Linux内存映射
vm_ops字段是一个指向vm_operations_struct结构体的指针,在vm_operations_struct结构体中定义了与该虚拟内存区操作相关的接口,每个虚拟内存区域都必须在vm_operations_struct结构中实现操作。vm_ops字段是一个指向vm_operations_struct结构体的指针,在vm_operations_struct结构体中定义了与该虚拟内存区操作相关的接口,每个虚拟内存区域都必须在vm_operations_struct结构中实现操作。原创 2023-10-18 21:51:06 · 162 阅读 · 2 评论 -
基于LKM的进程性能分析论文阅读并实现
此外,这种基于模块的技术的能力可以通过加入额外的功能来增强,从而使其成为一个成熟的多进程抽象层,以满足任何高性能嵌入式平台的需求。 在我看来,这个程序的具体实现过程为:在内核中创建了一个字符设备,该设备可以写入用户端程序传入到/dev/myNode中的数据,然后读出相应的数据到/dev/myNode,最后由用户端程序进行输出。 该程序中涉及到了很多有关设备操作的函数,仅能对该函数的功能进行理解,具体实现有点不太明白,对于信号量方面也很是陌生,但极大的锻炼了我解决报错和修改代码的能力。原创 2023-10-18 21:45:42 · 97 阅读 · 0 评论 -
通过打印进程控制块中的信息深刻认识进程
tgid,因为linux内核支持内核即线程,每个进程中的所有线程就形成了一个线程组,线程组就需要一个领导,那么这个领导就是所在进程的pid。**已解决:**未在printk语句中加入\n,加入后即可正常打印(上述代码已做修改),感觉输出的内容(在缓冲区)是通过\n(也就是回车)被写进日志文件的,在日志文件中每个输出的内容为一行进行记录。 进程控制块对一个进程来说是一个非常重要的一部分,如果把进程比作是一个人的话,那么进程控制块就是这个人的心脏,控制着人的各个器官。 pid是进程标识符。原创 2023-10-18 21:43:26 · 135 阅读 · 0 评论 -
通过实验学习系统调用
在做此实验之前,我先把书上第六章系统调用的内容过了一遍,对系统调用的过程有了一定的认识,再来做这个实验感觉就是在一步一步的落实系统调用,经过这个学习过程,我对系统调用有了更加清晰地认识。原创 2023-10-18 21:39:58 · 135 阅读 · 0 评论 -
内核模块入门学习
模块是在内核空间运行的程序,实际上是一种目标对象文件,没有链接不能独立运行,但是其代码可以在运行时链接到系统中作为内核的一部分运行或从内核中取下,从而可以动态扩充内核的功能。这种目标代码通常由一组函数和数据结构组成,用来实现一种文件系统,一个驱动程序,或其它内核上层的功能,模块机制的完整叫法应该是动态可加载内核模块(Loadable Kernel Module)或 LKM,一般就简称为模块。原创 2023-10-18 21:16:38 · 186 阅读 · 0 评论 -
用户态进程管理的方方面面
是一款常用的多核CPU性能分析工具,用来实时查询每个CPU的性能指标,以及所有CPU的平均指标。 ③当发生CPU密集型进程导致的高负载的情况时,我们可以通过top命令查看此时的负载情况,然后利用pidstat命令找到导致发生高负载情况的进程,然后进行解决。否则可能产生系统卡顿的现象。 由上图可知,CPU几乎全部的时间都在运行这4个stress进程,可见此时系统的高负载是由这4个stress进程导致的。是一个常用的进程性能分析工具,用来实时查看进程的CPU,内存,IO,以及上下文切换等性能指标。原创 2023-10-18 21:23:50 · 89 阅读 · 0 评论 -
进程运行轨迹的跟踪与统计
借用http://t.csdn.cn/T2fet中的一段话: 进程之间的切换是需要时间的,如果时间片设定得太小的话,就会发生频繁的进程切换,因此会浪费大量时间在进程切换上,影响效率;如果时间片设定得足够大的话,就不会浪费时间在进程切换上,利用率会更高,但是用户交互性会受到影响。举一个很直观的例子:我在银行排队办业务,假设我要办的业务很简单只需要占用1分钟,如果每个人的时间片是30分钟,而我前面的每个人都要用满这30分钟,那我就要等上好几个小时!原创 2023-10-18 21:28:49 · 181 阅读 · 0 评论