学习操作系统的知识,看哪本书好
1个回答
推荐于2016-12-01 · 知道合伙人数码行家
关注
展开全部
合实际一起看,效果会好的多。
书籍上讲的多是理论,可以自己再去找个开源的嵌入式OS,一起看着代码实现,就会好的多了。比如FreeRTOS,可以也买本书,学会编译,并在电脑里当成个应用跑起来,学会自己创建进程、协程后,进入对应的API实现看看。内核的调度、优先级、内存管理、资源管理、抢占式任务切换等等。
选择嵌入式OS是因为足够小,毕竟要为这个事情读Linux源码就是个大坑。FreeRTOS拥有大部分现代OS的各种核心功能,用来学习真是个好的例子。我也是学了FreeRTOS后,才逐渐让数年前操作系统的知识变得灵活起来了。
举几个例子,在FreeRTOS中的实现:
1. 线程管理:
给每个线程建立个私有的堆栈,每次在线程里调用任何的函数,所需的参数传递、本地变量等都是放在线程私有堆栈里的。这样各个线程之间不会发生混乱。该堆栈的建立一般还有个最大长度值,以免浪费内存过多,同时也限制了递归过深的情况。需要OS应用一开始就进行一个估算,调用栈会有多深。
2. 内存管理:
一般是先从物理内存里申请一大块内存,建立针对这块内存的分配表,每当有申请内存就记录一条,释放内存就选择时机将剩余内存合并。分配策略有多种,比如按照顺序,或者优先选择符合条件的最小空闲段。每个线程都建立自己的堆,有助于提高内存分配效率。
3. 进程/线程切换:
使用系统硬件上的定时器,每隔一定时间就发生一次硬件中断,此时当前进程/线程被停止,所有寄存器被保存到进程私有栈里。两次中断之间实际执行任务代码的部分,就叫做一个时间片。然后调用中断处理函数。这个中断处理函数就是OS内核里的任务切换功能,会重新选择处于就绪(ready)状态的各个任务中优先级最高的那个来运行。所以,理解并实现这个中断处理函数,就是理解任务切换的关键。放心代码不长。
4. OS内核调用:
现代的CPU,包括一些嵌入式MCU,都会严格区分user space和kernel space。两者的各种资源相对独立,甚至堆栈都不同。当user application需要调用内核提供的服务时,往往是将自己要调用的内核调用符号、参数、返回值放到内存中指定位置,然后触发一个软件中断。比如Cortex-M系列的SVCall,或者DOS的80中断。此时就切换到了kernel mode。此模式下的中断处理函数会根据系统调用内容分发调用请求,执行结束后,再根据返回地址跳转回去。
我推荐 6.828 / Fall 2014,往年的视频也很容易找到。这门课会接触到两个小的操作系统: xv6 和 jOS。课堂上主要讲xv6, 一个小的unix操作系统;而课程Lab分6~7个阶段让你填写jOS的关键代码。
这门课的好处就是理论加实践,而且课程节奏很好。
比如讲完系统调用,你就可以试着给xv6加个timer调用;讲完threads,你就可以试着给xv6加个系统调用,然后让这个系统支持线程...
Lab实现的jOS和xv6有很多设计决策不同,对比它们你可以更好的理解什么是操作系统;当然能自己亲手写一些代码感觉会很不一样(理论怎么转换到实践)
几点体会:
homework也许比Lab更有启发性(我是这么认为的);
如果看过CSAPP就最好了,汇编都不用学了,shell也会写了,memory也了解了。
6.828有个作业提交系统,只要邮箱就能注册了,然后可以互评Lab...
有了一些自己的体验后,然后结合书看也许就完全不一样了。
书籍上讲的多是理论,可以自己再去找个开源的嵌入式OS,一起看着代码实现,就会好的多了。比如FreeRTOS,可以也买本书,学会编译,并在电脑里当成个应用跑起来,学会自己创建进程、协程后,进入对应的API实现看看。内核的调度、优先级、内存管理、资源管理、抢占式任务切换等等。
选择嵌入式OS是因为足够小,毕竟要为这个事情读Linux源码就是个大坑。FreeRTOS拥有大部分现代OS的各种核心功能,用来学习真是个好的例子。我也是学了FreeRTOS后,才逐渐让数年前操作系统的知识变得灵活起来了。
举几个例子,在FreeRTOS中的实现:
1. 线程管理:
给每个线程建立个私有的堆栈,每次在线程里调用任何的函数,所需的参数传递、本地变量等都是放在线程私有堆栈里的。这样各个线程之间不会发生混乱。该堆栈的建立一般还有个最大长度值,以免浪费内存过多,同时也限制了递归过深的情况。需要OS应用一开始就进行一个估算,调用栈会有多深。
2. 内存管理:
一般是先从物理内存里申请一大块内存,建立针对这块内存的分配表,每当有申请内存就记录一条,释放内存就选择时机将剩余内存合并。分配策略有多种,比如按照顺序,或者优先选择符合条件的最小空闲段。每个线程都建立自己的堆,有助于提高内存分配效率。
3. 进程/线程切换:
使用系统硬件上的定时器,每隔一定时间就发生一次硬件中断,此时当前进程/线程被停止,所有寄存器被保存到进程私有栈里。两次中断之间实际执行任务代码的部分,就叫做一个时间片。然后调用中断处理函数。这个中断处理函数就是OS内核里的任务切换功能,会重新选择处于就绪(ready)状态的各个任务中优先级最高的那个来运行。所以,理解并实现这个中断处理函数,就是理解任务切换的关键。放心代码不长。
4. OS内核调用:
现代的CPU,包括一些嵌入式MCU,都会严格区分user space和kernel space。两者的各种资源相对独立,甚至堆栈都不同。当user application需要调用内核提供的服务时,往往是将自己要调用的内核调用符号、参数、返回值放到内存中指定位置,然后触发一个软件中断。比如Cortex-M系列的SVCall,或者DOS的80中断。此时就切换到了kernel mode。此模式下的中断处理函数会根据系统调用内容分发调用请求,执行结束后,再根据返回地址跳转回去。
我推荐 6.828 / Fall 2014,往年的视频也很容易找到。这门课会接触到两个小的操作系统: xv6 和 jOS。课堂上主要讲xv6, 一个小的unix操作系统;而课程Lab分6~7个阶段让你填写jOS的关键代码。
这门课的好处就是理论加实践,而且课程节奏很好。
比如讲完系统调用,你就可以试着给xv6加个timer调用;讲完threads,你就可以试着给xv6加个系统调用,然后让这个系统支持线程...
Lab实现的jOS和xv6有很多设计决策不同,对比它们你可以更好的理解什么是操作系统;当然能自己亲手写一些代码感觉会很不一样(理论怎么转换到实践)
几点体会:
homework也许比Lab更有启发性(我是这么认为的);
如果看过CSAPP就最好了,汇编都不用学了,shell也会写了,memory也了解了。
6.828有个作业提交系统,只要邮箱就能注册了,然后可以互评Lab...
有了一些自己的体验后,然后结合书看也许就完全不一样了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询