抄的八股文(2)

这些答案不一定正确

目录

1、Linux驱动框架

​编辑

2、内核态可以直接访问用户态传过来的虚拟地址吗? 

3、用户态和内核态零拷贝怎么实现

 4、代码编译链接过程

5、ARM L1/L2 cache

6、cache一致性

7、如何解决cache一致性问题

8、从uboot到kernel加载过程,以及kernel加载后会有哪些初始化动作 

9、虚拟地址和物理地址区别

10、应用层随便写个地址,内核是怎么检测出来异常的

11、应用层写的物理地址没有分配,内核怎么操作

12、中断是什么?中断处理过程


1、Linux驱动框架

1、设备的初始化/释放:负责对设备进程初始化/释放。检测所有驱动硬件是否正常。如果正常对设备以及相关驱动程序的进行初始化

2、上半部分:服务于文件系统I/O,命令字下发。通过文件系统从应用程序读取数据,将数据通过文件系统返回给应用数据。

3、下半部分:服务于硬件设备的I/。负责将数据从内核传到硬件,或者是硬件读取数据到内核。大部分是通过中断实现。比如网络设备的收发包

我以为是 Linux总线、设备、驱动模型。驱动只管驱动、设备只管设备,总线负责匹配设备和驱动

2、内核态可以直接访问用户态传过来的虚拟地址吗? 

理论上内核空间的特权级别是比用户空间高的,可以直接访问用户态的地址。但是直接访问的话无法保证用户态传过来的虚拟地址是否有对应的页表项等。因此才有了copy_from_user接口。在该函数里面会对地址进行校验

3、用户态和内核态零拷贝怎么实现

零拷贝详解-CSDN博客

 mmap + write :主要利用了同一个物理地址可以映射到不同的虚拟地址特性。将内核态的缓冲区和用户态的缓冲区映射到同一个物理地址。避免了数据从用户态<-->内核态的来回拷贝动作。

sendfile:用于实现在两个文件描述符之间拷贝数据,拷贝动作在内核完成。和上面的方法效果一样

带有DMA收集拷贝功能的sendfile:直接将数据拷贝到网卡,比上面两个方法又节约了一次拷贝

 4、代码编译链接过程

预处理、编译、汇编、链接

预处理:去注释、将宏替换、头文件展开,处理条件编译,添加行号和文件标识等.c-->.i

编译:进行语法、词法、语义分析,符合汇总(全局变量、函数等),最后生成汇编代码.i-->.s

汇编:将汇编代码转换为机器码的过程。这个过程会生成符合表、重定位表等信息,以便后面链接操作使用.s-->.o

链接(linking):将各种代码和数据片段(section)收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。

5、ARM L1/L2 cache

L1 cache是位于CPU内部的第一级高速缓存。用于存储指令和数据,分别对应I-cache和D-cache。I-Cache和D-cache的目的是通过提供更快的数据访问速度来减少对主内存的访问。当处理器核心需要执行指令时,它会首先在I-Cache中查找,如果指令已经缓存在I-Cache中,则可以立即执行。同样,当处理器核心需要读取或写入数据时,它会首先在D-cache中查找,如果数据已经缓存在D-cache中,则可以快速访问。

L2 cache:位于主存和CPU之间。作为第二级高速缓存,它的容量比L1大,并且L2缓存是共享的。和L1cache不同L2不区分数据和指令

参考文章 ARM基础(4):L1 Cache之I-Cache和D-cache详解-CSDN博客

6、cache一致性

参考文章:https://www.jianshu.com/p/3f6aae643d84 

内存系列学习(五):ARM处理器中的Cache和Write Buffer_指令cache和数据cache-CSDN博客

 有了cache后,cpu试图从某个地址加载数据时会查看L1cache是否命中,如果命中则将数据返回给cpu,如果未命中,则去查找L2,如果还未名字则从主存加载。然后将数据返回给L2,在返回给L1,最后给cpu(按照这种方式,此时应该每个cache都会有该数据的备份)

cache读分配策略:当cache miss时,都会分配一个cache line去从主存读取cache line大小的数据(即使cache line比实际读取的数据大)

cache写更新策略:当发生cache命中时,写操作应该如何更新数据。写直通:当cpu执行写指令并命中时,更新cache中数据,并且将数据也更新到主存;写回:只更新cache中的数据,当该cache line需要被替换时。如果该cache line内容被修改过,才更新到主存。这个更新策略的主存和cache的可能存在不一致问题

缓存一致性问题:假设两个cpu都将a=10,加载进了自己的L1cache。cpu0修改了a=11。当cpu1在读取a时,a=10.并不是11

7、如何解决cache一致性问题

1、直接使用no-cache buffer,关闭cache功能。这方法丧失了cache的意义/

解决一致性问题要保证2点:

a、某个cpu更新cache时,必须要传播到其他cpu的cache,即写传播

b、某个cpu对数据的操作顺序,必须让其他cpu看起来的顺序也是一样的。即事务串行(这个是什么意思,可以见参考文章)。

写传播和事务串行实现方法:我怎么感觉需要这两个才能实现一致性呢?但是看文章应该不是这个意思https://www.jianshu.com/p/3f6aae643d84

1、加锁:早期cpu中通过在总线上加锁保证一致性。cpu和其他部件通信是通过总线进行,对总线加锁阻塞了其他cpu对内存的访问,效率低下。

2、总线嗅探/写广播:写传播的原则就是当某个 CPU 核心更新了 Cache 中的数据,要把该事件广播通知到其他核心,其他cpu收到以后检测自己的cache,如果有则更新。但是这样会加重总线的负载

MESI(实际使用的方法):一个Cache加载一个变量的时候,是Exclusive状态,当这个变量被第二个Cache加载,更改状态为Shared;这时候一个CPU要修改变量, 就把状态改为Modified,并且Invalidate其他的Cache,其他的Cache再去读这个变量,达到一致。

8、从uboot到kernel加载过程,以及kernel加载后会有哪些初始化动作 

 uboot流程是怎么样的

boot loader流程是怎么样的

9、虚拟地址和物理地址区别

虚拟地址和物理地址之间的区别_虚拟地址的定义-CSDN博客

虚拟地址是由CPU生成的地址,它是一个虚拟的地址空间。每个进程都有自己的虚拟地址空间,这使得每个进程都认为自己拥有整个系统的内存,方便进行地址空间隔离。虚拟地址空间大小由cpu位数决定。

物理地址是内存模块上的实际地址,它是存储器中的真实位置。物理地址是硬件直接访问的地址,它与内存中的存储单元一一对应,其大小受到硬件给限制。

10、应用层随便写个地址,内核是怎么检测出来异常的
11、应用层写的物理地址没有分配,内核怎么操作
12、中断是什么?中断处理过程

上面问题8-12答案见文章嵌入式一些面试题_.写应用程序如果突然停止了,做一些什么操作能够让系统再一次跑的时候避免-CSDN博客

13、任务切换需要保存和加载的内容

14、DMA概念,嵌入式开发中如何使用DMA

DMA(Direct Memory Access,直接内存访问,我看代码里面是直接使用物理地址)DMA控制器是一种专用的硬件设备,它可以直接访问系统内存和外设,完成数据的传输。当需要进行数据传输时,CPU只需配置DMA控制器的参数,并将控制权交给DMA控制器,然后就可以继续执行其他任务,而不需要参与具体的数据传输过程。

15、系统调用

arm系统调用过程_arm tbl-CSDN博客

16、内存管理

17、内存碎片如何解决

内存池、避免频繁内存申请和释放

18、platform总线设备驱动模型

19、中断可以传参吗?有无法返回值

20、用户进程访问内核的方式

21、内存屏障

什么是内存屏障-CSDN博客

https://www.cnblogs.com/Chary/p/18112934

 cpu为了提高性能存在乱序执行的行为,这个可能会导致程序运行不符合预期。内存屏障是一类同步指令,是cpu或者编译器对内存随机访问的同步点。只有在该点之前的所有读写操作都执行后,才能继续执行同步点后的操作。

编译器和cpu都能引起内存的乱序访问。

编译时,编译器优化进行指令重排导致内存乱序访问

运行时,cpu自己也会进行乱序访问

22、mmap实现

mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。 实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享

23、为什么Linux内核空间需要放在虚拟地址高位

24、Linux内存空间

Linux内存布局详解_linux 内存结构-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值