如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的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()申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系。

⑤ vmalloc比kmalloc要慢

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)工作队列中的函数处于进程上下文,它可以睡眠,能被阻塞。能够在不同的进程间切换完成不同的工作。

嵌入式Linux内核开发工程师必须掌握的三十道题的更多相关文章

  1. 嵌入式系统Linux内核开发工程师必须掌握的三十道题(转)

    嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...

  2. 驱动开发学习笔记. 0.06 嵌入式linux视频开发之预备知识

    驱动开发读书笔记. 0.06  嵌入式linux视频开发之预备知识 由于毕业设计选择了嵌入式linux视频开发相关的项目,于是找了相关的资料,下面是一下预备知识 UVC : UVC,全称为:USB v ...

  3. 嵌入式Linux驱动开发日记

    嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...

  4. Linux内核开发进阶书籍推荐(不适合初学者)

    Linux内核开发进阶书籍推荐(不适合初学者) 很早之前就想写一篇文章总结一下Linux Kernel开发的相关资料,项目的原因,再加上家里的一些事情,一直没能找到闲暇,今天终于有些时间,希望可以完成 ...

  5. Linux内核开发

    Linux内核开发 https://www.cnblogs.com/pugang/p/9728983.html 很早之前就想写一篇文章总结一下Linux Kernel开发的相关资料,项目的原因,再加上 ...

  6. 嵌入式Linux内核+根文件系统构建工具-Buildroot 快速入手指导【转】

    本文转载自:https://my.oschina.net/freeblues/blog/596448 嵌入式Linux内核+根文件系统构建工具-Buildroot 快速入手指导 buildroot 是 ...

  7. 制作嵌入式linux内核

    拿到一个嵌入式linux内核代码,首先make distclean 接下来,如果在x86平台,就直接make menuconfig,如果是在ARM平台,就直接make menuconfig ARCH= ...

  8. 嵌入式Linux应用开发完全手册之环境搭建

    @ 目录 0.下载源配置 1.电脑BIOS启动虚拟化 2.linux网卡查看与IP设置 3.windows NAT虚拟网络配置 4.修改 Ubuntu 的 mountd 端口 5.vim设置 6.Mo ...

  9. 如何参与Linux内核开发(转)

    本文来源于linux内核代码的Document文件夹下的Hoto文件.Chinese translated version of Documentation/HOWTO If you have any ...

随机推荐

  1. 微信小程序上传文件时弹出当前系统代理不是安全代理,是否信任

    我的开发环境是.net core 启用了https,而微信的开发者工具不认这个证书. 解决办法1:关闭https 然后在 Startup.cs 中关闭注释掉 app.UseHttpsRedirecti ...

  2. SSH三大框架知识点

    Hibernate ****************************************************************************************** ...

  3. P2756 飞行员配对方案问题 网络流

    P2756 飞行员配对方案问题 #include <bits/stdc++.h> using namespace std; , inf = 0x3f3f3f; struct Edge { ...

  4. jQuery的替换/克隆

    1. 替换/克隆: 克隆: var $newImg=$img.clone() 2. 事件: 标准: 1. 普通绑定: $().on("事件名",function(){ ... }) ...

  5. DOM的使用

    1. 修改: 3样: 1. 内容: 3个属性: 1. 获取或修改原始HTML片段: 元素.innerHTML 2. 获取或修改纯文本内容: 元素.textContent vs innerHTML 1. ...

  6. nginx+vue+uwsgi+django的前后端分离项目部署

    Vue+Django前后端分离项目部署,nginx默认端口80,数据提交监听端口9000,反向代理(uwsgi配置)端口9999 1.下载项目文件(统一在/opt/luffyproject目录) (1 ...

  7. element-ui的el-table和el-form嵌套使用表单校验

    表格中嵌套使用表单验证 表格是el-table自动获取的后台数据,每行都有el-input的验证,这样一个rules的规则就不能匹配到每一行,所以要是用动态的prop和rules规则 需求如下,要对告 ...

  8. 201771010128王玉兰《面象对象程序设计(Java)》第七周学习总结

    第一部分:基础知识总结: 1继承 A:用已有类来构建新类的一种机制,当定义了一个新类继承一个类时,这个新类就继承了这个类的方法和域以适应新的情况: B:特点:具有层次结构.子类继承父类的方法和域: C ...

  9. 为什么说OC是运行时语言?什么是动态类型、动态绑定、动态加载?

    转载:https://www.cnblogs.com/dxb123456/p/5525343.html 动态: 主要是将数据类型的确定由编译时,推迟到了运行时. 这个问题其实浅涉及到两个概念,运行时和 ...

  10. Shift - And字符串快速处理 hdu5972+cf

    基础知识介绍 KMP就是不断往前找1的位置,而ShiftAnd经过三步处理已经完成这个迭代的过程了 如果匹配两个字符集有限的字符串的话,那么Shift-And比kmp要快,找区间内某字符串出现的数目也 ...