美文网首页Linux成神之路
Linux内核架构学习笔记 三

Linux内核架构学习笔记 三

作者: jhinx | 来源:发表于2020-06-23 11:37 被阅读0次

    1,内核通过缓存来改进系统性能,由于内核是基于页的内存映射来实现访问块设备的,因此也按页组织,故称页缓存。

    2,块缓存用于缓存没有组成成页的数据,重要性差很多,传统UNIX上,块缓存用作系统主缓存,Linux已经由页缓存取代了。

    3,内核提供的标准链表可以用于任何数据结构彼此链接起来,它不是类型安全的,加入链表的数据结构必须包含一个类型为list_head的成员,其中包含了正向和反向指针。

    4,链表七点同样是list_head实例,使用LIST_HEAD宏声明和初始化

    5,循环链表的时间复杂的为O(1)

    6,作为数据结构的成员struct_list_head被称作链表元素,链表起点元素被称作表头。

    7,一般性内核对象机制可用于执行的对象操作:

         引用计数

         管理对象链表

         集合加锁

         将对象属性导出到用户空间(通过sysfs文件系统)

    8,kobject不是通过指针与其他数据结构连接起来,而是必须直接嵌入。通过管理kobject即可达到对包含kobject对象的管理。

    9,kobject结构成员语义:

    k_name——对象的文本名称,可以利用sysfs导出到用户空间。

    kref——类型为struct kref,用于简化引用计数的管理。

    entry——标准的链表元素,用于将若干kobject放置到一个链表中。

    kset——将对象与其他对象放置到一个集合时使用

    parent——是以一个指向父对象的指针,用于在kobject之间建立层次结构

    ktype——提供包含kobject的数据结构详细信息,最重要的事用于释放该数据结构资源的析构器函数

    10,kobject与面向对象编程语言的对象概念相似,提供了在内核使用面向对象技术的可能性,无需C++的额外机制。

    11,kref中只有refcount,refcount是一个院子数据类型,给出内核中当前使用某个对象的计数,计数器为0时,就可以从内存中删除。

    12,处理kobject的标准方法:

        kobject_get(),kobject_put()——对kobject的引用计数器加1或减1

        kobject_(un)register()——从层次结构中注册或删除对象,对象被添加到父对象中显存的集合kset中,同时在sysfs文件系统中创建一个对应项。

        kobject_init()——初始化一个kobject,将引用计数器设置为初始值,初始化对象的链表元素

        kobject_add()——初始化一个内核对象,并使之显示在sysfs中

        kobject_cleanup()——,在不需要kobject时,释放分配的资源

    13,如果某个变量的类型时typedef而来,则不能直接访问,而需要通过辅助函数。

    14,内核定义了若干整数数据类型,不仅明确是有符号还是无符号,而且还指定了相关类型的精确位数。

    15,字节序——现代计算机采用大端序或者小端序格式。在大端序中,最高有效字节存储在最低地址,随着地址升高,字节的权重降地;小端序中,最低有效字节存储在最低地址,而随着地址升高,诶姐的权重也升高。

    16,基本数据类型的结构取决于底层体系结构的字节序。

    17,内核提供各种函数和宏,可以在CPU使用的格式和特定的表示法之间转换。

    18,内核的严肃问题:

        调 试 内 核 通 常 要 比 调 试 用 户 层 程 序 困 难。

        内核提供许多辅助函数,类似于C语言库,但是内核中的东西总是朴素的多

        用户层程序错误可能会导致段错误,或者内存转储,但是内核错误会导致整个系统故障。

        需要考虑到内核运行在许多体系结构上根本不支持非对齐内存访问。

        所有的内核代码必须并发安全。

        内核代码必须在大端序和小端序计算机上都可以运行。

        大多数体系结构不允许在内核中执行浮点运算,因此需要想办法用整型替代。

    相关文章

      网友评论

        本文标题:Linux内核架构学习笔记 三

        本文链接:https://www.haomeiwen.com/subject/czgcfktx.html