IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 嵌入式知识框架之四-Linux内核的组成部分 -> 正文阅读

[嵌入式]嵌入式知识框架之四-Linux内核的组成部分

了解内核组成及各个组成部分如何工作,对于提高程序的运行效率、理解运行过程、以及处理BUG有非常重要的作用,例如TASK_ZOBIE状态,是一种僵死状态,等待父进程回收资源,这样在我们看到进程运行列表中出现这样的进程状态,我们就知道在父进程中缺少回收资源这一步操作。进程还有可中断和不可中断状态,我们什么时候需要用到这种状态对于我们编程都有重要的意义。

?linux内核的组成部分与关系

1.进程调度

首先我们来理解“微观串行,宏观并行”,对于单核CPU来说,因为CPU运行速度是非常快的,对于大多数进程来说,会有阻塞状态,这时候就需要放出CPU资源,让给其他就绪的进程使用,才不会浪费CPU资源,等阻塞状态转为就绪态就可以在CPU被让出时从队列取出被执行了。对CPU来说,CPU只是按照某种顺序执行每行代码,并没有同时执行两个代码,这就是微观串行。但对于进程来说,两个程序都被CPU执行了,看起来时两个进程同时被执行,这就是宏观并行。总的来说这样的好处就是总进度变快了。

Linux的进程在几个状态间进行切换。在设备驱动编程中,当请求的资源不能得到满足时,驱动一般会调度其他进程执行,并使本进程进入睡眠状态,直到它请求的资源被释放,才会被唤醒而进入就绪状态。睡眠分成可中断的睡眠和不可中断的睡眠,两者的区别在于可中断的睡眠在收到信号的时候会醒,这部分建议结合《UNIX高级环境编程》相关章节阅读,这里面有对struct_task结构体的描述,会让你有更深的理解。?

?linux进程转换

?在Linux内核中,使用task_struct结构体来描述进程,该结构体中包含描述该进程内存资源、文件系统资源、文件资源、tty资源、信号处理等的指针。Linux的线程采用轻量级进程模型来实现,在用户空间通过pthread_create()API创建线程的时候,本质上内核只是创建了一个新的task_stru-ct,并将新task_struct的所有资源指针都指向创建它的那个task_struct的资源指针。
绝大多数进程(以及进程中的多个线程)是由用户空间的应用创建的,当它们存在底层资源和硬件访问的需求时,会通过系统调用进入内核空间。有时候,在内核编程中,如果需要几个并发执行的任务,可以启动内核线程,这些线程没有用户空间。启动内核线程的函数为:

pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);

?2.内存管理

内存管理的主要作用是控制多个进程安全地共享主内存区域。当CPU提供内存管理单元(MMU)时,Linux内存管理对于每个进程完成从虚拟内存到物理内存的转换。Linux 2.6引入了对无MMU CPU的支持。
一般而言,32位处理器的Linux的每个进程享有4GB的内存空间,0~3GB属于用户空间,3~4GB属于内核空间,内核空间对常规内存、I/O设备内存以及高端内存有不同的处理方式。当然,内核空间和用户空间的具体界限是可以调整的,在内核配置选项KernelFeatures→Memory split下,可以设置界限为2GB或者3GB。?

?

?linux进程地址空间

程序在内存上运行:

可以把内存管理理解为一个大型进程,里面有小型线程,但都是内核级线程。程序都是存储在存储器中的,CPU要得到程序内容,必须的从存储器对应的内容缓存到内存中来。编译的程序通常是以0作为起始地址的模块,多个目标模块再经过链接得到一个具有统一地址的装配模块,其素有目标模块地址的集合称为地址空间(逻辑上的概念)。物理内存的所有地址集合称为物理空间物理上的概念),从0开始的一段连续空间,大小是由容量来决定的。

把逻辑空间重定位到物理空间有三种方法:

1.程序编译链接时;需要知道用户进程驻留地点的绝对地址
2.程序装入内存时;
3.程序执行时;当CPU得到一个逻辑地址,需要快速将其转换为一个物理地址,需要物理器件的支持,MMU现代操作系统采用这种方法。

比如程序编译时从程序main函数从0x0000 0000(逻辑地址)开始,但是内存中0x0000 0000(物理地址)地址是另有他用的,该程序被读取到0x3000 0000的物理空间中,但这不是程序的入口就会发生错误,因此我们需要建立一个映射让是的CPU访问即使访问0x0000 0000时也能访问到main函数,也就是程序的入口,内存管理就是建立一个页(虚拟的内存)到物理块(实际存在的)的映射,这种转换过程称为地址重定位,该功能由MMU来负责。

重定位寄存器/页表寄存器是存储这逻辑地址和物理地址的偏移值,访问物理地址时,硬件上使得逻辑地址加上重定位寄存器的值得到代码的再内存中的真实的物理地址。

内存管理的功能:

1.为带运行的程序分配内存
2.程序运行结束回收内存

这部分可以结合linux操作系统的书籍内存管理的部分看。

linux进程的虚拟内存空间:

4GB
????????操作系统内核
3GB
? ? ? ? 环境变量
? ? ? ? 参数
????????栈

? ? ? ? 堆
? ? ? ? 数据bss
? ? ? ? 数据data(rodata、data)
? ? ? ? 代码
? ? ? ? (空)
0GB

3.虚拟文件系统

Linux虚拟文件系统隐藏了各种硬件的具体细节,为所有设备提供了统一的接口。而且,它独立于各个具体的文件系统,是对各种文件系统的一个抽象。它为上层的应用程序提供了统一的vfs_read()、vfs_write()等接口,并调用具体底层文件系统或者设备驱动中实现的file_operations结构体的成员函数。

?linux虚拟文件系统

4.网络接口

网络接口提供了对各种网络标准的存取和各种网络硬件的支持。如图所示,在Linux中网络接口可分为网络协议和网络驱动程序,网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备通信,每一种可能的硬件设备都有相应的设备驱动程序。?

?linux网络体系结构

5.进程间通信

进程间通信支持进程之间的通信,Linux支持进程间的多种通信机制,包含信号量、共享内存、消息队列、管道、UNIX域套接字等,这些机制可协助多个进程、多资源的互斥访问、进程间的同步和消息传递。在实际的Linux应用中,人们更多地趋向于使用UNIX域套接字,而不是System V IPC中的消息队列等机制。Android内核则新增了Binder进程间通信方式。

Linux内核5个组成部分之间的依赖关系如下。

进程调度与内存管理之间的关系:这两个子系统互相依赖。在多程序环境下,程序要运行,则必须为之创建进程,而创建进程的第一件事情,就是将程序和数据装入内存。

进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空间之外,还可以存取共同的内存区域。

虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持RAMDISK设备。

内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程定期由调度程序调度,这也是内存管理依赖于进程调度的原因。当一个进程存取的内存映射被换出时,内存管理向虚拟文件系统发出请求,同时,挂起当前正在运行的进程。

除了这些依赖关系外,内核中的所有子系统还要依赖于一些共同的资源。这些资源包括所有子系统都用到的API,如分配和释放内存空间的函数、输出警告或错误消息的函数及系统提供的调试接口等。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 11:48:50  更:2021-07-29 11:49:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 10:08:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计