绿林网

Linux 内核设计的艺术(第2版)的读后感大全

Linux 内核设计的艺术(第2版)的读后感大全

《Linux 内核设计的艺术(第2版)》是一本由新设计团队著作,机械工业出版社出版的平装图书,本书定价:89.00元,页数:455,特精心收集的读后感,希望对大家能有帮助。

《Linux 内核设计的艺术(第2版)》读后感(一):本书还需要改进的地方

1. 这本书的文字表述真心不取恭维,整本书处处都可见到类似于下面稚嫩的文字。

我摘抄312 页7.3节的其中一段:

“ 它们即是正确性的基础,又是让数据在缓冲区中停留的时间尽可能长的基础”

2. 章节缺少综合性的说明部分,一开始就陷入细节之中。有的章节虽然有,但也不够清楚。

《Linux 内核设计的艺术(第2版)》读后感(二):终于看到国内还能写出这么高端的书

从图书馆借来,刚翻了3~5页,我就决定再买一本收藏。

代码的展示,图画的描述,对自身的提高很有帮助。

有些东西是软能力,如操作系统,编译原理,计算机体系结构,部分的算法,不会这些也可以是主管喜欢的勤奋的程序员。

但是如书中所说,读完此本书,你会进入那%1

看完继续写评论。

《Linux 内核设计的艺术(第2版)》读后感(三):本书英文版在美国上市以来,不到一个月就取得在全球销售300余册的佳绩。以下是来自美国Amazon Top 100专家级评论员对本书的专业解读,对想了解和深入阅读这本书的读者朋友应该有帮助。

评论英文原文:

This book has lot of details, I mean lot of details. Linux kernel 0.11 has been dissected and explained in very detailed way in this book,The reason I am giving a 4 star is not because it focuses on 0.11 version which is over 20 years, but I find a lack of security focus on the book. Otherwise this is certainly a stellar book on Operating systems concepts. If you have read Tanenbaum's Operating systems book on MINIX, this will be a very similar treatment. Code has been dissected wonderfully! I cannot imagine the reverse engineering process of understanding the code and making it easy to explain to people.

The book starts with BIOS and how operating systems are bootstrapped. I really liked how the explanations are done - lot of source code, and design diagrams. This is like a design document for the kernel.There are lots of diagrams, yes plenty! File operations, process management, inter process communication, operating system design, buffer management are all explained in great detail. Overall explanations are great and this will be a wonderful asset to any student. Using Linux 0.11 makes it very easy to explain as foundations to operating systems are all same and a student can learn concepts well. As I said earlier, security should be taught from beginning and this is the biggest gap in systems design and how programming is taught. It cannot be an afterthought. It should be taught from beginning like from this book.

For any serious student of computer science, this book will be an invaluable asset.

为了便于国内的读者理解,我们将该评论翻译成了中文:

这本书有很多细节,我的意思是“很多细节”。

在这本书中,用非常详细的方式对Linux0.11的内核进行了剖析和解释。我给一个4星级的原因并不是因为它侧重于一个超过20年的0.11版本,而是认为缺乏对安全的关注。否则,这本书无疑将是操作系统概念上明星级别的著作。如果你已经读过Tanenbaum关于Minix操作系统的书,就会感到似曾相识。

代码已经被精彩的解剖!我无法想象采用逆向工程的方式去理解代码,并且能够以容易接受的方式解释代码。

这本书从BIOS、操作系统如何启动开始讲起,我真的非常喜欢这种有很多源代码和设计图的讲解方式,就像一个内核的设计文档,有许多的图,很充分!文件操作、进程管理、进程间通信、操作系统设计、缓冲区管理都有非常详尽的解释。所有的解释都很好,对任何学生而言都是非常好的材料。使用Linux0.11能够更容易解释所有操作系统实际上相同的基础部分,学生也能够很好的学习这些概念。

正如我刚才所说,安全应该从开始就被讲授,这是目前系统设计和编程教育中最大的缺陷。它不能是一个后来添加的东西。它应该在这本书的开始就被讲授。

对于任何一个计算机学科的、有着严肃态度的学生来说,这本书将是一个无价之宝。

除此之外,本书的中文版在国内也收到了很多开发者和高校老师发来的详细的、中肯定的、高度认可的评价!

《Linux 内核设计的艺术(第2版)》读后感(四):linux内核设计的艺术 读书报告

linux内核设计的艺术 读书报告

Linux操作系统主要分为三个部分来学习:第一部分分析从开机加电到操作系统启动完成并进入怠速状态的整个过程;第二部分讲述操作系统进入系统怠速后,在执行用户程序的过程中,操作系统和用户进程的实际运行过程和状态;第三部分阐述整个Linux操作系统的设计指导思想,是从微观到宏观的回归。

第一部分:

第一章:从开机加电到执行main函数之前的过程

主要分三部分完成:

①启动BIOS(即 基本输入系统),准备实模式下的中断向量表和终端服务程序

计算机的运行是离不开程序的。在开机的瞬间,计算机的内存中(RAM什么程序也没有。软盘里虽然有操作系统程序,但如果要运行软盘中的操作系统,必须将软盘中的操作系统程序加载到内存(RAM)中。那么,BIOS程序又是由谁来执行的呢?就是将CS:IP指向0xFFFF0。

总结:为了兼容,也为了解决启动问题,Intel将所有80x86系列的CPU都设计为加电即进入16位实模式状态运行。同时,将CPU硬件逻辑设计为加电瞬间强行将CS的值置为0xF000、IP的值置为0xFFF0,这样CS:IP就指向0xFFFF0这个地址位置。

BIOS程序被固化在计算机主板上的一块很小的ROM芯片中。当CS:IP指向0xFFFF0这个位子,就意味BIOS开始启动。在启动过程中,BIOS在内存中建立中断向量表和中断服务程序这一工作十分重要。

②从启动盘加载操作系统程序到内存,其加载工作就是利用第一步实现的

现在要执行真正的boot操作了,即把软盘中的操作系统程序加载至内存,为保护模式做准备。Ⅰ-加载第一部分内核代,即引导程序( bootsect):这段BIOS程序所要做的就是“找到软盘”并“加载第一扇区”。Ⅱ-加载第二部分代码setup:bootsec现在的作用就是把第二批和第三批程序陆续加载到内存中,需要规划内存。接下来,bootsect启动程序将它自身,从内存0x07C00处复制至内存0x90000处。下面,bootsect程序就要将setup程序加载到内存中,要借助BIOS提供的int0x13中断向量所指向的中断服务程序来完成。Ⅲ-加载第三部分内核代码-system模块:bootsect借着BIOS中断int 0x13,将240个扇区的system模块加载进内存。读盘工作最终是由0x13对应的终端服务程序完成。

③为执行32位main函数做过渡工作

操作系统要使计算机在32位保护模式下工作。这期间要做大量的重建工作,并且持续工作到操作系统的main函数的执行过程中。Ⅰ-关中断并将system移动到内存地址起始位置0x00000。Ⅱ-设置中断描述符表和全局描述符表。要通过setup程序自身的数据信息对中断描述符表寄存器(IDTR)和全局描述符表寄存器(GDTR)进行初始化设置。Ⅲ-打开A20,实现32位寻址。实模式下,当程序寻址超过0xFFFFF时,CPU将“回滚”至内存地址起始处寻址。Ⅳ-为保护模式下执行head.s做准备,setup程序将对可编程中断控制器8259A进行重新编程。CPU工作方式转变为保护模式,一个重要的特征就是要根据GDT决定后续执行哪里的程序。Ⅴ-head.s开始执行。在执行main函数之前,先要执行三个由汇编代码生成的程序,即bootsect、setup和head。之后才执行由main函数开始的用C语言编写的内核程序。

总结:主要分为两步骤:第一部分为加载操作系统->借助BIOS将bootsect.s文件加载到内存开始,相继加载了setup.s文件和system文件。 第二部分为32位保护、分页模式下的main函数的执行做准备->设置IDT、GDT、页目录表、页表以及机器系统数据,为32位保护、分页模式下的main函数的执行做准备。一切就绪后,跳转到main函数执行入口,开始执行main函数。

第二章:设备环境初始化及激活进程0

完成第一章的操作后就开始可以执行main函数了。对设备环境进行初始化,并且激活第一个进程——进程0

①设置根设备、硬盘

内核首先初始化根设备和硬盘,用bootsect中写入机器系统数据0x901FC(见1.2.3节)的根设备为软盘的信息,设置软盘为根设备,并用起始自0x90080的32字节的机器系统数据的硬盘参数表设置内核中的硬盘信息drive_info。

②规划物理内存格局,设置缓冲区、虚拟盘、主内存

设置缓冲区、虚拟盘、主内存:这样从根本上决定了所有进程使用内存的数量和方式,必然会影响到进程在主机中的运算速度。我们根据内存大小对缓冲区和主内存区的位置和大小进行内存的初步设置。

③设置虚拟盘空间并初始化

需要对外设中的虚拟盘区进行设置。检查makefile文件中“虚拟盘使用标志”是否设置,以此确定本系统是否使用了虚拟盘。调用rd_init()函数,开始对虚拟盘进行设置,最后将虚拟盘区的长度值返回。返回值将用来重新设置主内存区的起始位置。

④内存管理结构mem_map初始化

第3步标志主内存区和缓冲区的位置和大小全都确定了,于是系统开始调用mem_init()函数。先对主内存区的管理结构进行设置,系统通过mem_map[]对1 MB以上的内存分页进行管理,记录一个页面的使用次数。

⑤异常处理类中断服务程序挂接

不论是用户进程还是系统内核都要经常使用中断或遇到很多异常情况需要处理。trap_init()函数将中断、异常处理的服务程序与IDT进行挂接,逐步重建中断服务体系,支持内核、进程在主机中的运算。IDT中的第一项除零错误中断描述符初始化完毕,其余异常处理服务程序的中断描述符初始化过程都差不多。

⑥初始化块设备请求项结构

进程要想与块设备进行沟通,必须经过主机内存中的缓冲区。请求项管理结构request[32]就是操作系统管理缓冲区中的缓冲块与块设备上逻辑块之间读写关系的数据结构。request[32]是一个由数组构成的链表;request[i].dev=-1说明了这个请求项还没有具体对应哪个设备,request[i].next=NULL说明这时还没有形成请求项队列。

⑦与建立人机交互界面相关的外设的中断服务程序挂接

Linus设计了tty_init()函数,内容就是初始化字符设备。字符设备的初始化主要是对串行口、显示器、键盘进行初始化设置,以及与此相关的中断服务程序与IDT挂接。在tty_init()函数中,先调用rs_init()函数来设置串行口,再调用con_init()函数来设置显示器。

⑧开机启动时间设置

开机启动时间是大部分与时间相关的计算的基础。具体执行步骤:CMOS是主板上的一个小存储芯片,系统通过调用time_init()函数,先对它上面记录的时间数据进行采集,提取不同等级的时间要素,比如秒、分、年等,然后对这些要素进行整合,并最终得出开机启动时间(startup_time)。

⑨初始化进程0

进程0是Linux操作系统中运行的第一个进程。步骤包含:系统先初始化进程0,要求进程0具备参与多进程轮询和处理系统调用的能力。这些都是在sched_init()函数中实现的。

⑩初始化缓冲区管理结构,初始化硬盘、软盘

缓冲区是内存与外设(如硬盘,以后以硬盘为例)进行数据交互的媒介。操作系统通过hash_table[NR_HASH]、buffer_head双向环链表组成的复杂的哈希表管理缓冲区。操作系统通过调用buffer_init()函数对缓冲区进行设置。

总结:开始执行以main()函数为代表的用C语言编写的操作系统内核代码,内容涉及硬件初始化、为内核及进程的正确运行所做的初始化、激活进程0。

第三章:进程1的创建及执行

①进程1的创建

Ⅰ-进程0创建进程:是由父进程调用fork函数来实现的。Ⅱ-在task[64]中为进程1申请一个空闲位置并获取进程号:开始执行sys_fork()。Ⅲ-调用copy_process函数:进入copy_process()函数后,调用get_free_page()函数,在主内存申请一个空闲页面并清零,用于进程1的task_struct及内核栈。Ⅳ-设置进程1的分页管理:在进程1的线性地址空间中设置代码段、数据段,为进程1创建第一个页表并设置对应的页目录项。Ⅴ-进程1共享进程0的文件:返回copy_process()函数中继续调整。虽然进程0中这些数值还都是空的,进程0只具备在主机中正常运算的能力。Ⅵ-设置进程1在GDT中的表项:把进程1的TSS和LDT,挂接在GDT中。Ⅶ-进程1处于就绪态:将进程1的状态设置为就绪态,使它可以参加进程调度,最后返回进程号1。

②内核第一次做进程调度

现在执行的是进程0的代码。从这里开始,进程0准备切换到进程1去执行:允许进程运行的时间结束和进程的运行停止时可以产生进程切换。首先依据task[64]这个结构,第一次遍历所有进程,只要地址指针不为空,就要针对它们的“报警定时值alarm”以及“信号位图signal”进行处理。第二次遍历所有进程,比较进程的状态和时间片,找出处在就绪态且counter最大的进程。

③轮转到进程1执行

Ⅰ-进程1为安装硬盘文件系统做准备:及sys_setup()的大部分代码,包括从函数开始到调用rd_load()之前的所有代码。Ⅱ-进程1格式化虚拟盘并更换根设备为虚拟盘:格式化所用的信息就在boot操作系统的软盘上。进程1调用rd_load()函数,用软盘上256以后扇区中的信息“格式化”虚拟盘,使之成为一个块设备。Ⅲ-进程1在根设备上加载根文件系统:操作系统中的文件系统可以大致分成两部分;一部分在操作系统内核中,另一部分在硬盘、软盘、虚拟盘中。

总结:讲解了进程0创建进程1的全过程。后续所有进程的创建过程与这个过程基本相同;作系统启动以来内核做的第一次进程调度,内容涉及了进程调度的很多代码,为更深入地理解进程调度起到了很好的铺垫作用;作系统启动以来内核做的第一次进程调度,内容涉及了进程调度的很多代码,为更深入地理解进程调度起到了很好的铺垫作用。

第四章:进程2的创建及执行

①打开终端设备文件及复制文件句柄

Ⅰ-打开标准输入设备文件:通过调用open()函数来打开标准输入设备文件,open()函数执行后产生软中断,并最终映射到内核中sys_open()函数去执行。Ⅱ-打开标准输出、标准错误输出设备文件:open()函数返回后,进程1在tty0文件已经被打开的基础上,通过调用dup()函数,复制文件句柄,一共复制了两次。

②进程1创建进程2并切换到进程2执行

进程1将调用fork()函数,创建进程2。调用find_empty_process()函数,为进程2寻找空闲的task,之后调用copy_process()函数,复制进程。进程2创建完毕后,fork()函数返回,返回值为2。

③加载shell程序

Ⅰ-关闭标准输入设备文件,打开rc文件:在确定if(!(pid=fork()))这条语句中条件为真后,调用close()函数来关闭标准输入设备文件,并用rc文件替换它。Ⅱ-检测shell文件:检测i节点属性,检测文件头属性,对文件头的信息进行检测,以此进一步确定shell文件的内容是否符合载入的规定。Ⅲ-为shell程序的执行做准备:加载参数和环境变量,调整进程2的管理结构。Ⅳ-执行shell程序:执行shell引导加载第一页程序,检测文件头属性,映射加载页的物理地址与线性地址。

④系统实现怠速

Ⅰ-创建update进程,切换到shell进程执行,重建shell。

总结:详细讲解了进程1创建进程2、加载shell程序、创建update进程、重建shell、实现系统怠速的全过程。

第五章:文件操作

①安装文件系统

将硬盘上的超级块读取出来,并载入系统中的super_block[8]中;将虚拟盘上指定的i节点读出,并将此i节点加载到系统中的inode_table[32]中;将硬盘上的超级块挂接到inode_table[32]中指定的i节点上。

②打开文件

打开文件,在操作系统中就是确定进程操作哪个文件。这个确定过程由两件事构成:将用户进程task_struct中的*filp[20]与内核中的file_table[64]进行挂接;将用户进程需要打开的文件对应的i节点在file_table[64]中进行登记。

③读文件

确定数据块在外设中的位置,read()函数最终映射到sys_read()系统调用函数去执行;调用bread()函数,将数据块读入缓冲块;将缓冲块中的数据复制到进程空间。

④新建文件

即根据用户进程要求,创建一个文件系统中不存在的文件。新建文件由creat()函数实现。

Ⅰ-查找文件:creat()函数最终映射到sys_creat()函数中,新建文件和打开文件的代码类似,所以进入sys_creat()函数后,直接调用sys_open()函数来新建文件。Ⅱ-用new_inode()函数执行新建i节点的任务。Ⅲ-调用add_entry()函数来新建目录项。

⑤写文件

进程空间的数据先要写入缓冲区中,然后操作系统在适当的条件下,将缓冲区中的数据同步到外设上。Ⅰ-确定文件的写入位置:write()函数最终映射到sys_write()函数中去执行。先对参数的合理性进行检查,之后调用file_write()函数写文件。Ⅱ-申请缓冲块:调用bread()函数。Ⅲ-将指定的数据从进程空间复制到缓冲块。Ⅳ-数据同步到外设的方法:sync()函数映射到sys_sync()系统调用函数去执行;由getblk()函数完成。

⑥修改文件

Ⅰ-重定位文件的当前操作指针:用户进程调用lseek()函数,将文件的当前操作指针f_pos进行重新定位,最终映射到sys_lseek()函数去执行。Ⅱ-修改文件:sys_write()函数和sys_lseek()函数联合使用,把数据插入hello.txt文件中。

⑦关闭文件

关闭文件对应的是打开文件,是在close()函数中完成的。

Ⅰ-当前进程的filp与file_table[64]脱钩:close()函数最终映射到sys_close()系统调用函数去执行。Ⅱ-文件i节点被释放:先要对i节点的各类属性进行检查,然后,递减i节点的i_count,使i节点的引用计数变为0。

⑧删除文件

删除文件对应的是新建文件,即所有进程都无法访问到hello.txt这个文件。

Ⅰ-对文件的删除条件进行检查。Ⅱ-进行具体的删除工作:调用truncate()函数,根据文件i节点中i_zone[9]释放文件在外设上的所有逻辑块。

第六章:用户进程与内存管理

①线性地址的保护

Ⅰ-进程线性地址空间的格局。Ⅱ-段基址、段限长、GDT、LDT、特权级。

②分页

Ⅰ-线性地址映射到物理地址。Ⅱ-进程执行时分页:只能从空闲页面中分配新页面,不能分配其他进程正在使用的页面。Ⅲ-进程共享页面。Ⅳ-进入保护模式后,内核先给自己分页。

③一个用户进程从创建到退出的完整过程

Ⅰ-创建str1进程:需要做准备,为str1进程管理结构找到存储空间,Shell进程给str1进程复制task_struct结构。Ⅱ-str1进程加载的准备工作。Ⅲ-str1进程的运行、加载。Ⅳ-str1进程的退出。

④多个用户进程同时运行

Ⅰ-进程调度。Ⅱ-页写保护。

总结:详细讲解了线性地址、分页、进程调度以及一个用户进程从创建到退出的完整过程和同时运行多个用户进程。其中最难理解的是线性地址的部分。

第七章:缓冲区和多进程操作文件

①缓冲区的作用

形成所有块设备数据的统一集散地,操作系统的设计更方便、更灵活;对块设备的文件操作运行效率更高。

②缓冲区的总体结构

Ⅰ-buffer_head:主要负责进程与缓冲区中的缓冲块的数据交互。Ⅱ-request主要负责缓冲区中的数据与块设备之间的数据交互。

③b_dev、b_blocknr及request的作用

Ⅰ-保证进程与缓冲块数据交互的正确性。Ⅱ-让数据在缓冲区中停留的时间尽可能长

④uptodate和dirt的作用

Ⅰ-b_uptodate和b_dirt这两个字段,保证缓冲区数据与硬盘数据块数据的正确性。Ⅱ-i_uptodate、i_dirt和s_dirt作用是共享文件i节点信息。

⑤count、lock、wait、request的作用

i_count这一字段来标识该i节点项被多少进程共享了。如果没被共享,则i_count就是0,就可以被当做空闲项。*b_wait解决了记录问题。

总结:详细讲解了缓冲区的作用及整体架构,全面分析了b_dev、b_blocknr、uptodate、dirt……的作用,并以两个实例详细讲解了进程等待队列及多进程操作文件。

第八章:管道机制

Ⅰ-管道机制:体现对进程的保护,在不跨越进程边界的前提下实现进程间通信。Ⅱ-信号机制-为进程提供的一套“局部的类中断机制”。

第九章:操作系统的设计指导思想

①运行一个最简单的程序,看操作系统为程序运行做了哪些工作

②操作系统的设计指导思想——主奴机制

③实现主奴机制的三种关键技术:保护和分页,特权级,中断。

④建立主奴机制的决定性因素——先机

⑤软件和硬件的关系 ⑥父子进程共享页面

⑦操作系统的全局中断与进程的局部中断——信号

本文由作者上传并发布(或网友转载),绿林网仅提供信息发布平台。文章仅代表作者个人观点,未经作者许可,不可转载。
点击查看全文
相关推荐
热门推荐