Linux 内核分析与应用课程总结

  • Linux内核学习方法

Linux内核学习三类:reader、writer、hacker。reader 就是了解某个功能在内核的大致实现 how does it work,一般不关心某些极端情况下(内存不足、受到攻击)的处理方法,对于看不懂的地方也可以跳过,读一个函数一般只看主干(happy path),不管 security/debugging/tracing,经常忽略错误处理分支。writer 是给内核加feature和改bug的人,需要更进一步的知识,写代码要考虑 how not to break it(哪些地方需要加锁,按照什么顺序加锁以避免死锁,如何正确释放分配的资源等等)。hacker 是通过分析代码找出安全漏洞并加以利用的人,研究 how to break it,读代码更注意找出error handling分支没有覆盖的case。

没必要非常深入的专研内核代码,因为内核代码变化很快,在不断的更新过程中。再看Linux驱动模块的时候想,如果我来写这个驱动模块我会怎么写。学习任何知识时候,找相关参考书梳理知识脉络,更重要的是动手修改代码验证自己的理解。

多掌握原理,少扣细节,先粗后细,到不得不去看细节代码的时候再去学习。

 

  • Linux内核使用哈希表结构

特点是hlist_node有一个pprev的二级指针,指向前面节点的next一级指针。如果改变为一级指针就不能指向第一个hlist_node *first指针,而在散列表中使用指针是为了只需要保存地址,而不需要保存数据,节约空间(和总数据是一个数量级)。

  • fork函数创建进程

fork函数能够快速建立进程的原因是,fork一个进程只是建立mm_struct结构体、vm_area_struct结构体、页目录和页表,并没有真正创建一个物理页面,需要的时候和父进程使用写时复制的机制保证不对父进程的数据修。

  • 中断

为了更好的处理中断程序并且不发生其他中断的处理丢失,把中断处理程序分为两个部分,第一部分为CPU立即执行,第二部分为稍后执行。

  • 系统调用

 

Linux API由Linux内核系统调用接口(这部分的接口API符合POSIX API接口标准)和GUN C库接口。

  • 设备驱动和文件系统

Linux一切皆为文件的思想对程序开发者是非常友好的,把所有的设备都使用统一的接口函数来操作,代码移植性非常高。

virtual file system是提供统一的系统文件调用给User使用,尽量保证对于用户空间接口函数的统一性。

超级块对象:存放系统中已安装文件系统的有关信息;文件对象:存放打开文件与进程之间交互有关信息。

连接到I/O总线上的设备的地址集称为I/O端口。I/O端口和对应设备控制器之间的硬件电路称为I/O接口。

设备驱动模型组件:设备(由一个device对象来描述)、驱动程序(由device_driver对象描述)、总线(由bus_type对象描述)和类(由class对象描述,设备驱动程序模型中的类本质上是要提供一个标准的方法,为用户态应用程序导出逻辑设备的接口)。

主设备号标识设备的类型。次设备号标识主设备号相同的设备组中一个特定设备。

 

文件操作是对设备操作的组织和抽象,而设备操作则是对文件操作的最终实现。为了解决多个进程对一个文件访问的同步问题,通过POSIX规定函数对文件的部分或者全部进行加锁。

 文件系统基本上建立在块设备上,但是也有一部分放在内存上,比如clock文件系统放在内存上不需要驱动程序。

平台总线通过两条链表分别管理设备和驱动,当一个设备被注册到总线上的时候,总线根据其名字搜索对应的驱动程序,找到就把设备信息导入到对应的驱动程序,执行驱动。如果驱动注册到平台总线上的时候,总线也会搜索相应的设备信息,总线将设备和驱动相匹配,这样做到驱动和设备信息分离。当硬件变化了之后,只需要修改一部分硬件代码,内核代码不需要修改,增加代码的可移植性。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值