Linux内核相关

1. 用户空间与内核通信方式有哪些?⭐⭐⭐⭐⭐

转载
1.使用API(最常用)
 get_user(x,ptr):在内核中被调用,获取用户空间指定地址的数值并保存到内核变量x中。
 put_user(x,ptr):在内核中被调用,将内核空间的变量x的数值保存到到用户空间指定地址处。
copy_from_user()/copy_to_user():主要应用于设备驱动读写函数中,通过系统调用触发。
2.proc虚拟文件系统:和sysfs文件系统类似,也可以作为内核空间和用户空间交互的手段。
3.使用mmap系统调用:可以将内核空间的地址映射到用户空间。
一方面可以在driver中修改Struct file_operations结构中的mmap函数指针来重新实现一个文件对应的映射操作。另一方面,也可以直接打开/dev/mem文件,把物理内存中的某一页映射到进程空间中的地址上。
4.信号:从内核空间向进程发送信号。
用户程序出现重大错误,内核发送信号杀死相应进程。
5.netlink:netlink socket提供了一组类似于BSD风格的API,用于用户态和内核态的IPC(进程间通信)。
6.文件:当处于内核空间的时候,直接操作文件,将想要传递的信息写入文件,然后用户空间可以读取这个文件便可以得到想要的数据了。

2. 系统调用的作用

什么是系统调用?
Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由操作系统核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。

1.系统调用可以为用户空间提供访问硬件资源的统一接口,以至于应用程序不必去关注具体的硬件访问操作。
比如,读写文件时,应用程序不用去管磁盘类型,甚至于不用关心是哪种文件系统。
2.系统调用可以对系统进行保护,保证系统的稳定和安全。系统调用的存在规定了用户进程进入内核的具体方式。

换句话说,用户访问内核的路径是事先规定好的,只能从规定位置进入内核,而不准许肆意跳入内核。有了这样的进入内核的统一访问路径限制才能保证 内核的安全。我们可以形象地描述这种机制:作为一个游客,你可以买票要求进入野生动物园,但你必须老老实实地坐在观光车上,按照规定的路线观光游览。当然,不准下车,因为那样太危险,不是让你丢掉小命,就是让你吓坏了野生动物。

3. 内核态,用户态的区别

转载1
转载2
用户空间:指的就是用户可以操作和访问的空间,这个空间通常存放我们用户自己写的数据等。
内核空间:是系统内核来操作的一块空间,这块空间里面存放系统内核的函数、接口等。
在用户空间下执行,我们把此时运行得程序的这种状态成为用户态,而当这段程序执行在内核的空间执行时,这种状态称为内核态。
用户态切换到内核态的3种方式
a.系统调用
b.异常
c.外围设备的中断

4. Bootloader 内核 根文件的关系⭐⭐⭐⭐

一个嵌入式Linux系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux内核,文件系统,应用程序。
1、引导加载程序。包括固化在固件中的boot代码(可选)和BootLoader两大部分。在嵌入式系统中,通常并没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。一个基于ARM9 TDMI core的嵌入式系统中,系统在上电或复位时通常从地址0x00000000处开始执行,而这个地址处安排的通常就是系统的BootLoader程序。目前比较流行的两款bootloader是vivi和u-boot.
2、Linux内核。
3、文件系统。包括根文件系统和建立于flash设备之上的文件系统。
4、用户应用程序。

5. 为什么需要BootLoader

参考
简单的说,BootLoader就是在操作系统运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。对于Bootloader的启动过程又分为两个阶段stage1和stage2。
stage1全部由汇编编写,它的主要工作是(1)初始化硬件设备、(2)为加载Bootlodader的stage2准备RAM空间(3)拷贝Bootloader的stage2到RAM空间(4)设置好堆栈段为stager2的C语言环境做准备。
stage2全部由C语言编写,其的主要工作是(1)初始化本阶段要使用到的硬件设备(2)将内核映像和根文件系统映像从 flash 上读到RAM (3)调用内核
每种不同的CPU体系结构都有不同的Bootloader。除了依赖于CPU的体系结构外,Bootloader还依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,外设芯片类型等。对于两块不同的开发板而言,即使他们是基于同一种CPU而构建的,但是如果他们的硬件资源或配置不一致的话,想要在一块开发板上运行Bootloader程序也能在另一块板子上运行,还是需要做修改。

6. Linux内核同步方式总结

!!!转载
Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发访问会导致竞态,linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景。
Linux内核是多进程、多线程的操作系统,它提供了相当完整的内核同步方法。内核同步方法列表如下:
1、中断屏蔽
在单CPU范围内避免竞态的一种简单方法是在进入临界区之前屏蔽系统的中断。由于linux内核的进程调度等操作都依赖中断来实现,内核抢占进程之间的并发也就得以避免了。
2、原子操作
原子操作指的是在执行过程中不会被别的代码路径所中断的操作。
3、自旋锁
4、读写自旋锁
5、顺序锁
6、信号量
7、读写信号量
8、BKL(大内核锁)
9、Seq锁

并发与竞态
定义
在linux中,主要的竞态发生在如下几种情况
解决竞态问题的途径
临界区和竞争条件
死锁
自旋锁和信号量区别
1、由于争用信号量的进程在等待锁重新变为可用时会睡眠,所以信号量适用于锁会被长时间持有的情况。
2、相反,锁被短时间持有时,使用信号量就不太适宜了,因为睡眠引起的耗时可能比锁被占用的全部时间还要长。
3、由于执行线程在锁被争用时会睡眠,所以只能在进程上下文中才能获取信号量锁,因为在中断上下文中(使用自旋锁)是不能进行调度的。
4、你可以在持有信号量时去睡眠(当然你也可能并不需要睡眠),因为当其它进程试图获得同一信号量时不会因此而死锁,(因为该进程也只是去睡眠而已,而你最终会继续执行的)。
5、在你占用信号量的同时不能占用自旋锁,因为在你等待信号量时可能会睡眠,而在持有自旋锁时是不允许睡眠的。
6、信号量锁保护的临界区可包含可能引起阻塞的代码,而自旋锁则绝对要避免用来保护包含这样代码的临界区,因为阻塞意味着要进行进程的切换,如果进程被切换出去后,另一进程企图获取本自旋锁,死锁就会发生。
7、信号量不同于自旋锁,它不会禁止内核抢占(自旋锁被持有时,内核不能被抢占),所以持有信号量的代码可以被抢占,这意味着信号量不会对调度的等待时间带来负面影响。

7. 为什么自旋锁不能睡眠而在拥有信号量时就可以?

参考
自旋锁禁止处理器抢占;而信号量不禁止处理器抢占。
基于这个原因,如果自旋锁在锁住以后进入睡眠,由于不能进行处理器抢占,其他系统进程将都不能获得CPU而运行,因此不能唤醒睡眠的自旋锁,因此系统将不响应任何操作(除了中断或多核的情况,下面会讨论)。而信号量在临界区睡眠后,其他进程可以用抢占的方式继续运行,从而可以实现内存拷贝等功能而使得睡眠的信号量程序由于获得了等待的资源而被唤醒,从而恢复了正常的代码运行。
当然,自旋锁的睡眠的情况包含考虑多核CPU和中断的因素。自旋锁睡眠时,只是当前CPU的睡眠以及当前CPU的禁止处理器抢占,所以,如果存在多个CPU,那么其他活动的CPU可以继续运行使操作系统功能正常,并有可能完成相应工作而唤醒睡眠了的自旋锁,从而没有造成系统死机;自旋锁睡眠时,如果允许中断处理,那么中断的代码是可以正常运行的,但是中断通常不会唤醒睡眠的自旋锁,因此系统仍然运行不正常。

自旋锁不能睡眠:
A获得锁睡眠,B在等锁怎么办,可能会等很久哦,B就一直自旋等着,光等着不干活。获得锁,本来就是要操作一些共享资源,所以赶快的,别墨迹,还睡个球。
禁止中断不能睡眠:
禁止中断就是希望不被打扰,赶紧干完自己该做的事,还睡觉,我靠,还想不想干了。当硬件中断来的时候,这种情况不能睡眠,想想也对,你来强行打断人家,还想带着人家去睡,怎么可以,中断上下文不应该睡眠,只有进程上下文可以睡,技术当然可以实现,但没有意义。
spinlock的初衷是关调度,别人别和我抢这个临界区,同时也不让其他核抢。
关中断时不能睡眠,因为睡眠依赖调度器,调度器通过时钟中断判断何时唤醒任务。

8. Bootloader多数有两个阶段的启动过程:⭐⭐⭐

参考
对于Bootloader的启动过程分为两个阶段stage1和stage2。
stage1全部由汇编编写,它的主要工作是
(1)初始化硬件设备
(2)为加载Bootlodader的stage2准备RAM空间
(3)拷贝Bootloader的stage2到RAM空间
(4)设置好堆栈段为stager2的C语言环境做准备。
stage2全部由C语言编写,其的主要工作是
(1)初始化本阶段要使用到的硬件设备
(2)将内核映像和根文件系统映像从 flash 上读到RAM
(3)调用内核

9. linux下检查内存状态的命令

查看内存状态的命令是:top
查看正在运行的进程和系统负载信息,包括cpu负载、内存使用、各个进程所占系统资源等,top命令以一定频率动态更新这些统计信息。
查看进程的命令是:ps -a
free 命令会显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存等。
cat /proc/meminfo

10. Linux内核的组成⭐⭐

转载
Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信
1.进程调度(SCHED):控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。
2.内存管理(MM):允许多个进程安全的共享主内存区域。Linux 的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。必要时,操作系统负责在磁盘和内存间交换程序块。内存管理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。
3.虚拟文件系统(Virtual File System,VFS):隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
4.网络接口(NET):提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。
5.进程间通讯(IPC) :主要用于控制不同进程之间在用户空间的同步、数据共享和交换。由于不用的用户进程拥有不同的进程空间,因此进程间的通信要借助于内核的中转来实现。一般情况下,当一个进程等待硬件操作完成时,会被挂起。当硬件操作完成,进程被恢复执行,而协调这个过程的就是进程间的通信机制。

11. 系统调用read()/write(),内核具体做了哪些事情

参考
内核空间,scull_read() 通过file_operations结构与scull_fops->read联系
用户空间read()–>内核空间sys_read()–>scull_fops.read–>scull_read();
read 系统调用发出到结束处理的过程包括两个部分:用户空间的处理、核心空间的处理。用户空间处理部分是系统调用从用户态切到核心态的过程。核心空间处理部分则是 read 系统调用在 linux 内核中处理的整个过程。
Read 系统调用在用户空间中的处理过程
Read 系统调用,当调用发生时,库函数在保存 read 系统调用号以及参数后,陷入 0x80 中断。这时库函数工作结束。Read 系统调用在用户空间中的处理也就完成了。
Read 系统调用在核心空间中的处理过程
0x80 中断处理程序接管执行后,先检察其系统调用号,然后根据系统调用号查找系统调用表,并从系统调用表中得到处理 read 系统调用的内核函数 sys_read ,最后传递参数并运行 sys_read 函数。至此,内核真正开始处理 read 系统调用(sys_read 是 read 系统调用的内核入口)。
Read 系统调用在核心空间中处理的层次模型
对于磁盘的一次读请求,首先经过虚拟文件系统层(vfs layer),其次是具体的文件系统层(例如 ext2),接下来是 cache 层(page cache 层)、通用块层(generic block layer)、IO 调度层(I/O scheduler layer)、块设备驱动层(block device driver layer),最后是物理块设备层(block device layer)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值