• 嵌入式Linux内核开发工程师必须掌握的三十道题


    如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师。

    1. Linux中主要有哪几种内核锁?(进程同步与互斥)

    (1)自旋锁:非睡眠锁

    (2)信号量:睡眠锁

    2. Linux中的用户模式和内核模式是什么含义?(内存管理)

    (1)用户模式:应用程序运行于用户模式,仅可以有限度的访问CPU及其他硬件资源

    (2)内核模式:内核线程运行于内核模式,内核模式的代码可以无限制地访问所有处理器指令集以及全部内存和I/O空间

    3. 怎样申请大块内核内存?(内存管理)

    ① vmalloc()用于申请大块内存,它的特点为虚拟地址连续,物理地址不一定连续

    ② kmalloc()用于申请小块内存 ,它基于slab实现的。

    4. 用户进程间通信主要有哪几种方式?(进程间通信)

    (1)管道(PIPE):仅父子进程间通信

    (2)有名管道(FIFO):可用于任意进程

    (3)共享内存(简单实用):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信

    (4)消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

    (5)信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生

    (6)信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

    (7)Socket:可用于不同机器进程间的通信

    5. 通过伙伴系统申请内核内存的函数有哪些?(内存管理)

     ① 伙伴算法的思想是:把内存中连续的空闲叶框空间看做空闲叶框块,并按照它们的大小(连续叶框的数目)分成10组,

      第0组:每个元素都代表由一个2^0个叶框组成的空闲叶框块

      第1组:每个元素都代表由一个2^1个叶框组成的空闲叶框块

      ...

      第9组:每个元素都代表由一个2^9个叶框组成的空闲叶框块

      每组中的空闲叶框块用其自身的page结构连接为双向链表;然后使结构free_area_struct的next和prev分别作为各个链表的头、尾指针;最后把各组的free_area_struct结构以组的序号为下标保存在数组free_area[]中

    注:伙伴算法的目的是在分配时合理分配,以尽量减少内存碎片

    ② 内核函数__get_free_page()用于物理叶框的分配

    6. 通过slab分配器申请内核内存的函数有?(内存管理)

    ① kmalloc():通用缓冲区

    ② kmem_cache_alloc():专用缓冲区

    ③ slab思想:把若干页框合在一起形成一个大存储块--slab,斌仔这个slab中只存储一类数据

    7. Linux的内核空间和用户空间是如何划分的(以32位系统为例)(内存管理)

    (1)Linux将4G的地址划分为用户空间和内核空间两部分。通常0-3G为用户空间,3G-4G为内核空间,但他们的本质都为虚拟内存空间,都需要通过页表进行转换为实际的物理地址。

    8. vmalloc()申请的内存有什么特点?(内存管理)

    ① vmalloc()和kmalloc()是内核内存分配函数,malloc()是用户进程内存分配函数

    ② vmalloc()是通过页表动态分配的内存,其虚拟地址空间连续,但物理地址空间不一定连续

    ③ kmalloc()是通过直接映射区分配内存,可以保证物理空间连续,但其所能分配的空间有限

    注:内存只有在要被DMA访问的时候才需要物理上连续。

    kmalloc()get_free_page()申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系。

    vmallockmalloc要慢

    9. 用户程序使用malloc()申请到的内存空间在什么范围?(内存管理)

    malloc()函数分配的内存空间在0~3G之间,即Linux用户空间

    10. 在支持并使能MMU的系统中,Linux内核和用户程序分别运行在物理地址模式还是虚拟地址模式?(内存管理)

    ① 运行于虚拟地址模式

    ② MMU的作用:

    (1)将虚拟地址转化为物理地址

    (2)访问权限管理

    11. ARM处理器是通过几级页表进行存储空间映射的(内存管理)

    ① Linux操作系统使用三级页表结构:页目录(Page Dicretory, PGD)、中间页目录(Page Midlle Dicretory, PMD)和页表(Page Table,PTE)

    ② ARM处理器通过二级页表进行映射

    12. Linux是通过什么组件来实现支持多文件系统的?(文件系统)

     虚拟文件系统

    13. Linux虚拟文件系统的关键数据结构有哪些?(至少写出四个)(文件系统)

    (1)struct file

    (2)struct file_operation

    (3)struct super_block

    (4)struct inode

    14. 对文件或设备的操作函数保存在那个数据结构中?(文件系统)

     struct file_operation

    15. Linux中的文件包括哪些?(文件系统)

     普通文件、目录文件、链接文件、设备文件

    16. 创建进程的系统调用有哪些?(进程管理)

    ① fork:子进程获得一个父进程的副本,子进程有自己的数据区和堆栈区,以及系统堆栈(内核堆栈),子进程拥有自己独立的内存空间(拥有独立的页表)

    ② vfork:与fork不同,vfork并不把父进程复制到子进程中,而只是用复制指针的方法使子进程与父进程的资源实现共享,子进程和父进程共享内存空间

    17. 调用schedule()进行进程切换的方式有几种?(进程管理)

    18. Linux调度程序是根据进程的动态优先级还是静态优先级来调度进程的?(进程管理)

     Linux调度是根据weight来确定优先权的,而weight是由静态优先级和动态优先级组合计算出来的值

    weight = [counter + (20 - nice)]

    19. 进程调度的核心数据结构是哪个?(进程管理)

    struct runqueue

    20. 如何加载、卸载一个模块?(内核基本知识)

    ① insmod

    ② rmmod

    21. 模块和应用程序分别运行在什么空间?(内存管理)

     模块运行于内核空间,应用运行于用户空间

    22. Linux中的浮点运算由应用程序实现还是内核实现?(内存管理)

    由应用程序实现,浮点数计算位于库函数中,而库函数只能由应用程序链接

    23. 模块程序能否使用可连接的库函数?(内存管理)

     模块程序运行于内核空间,不能链接库文件

    24. TLB中缓存的内容是什么?(内存管理)

    TLB(Translation lookaside buffer)即旁路转换缓冲, 称为页表缓冲,当线性地址第一次被转换为物理地址时,将线性地址与物理地址存放到TLB中,用于下次访问到这个地址时,加快转换速度

    25. Linux中有哪几种设备?(设备驱动)

     字符设备,块设备,网络接口设备

    26. 字符设备驱动程序的关键数据结构是哪个?(设备驱动)

    struct file_operation

    27. 设备驱动程序包括哪些功能函数?(设备驱动)

    ① open

    ② read

    ③ write

    ④ ioctl

    ⑤ release

    ⑥ llseek

    28. 如何唯一标识一个设备?(设备驱动)

    主设备号+次设备号

    29. Linux通过什么方式实现系统调用?(Linux系统基本知识)

    ① Linux通过软中断(swi)实现系统调用

    ② 以ARM平台为例,系统调用工作原理是

    (1)进程先用适当的值填充寄存器(R7),

    (2)然后调用一个特殊的指令(swi),

    (3)这个指令会让用户程序跳转到一个事先定义好的内核中的一个位置(vector_swi),

    (4)这位置的代码会根据寄存器(R7)的值从表sys_call_table中查找相应的函数。

    30. Linux软中断和工作队列的作用是什么?(中断处理)

    ① Linux软中断和工作队列的作用是中断延迟处理(中断下半部分处理)

    (1)软中断是一种“可延迟函数”的总称,它不能睡眠、不能阻塞。他处于中断上下文,不能进程切换,不能被自己打断,只能被硬件中断

    (2)工作队列中的函数处于进程上下文,它可以睡眠,能被阻塞。能够在不同的进程间切换完成不同的工作。

  • 相关阅读:
    Java提高篇——通过分析 JDK 源代码研究 Hash 存储机制
    Java提高篇——equals()与hashCode()方法详解
    Java提高篇——equals()方法和“==”运算符
    Java提高篇—— 简单介绍Java 的内存泄漏
    Java提高篇——理解String 及 String.intern() 在实际中的应用
    hbuilder
    angular
    微信小程序
    angular
    angular
  • 原文地址:https://www.cnblogs.com/wulei0630/p/10809317.html
Copyright © 2020-2023  润新知