《深入Linux内核架构与底层原理》读书笔记一——内核架构与内核数据结构知识

1、内核架构
常见架构范式:
  • Linux内核上下层通信方式
  • 横向系统和纵向系统
横向系统如cgroup,proc,sys文件系统,系统调用的组织,调试系统,Core Dump,信号,内存管理等;
纵向系统是指具体的功能模块,如USB功能,一个对USB文件的操作要走完内核中的很多个层次,即文件系统层、缓存层、通用块层、SCSI层、USB层等。 Linux一般将这些层次划分为3个大的层次,接口层、功能逻辑层和驱动层。
2、模块支持
  • 模块是Linux支持动态功能扩展的最主要机制。
  • 模块可以在编程时指定其可以接受的参数,这个参数是给用户用的。在模块加载之后,用户空间通过"echo -n ${value} > /sys/module/${modulename}/parameters/${parm}"就可以动态修改模块参数。
  • 模块机制存在的意义就是可以动态的加载和卸载。
  • 模块签名,每个模块在编译时都会从内核目录中获得版本号写入编译的模块,运行中的内核在插入新的模块时会检测签名是否一致,若不一致就不会加载。可以使用modinfo查看模块签名信息。模块签名的内容有两部分:版本号、哈希签名
  • 模块编程可使用的内核组件:workqueue,Linux下的工作队列,可以将工作推后执行,对其进行睡眠、调度,系统有默认的workqueue内核线程,但也支持用户自己定义workqueue;中断系统和tasklet,中断亲合度可以用于应用运维工作中帮助锁定应用性能。
3、特殊软件机制
  • UIO,允许用户端直接访问设备细节,是一个在用户端实现内核驱动的机制。
  • VFIO,是软件对硬件设备内存暴露在用户空间的支持,是对UIO的升级。用户可以通过直接操作硬件的内存空间来操作硬件。
  • SysRq,类似于windows的Ctrl+Alt+Del组合键的效果,只要系统不是完全被锁死的状态,就会优先响应这个命令。
在Linux中可以控制SysRq的关闭和打开,使用echo "1" > /proc/sys/kernel/sysrq打开该机制。
在Linux中调用该系列命令的方式是“SysRq+命令”,SysRq在大部分键盘上一般是Print Screen按键的副功能,需要使用Alt键调用。
SysRq+b:立即重启系统
SysRq+c:产生一个系统级的crash dump
SysRq+d:显示当前使用中的所有锁
SysRq+e:发送SIGTERM给除init之外的全部进程
除以上之外还有十几个类似命令
  • 其他机制,PADATA,namespace
4、内核数据结构之链表与哈希表
  • 链表,具有弹性不动属性,可以把离散时间到达的数据结构串起来,使其可以更容易地被索引,并且不需要移动之前的内容。
  • 内核哈希表,是由链表群组成的,其每一个哈希桶都是一个链表。
  • 双向链表,其数据域一般包括prev、next与data,很容易做成一个环。
  • hlist,拥有只有一个指针大小的头部的双向链表(只使用一个头部,解决哈希桶的空间利用率问题)。
  • ScatterList,在DMA支持分离的多块内存同时的传输下所产生的一种软件结构,其表示的是多块分离的块内存。Linux允许对ScatterList进行拼接或合并。
  • llist,一种不需要加锁的list,这是内核出于提高处理效率而采用的一种无锁操作所使用的数据结构。

5、其它数据结构
  • B+树,Linux内核中实现了一个通用的B+树,主要用于文件系统中,当然也有一些文件系统是自己实现的类似的B+树。
  • radix tree树,内核中使用该数据结构将指针与long整数键值进行关联,例如IDR机制,并且具有很高的搜索效率。
  • 位数组bitmap,是以位为单位存储值的方式,大部分文件系统都用到了这一技术。如ext中使用inode位图和数据块位图,用来表示对应序号的inode或者数据块有没有被使用。在raid系统中,如raid1的数据一致性保障,会通过检查这样的一份位图,以发现两份数据的不一致问题。
  • FIFO,命名管道,是内核提供给用户空间的一个非常好用的工具,相当于一个跨进程的队列,提供了原生的阴塞和配合文件能力的工具。类似的能力也可以使用消息队列或UNIX domain socket来实现。FIFO文件还有一个特性,它是一个文件,即使没人在读取,也可以往文件里写内容。
  • FIFO文件在交互式shell中是非常有效的一种调试工具,使用mkfifo命令建立fifo文件。在阻塞模式下,一方保持cat该文件,如果没有数据就会一直阻塞在那里;若有一方使用了echo等向其写入了数据,cat就会立即执行读取数据。
  • 在Linux中,FIFO管道并没有专门的数据结构,而是通过将两个file结构指向同一个临时的VFS索引节点inode,而这个VFS索引节点又是指向一个物理页面而实现的。在写入FIFO文件的时候最好不要使用文件的缓存功能,要一次性地完整写入。
  • FIFO的使用并不容易,对于一个严肃的FIFO应用场景来说,需要满足以下使用条件:
跨进程传输数据
数据的产生和数据的监听不同步
数据只要被读取了就会被删除,第二次就不会被再次读取
需要等待超时、永久阻塞、立即返回其中的某些或全部特性
需要运维系统查看数据流
没有任何办法提前判断要读的阻塞式的FIFO内是否有数据

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值