前言:Linux内核是操作系统中最核心的部分,它负责管理计算机硬件资源,并提供对应用程序和其他系统组件的访问接口。它控制着计算机的内存、处理器、设备驱动程序和文件系统等关键功能。
作为开源软件,Linux内核由全球各地的开发者共同维护和改进,不断增强其性能、安全性和功能。许多流行的操作系统都基于Linux内核,如Ubuntu、Debian、CentOS等。
一、Linux内核的特征
(1)Linux内核组织形式为整体式结构
Linux内核是面向过程的,每一个模块单独编译,最后链接成一个独立的目标程序。这种结构最大的特点是内部结构简单,子系统容易进行访问,因此内核的工作效率比较高。基于过程的结构有助于不同业务的成员进行基于不同业务的开发,基于这种角度,linux内核又是开放式的开发,它允许任何人对其不同模块进行完善和再次开发。
(2)进程调度方式简单而有效
可以说linux追求效率方面领先,体现在调度方式上也是别具一格,对于用户进程linux采用简单的动态优先级调用方式。对内核的例程,比如中断服务程序、设备驱动程序等采用一种独特的机制,就是我们所讲的软中断机制,这种机制保证内核例程以一种高效的机制运行。
(3)支持内核线程(或称为守护进程)
内核线程是在后台运行而业务终端和登录shell和它结合在一起的进程。有许多标准的内核线程,其中有一些是周期运行的来完成一些特定的任务。而其余的部分它是连续运行的等待处理某些特定的事件。内核线程可以说是用户进程,但它和一般用户进程又不一样,它像内核一样不被放出,因此运行效率比较高。
(4)支持多种平台的虚拟内存管理
内存管理是和硬件平台相互关联的一部分。为了支持不同的平台,又要保证虚拟管理存储技术的一个通用性。那linux虚拟内存管理为不同硬件平台提供统一的接口。因为我们把linux内核移植到一个新的硬件平台并不是一个很困难的事情。
(5)虚拟文件系统
虚拟文件系统不仅为多种逻辑文件统一了一个接口,而且为各种硬件设备提供了统一的接口,作为一种特殊的文件。
(6)模块机制
模块机制可以使内核保持独立而又容易扩展。使内核很容易增加一个模块,比如一个新的设备驱动程序,不需要重新编译内核,同时模块机制可以把一个模块按照需要添加到内核,或者把一个模块从内核当中卸载下来。这使得我们可以开发需要定制自己的内核。
(7)增加系统调用。
满足特殊的需求,一般来讲系统调用是操作系统设计者提供给用户使用内核工具的一个内核接口。但是linux开放源代码也允许我们自己设计自己的系统调用。然后把它加入到系统里面去。
(8)面向对象。
网络部分面向对象的思想使得我们现代linux内核支持多种协议、多种网卡驱动程序变得更加容易。
1.1Linux内核组成为五大部分
1.2系统数据结构
task_struct:代表一个进程数据结构指针形成一个task数组。
mm_struct:代表进程的虚拟内存。
inode:代表虚拟文件系统中的文件、目录等对应的索引节点(inode)。
1.3linux内核源码目录组织结构
(1)linux内核版本说明
Linux内核版本有两种:稳定版本和开发版本,Linux内核版本号由3组数字组成,第一组数字,第二组数字,第三组数字。第一组数字代表目前发布的内核主版本;第二组数字:偶数表示稳定版本,奇数开发中版本;第三组数字:错误修补次数。
例如:Linux 3.6.34
(2)linux内核目录说明
不同文件分析:
(3)源码结构图
kernel/sched/路径下:
二、为什么要学习linux内核
(1)提升研发出高水平软件
对技术提升有巨大参考价值,站在巨人的肩膀上,尤其对各种驱动的开发起到一个博采众长的参考作用。 我们只要认真的钻研,就一定能吃透他们牛逼的思想。为能够自己研究出解压芯片,路由器等设备提供借鉴,打破一些外来的技术封锁。
(2)开发自己的操作系统
为嵌入式系统提供一个极有吸引力的选择。以内核为基础的完全内核手册,支持多种计算机硬件,比如x86,arm等等现有的这些芯片,连源代码都全部公开,任何人员都可以修改,开发人员也可以为操作系统进行定制。它也有个好处,不用像windows操作系统一样有后台的威胁,这就是linux操作系统的好处。为开发嵌入式操作系统提供广泛的开发前景,比如数字家电,机顶盒,多媒体手机等。还有智能沟通设备,比如pos机、atm机等等。
(3)有助于计算机科学领域研究
(4)Linux系统性能优化
要转向内核开发,嵌入式开发人员需要掌握以下知识
还不熟悉的朋友,这里可以先领取一份Linux内核驱动开发新手学习资料包(入坑不亏):
这里给大家推荐零声教育全网独家的【Linux内核源码分析与项目实战】课程体系,通过原理技术+源码分析+案例分析+项目实战,全面解析计算机底层原理,20项目案例,2W+行手写代码,全面解析6个内核底层原理开发技术:
1、进程管理专题
(一)操作系统与汇编基础
(二)进程管理基础
(三)进程调度模块
2、内存管理专题
(一)内存管理基础部分
(二)内存管理进阶部分
3、网络协议栈专题
(一)网络基础架构
(二)网络协议栈架构
4、设备驱动专题
(一)设备驱动基础架构
(二)NIC网络接口卡
5、文件系统专题
(一)虚拟文件系统
(二)文件系统调用
(三)挂载文件系统
(四)磁盘文件系统
(五)数据同步
6、内核组件专题
(一)内核活动组件
(二)开源社区
以上是系统学习课程内容,需要系统学习请扫码添加秋香老师VX:2207032995(备注911)领取专属大额优惠券。
7、内核难点与学习方法8、内核适宜的工程师人群
至于学习效果怎么样?
三、阅读源代码
(1)系统的启动和初始化
在基于 Intel 的系统上,当 loadlin.exe 或 LILO 把内核装入到内存并把控制权传递给内核时,内核开始启动。关于这一部分,看 arch/i386/kernel/head.S ,head.S 进行特定结构的设置,然后跳转到 init/main.c 的 main()例程。
(2)内存管理
内存管理的代码主要在/mm,但特定结构的代码在 arch/*/mm。缺页中断处理的代码在mm/memory.c ,而内存映射和页高速缓存器的代码在 mm/filemap.c。缓冲器高速缓存是在mm/buffer.c 中实现,而交换高速缓存是在 mm/swap_state.c 和 mm/swapfile.c 中实现。
(3)内核
内核中,特定结构的代码在 arch/*/kernel,调度程序在 kernel/sched.c初始化磁盘,fork 的代码在 kernel/fork.c,task_struct 数据结构在 include/linux/sched.h 中。
(4)PCI
PCI 伪驱动程序在 drivers/pci/pci.c ,其定义在 include/linux/pci.h。每一种结构都有一些特定的 PCI BIOS 代码,Intel 的在 arch/alpha/kernel/bios32.c。
(5)进程间通信
所 有 System V IPC 对 象 权 限 都 包 含 在 ipc_perm 数 据 结 构 中 , 这 可 以 在include/linux/ipc.h 中找到 System V 消息是在 ipc/msg.c 中实现, 共享内存在 ipc/shm.c中,信号量在 ipc/sem.c 中,管道在 ipc/pipe.c 中实现。
(6)中断处理
内 核 的 中 断 处 理 代 码 是 几 乎 所 有 的 微 处 理 器 所 特 有 的 。 中 断 处 理 代 码 在arch/i386/kernel/irq.c 中,其定义在 include/asm-i386/irq.h 中。
(7)设备驱动程序
Linux 内核源代码的很多行是设备驱动程序。Linux 设备驱动程序的所有源代码都保存在/driver,根据类型可进一步划分为:
/block块设备驱动程序如 ide(在 ide.c)。如果想看包含文件系统的所有设备是如何被初始化的,应当看drivers/block/genhd.c 中的 device_setup(),device_setup()不仅初始化了硬盘,当一个网络安装 nfs 文件系统时,它也初始化网络。块设备包含了基于 IDE 和 SCSI的设备。
/char
这是看字符设备(如 tty,串口及鼠标等)驱动程序的地方。
/cdrom
Linux 的所有 CDROM 代码都在这里,如在这儿可以找到 Soundblaster CDROM 的驱动程序。注意 ide CD 的驱动程序是 ide-cd.c,放在 drivers/block;SCSI CD 的驱动程序是 scsi.c,放在 drivers/scsi。
/pci
这是 PCI 伪驱动程序的源代码,在这里可以看到 PCI 子系统是如何被映射和初始化的。
/scsi
在这里可以找到所有的 SCSI 代码及 Linux 所支持的 scsi 设备的所有设备驱动程序。
/net
在这里可以找到网络设备驱动程序,如 DECChip 21040 PCI 以太网驱动程序在 tulip.c中。
/sound
这是所有声卡驱动程序的所在地。
(8)文件系统
EXT2 文 件 系 统 的 源 代 码 全 部 在 fs/ext2/ 目 录 下 , 而 其 数 据 结 构 的 定 义 在include/linux/ ext2_fs.h,ext2_fs_i.h 及 ext2_fs_sb.h 中。虚拟文件系统的数据结构include/linux/fs.h 中描述,而代码是在 fs/*中。缓冲区高速缓存与更新内核的守护进程的实现是在 fs/buffer.c 中。
(9)网络
网络代码保存在/net 中,大部分的 include 文件在 include/net 下,BSD 套节口代码在net/socket.c 中初始化磁盘,IP 第 4 版本的套节口代码在 net/ipv4/af_inet.c。一般的协议支持代码(包括 sk_buff 处理例程)在 net/core 下,TCP/IP 联网代码在 net/ipv4 下,网络设备驱动程序在/drivers/net 下。
(10)模块
内核模块的代码部分在内核中,部分在模块包中,前者全部在 kernel/modules.c 中,而 数 据 结 构 和 内 核 守 护 进 程 kerneld 的 信 息 分 别 在 include/linux/module.h 和include/linux/kerneld.h 中。如果想看 ELF 目标文件的结构,它位于 include/linux/elf.h中。
限时特惠:本站每日持续更新海量各大内部网赚创业教程,会员可以下载全站资源点击查看详情
站长微信: