08 | 操作系统内核与编程接口
08 | 操作系统内核与编程接口
讲述:丁伟
时长14:24大小13.21M
系统调用
编程接口
动态库
操作系统与编程语言
结语
赞 51
提建议
精选留言(59)
- :)2019-05-10老师讲得太好了,让我对操作系统有了更加深入的理解,个人认为理解好老师所讲的内容,有如下关键点:1. 操作系统和我们写的程序运行于两个进程中 2.我们写的程序无法直接访问操作系统所在的内存 3.连接操作系统进程和用户进程的桥梁是中断地址 。 可以设想在还没有出现操作系统的上古时代,有两个普通的程序A和B在cpu上跑着,那么程序A和程序B如何交互呢?一种简单的办法就是程序A直接跳到程序B的函数地址上,cpu去执行该函数。但是呢,如果程序A访问不了程序B的地址咋办呢?可以在他们之间创建一个桥梁,这个桥梁就是中断地址,程序A可以通过中断地址间接的把cou执行权限交给B。这样程序B就可以执行了。 从cpu的角度看程序A和程序B都是普通的程序,但是呢,程序B是个功能丰富的程序,它可以做很多事,比如管理内存,管理外围设备。话说,程序A也可以做管理设备的工作啊,程序C也可以做管理设备的工作,,,后来一发现,程序A,B,C....都做了和外围设备交互的工作,我擦大家都做了相同的工作啊,那要不都交给程序B来做吧,我们A和C希望和外围设备交互的时候,就通过中断做为桥梁,把执行权交给B,然后就达到间接的外围设备交互,,,于是乎B越来越壮大!不仅有外围IO管理的能力,还有了内存管理,进程环境,,,等等。于是乎操作系统产生了,,,这是我个人的理解,还请老师多多指正!展开共 1 条评论94
- Fz2019-05-10交叉编译不是很理解
作者回复: 其实理解清楚一个实质:编译器就是把高级语言翻译成为机器码,更抽象说,它其实就是格式转换器。目标格式是不是编译器正在运行的环境并不重要,只不过如果目标格式刚好是当前机器的CPU+操作系统,那么目标格式就可以直接执行,否则就编译出一个当前环境下无法执行的目标格式,这种情况就叫交叉编译。
共 5 条评论53 - SuperFranky2019-05-11cpu不需要检查是否发生了中断,它的原理类似于开关和灯泡的关系,当开关合上,灯泡就会亮,灯泡不需要定期检查开关是否合上了
作者回复: 👍
共 2 条评论30 - 晓凉2019-05-12优秀的架构设计能带来的好处可能超出架构师最初的预想,例如Linux系统的容器特性,现在成了云计算领域的重要基础技术,成就了一个领域。基于前辈大师的优秀架构,现在的信息世界才能如此生生不息。优秀的架构不仅能解决当前的实际问题,更具有理论上的优雅,像一种真理,可照亮未来。
作者回复: 我们日常所见明明有无数设计精良的例子,所以我们其实不需要一上来去设计新的例子,从这些最宏大的例子学起
24 - 云学2019-05-12看完有种苹果砸到脑袋上的感觉,好多问题之前总想不透,现在贯通了,许老师可以创立个品牌专门教小孩编程,以老师的功底肯定能教会
作者回复: 正在教自家小孩😊
共 2 条评论16 - M2019-05-10请问一下cpu是如何检查是否有中断的。是怎么及时知道发生了中断?每执行完一条指令都去检查一次吗?
作者回复: 挺好的问题。硬件中断和软中断不一样。硬件中断你可以理解为总是会定期检查。软中断本身是一条指令,所以不存在检查这样的概念。
共 3 条评论15 - 码农Kevin亮2019-10-03我重复一下我理解的交叉编译,老师帮忙看看理解对不对: 编译的目标是生成机器码指令,即对cpu有意义的01序列。当出现新的cpu指令时,本质上只是生成一个新的01序列。整个自举的过程有点像自然语言的自举,比如用原有的词汇去解释新的词汇。 是这样理解么?
作者回复: 是这样
11 - 杨寅冬2019-06-17老师可以谈谈最近华为要推出的“鸿蒙系统”吗,和Linux有什么关系,如果想开发一个操作系统,从哪些方面考虑。
作者回复: 做操作系统的难度不在技术,而是在:1、用户为何用你,你有何不可替代性;2、开发者为何要支持你,你用户多不多。
共 2 条评论11 - 黑洞2019-05-22老师解释的真是很明白,尤其是系统调用的工作原理,我一直都没有想明白普通用户自定义函数调用和系统调用之间到底有什么区别,原来以为是垮进程内存地址传递和内存共享,原来压根儿就是在同一个内存地址空间里啊!OS内核地址空间被所有用户进程自己操作系统自己共享啊。 上学时学习操作系统课程,上面说虚拟内存低地址空间已经分给操作系统内核使用,这句话原来是这个意思啊,真是恍然大悟,受教受教了。💐(/ε\*)给你花花展开共 2 条评论10
- new life2019-05-11老师 但是实际上常见的系统级语言(比如 C 语言)都是可以编写出不依赖任何内核的程序的。这句话是说我们编写的程序 没有操作系统也可以跑起来是吗
作者回复: 要让引导程序给你执行权才行,如果你写一个不依赖操作系统的程序,但是要让操作系统执行它是行不通的,因为操作系统接管了所有的资源,你不依赖它什么也干不了(没有权限)。所以这种写法基本上只适合写另一个操作系统。
共 2 条评论10 - 行者2019-05-13关于动态库,是不是可以理解为:提供动态库不是操作系统的责任(因为其他语言完全可以通过系统调用来自己实现动态库的功能),只是操作系统为了方便其他语言(减少不必要的冗余)而做的多余的事?
作者回复: 是的
共 2 条评论8 - 小袋子2019-06-23插个题外话,以老师的经验,小孩几岁开始学编程比较合适😂
作者回复: 8-9岁
8 - 二星球2019-05-13老师好,我这有个问题,就是有中断必有对应的中断处理程序,那么执行中断处理程序会不会像普通线程那样抢占cpu资源呢,如果没抢到还要等一等?还有就是一下同时来了十几个中断,那么怎么处理呢?
作者回复: 软中断你可以把它理解为虚函数调用,本来就占着cpu资源呢,不需要等。一下子来很多中断是可能的,在硬件中断的情况下,这时候会根据中断优先级响应。
共 2 条评论7 - Geek_gooy2020-01-13前面提到: 操作系统与我们编写的软件并不同属一个进程,两边的内存地址空间都是独立的。 后面提到: 当然你可能要问:既然操作系统内核和我同属一个地址空间,…… 老师,这是不是矛盾啊?中间的解释看不懂,求形象举例。展开
作者回复: 第一句话是逻辑上的,操作系统的进程,和用户进程都有独立的地址空间。但是细究细节,可以发现操作系统进程和所有用户进程有一部分地址空间又是共享的,里面就是操作系统的内核。
共 2 条评论6 - dong2019-05-10这是我看过的讲的最清楚的计算机组成原理和操作系统。期待更新。6
- 尹少爷2019-05-15操作系统内核的进程都是共享内存的,在联合上一章内容: 其实操作系统内核上层如果按照保护模式来看,通过虚拟内存做了一层安全隔离,不同程序的隔离, 那么同一个程序中的,不同进程的隔离是怎么做的,
作者回复: 同一进程内的隔离是通过:1、分内核态很用户态;2、内存页的保护属性(不可读、不可写、不可执行)
5 - apk2019-05-13go有自己的编译器,它也是基于CPU+操作系统实现的,还是自己通过机器码,汇编,go编译器思路实现的呢?像按行解析的编译器比如python和C这种执行加载的语言在编译器上有什么区别呢?
作者回复: go当然是用c实现的,大部分语言都是如此。后来go决定自举,就换成go来实现go了。
5 - Yayu2019-05-13请问老师,变成语言提供的内置库(SDK)可大体氛围两类:1、对(操作系统各个子系统的)系统调用的封装;2、业务(逻辑)层的工具。那我们这里说的SDK是文章末尾分层图中的 【编程语言操作系统相关的标准库】和【编程语言的算法库】对吧?那【编程语言的核心文法及内置库】这一层如何理解?落实到具体的指代哪些库呢?
作者回复: 编程语言的核心文法及内置库主要就是语言各种基础特性,主要就是语言文法部分,比如变量、控制语句(if、for、switch)、函数定义等等
5 - long.mr2019-05-12许老师,问一哈在画架构图的时候有没有一些约定俗成的准则呢,比如虚线 实线 方框 圆角矩形的选择。业界有一些权威的参考吗?
作者回复: UML 里面有一些约定,可以参考。但是更重要的是团队内的约定。
5 - 马留2019-05-16对“硬件中断要周期性检查”不太理解。CPU和外设交互,有三种方式:轮询 中断 DMA。对CPU来说,硬件中断来自于外部触发,是异步的,怎么需要周期性检查呢?
作者回复: 硬件中断周期性检查是一个错误的表述
4