什么是操作系统
(1)常见:linux、windows、android、ucos等操作系统;
(2)本质:程序,由很多源文件构成,需要编译连接成操作系统二进制程序(vmlinz、zImage);
(3)作用:管理计算机硬件,给应用程序提供运行环境。
(4)核心功能:
1)内存管理。
如uboot中使用内存没有注册也没有限制, 如果不小心同块内存重复使用会出现逻辑错误, 用的内存多了, 管理非常麻烦;
有了操作系统负责内存,所有应用程序需要申请和注册,内存管理模块分配, 好处是不会冲突。
2)进程调度。
多个应用程序同时运行时(单核CPU宏观并行),进程调度模块负责各个进程之间切换。
3)硬件设备管理。(驱动模块)
操作系统控制各个硬件,应用程序不考虑硬件细节, 不用自己写代码。
4)文件系统。
管理存储设备的一种方式, 有文件系统后, 只关注目录和文件名,不用管文件在物理磁盘的哪个扇区(每个扇区有512/1024/2048/4096字节)。
(5)可扩展功能:
1)协议栈: 可嵌入其他通信协议来支持特殊的通信接口;
2)应用程序包: 不属于操作系统内核,是给人用的,面向某种功能的。如ping程序测试网络是否联通,ifconfig/ipconfig程序配置网卡, 蜘蛛纸牌、时钟显示、微软输入法.....。
什么是内核
内核是操作系统的最基本部分, 为众多应用程序提供对硬件的安全访问;
内核属于操作系统下层, 普遍意义上的操作系统指发行版, os = 内核 + 常用应用程序;
内核和发行版的区别
1)发行版是基于内核的:
1)内核只有一个(如linux, 在www.kernel.org), 负责实现操作系统的核心功能(资源管理模块,譬如内存管理、调度系统······),但不包括应用程序, 所以只有内核人是没法用的,因为没有面向人的应用程序。
2)发行版有多个。如ubuntu、redhat、suse、centos·····, 卖操作系统的厂商会把把内核和不同应用程序打包提供,这就是操作系统发行版。
内核和驱动的关系
(1)关系: 驱动属于内核的一部分;
1)说硬件设备管理模块, 属于内核的中下层;
2)驱动工作在内核态;//随机寻址, 而用户态的地址访问有限制, 否则段错误
//驱动程序故障会导致整个内核崩溃
//驱动程序漏洞会使内核不安全
(2)总结: 写驱动比写应用程序要更严谨, 免得把系统搞崩;
(3)题外: 近几年由于设备快速发展, 内核版本比以前跟频繁地更新, 原因就是不断增加新驱动支持新设备;
内核和应用的关系
(1)关系: 应用程序在内核之上, 不属于内核;
1)应用程序工作在用户态,受限制的; (为了限制恶意应用程序, 病毒等, 但还是有找到系统漏洞的程序)
2)应用程序故障不会导致内核崩溃;
3)应用程序调用API接口来让内核工作;(有条件的, 需要合法调用)
(2)总结: 应用是最终目标(面向业务的功能); 内核是应用提供底层资源管理(实现的工具, linux内核就300多个API);
内核和根文件系统的关系
(1)根目录是根文件系统的源点;
(2)进程1存放在根文件系统中;(用户态和内核态的互换的交接点, 最开始是只有内核态的, 直到有了第一个进程)
(3)内核启动最后, 会装载根文件系统;
(4)总结:根文件系统为操作系统的启动提供了很多必备的资源, 包括:根目录、进程1;
什么是模块化设计
(1)历史趋势: linux内核庞大,代码量大、东西多,如果完全设计成一体(各文件、函数紧耦合),复杂度超出了人所能理解, 现在模块化设计已成普遍的系统设计原则。
(2)作用: 各功能模块彼此独立,减少了调用联系; 如调度系统和内存管理系统, 没有全局变量互相引用,函数互相调用也很少, 实现功能模块的松耦合。
(3)接口规范: 只要接口不变, 各模块遵循该接口, 还是能对接;
(4)优势:
1)可裁剪性: linux模块化程度非常高, 配置时可裁剪, 甚至可以剪到可以装入单片机;
静态裁剪: 编译前可配置,使用条件编译选择组成内核的成千上万个模块, 还有更多的细节需求的配置。
动态裁剪: 新趋势, 模块化编译或安装。不需要重启系统/重新烧录系统, 这种动态升级也由模块化来支持(如插了驱动立即编译链接进内存使用, 不用时从内核中剔除, 减少操作系统的占用内存)。
2)可扩展性(动态裁剪: 安装卸载、支持新硬件);
3)利于分工协作, 用接口对接, 减少开会讨论配合的时间;
2.选择合适版本的内核
linux内核版本变迁
(1)linux0.01。初版, 源码都找不到了;
(2)linux0.11。很多经典书以该版本为原本来讲。如《图解linux内核设计的艺术》;
(3)linux2.4。比较接近现代的版本,很多教材以2.4版本为参照,如《Linux Device Driver3》(很多例程因为驱动版本不匹配, 编译打印报错)。2.4晚期内核十年前经常碰到。
(4)linux2.6早期。2.6早期和2.4晚期相似。
(5)linux2.6晚期。2.6晚期改变较大,尤其驱动部分和头文件位置, 2016年还比较主流。
(6)linux3.x 4.x;
选择合适的内核版本
(1)不是越新的内核越好
(2)选择适合SoC的移植版本会减少工作量
S5PV210适用的内核版本
(0)参考三星选择的版本来学习, 难度没那么大, 熟悉后再自己基于基础版移植;
(1)linux 2.6.35.7+android2.3/QT4.8.3 [2012年]
(2)linux 3.0.8+android4.0 [随着4.0的退出, 三星又移植了一个]
(3)课程使用2.6.35.7版本讲解, 九鼎又基于这个内核做了完整的适配, 方便分析;
总结:
(1)对庞大整体要有认识, 先建立框架和整体,然后逐渐学各个细节部分,逐步细化。(先画树干, 后树叶)
(2)对各分层的作用要清楚。
(3)对层次间的关联和互相调用要理解。
注: 文章内容主要参考朱有鹏linux嵌入式课程