曾几何时,我们为调试成功第一段汇编小程序而欢欣鼓舞,为写完C语言小程序通宵达旦,为自己的数据结构解决了一个实际问题而踌躇满志。再后来我们学习了计算机组成原理或者高级点的计算机系统结构,学习过操作系统的实现和设计,看过算法导论...但好像一切又渐渐变得遥远了,虽然书本上的一切也都感觉上能理解,但总是朦朦胧胧觉得缺少点什么,或许是觉得所有的知识都是断断续续的,感觉很多知识是无本之源。但这本书拂去了一切挡在眼前的薄薄尘埃,让我看见所有的一切都在这里完美结合了,有如灵魂和肉体的结合,一切都富有活力起来。汇编、数据结构、算法、操作系统理论、计算机系统结构、C语言、编译器等等好像都在这里闪动着五颜六色的极富魅力的小光线,我揉了揉干涩的眼睛,渐渐地,我看清了它们组成的光芒照耀着的是操作系统...

看的是影印版,本书特点:

1.也是最大的特点,用足够多的汇编来介绍操作系统的一些功能如启动、切换、同步、中断。汇编(不是DOS下的汇编)是了解操作系统跳不过去的坎,有了至少一种CPU汇编的理解,其实相当于理解了相应CPU的架构,这才算真正的开始了解操作系统。这本书是汇编和Linux操作系统的桥梁。

2.对编译操作系统需要的编译选项也做了不少铺垫,真的算体贴入微了。

3. 有如外科手术刀,提供了很好的几个断面来了解Linux。即使这么复杂的系统,也能这样娓娓道来,非常不容易。 循序渐进、深入浅出,书中出现的未知内容或者重要概念一般会提示你在哪里查找。

本书是我看过花费时间最长的书,总结原因如下:

1. 知识量大:操作系统本身概念多、难点多、平时接触少。

2. 细节太多:本书主要从下至上的形式讲解,一开始就有太多的细节(汇编、数据结构、函数),需要熟读几遍的基础上才有可能再从上到下的方法进行总结,知道了重点和纽带,思路才变得慢慢清晰起来。遗忘和迷失方向是经常的,每次学习也带来新的自我提问。查看相关代码的数据结构、函数、相互引用、书本内容的确认需要很多时间。另外Linux 2.6是个实际运行系统,太多的错误处理、接口、参数和扩展等,使得源码变得更加晦涩难懂。

3. 内容交织:书中几乎每一章与其他章节都联系紧密。仅仅一个函数,可能引用了书中很多其他章节或操作系统的许多概念,变得非常难以理解(如Page Fault Exception Handler(P376)),因此你根本无法仅依赖熟读某一章里面就完全了解这一章内容,而且几乎每一章都包含一些后面章节未介绍的概念,很多时候觉得有点无处下手。每个功能的区别可能用一个位来表示,变得非常隐晦,很难记住这么多。操作系统的概念介绍一般包括功能、实现方式、数据结构、相关函数(算法)、汇编实现、全局变量、初始化、正常关闭等。同时每个概念的实现中还可能包括系统调用、特殊文件目录(/proc或/sys)、shell命令、系统初始化(start_kernel下的函数)、权限、资源、中断、信号、编译选项、统计等。因此也积累了无限的可能,这也许操作系统难学的原因吧。操作系统的复杂也许来自于层次性和不可分割性。

看了本书的体会:

1. linux操作系统让数据结构、算法、计算机系统结构、汇编、驱动、有了驰骋的疆场。操作系统的设计理念得到实现或试验,而不是仅仅停留在白纸上。

2. 问题的思考层次,编程中出现的问题能尝试从多层次出发进行考虑,如CPU指令/操作系统实现(包括模块和驱动)/系统函数接口/C函数接口/应用系统,理解操作系统在其中能起到的桥梁作用,同时兼顾编译器的帮助。

3. 这本书打开了无数扇窗,每一扇风景都等着你去发现。这本书只是认识Linux操作系统的开始,这本书理论为主,实战少。但是经过这本书磨练,实际工作中的碰到的操作系统中大部分的概念,你都可以自己在源码中得到证实,而不是“好像觉得","牛人说","书上说"。

4. 对windows操作系统也会有新的认识,并且尝试重新认识数据库、java虚拟机等。

本书的重点总结:

1. 汇编 head.S entry.S 与启动、切换、中断、系统调用等相关

2. 内存管理(P35,P294)

3. 程序切换和调度(P102, P290)

4. ext2文件读(写)过程:结构图(P561) 理解每一层的做什么

5. 各个层的缓存、各种缓存技术(LRU,cache, hot/cold page…),,以及页面回收算法RFPA

6. exec过程(P828):

ext2文件读(写)过程:结构图(P561) 理解每一层的做什么

read(P508)                                                  【层:User Mode】

-->sys_read-->vfs_read-->file->f_op->read()                 【层:VFS】

---->generic_file_read(P632)                                【层:Disk File(Block Device File)】

------>do_generic_file_read(p635)-->do_generic_mapping_read 【层:Page Cache (inode)】

-------->ext2_read_page(P638)-->mpage_readpage()            【层:ext2】

---------->submit_bio()-->generic_make_request(P570)        【层:Generic Block Layer】

------------>__make_request -->q->add_request()             【层:I/O Scheduler】

相关request在I/O Scheduler队列中的 q->request_fn函数(即do_hd_request)调用:

do_hd_request(以HD.c为例)                                 【层:Block Device Driver 取队列,发起读请求】

-->elv_next_request(),

-->hd_request()

read_intr()                                               【层:Block Device Driver中断,读数据,从队列中删除,再发起请求】

-->end_request()

---->end_that_request_first()

---->blkdev_dequeue_request()

---->end_that_request_last()

共享内存(P801)、文件映射(P657)、直接文件读写的区别

a. 共享内存的缺页:

do_no_page (预先在mmap()-->shmem_zero_setup设置shmem_nopage )

-->vma->vm_ops->nopage

-->shmem_nopage

---->shmem_getpage

------>find_lock_page

------>shmem_alloc_page

------>add_to_page_cache_lru

b. 文件映射的缺页:

do_no_page(预先在mmap-->file->f_op->mmap设置filemap_nopage)

-->vma->vm_ops->nopage

-->filemap_nopage

---->find_get_page

---->mapping->a_ops->readpage(一般为ext2_aops.read)

---->ext2_readpage 函数直接读写 ext2文件系统,inode缓存由前面的步骤建立了。

c. 文件映射和直接读写文件相同点:

i. 都调用ext2_readpage函数,则ext2层以下完全相同

ii. 都采用inode的Page Cache,由直接文件读写的do_generic_file_read和文件映射的filemap_nopage分别建立

iii. 都可能尝试磁盘的预读。

d. 文件映射和直接文件读写不同点:

直接读文件,修改后并写入文件:数据需要从内核态-->用户态复制一次,再从用户态-->内核态复制一次,还可能需要两次高端映射。

相关参考书目:

gcc 文档

附:

不过就在昨天,我觉得自己是个碎片,在生命的苍穹中毫无节奏地颤动。

如今我知道自己就是苍穹,一切生命都是节奏分明的碎片,在我内在活动。.....纪伯伦

因为要懂得指针,深入学习C就是在学习指针。

要构架知识,汇编还不是一般的8086的,要32位的,具体的要求比楼主的高多了,具体要求的课程有:

C语言(精通指针),数据结构,汇编语言(32位),intel知识构架,最好读intel的程序开发员手册第三卷,可以到intel网站申请寄过来(免费),计算机组成原理。大概就这样。

linux内核深度解析 豆瓣,来着豆瓣经典点评《深入理解linux内核相关推荐

  1. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一第1章 C语言与内存1.1 引言...

    本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第1章,第1.1节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"华章计算机&quo ...

  2. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.4 位运算构建特定二进制数...

    本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第2章,第2.4节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"异步社区" ...

  3. 嵌入式Linux与物联网软件开发:C语言内核深度解析

    嵌入式Linux与物联网软件开发:C语言内核深度解析     1.C语言与内存         1.引言         2.计算机程序运行的目的         3.位.半字.字的概念和内存位宽   ...

  4. 嵌入式 Linux 与物联网软件开发 ——C 语言内核深度解析

    C 语言是嵌入式 Linux 领域的主要开发语言. 对于学习嵌入式.单片机.Linux 驱动开发等技术来说,C 语言是必须要过的一关.C 语言学习的特点是入门容易.深入理解难.精通更是难上加难.很多用 ...

  5. 《C语言内核深度解析》——笔记及拓展(1)

    文章是我前几天读了朱有鹏,张先凤老师的<嵌入式Linux与物联网软件开发:C语言内核深度解析>写的,拜读之后,虽没有醍醐灌顶,至少解开了我之前的一些疑惑. <嵌入式Linux与物联网 ...

  6. Linux正则表达式多个条件并,linux 正则表达式深度解析

    简介 大体来讲,正则表达式的文法分为3种标准:BRE.ERE 和 ARE.其中 BER 和 ERE 属于 POSIX 标准,ARE 则是由各家定义的扩展. POSIX 正则表达式 传统上,POSIX ...

  7. linux内核深度解析_十年磨一剑,第一本龙芯平台的Linux内核书来了

    <用"芯"探核:基于龙芯的Linux内核探索解析>是一本基于龙芯平台,结合源代码来探索和解析Linux-5.x内核的书. 市面上解析Linux 内核的经典书籍已有不少, ...

  8. Linux内核深度解析

    本书基于 4.x 版本的 Linux 内核,介绍了 Linux 内核的若干关键子系统的技术原理.本书主要内 容包括内核的引导过程.内核管理和调度进程的技术原理.内核管理虚拟内存和物理内存的技术原 理. ...

  9. Linux内核深度解析epub,Unix内核源码剖析 高清pdf版 含epub+mobi

    本书是一本Unix内核源代码的阅读指南.作者结合UNIX V6已公开的相关文档,对其内核源码进行详细剖析,旨在让读者更深入地理解进程.中断.块I/O系统.文件系统.字符I/O系统.启动系统等操作系统的 ...

最新文章

  1. ibatis查询SQL语句返回一个对象,此对象包含一个List属性
  2. android 得到毫秒时间戳,android – Location.getTime()总是返回没有毫秒的时间戳
  3. RabbitMq org.springframework.amqp.AmqpIOException: java.io.IOException
  4. 代码阅读 | torch.sort函数
  5. 华人的战场——MSU视频编码大赛
  6. 事理图谱概念辨析及其与风险标签分类结合的应用探讨
  7. 设置 ASP.NET 存储当前应用程序的临时文件(生成的源、编译了的程序集等)的目录的物理路径。...
  8. Android开发笔记(十一)自定义视图的构造方法
  9. 怎么从视频文件中提取音频?
  10. 智慧交通前瞻:如何解决城市发展“心病”?
  11. [Swift]LeetCode528. 按权重随机选择 | Random Pick with Weight
  12. java web学习_JavaWeb学习路线
  13. 手机开热点但是电脑一直连接不上_电脑连接不上手机热点解决办法
  14. 网站死链查询检测方法(seo的优化工作全攻略)
  15. STM32F407ZET6+NRF24L01实现一收多发(一发多收)
  16. 如何使用pycharm连接Databricks
  17. Python:dbus监控U盘插拔
  18. OllyDBG 完美教程 ( 超强入门级 1)
  19. “美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)E. 小花梨的数组
  20. SQL语法之 CHECK 约束

热门文章

  1. C++头文件和源文件的关联引用
  2. 腾讯视频下载|腾讯视频播放器下载
  3. 将最小特权原则应用到Windows XP用户帐户
  4. 本地搭建织梦php,dedecms本地安装教程,如何搭建本地环境安装织梦网
  5. checkbox 复选框只选择一个
  6. [译] npm 的经济风云 —— 上半部分
  7. 简析ROF降噪原理及python实现详解
  8. 【180930】WPF蜘蛛纸牌游戏源码
  9. 商标19类明细计算机,商标40类明细(商标19类明细都有什么)
  10. java实现调用短信接口发送短信