2019-03-22 10:30:34 tiaozhanzhe1900 阅读数 301
  • 韦东山升级版嵌入式视频之快速入门

    韦东山老师为啥要录升级版嵌入式视频? 200x年左右,嵌入式Linux在全世界、在中国刚刚兴起。 我记得我2005年进入中兴时,全部门的人正在努力学习Linux。 在2008年,我写了一本书《嵌入式Linux应用开发完全手册》。 它的大概内容是:裸机、U-boot、Linux内核、Linux设备驱动。 那时还没有这样讲解整个系统的书, 芯片厂家Linux开发包也还不完善,从bootloader到内核,再到设备驱动都不完善。 有全系统开发能力的人也很少。 于是这书也就恰逢其时,变成了畅销书。 我也根据这个思路录制了视频:裸机、U-boot、Linux内核、Linux设备驱动。 收获些许名声,带领很多人进入Linux世界。 11年过去了,嵌入式Linux世界发生了翻天覆地的变化 ① 基本系统能用 芯片厂家都会提供完整的U-boot、Linux内核、芯片上硬件资源的驱动。 方案厂家会做一些定制,比如加上某个WIFI模块,会添加这个WIFI模块的驱动。 你可以使用厂家的原始方案,或是使用/借鉴方案商的方案,做出一个“能用”的产品。 ② 基础驱动弱化;高级驱动专业化 基础的驱动,比如GPIO、UART、SPI、I2C、LCD、MMC等,有了太多的书籍、视频、示例代码,修修改改总是可以用的。 很多所谓的驱动工程师,实际上就是“调参工程师”。 我们群里有名的火哥,提出了一个概念:这些驱动就起一个“hardware enable”的作用。 高级的驱动,比如USB、PCIE、HDMI、MIPI、GPU、WIFI、蓝牙、摄像头、声卡。 体系非常复杂,很少有人能讲清楚,很多时候只是一笔带过。 配置一下应用层工具就了事,能用就成。 这些高级驱动,工作中需要专门的人来负责,非常专业。 他们是某一块的专家,比如摄像头专家、音频专家。 ③ 项目为王 你到一个公司,目的是把产品做出来,会涉及APP到内核到驱动全流程。 中小公司玩不起华为中兴的配置,需要的是全面手。 大公司里,只负责很小很小一块的镙丝钉,位置也不太稳固啊。 所以,如果你不是立志成为某方面的专家,那就做一个全栈工程师吧。 ④ 调试很重要 都说代码是3分写7分调,各种调试调优技术,可以为你的升职加薪加一把火。 基于上述4点,我录制的全新视频将有这些特点: 1. 快速入门, 2. 实战项目, 3. 驱动大全, 4. 专题, 5. 授人以渔, 6. 要做任务 另外,我们会使用多款芯片同时录制,先讲通用的原理,再单独讲各个板子的操作。 这些芯片涵盖主流芯片公司的主流芯片,让你学习工作无缝对接。 1.快速入门 入门讲究的是快速,入门之后再慢慢深入, 特别是对于急着找工作的学生,对于业余时间挑灯夜读的工作了的人,一定要快! 再从裸机、U-boot、内核、驱动这样的路线学习就不适合了,时间就拉得太长了。 搞不好学了后面忘了前面。 并且实际工作中并不需要你去弄懂U-boot,会用就行:U-boot比驱动还复杂。 讲哪些内容? 怎么讲呢? 混着讲 比如先讲LED APP,知道APP怎么调用驱动,再讲LED硬件原理和裸机,最后讲驱动的编写。 这样可以快速掌握嵌入式Linux的整套开发流程, 不必像以前那样光学习裸机就花上1、2个月。 而里面的裸机课程,也会让你在掌握硬件操作的同时,把单片机也学会了。 讲基础技能 中断、休眠-唤醒、异步通知、阻塞、内存映射等等机制,会配合驱动和APP来讲解。 这些技能是嵌入式Linux开发的基础。 而这些驱动,只会涉及LED、按制、LCD等几个驱动。 掌握了这些输入、输出的驱动和对应的APP后,你已经具备基本的开发能力了。 讲配置 我们从厂家、从方案公司基本上都可以拿到一套完整的开发环境,怎么去配置它? 需要懂shell和python等配置脚本。 效果效率优先 以前我都是现场写代码、现场写文档,字写得慢,降低了学习效率。 这次,效果与效率统一考虑,不再追求所有东西都现场写。 容易的地方可先写好代码文档,难的地方现场写。 2.实战项目 会讲解这样的涉及linux网关/服务器相关项目(不限于,请多提建议):                      定位为:快速掌握项目开发经验,丰满简历。 涉及的每一部分都会讲,比如如果涉及蓝牙,在这里只会讲怎么使用,让你能写出程序;如果要深入,可以看后面的蓝牙专题。 3. 驱动大全 包括基础驱动、高级驱动。 这些驱动都是独立成章,深入讲解。 虽然基础驱动弱化了,但是作为Linux系统开发人员,这是必备技能,并且从驱动去理解内核是一个好方法。 在讲解这些驱动时,会把驱动的运行环境,比如内核调度,进程线程等概念也讲出来,这样就可以搭建一个知识体系。 没有这些知识体系的话,对驱动的理解就太肤浅了,等于在Linux框架下写裸机,一叶障目,不见泰山。 定位为:工具、字典,用到再学习。 4. 专题 想深入学习的任何内容,都可独立为专题。 比如U-boot专题、内核内存管理专题、systemtap调试专题。

    2952 人正在学习 去看看 韦东山

1 introduction

**教学内容:**操作系统结构、中断及系统调用、内存管理、进程线程,处理器调度、同步互斥、文件系统、I/O子系统
操作系统的定义:

  • 一个控制程序
  • 一个资源管理器

操作系统的组成:

  • shell
  • gui
  • kernel

操作系统内核特征:

  • 并发
  • 共享:同时访问/互斥天
  • 虚拟:多道程序设计
  • 异步:走走停停

操作系统的演变:
单用户系统->批处理系统、多程序系统->分时系统->个人计算机、分布式计算机

操作系统结构:
简单系统:不同机器都操作系统不一样,可移植性差
分层结构:提高了可移植性:unix
微内核结构(microkernel):更灵活,但性能更差
现在的操作系统基本是微内核结构和分层结构的混合体

2 启动、中断、异常和系统调用

2.1 启动

BIOS:Basic Input Output System,是一组固化到ROM上的程序,是个人电脑启动时加载的第一个软件
BIOS启动固件作用:

  • 基本输入输出程序
  • 系统设置信息
  • 开机后自检程序
  • 系统自启动程序:将记载程序从磁盘都引导扇区(512字节)加载到0x7c00,之后跳转到0x7c00,将操作系统的代码和数据从硬盘加载到内存中,跳转到操作系统都起始地址
    在这里插入图片描述在这里插入图片描述**系统启动出始化,从0xFFFF0读第一条指令,CS:IP=0xF000:FFF0,第一条指令啥跳转指令
  • BIOS初始化
    • 硬件自检
    • 显卡等设备都初始化
    • 执行系统BIOS
    • 按制定启动顺序从软盘、硬盘或光驱启动
    • 主引导记录MBR:有硬盘分区表描述分区状态和位置,加载并跳转到磁盘上都引导程序
  • 跳到活动分区的引导分区,再跳转到加载程序
  • 加载程序(bootloader)从文件系统中读取启动配置信息,根据配置去加载内核
    UEFI:统一的可扩展固件接口(Unified Extensible Firmware Interface)再所有平台上一致都操作系统启动服务,对引导记录都可行性进行检查

2.2 中断、异常、系统调用

异常:非法指令导致当前指令失败后都处理请求
中断:来在硬件设备都处理请求
系统调用:应用程序主动向操作系统发出都服务请求
程序访问通常啥通过高层次API接口而不是直接进行系统调用
三种最常用都应用程序编程接口(API):

  • win32 API for windows
  • POSIX API for Unix, Linux, Mac OSX
  • Java API for JVM
    系统调用和函数调用都不同
  • INT和IRET用于系统调用,涉及到堆栈切换和特权级都转换
  • CALL和RET用于函数调用,不需要堆栈切换
  • 因为内核态和用户态的切换,系统调用都开销是大于函数调用都

3 内存管理

内存管理的目标
抽象:逻辑地址空间
保护:独立地址空间
共享:访问相同内存
虚拟化:更大都地址空间
内存管理方式:
重定向relocation
分段segmentation
分页paging
虚拟存储virtual memory

3.1 连续内存分配

连续内存分配:给进程分配一块不小于指定大小都连续都物理内存区域
内存碎片:不能被利用都空闲内存,内部碎片和外部碎片
动态内存分配:当程序被加载执行时,分配一个进程指定大小可变分区:
动态分区的分配测略:

  • 最先匹配:简单,会有外部碎片,分配大空间内存时速度慢
  • 最佳匹配:避免大都空闲分区被拆分,但释放分区较复杂
  • 最差匹配:中等大小都分配较多时,效果最好,避免出现太多小碎片,释放分区较复杂
    碎片整理:
  • 紧凑:调整进程占用都分区位置来减少或避免分区碎片,需要保证所有应用程序啥可动态重定位
  • 分区对换:抢占并回收处于等待状态进程都分区,以增大可用内存空间
    伙伴系统buddy system:
    初始状态只有一个大小为2u2^u的空闲块,从小到大在空闲块数组中找最小的可用空闲块,如果空闲块过大,对空闲块进行二等分,直到大小合适都可用空闲块
    空闲块合并条件:大小相同,地址相邻,起始地址较小都块都起始地址是2(i+1)2^(i+1)

3.2 非连续内存分配

连续分配的缺点:物理内存必须连续,存在外碎片和内碎片,内存利用率低
非连续分配:允许共享代码和数据,支持动态加载和动态链接
段式存储管理segmentation:
将进程空间由多个段组成:数据、代码、堆栈,粒度比较大
段号去段表找基址,加上偏移就是物理地址
页式存储管理
将物理地址空间划分成相同大小的基本分配单元
帧frame:物理内存被划分成大小相等的帧
页page:逻辑地址空间被划分成大小相同的页
页表:逻辑地址到物理地址之间都映射关系
页表基址寄存器PTBR:page table basse register
如何减少页表大小?

  • 快表TLB:translation look-aside buffer:缓存近期访问的页表项
  • 多级页表:通过间接引用建立页表树
  • 页寄存器:让页表与物理地址相对应,根据物理帧号寻找逻辑页号:逻辑地址进行hash变换->快表中找页表项
  • 反置页表:类似页寄存器,把进程id也考虑进来:逻辑地址+pid进行hash变换->反置页表中找页表项
    段页式存储管理需求
    段式存储在内存保护方面有优势,页式存储再内存利用效率和优化转移到后备存储方法有优势
    在段式存储管理都基础上,给每一个段加一级页表
    逻辑地址->段表->页表->物理地址
    段页式存储管理中都内存共享:不同进程的段表中的共享段,指向相同的页表项
    在这里插入图片描述

3.3 虚拟内存

覆盖overlay:程序员给出模块间逻辑覆盖结构,发生再运行程序都内部模块间
交换swap:以进程为单位交换,发生在内存进程间
虚拟存储技术都目标:只把部分程序放到内存中,从而运行比物理内存大的程序
实现进程在内存和外存之间的交换,从而获得更多的空闲内存空间
分支局部性:一条跳转指令的两次执行,很可能跳到相同的内存位置
在这里插入图片描述缺页异常->查找在外存中都页面->页面置换

3.4 页面置换算法

置换算法:当出现缺页异常时,调入新页面且内存已满时,置换算法选择被置换的物理页面
页面锁定:描述必须常驻内存的逻辑页面,是操作系统的关键部分,或者是要求相应速度的代码和数据
局部页面置换算法:置换页面的选择范围仅限于当前进程占用的物理页面内
全局页面置换算法:置换页面的选择范围是所有可换出的物理页面

3.4.1 局部置换算法

  • 最优置换算法optimal:置换未来最长时间不访问的页面,是理想情况,实际系统中无法实现
  • 先进先出算法FIFO:链表元素按驻留内存的时间排序,链首最长,链尾最短
  • 最近最久未使用算法LRU:选择最长时间没有被引用的页面进行置换,是最优置换算法的一个近似
    可以通过页面链表来实现,维护一个按最近访问时间排序的页面链表,或者是活动页面栈
  • 时钟置换算法:在LRU和FIFO的折中,设一个访问位,访问页面的时候,访问位置1,缺页的时候指针顺序检查环形链表,就像时钟一样
  • 改进的时钟置换算法:如果,一个页面有修改,则修改位为1,缺页时跳过有修改的页面,有修改的页面可以在其他时候写到外存中
  • 最不常用算法LFU:每个页面设置一个访问计数,访问页面时访问计数加1,缺页时置换计数最小的页面
    belady现象:采用FIFO算法,可能出现分配物理页面数增加时,缺页率反而增加
    这是因为FIFO记录信息少,而LRU算法因为记录信息更多,没有belady现象,但是开销也更大

3.4.2 全局置换算法:

因为进程在不同阶段的内存需求是变化的,所有全局置换算法需要确定分配给进程的物理页面数
CPU利用率和并发进程数存在相互促进和制约的关系:
并发进程导致内存访问增加,并发进程的内存访问会降低访存的局部性特征
工作集W(t,Δ)W(t,\Delta)指当前时刻t前的Δ\Delta时间窗口中的所有访问页面所组成的集合
工作集置换算法:换出不在工作集中的页面,有点类似LRU
缺页率=缺页平均时间间隔的倒数
缺页率算法:如果进程缺页率过高,则增加常驻集以分配更多的物理页
在这里插入图片描述

3.4.2 抖动和负载控制:

**抖动thrashing:**进程物理页面太少,不能包含工作集,频繁置换
所以说操作系统要在并发和缺页率之间达到一个平衡,调节并发进程数MPL进行系统负载控制
最好是wi=\sum{w_i}=内存的大小
或者是平均缺页间隔时间(MTBF)=缺页异常处理时间(PFST)的点,这时候我们认为缺页的时候缺页异常来得及处理

4 进程控制

进程控制块PCB:porcess control block:操作系统管理控制进程运行所用的信息集合

  • 进程标识信息
  • 处理机现场保存:PC, SP
  • 进程控制信息:进程间通信和存储信息
    三状态进程模型:运行、就绪、等待,此外还有创建和退出这两个状态
    进程挂起:处于挂起的进程映像放在外存中
  • 就绪到就绪挂起:高优先级进程等待,低优先级进程就绪,为了释放空间
  • 等待挂起:就绪进程需要更多的内存空间
  • 运行到就绪挂起:在抢先式分时操作系统中,高优先级进程就绪
    激活:把一个进程从外存转到内存

4.1 线程

单进程多线程系统:对并发执行要求高、对信息共享要求高,对安全隔离要求低
线程能减少并发执行的时间和空间开销:
线程的创建时间、终止时间、切换时间比进程短,共享内存和文件资源
用户线程:用一组用户级的线程库函数来完成线程的创建终止同步和调度,可以自己写调度算法,不需要和内核态切换,
缺点是线程发起系统调用而阻塞时,整个进程进入等待,线程只能按进程分配CPU时间,多个线程进程中,每个线程的时间片就少
内核线程:由内核维护PCB和TCB,使得进程是资源分配的单位,线程是处理器调度单位
**结论:**用户线程和内核线程一对一最好

4.2 进程控制

4.2.1 进程创建

windows进程创建api:CreateProcess(filename)
unix进程创建系统调用api:fork/exec
fork()父进程返回子进程pid,子进程返回0
exec()加载新程序取代当前运行进程pid不变
在这里插入图片描述

main{
	int childPID=fork();
	if(childPID==0)
		<子进程执行代码>
	else
		<父进程执行代码>
}

4.2.2 进程切换

进程生命周期的信息:寄存器、CPU状态、内存地址空间
为了提高效率,采用汇编代码保存寄存器状态

#include <unistd.h>
#include <sys/types.h>  
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
	pid_t pid;
	int i;

	for(i=0;i<3;i++){
		pid=fork();
		if(pid<0){
			printf("fork failed");
			exit(-1);
		}
		else if (pid==0){
			printf("i=%d, pid=%d, parent pid=%d\n",i, getpid(), getppid());
		}
		wait(NULL);
		/*exit(0);*/
	}
}

在这里插入图片描述
wait()系统调用:
子进程结束时通过exit()向父进程返回一个值
父进程通过wait()接受病处理返回值

4.3 处理器调度

处理器调度:从就绪队列中挑选下一个占用CPU运行的进程
比较调度算法的准则:

  • CPU使用率:CPU处于忙状态的时间百分比
  • 吞吐量:单位时间内完成的进程数量
  • 周转时间:进程从初始化到结束的总时间
  • 等待时间:进程在就绪队列中的总时间
  • 响应时间:从提交请求到产生响应所花费的总时间

调度算法:

  • 先来先服务算法FCFS:简单,但是当短进程排在长进程之后时,等待时间变长长
  • 短进程优先算法:有最优平均周转时间,需要预估CPU执行时间,可以用历史执行时间来预测未来,可能导致长进程一直在队列中等待,不合理
    一个变种是短剩余时间优先算法,这样就可以抢占正在执行的进程
  • 最高响应比优先算法:每次选择响应比R最高的进程,你等的时间越长,你的优先级越高
    R=(Twaiting+Tservice)/TserviceR=(T_waiting+T_service)/T_service
    其中TwaitingT_waiting是等待时间,TserviceT_service是执行时间
  • 时间片轮转算法:时间片结束时,按FCFS算法切换到下一个就绪进程,
    有额外的上下文切换
    时间片太大,退化成FCFS;时间片太小,上下文切换太多,一般按经验选择10ms
    公平,但是等待时间较差
  • 多级队列调度算法MQ:就绪队列被划分成多个独立子队列,每个队列有自己的调度算法,队列间可以按照时间片或者优先级调度
  • 多级反馈队列算法MLFQ:进程可以在不同队列间移动
    在这里插入图片描述- 公平共享调度FSS:保证不重要的组无法垄断资源

实时调度:要指定时间内完成
硬时限:错过任务时限会有灾难性后果
软时限:有时不能满足,则降低要求

  • 速率单调调度算法:周期越短,优先级越高
  • 最早截止时间优先算法
    对称多处理器调度SMP:每个处理器运行自己的调度程序,调度程序对共享资源的访问需要同步
    静态进程分配:进程从开始到结束都被分配到一个固定的处理器,这样调度的开销小
    动态进程分配:所有处理器共享一个公共的就绪队列,这样调度的时候需要各处理器同步
    优先级反置:高优先级进程长时间等待低优先级进程占用资源的现象
    基于优先级的可抢占调度算法存在优先级反置
    解决方法:
  1. 占有资源的低优先级进程,继承申请资源的高优先级的优先级
  2. 优先级天花板协议:占用资源进程的优先级和所有可能申请该资源的进程的最高优先级相同

4.4 同步互斥

程序并发执行的好处:共享资源、加速、程序模块化
原子操作atomic operation:不会出现部分执行的状态
在这里插入图片描述
临界区:进程中访问临界资源的一段需要互斥执行的代码
临界区的访问规则:
空闲则入,忙则等待、有限等待
临界区的实现方法:

  • 禁用中断:没有中断,没有上下文切换,因此没有并发,禁用中断后进程无法停止
  • 软件方法:通过共享变量,需要忙等待,浪费CPU时间
    在这里插入图片描述
    如果是多个线程:
    在这里插入图片描述
  • 操作系统的抽象方法
    硬件提供一些原子操作,比如
  1. 锁lock,有锁定和释放
  2. 测试和置位test-and-set指令:读值+写1
  3. 交换exchange
    利用test-and-set指令可以实现自旋锁spinlock和无忙等待锁,但是可能出现死锁
    在这里插入图片描述
    在这里插入图片描述

4.5 信号量和管程

信号量semaphore是操作系统提供的一种协调共享资源访问的方法,用信号量表示系统资源的数量
是一种抽象的数据结构,由一个整形变量和两个原子操作组成,可以实现访问互斥和条件同步
在这里插入图片描述
管程moniter:多线程互斥访问共享资源的程序结构,正在管程的线程可以临时放弃管程
等待操作wait():将自己阻塞在等待队列中,唤醒一个等待者
释放操作signal():将等待对类中的一个线程唤醒
在这里插入图片描述

4.5.1 生产者-消费者问题

任何时刻只能有一个线程操作缓冲区(互斥访问)
缓冲区为空时,消费者必须等待生产者(条件同步)
缓冲区满时,生产者必须等待消费者(条件同步)
在这里插入图片描述
在这里插入图片描述

4.5.2 哲学家就餐问题

5个哲学家围着一个圆桌,桌子放着5支叉子,哲学家思考或者就餐,就餐就要同时拿起左右两边的叉子
在这里插入图片描述

4.5.3 读者-写者问题

读者:只读数据不改,允许多个读者同时读
写者:读取和修改数据,读-写互斥,写-写互斥
在这里插入图片描述
用管程实现
在这里插入图片描述
在这里插入图片描述

4.6 死锁

出现死锁的必要条件:

  • 互斥
  • 持有并等待
  • 非抢占:资源只能在进程使用后自愿释放
  • 循环等待:进程0等进程1,进程1等进程2……
    通常操作系统忽略死锁,由应用程序处理死锁
    死锁处理方法:
  • 死锁预防:限制对资源的请求,使得任何情况都不满足死锁的条件
  • 死锁避免:利用额外的先验信息,动态检查资源分配状态,确保不会出现死锁,如银行家算法
    银行家算法:客户贷款数量不超过银行拥有的最大值时,银行家应尽量满足客户需要
  • 死锁检测:允许系统进入死锁,定期调用死锁检测算法来检测是否出现死锁
  • 死锁恢复:一次终止一个进程直至死锁消除,按照进程的优先级、已运行时间等顺序终止

4.7 进程通信

通信方式:

  • 间接通信:通过操作系统,利用消息队列,一个消息队列可以和多个进程共享
  • 直接通信:两个进程之间建立共享通道
  • 阻塞通信:一方在等待,只是接收/发送了信息
  • 非阻塞通信
    四种通信机制:
  • 信号
  • 管道
  • 消息队列
  • 共享内存
    在这里插入图片描述
    管道:进程间通过内存文件的通信机制
    在这里插入图片描述
    共享内存:把同一个物理内存区域同时映射到多个进程的内存地址空间的通信机制
    不同进程需要显式设置共享内存段,不过需要同步机制来协调数据访问

5 文件管理

文件:具有符号名,由字节序列构成的数据项集合
文件头:文件系统元数据中的文件信息,包括文件属性和文件存储位置和顺序
文件描述符:操作系统在打开文件表中维护的打开文件状态和信息

  • 包括文件指针:每个进程最后一次读写位置
  • 文件打开计数、
  • 文件的磁盘位置:缓存数据访问信息

文件系统的基本操作单位是数据块
进程访问文件的模式:顺序访问、随机访问、索引访问

多进程如何同时访问共享文件??让应用程序自己解决

操作系统只允许内核修改目录,应用程序通过系统调用来访问目录。文件系统需要挂载才能被访问

**文件别名:**两个或多个文件名关联同一个文件

  • 硬连接:多个文件项指向一个文件
  • 软连接:快捷方式的形式,这样删除别名和删除其他文件是一样的

文件系统种类:

  • 磁盘文件系统:如FAT、NTFS、ext2/3
  • 数据库文件系统:如WinFS
  • 日志文件系统:记录文件系统的修改/时间
  • 网络/分布式文件系统,如:NFS

虚拟文件系统:不同的文件系统对上层的应用程序有相同的API接口
文件系统基本数据结构

  • 文件卷控制块:每个文件系统一个:文件系统详细信息,如块大小,空余块
    当文件系统挂载时进入内存
  • 文件控制块:每个文件一个:文件详细信息,如访问权限,大小,拥有者
    当文件被访问时进入内存
  • 目录项:每个目录项一个:指向文件控制块,父目录,子目录
    遍历到这个目录时进入内存
  • 打开文件表:每个进程有一个打开文件表,系统有一个总的打开文件表

5.1 文件缓存

数据块使用后被缓存,两种数据块缓存方式:数据块缓存和页缓存
在这里插入图片描述
页缓存:在虚拟内存中文件数据块被映射成页,文件的读写操作被转换成对内存的访问
在这里插入图片描述

5.2 文件分配:分配一个文件数据块的位置和顺序

分配方式:

  • 连续分配:文件读取表现好,但是会有碎片,数据增加会有问题
  • 链式分配:用数据块链表存储:没有碎片,无法实现随机访问,可靠性差,破坏一个链,后面的都没有了
  • 索引分配:给每个文件创建索引数据块:没有碎片,当文件很小,存储索引开销不可忽略
  • UFS多级索引分配:前面10个直接索引,超过10个再加1级间接索引块,再超过就再加2级简介索引块

5.3 空闲空间组织和冗余磁盘阵列

用位图代表空闲数据块列表,Di=0D_i=0表示第i个数据块空闲,但是这样空闲数据块链表太大
而链表的开销较大,不如用链式索引
在这里插入图片描述
磁盘分区:磁盘上一组柱面的集合,一个分区内可以减少寻道时间
文件卷:一个拥有完整文件系统实例的外存空间,通常常驻在磁盘的单个分区上

6 I/O管理

常见设备接口类型:

  • 字符设备:键盘/鼠标、串口
  • 块设备:以块为单位,如磁盘驱动器、光驱
  • 网络设备:以太网、无线

CPU北桥连高速设备,南桥连I/O设备
CPU与设备的通信方式:轮询、中断或DMA

I/O地址

  • 内存地址:MMU设置映射,将设备的寄存器/存储映射到内存地址空间
  • 端口号:通过CPU的I/O指令访问I/O端口号

**磁盘调度算法:**通过优化磁盘访问请求顺序来提高磁盘访问性能

  • FIFO算法
  • 最短服务时间算法SSTF
  • 扫描算法SCAN:磁盘在一个方向上移动,访问所有未完成的请求,知道磁壁到达该方向上最后的磁道

磁盘缓存:磁盘扇区在内存中的缓存

2017-12-23 17:01:34 qq_27522735 阅读数 1777
  • 韦东山升级版嵌入式视频之快速入门

    韦东山老师为啥要录升级版嵌入式视频? 200x年左右,嵌入式Linux在全世界、在中国刚刚兴起。 我记得我2005年进入中兴时,全部门的人正在努力学习Linux。 在2008年,我写了一本书《嵌入式Linux应用开发完全手册》。 它的大概内容是:裸机、U-boot、Linux内核、Linux设备驱动。 那时还没有这样讲解整个系统的书, 芯片厂家Linux开发包也还不完善,从bootloader到内核,再到设备驱动都不完善。 有全系统开发能力的人也很少。 于是这书也就恰逢其时,变成了畅销书。 我也根据这个思路录制了视频:裸机、U-boot、Linux内核、Linux设备驱动。 收获些许名声,带领很多人进入Linux世界。 11年过去了,嵌入式Linux世界发生了翻天覆地的变化 ① 基本系统能用 芯片厂家都会提供完整的U-boot、Linux内核、芯片上硬件资源的驱动。 方案厂家会做一些定制,比如加上某个WIFI模块,会添加这个WIFI模块的驱动。 你可以使用厂家的原始方案,或是使用/借鉴方案商的方案,做出一个“能用”的产品。 ② 基础驱动弱化;高级驱动专业化 基础的驱动,比如GPIO、UART、SPI、I2C、LCD、MMC等,有了太多的书籍、视频、示例代码,修修改改总是可以用的。 很多所谓的驱动工程师,实际上就是“调参工程师”。 我们群里有名的火哥,提出了一个概念:这些驱动就起一个“hardware enable”的作用。 高级的驱动,比如USB、PCIE、HDMI、MIPI、GPU、WIFI、蓝牙、摄像头、声卡。 体系非常复杂,很少有人能讲清楚,很多时候只是一笔带过。 配置一下应用层工具就了事,能用就成。 这些高级驱动,工作中需要专门的人来负责,非常专业。 他们是某一块的专家,比如摄像头专家、音频专家。 ③ 项目为王 你到一个公司,目的是把产品做出来,会涉及APP到内核到驱动全流程。 中小公司玩不起华为中兴的配置,需要的是全面手。 大公司里,只负责很小很小一块的镙丝钉,位置也不太稳固啊。 所以,如果你不是立志成为某方面的专家,那就做一个全栈工程师吧。 ④ 调试很重要 都说代码是3分写7分调,各种调试调优技术,可以为你的升职加薪加一把火。 基于上述4点,我录制的全新视频将有这些特点: 1. 快速入门, 2. 实战项目, 3. 驱动大全, 4. 专题, 5. 授人以渔, 6. 要做任务 另外,我们会使用多款芯片同时录制,先讲通用的原理,再单独讲各个板子的操作。 这些芯片涵盖主流芯片公司的主流芯片,让你学习工作无缝对接。 1.快速入门 入门讲究的是快速,入门之后再慢慢深入, 特别是对于急着找工作的学生,对于业余时间挑灯夜读的工作了的人,一定要快! 再从裸机、U-boot、内核、驱动这样的路线学习就不适合了,时间就拉得太长了。 搞不好学了后面忘了前面。 并且实际工作中并不需要你去弄懂U-boot,会用就行:U-boot比驱动还复杂。 讲哪些内容? 怎么讲呢? 混着讲 比如先讲LED APP,知道APP怎么调用驱动,再讲LED硬件原理和裸机,最后讲驱动的编写。 这样可以快速掌握嵌入式Linux的整套开发流程, 不必像以前那样光学习裸机就花上1、2个月。 而里面的裸机课程,也会让你在掌握硬件操作的同时,把单片机也学会了。 讲基础技能 中断、休眠-唤醒、异步通知、阻塞、内存映射等等机制,会配合驱动和APP来讲解。 这些技能是嵌入式Linux开发的基础。 而这些驱动,只会涉及LED、按制、LCD等几个驱动。 掌握了这些输入、输出的驱动和对应的APP后,你已经具备基本的开发能力了。 讲配置 我们从厂家、从方案公司基本上都可以拿到一套完整的开发环境,怎么去配置它? 需要懂shell和python等配置脚本。 效果效率优先 以前我都是现场写代码、现场写文档,字写得慢,降低了学习效率。 这次,效果与效率统一考虑,不再追求所有东西都现场写。 容易的地方可先写好代码文档,难的地方现场写。 2.实战项目 会讲解这样的涉及linux网关/服务器相关项目(不限于,请多提建议):                      定位为:快速掌握项目开发经验,丰满简历。 涉及的每一部分都会讲,比如如果涉及蓝牙,在这里只会讲怎么使用,让你能写出程序;如果要深入,可以看后面的蓝牙专题。 3. 驱动大全 包括基础驱动、高级驱动。 这些驱动都是独立成章,深入讲解。 虽然基础驱动弱化了,但是作为Linux系统开发人员,这是必备技能,并且从驱动去理解内核是一个好方法。 在讲解这些驱动时,会把驱动的运行环境,比如内核调度,进程线程等概念也讲出来,这样就可以搭建一个知识体系。 没有这些知识体系的话,对驱动的理解就太肤浅了,等于在Linux框架下写裸机,一叶障目,不见泰山。 定位为:工具、字典,用到再学习。 4. 专题 想深入学习的任何内容,都可独立为专题。 比如U-boot专题、内核内存管理专题、systemtap调试专题。

    2952 人正在学习 去看看 韦东山

什么是操作系统?

角度1:

  • 从用户角度上,操作系统是一个控制软件;
  • 管理应用程序;
  • 为应用程序提供服务;
  • 杀死 应用程序;


角度2:

  • 资源管理;
  • 管理外设,分配资源;


操作系统的层次架构

硬件之上,应用程序之下,操作系统位于软件之下,为应用软件提供服务支撑。


Kernel操作系统内部组件,包括:

  • CPU调度器
  • 物理内存管理
  • 虚拟内存管理
  • 文件系统管理
  • 中断处理与设备驱动

OS Kernel的特征

  • 并发
  • 计算机系统中同时存在多个运行的程序需要OS管理调度
  • 共享:“同时”访问,互斥共享
  • 虚拟:利用多道程勋设计技术,让每个用户都觉得有一个计算机专门为它服务
  • 异步:程序的执行不是一贯到底,而是走走停停向前推进的速度不可预知,但是运行环境相同
  • 需要保证程序运行的结果也要相同



我听到的我会忘记,我看到的我能记住,只有我做过的我才能理解。






2015-06-02 10:36:34 zhouzhou135 阅读数 363
  • 韦东山升级版嵌入式视频之快速入门

    韦东山老师为啥要录升级版嵌入式视频? 200x年左右,嵌入式Linux在全世界、在中国刚刚兴起。 我记得我2005年进入中兴时,全部门的人正在努力学习Linux。 在2008年,我写了一本书《嵌入式Linux应用开发完全手册》。 它的大概内容是:裸机、U-boot、Linux内核、Linux设备驱动。 那时还没有这样讲解整个系统的书, 芯片厂家Linux开发包也还不完善,从bootloader到内核,再到设备驱动都不完善。 有全系统开发能力的人也很少。 于是这书也就恰逢其时,变成了畅销书。 我也根据这个思路录制了视频:裸机、U-boot、Linux内核、Linux设备驱动。 收获些许名声,带领很多人进入Linux世界。 11年过去了,嵌入式Linux世界发生了翻天覆地的变化 ① 基本系统能用 芯片厂家都会提供完整的U-boot、Linux内核、芯片上硬件资源的驱动。 方案厂家会做一些定制,比如加上某个WIFI模块,会添加这个WIFI模块的驱动。 你可以使用厂家的原始方案,或是使用/借鉴方案商的方案,做出一个“能用”的产品。 ② 基础驱动弱化;高级驱动专业化 基础的驱动,比如GPIO、UART、SPI、I2C、LCD、MMC等,有了太多的书籍、视频、示例代码,修修改改总是可以用的。 很多所谓的驱动工程师,实际上就是“调参工程师”。 我们群里有名的火哥,提出了一个概念:这些驱动就起一个“hardware enable”的作用。 高级的驱动,比如USB、PCIE、HDMI、MIPI、GPU、WIFI、蓝牙、摄像头、声卡。 体系非常复杂,很少有人能讲清楚,很多时候只是一笔带过。 配置一下应用层工具就了事,能用就成。 这些高级驱动,工作中需要专门的人来负责,非常专业。 他们是某一块的专家,比如摄像头专家、音频专家。 ③ 项目为王 你到一个公司,目的是把产品做出来,会涉及APP到内核到驱动全流程。 中小公司玩不起华为中兴的配置,需要的是全面手。 大公司里,只负责很小很小一块的镙丝钉,位置也不太稳固啊。 所以,如果你不是立志成为某方面的专家,那就做一个全栈工程师吧。 ④ 调试很重要 都说代码是3分写7分调,各种调试调优技术,可以为你的升职加薪加一把火。 基于上述4点,我录制的全新视频将有这些特点: 1. 快速入门, 2. 实战项目, 3. 驱动大全, 4. 专题, 5. 授人以渔, 6. 要做任务 另外,我们会使用多款芯片同时录制,先讲通用的原理,再单独讲各个板子的操作。 这些芯片涵盖主流芯片公司的主流芯片,让你学习工作无缝对接。 1.快速入门 入门讲究的是快速,入门之后再慢慢深入, 特别是对于急着找工作的学生,对于业余时间挑灯夜读的工作了的人,一定要快! 再从裸机、U-boot、内核、驱动这样的路线学习就不适合了,时间就拉得太长了。 搞不好学了后面忘了前面。 并且实际工作中并不需要你去弄懂U-boot,会用就行:U-boot比驱动还复杂。 讲哪些内容? 怎么讲呢? 混着讲 比如先讲LED APP,知道APP怎么调用驱动,再讲LED硬件原理和裸机,最后讲驱动的编写。 这样可以快速掌握嵌入式Linux的整套开发流程, 不必像以前那样光学习裸机就花上1、2个月。 而里面的裸机课程,也会让你在掌握硬件操作的同时,把单片机也学会了。 讲基础技能 中断、休眠-唤醒、异步通知、阻塞、内存映射等等机制,会配合驱动和APP来讲解。 这些技能是嵌入式Linux开发的基础。 而这些驱动,只会涉及LED、按制、LCD等几个驱动。 掌握了这些输入、输出的驱动和对应的APP后,你已经具备基本的开发能力了。 讲配置 我们从厂家、从方案公司基本上都可以拿到一套完整的开发环境,怎么去配置它? 需要懂shell和python等配置脚本。 效果效率优先 以前我都是现场写代码、现场写文档,字写得慢,降低了学习效率。 这次,效果与效率统一考虑,不再追求所有东西都现场写。 容易的地方可先写好代码文档,难的地方现场写。 2.实战项目 会讲解这样的涉及linux网关/服务器相关项目(不限于,请多提建议):                      定位为:快速掌握项目开发经验,丰满简历。 涉及的每一部分都会讲,比如如果涉及蓝牙,在这里只会讲怎么使用,让你能写出程序;如果要深入,可以看后面的蓝牙专题。 3. 驱动大全 包括基础驱动、高级驱动。 这些驱动都是独立成章,深入讲解。 虽然基础驱动弱化了,但是作为Linux系统开发人员,这是必备技能,并且从驱动去理解内核是一个好方法。 在讲解这些驱动时,会把驱动的运行环境,比如内核调度,进程线程等概念也讲出来,这样就可以搭建一个知识体系。 没有这些知识体系的话,对驱动的理解就太肤浅了,等于在Linux框架下写裸机,一叶障目,不见泰山。 定位为:工具、字典,用到再学习。 4. 专题 想深入学习的任何内容,都可独立为专题。 比如U-boot专题、内核内存管理专题、systemtap调试专题。

    2952 人正在学习 去看看 韦东山

1、操作系统:是一个控制程序,是一个资源管理器



操作系统软件的组成:Shell命令行接口,键盘操作;GUI图形用户接口;Kernel操作系统的内部

 

 

2、操作系统特征:

并发:同时存在多个运行的程序,需要OS管理和调度

共享:宏观“同时”访问,微观互斥共享

虚拟:利用多道程序设计技术,让每个用户都觉得有一个专门为他服务

异步:程序是走走停停的;运行环境相同,OS需要保证其结果也是相同的

3、操作系统实例:

UNIX家族、Linux家族,android(开放),Windows(封闭)

4、操作系统的演变:硬件抽象和协调管理

早期的系统追求效率

单用户系统:昂贵组件的低利用率

批处理系统:顺序执行与批处理

多道程序系统:保持多个工作在内存中并且在各工作间复用CPU

分时系统:定时中断用于工作时对CPU的复用

个人计算机:每个用户一个系统,效率已经不是重点,重点是用户界面和多媒体功能

分布式计算机:每个用户多个系统,网络,支持分布式服务

2019-03-18 19:46:40 pomo16 阅读数 58
  • 韦东山升级版嵌入式视频之快速入门

    韦东山老师为啥要录升级版嵌入式视频? 200x年左右,嵌入式Linux在全世界、在中国刚刚兴起。 我记得我2005年进入中兴时,全部门的人正在努力学习Linux。 在2008年,我写了一本书《嵌入式Linux应用开发完全手册》。 它的大概内容是:裸机、U-boot、Linux内核、Linux设备驱动。 那时还没有这样讲解整个系统的书, 芯片厂家Linux开发包也还不完善,从bootloader到内核,再到设备驱动都不完善。 有全系统开发能力的人也很少。 于是这书也就恰逢其时,变成了畅销书。 我也根据这个思路录制了视频:裸机、U-boot、Linux内核、Linux设备驱动。 收获些许名声,带领很多人进入Linux世界。 11年过去了,嵌入式Linux世界发生了翻天覆地的变化 ① 基本系统能用 芯片厂家都会提供完整的U-boot、Linux内核、芯片上硬件资源的驱动。 方案厂家会做一些定制,比如加上某个WIFI模块,会添加这个WIFI模块的驱动。 你可以使用厂家的原始方案,或是使用/借鉴方案商的方案,做出一个“能用”的产品。 ② 基础驱动弱化;高级驱动专业化 基础的驱动,比如GPIO、UART、SPI、I2C、LCD、MMC等,有了太多的书籍、视频、示例代码,修修改改总是可以用的。 很多所谓的驱动工程师,实际上就是“调参工程师”。 我们群里有名的火哥,提出了一个概念:这些驱动就起一个“hardware enable”的作用。 高级的驱动,比如USB、PCIE、HDMI、MIPI、GPU、WIFI、蓝牙、摄像头、声卡。 体系非常复杂,很少有人能讲清楚,很多时候只是一笔带过。 配置一下应用层工具就了事,能用就成。 这些高级驱动,工作中需要专门的人来负责,非常专业。 他们是某一块的专家,比如摄像头专家、音频专家。 ③ 项目为王 你到一个公司,目的是把产品做出来,会涉及APP到内核到驱动全流程。 中小公司玩不起华为中兴的配置,需要的是全面手。 大公司里,只负责很小很小一块的镙丝钉,位置也不太稳固啊。 所以,如果你不是立志成为某方面的专家,那就做一个全栈工程师吧。 ④ 调试很重要 都说代码是3分写7分调,各种调试调优技术,可以为你的升职加薪加一把火。 基于上述4点,我录制的全新视频将有这些特点: 1. 快速入门, 2. 实战项目, 3. 驱动大全, 4. 专题, 5. 授人以渔, 6. 要做任务 另外,我们会使用多款芯片同时录制,先讲通用的原理,再单独讲各个板子的操作。 这些芯片涵盖主流芯片公司的主流芯片,让你学习工作无缝对接。 1.快速入门 入门讲究的是快速,入门之后再慢慢深入, 特别是对于急着找工作的学生,对于业余时间挑灯夜读的工作了的人,一定要快! 再从裸机、U-boot、内核、驱动这样的路线学习就不适合了,时间就拉得太长了。 搞不好学了后面忘了前面。 并且实际工作中并不需要你去弄懂U-boot,会用就行:U-boot比驱动还复杂。 讲哪些内容? 怎么讲呢? 混着讲 比如先讲LED APP,知道APP怎么调用驱动,再讲LED硬件原理和裸机,最后讲驱动的编写。 这样可以快速掌握嵌入式Linux的整套开发流程, 不必像以前那样光学习裸机就花上1、2个月。 而里面的裸机课程,也会让你在掌握硬件操作的同时,把单片机也学会了。 讲基础技能 中断、休眠-唤醒、异步通知、阻塞、内存映射等等机制,会配合驱动和APP来讲解。 这些技能是嵌入式Linux开发的基础。 而这些驱动,只会涉及LED、按制、LCD等几个驱动。 掌握了这些输入、输出的驱动和对应的APP后,你已经具备基本的开发能力了。 讲配置 我们从厂家、从方案公司基本上都可以拿到一套完整的开发环境,怎么去配置它? 需要懂shell和python等配置脚本。 效果效率优先 以前我都是现场写代码、现场写文档,字写得慢,降低了学习效率。 这次,效果与效率统一考虑,不再追求所有东西都现场写。 容易的地方可先写好代码文档,难的地方现场写。 2.实战项目 会讲解这样的涉及linux网关/服务器相关项目(不限于,请多提建议):                      定位为:快速掌握项目开发经验,丰满简历。 涉及的每一部分都会讲,比如如果涉及蓝牙,在这里只会讲怎么使用,让你能写出程序;如果要深入,可以看后面的蓝牙专题。 3. 驱动大全 包括基础驱动、高级驱动。 这些驱动都是独立成章,深入讲解。 虽然基础驱动弱化了,但是作为Linux系统开发人员,这是必备技能,并且从驱动去理解内核是一个好方法。 在讲解这些驱动时,会把驱动的运行环境,比如内核调度,进程线程等概念也讲出来,这样就可以搭建一个知识体系。 没有这些知识体系的话,对驱动的理解就太肤浅了,等于在Linux框架下写裸机,一叶障目,不见泰山。 定位为:工具、字典,用到再学习。 4. 专题 想深入学习的任何内容,都可独立为专题。 比如U-boot专题、内核内存管理专题、systemtap调试专题。

    2952 人正在学习 去看看 韦东山

操作系统概述

什么是操作系统?

没有公认定义,可以理解为起协助作用的控制程序,或者是介于软硬件之间的资源管理器。

操作系统软件组成

  1. Shell 命令行接口

    • 通过键盘操纵
    • 方便用户进行命令输入
  2. GUI 图形用户接口

    • WIMP
      视窗(windows)、t图标(icon)、选单(menu)、指标(pointer)
    • 直接操作、所见即所得
  3. Kernel 操作系统内核

    • 执行各种资源管理等功能

操作系统内核

  • 并发:计算机系统中同时存在多个运行的程序,需要 OS 管理和调度
  • 共享:“同时”访问(宏观),互斥共享(微观:对资源进行隔离保护)
  • 虚拟:高频率交替(多道程序设计技术),使用户感觉在专用系统
  • 异步:程序执行时间难于预测,运行环境相同时,os需要保证输出结果相同

系统类型

  1. UNIX(开放):UNIX BSD、Mac OS等
  2. Linux(与UNIX同一类,API兼容或类似,开放程度更完整):Ubuntu、安卓等
  3. Windows(专用和封闭,图形用户接口,易用)

操作系统主要功能:硬件抽象和协调管理

操作系统的演变

  • 单用户系统
  • 批处理系统
  • 多程序系统
  • 分时
  • 个人计算机:每个用户一个系统
  • 分布式计算:每个用户多个系统

操作系统结构

  1. 简单结构:无模块划分,主要汇编,不可移植
  2. 分层结构:
    • 将操作系统分为多层(levels)
      • 每层建立在底层之上
      • 最底层(layer 0)是硬件
      • 最高层(layer N)是用户界面
    • 每一层仅使用更低一层的功能(操作)和服务
  3. 微内核结构(Microkernel):
    • 尽可能把内核功能移到用户空间
    • 用户模块间的通信使用消息传递
    • 好处:灵活、安全
    • 缺点:性能
  4. 外核结构(Exokernel):
    • 内核少放东西,资源管理由应用态代码完成,一个系统支起不同的操作系统服务
    • 让内核分配机器的物理资源给多个应用程序,并让每个程序决定如何处理这些资源
    • 程序能链接到操作系统库(libOS)实现了操作系统抽象
    • 保护和控制隔离
  5. VMM(虚拟机管理器,非操作系统结构):
    • 负责和硬件接触(隔离资源),操作系统负责资源管理
    • 虚拟机管理器将单独的机器接口转换成很多的虚拟机,每个虚拟机都是一个原始计算机系统的有效副本,并能完成所有的处理器指令

对于主流操作系统的结构分析

  • Windows
    Windows 属于比较接近微内核的混合内核结构,这样的结构有一个特点,那就是驱动是单独分发的,并不会和 Windows 的微内核混合在一起。因此,其驱动配置比较简单,无需改动 Windows 内核代码。

  • Linux
    Linux是一个宏内核的结构,在保留了微内核结构优点的基础上进行了优化。Linux的驱动和内核是整合在一起的,要适配某种硬件,得把驱动都整合进Linux内核。它是模块化的、多线程的以及内核本身可调度的操作系统。Linux 仅仅是一个单块内核,单个内核负责管理 CPU、内存、进程间通信、设备驱动程序、文件系统和系统服务器调用。

  • Mac OS
    Mac OS 的内核(XNU)结合了微内核(Mach)和单片内核的(BSD)的特性。根据苹果公司的 Github 页面,XNU 是将卡耐基梅隆大学开发的 Mach 内核和 FreeBSD 组件整合而成的混合内核,加上用于编写驱动程序的 C++ API。代码的 BSD 子系统部分在微内核系统中,通常实现为用户空间的服务。Mach 部分负责底层工作,例如多任务、内存保护、虚拟内存管理、内核调试支持和控制台 I/O。

启动、中断、异常和系统调用

BIOS启动固件

基本功能:

  • 基本输入输出的程序
  • 系统设置信息
  • 开机后自检程序
  • 系统自启程序等

BIOS 系统调用:

  • BIOS 以中断调用的方式提供了基本的 I/O 功能
    • INT 10h:字符显示
    • INT 13h:磁盘扇区读写
    • INT 15h:检测内存大小
    • INT 16h:键盘输入
  • 只能在 x86 的实模式下访问

系统启动流程

  1. CPU 初始化
    • CPU 加电稳定后从 0XFFFF0 读第一条指令
      • CS:IP = 0xf000:fff0
      • 第一条指令是跳转指令
    • CPU 初始状态为16位实模式
      • CS:IP 是16位寄存器
      • 指令指针 PC = 16 * CS + IP
      • 最大地址空间是 1MB
  2. BIOS 初始化
    • 硬件自检 POST
    • 检测系统中内存和显卡等关键部件的存在和工作状态
    • 查找并执行显卡等接口卡 BIOS ,进行设备初始化
    • 执行系统 BIOS ,进行系统检测,检测和配置系统中安装的即插即用设备
    • 更新 CMOS 中的扩展系统配置数据 ESCD
    • 按指定启动顺序从软盘、硬盘或光驱启动
  3. 主引导记录 MBR 格式
    • 启动代码:446字节
      • 检查分区表正确性
      • 加载并跳转到磁盘上的引导程序
    • 硬盘分区表:64字节
      • 描述分区状态和位置
      • 每个分区描述信息占据16字节
    • 结束标志字:2字节 (55AA)
      • 主引导记录的有效标志
  4. 分区引导扇区格式
    • 跳转指令:跳转到启动代码
      • 与平台相关代码
    • 文件卷头:文件系统描述信息
    • 启动代码:跳转到加载程序
    • 结束标志:55AA
  5. 加载程序(bootloader)

系统启动规范

  • BIOS
    • 固化到计算机主板上的程序
    • 包括系统设置、自检程序和系统自启动程序
    • BIOS-MBR、BIOS-GPT、PXE
  • UEFI
    • 接口标准
    • 在所有平台上一致的操作系统启动服务

中断、异常和系统调用

  • 系统调用 (system call)
    • 应用程序主动向操作系统发出的服务请求
  • 异常
    • 非法指令或者其他原因导致当前指令执行失败 (如:内存出错)后的处理请求
  • 中断
    • 来自硬件设备的处理请求
  • 区别:
    • 源头
      • 中断:外设
      • 异常:应用程序意想不到的行为
      • 系统调用:应用程序请求操作提供服务
    • 响应方式
      • 中断:异步
      • 异常:同步
      • 系统调用:同步或异步
    • 处理机制
      • 中断:持续,对用户应用程序是透明的
      • 异常:杀死或者重新执行意想不到的应用程序指令
      • 系统调用:等待和持续

中断处理机制

  • 硬件处理
    • 在 CPU 初始化时设置中断使能的标志
      • 依据内部或外部事件设置中断标志
      • 依据中断向量调用相应中断的服务例程
  • 软件
    • 现场保存(编译器)
    • 中断服务处理(服务例程)
    • 清除中断标记(服务例程)
    • 现场恢复(编译器)
  • 中断嵌套
    • 硬件中断服务例程可被打断
      • 不同硬件中断源可能硬件中断处理时出现
      • 硬件中断服务例程中需要临时禁止中断请求
      • 中断请求会保持到 CPU 做出响应
    • 异常处理例程可被打断
      • 异常服务例程执行时可能出现硬件中断
    • 异常服务例程可嵌套
      • 异常服务例程可能出现缺页

系统调用的外界使用

  • 操作系统服务的编程接口
  • 通常由高级语言编写 (C 或者 C++)
  • 程序访问通常是通过高层次的 API 接口而不是直接进行系统调用
  • 三种最常用的应用程序编程接口 (API)
    • Win32 API 用于 Windows
    • POSIX API 用于 POSIX-based systems (包括 UNIX, LINUX, Mac OS X的所有版本)
    • Java API 用于 JAVA 虚拟机 (JVM)

系统调用的内部实现

  • 每个系统调用对应一个系统调用号
    • 系统调用接口根据系统调用号来维护表的索引
  • 系统调用接口调用内核态中的系统调用功能实现,并返回系统调用的状态和结果
  • 用户不需要知道系统调用的实现
    • 需要设置调用参数和获取返回结果
    • 操作系统接口的细节大部分都隐藏在应用编程接口后
      • 通过运行程序支持的库来管理

函数调用和系统调用的不同处

  • 系统调用
    • INT 和 IRET 指令用于系统调用
      • 系统调用时,堆栈切换和特权级的转换
  • 函数调用
    • CALL 和 RET 用于常规调用
      • 常规调用时没有堆栈切换

中断、异常和系统调用的开销

系统调用比函数调用更安全,但是系统调用的开销超过函数调用。
中断、异常和系统调用具体开销:

  • 引导机制
  • 建立内核堆栈
  • 验证参数
  • 内核态映射到用户态的地址空间
    • 更新页面映射权限
  • 内核态独立地址空间
    • TLB

内存层次

操作系统的内存管理

操作系统的内存管理方式

  • 操作系统中采用的内存管理方式
    • 重定位 ( relocation )
    • 分段 ( segmentation )
    • 分页 ( paging )
    • 虚拟存储 ( virtual memory )
      • 目前多数系统(如 Linux )采用按需页式虚拟存储
  • 实现高度依赖硬件
    • 与计算机存储架构紧耦合
    • MMU(内存管理单元):处理 CPU 存储访问请求的硬件
2020-01-07 17:06:11 Cloud_yan 阅读数 9
  • 韦东山升级版嵌入式视频之快速入门

    韦东山老师为啥要录升级版嵌入式视频? 200x年左右,嵌入式Linux在全世界、在中国刚刚兴起。 我记得我2005年进入中兴时,全部门的人正在努力学习Linux。 在2008年,我写了一本书《嵌入式Linux应用开发完全手册》。 它的大概内容是:裸机、U-boot、Linux内核、Linux设备驱动。 那时还没有这样讲解整个系统的书, 芯片厂家Linux开发包也还不完善,从bootloader到内核,再到设备驱动都不完善。 有全系统开发能力的人也很少。 于是这书也就恰逢其时,变成了畅销书。 我也根据这个思路录制了视频:裸机、U-boot、Linux内核、Linux设备驱动。 收获些许名声,带领很多人进入Linux世界。 11年过去了,嵌入式Linux世界发生了翻天覆地的变化 ① 基本系统能用 芯片厂家都会提供完整的U-boot、Linux内核、芯片上硬件资源的驱动。 方案厂家会做一些定制,比如加上某个WIFI模块,会添加这个WIFI模块的驱动。 你可以使用厂家的原始方案,或是使用/借鉴方案商的方案,做出一个“能用”的产品。 ② 基础驱动弱化;高级驱动专业化 基础的驱动,比如GPIO、UART、SPI、I2C、LCD、MMC等,有了太多的书籍、视频、示例代码,修修改改总是可以用的。 很多所谓的驱动工程师,实际上就是“调参工程师”。 我们群里有名的火哥,提出了一个概念:这些驱动就起一个“hardware enable”的作用。 高级的驱动,比如USB、PCIE、HDMI、MIPI、GPU、WIFI、蓝牙、摄像头、声卡。 体系非常复杂,很少有人能讲清楚,很多时候只是一笔带过。 配置一下应用层工具就了事,能用就成。 这些高级驱动,工作中需要专门的人来负责,非常专业。 他们是某一块的专家,比如摄像头专家、音频专家。 ③ 项目为王 你到一个公司,目的是把产品做出来,会涉及APP到内核到驱动全流程。 中小公司玩不起华为中兴的配置,需要的是全面手。 大公司里,只负责很小很小一块的镙丝钉,位置也不太稳固啊。 所以,如果你不是立志成为某方面的专家,那就做一个全栈工程师吧。 ④ 调试很重要 都说代码是3分写7分调,各种调试调优技术,可以为你的升职加薪加一把火。 基于上述4点,我录制的全新视频将有这些特点: 1. 快速入门, 2. 实战项目, 3. 驱动大全, 4. 专题, 5. 授人以渔, 6. 要做任务 另外,我们会使用多款芯片同时录制,先讲通用的原理,再单独讲各个板子的操作。 这些芯片涵盖主流芯片公司的主流芯片,让你学习工作无缝对接。 1.快速入门 入门讲究的是快速,入门之后再慢慢深入, 特别是对于急着找工作的学生,对于业余时间挑灯夜读的工作了的人,一定要快! 再从裸机、U-boot、内核、驱动这样的路线学习就不适合了,时间就拉得太长了。 搞不好学了后面忘了前面。 并且实际工作中并不需要你去弄懂U-boot,会用就行:U-boot比驱动还复杂。 讲哪些内容? 怎么讲呢? 混着讲 比如先讲LED APP,知道APP怎么调用驱动,再讲LED硬件原理和裸机,最后讲驱动的编写。 这样可以快速掌握嵌入式Linux的整套开发流程, 不必像以前那样光学习裸机就花上1、2个月。 而里面的裸机课程,也会让你在掌握硬件操作的同时,把单片机也学会了。 讲基础技能 中断、休眠-唤醒、异步通知、阻塞、内存映射等等机制,会配合驱动和APP来讲解。 这些技能是嵌入式Linux开发的基础。 而这些驱动,只会涉及LED、按制、LCD等几个驱动。 掌握了这些输入、输出的驱动和对应的APP后,你已经具备基本的开发能力了。 讲配置 我们从厂家、从方案公司基本上都可以拿到一套完整的开发环境,怎么去配置它? 需要懂shell和python等配置脚本。 效果效率优先 以前我都是现场写代码、现场写文档,字写得慢,降低了学习效率。 这次,效果与效率统一考虑,不再追求所有东西都现场写。 容易的地方可先写好代码文档,难的地方现场写。 2.实战项目 会讲解这样的涉及linux网关/服务器相关项目(不限于,请多提建议):                      定位为:快速掌握项目开发经验,丰满简历。 涉及的每一部分都会讲,比如如果涉及蓝牙,在这里只会讲怎么使用,让你能写出程序;如果要深入,可以看后面的蓝牙专题。 3. 驱动大全 包括基础驱动、高级驱动。 这些驱动都是独立成章,深入讲解。 虽然基础驱动弱化了,但是作为Linux系统开发人员,这是必备技能,并且从驱动去理解内核是一个好方法。 在讲解这些驱动时,会把驱动的运行环境,比如内核调度,进程线程等概念也讲出来,这样就可以搭建一个知识体系。 没有这些知识体系的话,对驱动的理解就太肤浅了,等于在Linux框架下写裸机,一叶障目,不见泰山。 定位为:工具、字典,用到再学习。 4. 专题 想深入学习的任何内容,都可独立为专题。 比如U-boot专题、内核内存管理专题、systemtap调试专题。

    2952 人正在学习 去看看 韦东山

什么是操作系统

操作系统的定义
用户角度上讲:
管理应用程序
为应用程序提供服务
杀死应用程序

资源管理上讲:
管理外设、分配资源


操作系统架层次结构:
硬件之上
应用程序之下

操作系统位于应用软件之下,为应用软件提供支持


外壳Shell
内核kernel


操作系统的内部组件:
CPU调度器
物理内存管理
虚拟内存管理
文件系统管理
中断处理与设备驱动


操作系统的特征:
并发
计算机系统中同时存在多个运行的程序,需要OS管理和调度
并发:一段时间内有多个程序可以运行
并行:一个时间点上有多个程序可以同时运行(多个CPU)

共享
同时访问
互斥共享

虚拟
利用多道程序设计技术,让每个用户都觉得有一个计算机专门为他服务

异步
程序的执行不是一贯到底,而是走走停停,向前推进的速度不可预知
但只要运行环境相同,OS需要保证程序运行的结果也要相同


操作系统的实例:
Linux
Unix
Windows


操作系统的演变历史:
早期计算机使用纸带传输程序和数据,操作系统只起到加载作用

批处理时期

内存的容量越来越大,CPU执行多个程序。并发的执行

在一个程序执行其他的,程序二执行
多道执行,中断

为了更好的利用计算机资源,并且更好的和用户交互,出现了分时系统

个人计算机

多核多处理

分布式操作系统

未来:云中心,一个人周围有大量的机器为其服务


操作系统结构
简单操作系统:MS-DOS
不分模块的单体内核
容易攻击容易破坏,难以扩展

微内核的设计,尽可能把内核功能移到用户空间
只在操作系统内核中放最基本的功能,如中断

外核(学术界)
一块和硬件交互,功能是硬件功能的复制
一块和具体应用交互
好处在于速度

VMM(虚拟机监控器)
虚拟一台完整的计算器系统
多个操作系统共享硬件资源


操作系统的启动

DISK:存放OS(硬件)
BIOS:基本I/O处理系统(检查外设)
Bootloader:加载OS,将OS从硬盘放在内存中

没有更多推荐了,返回首页