linux内核题,《Linux内核完全注释》部分习题答案

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

=====================

第3章 内核引导和启动过程

2.为什么不直接将system模块搬到0x00000处而是先搬到0x10000处,再搬到0x00000处呢?

在机器开机上电时,ROM BIOS将bootsect代码加载到内存的固定位置0x7c00处,bootsect又把自己移动到了0x90000处,同时把setup.s代码和 system模块分别加载到0x90200和0x10000处。对于本书所讨论的Linux内核,system模块的大小不超过512KB。由于在即将执行的setup代码中还需要使用BIOS的功能,因此若直接将system模块加载到0x00000处就会覆盖掉BIOS设置的中断向量区域(0x0000-0x0400)。

3.setup.s和head.s中都设置了一次GDT和IDT,这是为何,可否只在head.s做一次设置?

第一次设置是为了head.s能首次运行在32位保护模式下。GDT临时在setup.s中,也即0x902xx左右的地方,这个地方将被用于缓冲区。而内核是在靠近物理内存0x0处的,因此必须重新设置。

4.不用as86,用gas来编译bootsect可以么?为什么Linus当时要使用as86汇编器?

可以。bootsect需要是16位的实模式程序。目前gas汇编器也支持16位的编译。Linus当时是在MINIX系统上开发Linux的,最初MINIX系统上还没有移植gas程序,因此Linus就使用了MINIX系统上的as86。

5.根据setup.s和head.s程序中的使用方法,请详细说明Intel 32位保护模式的运行机制。它与实模式下的寻址方式有和主要区别?

第4章 系统初始化

1.在setup.s代码执行完之后,head.s及system被移到了0x00000~0x800000处,那么PC开机时0x0000~0x0400处及之后的一些参数不是也被覆盖了吗?内核以后是怎么设置的?

Linux 在这之后就完全不用PC自己的中断程序,而纯粹自己作中断程序了。在head.s中的78行(setup_idt)开始,首先在232行的_idt处设置了256个亚中断向量,指向一个只显示"Unknown interrupt"的中断处理程序。然后会在init的main()中各个硬件的初始化函数中一个一个地分别设置所用到的实际中断向量。

2.请简述Linux内核的整个初始化过程。

系统初始化时,sched_init() 程序启动了系统的空闲任务0,同时派生了任务1,此时,系统中有两个进程(task 0 and task 1),假设从此时开始,系统没有接收到任何中断(包括系统的定时时钟中断或外部硬件中断以及软件的系统调用产生的中断),那么系统中将永远只包含着这两个进程,但是实际中,时钟中断周期的检查有没有新任务就绪,或者硬件中断包括系统调用使系统调度执行来检查系统的新任务,如果有新任务就绪,执行新任务。系统的其它部分,都是为这些任务的执行提供服务。

系统中各进程的执行基本上是由于进程请求等待想要的资源而自动情愿地放弃CPU去睡眠,另一种就是时钟中断把用完时间片的进程对CPU的使用权剥夺,不情愿地放弃CPU。

3.详细说明_syscall0(int,fork)嵌入函数的使用方法。在程序中调用该函数的实际语句是怎样的?请具体写出来。

第5章 进程调度与系统调用

1.请问硬盘中断怎么产生的?系统调用read、write等都是产生请求,并将请求插入请求队列,在中断时由中断处理函数遍历请求队列完程读写,那么请问最初的硬盘的中断是由谁、如何激发的呢?

参见6.6.1功能描述和图6.1

2.copy_process的参数有17个,从右往左分别是:ss,esp,eflags,cs,eip,ds,es,fs,edx,ecs,ebx,none,gs,esi,edi,ebp,nr。请问其中的那个none对应的是堆栈中的什么内容?简单说明原因。

3.在do_signal()函数中的104行语句是:*(&eip) = sa_hangler;这条语句不就是等价与eip = sa_handler;吗?Linus为什么会这样表达?

这里主要是牵涉到变量类型匹配的问题。因为这两个变量的类型不一样。

4.在head.s中执行 lss _stack_start,%esp,此时ss是什么内容?(提示:参考sched.c,第69行)。

ss=0x10,也即内核段选择符。参见sched.c,69行。此时ss=ds。

5.在中断程序里,段描述符寄存器的值被改掉了,那请问是在什么时候改的呢?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux Linux最早是Linus Torvalds在1991年开始设计开发的, 当时他正是赫尔辛基大学计算机系的学生,刚开始他是在Minix环境下写了一个处理多任务切换的程序,用他自己的话来描述这个程序,Minix是linux的父亲。1991年的夏季,也就是他购买了第一台PC机之后6个月,Linus觉得他还需要从网上下载某些文件,为此他必须读写某个磁盘。于是他又不得不写一个磁盘驱动程序,然后是一个文件系统。而一旦你有了任务切换器、文件系统和设备驱动程序之后,你当然就拥有了一个操作系统,或者至少是它的一个内核linux也就这样诞生了。 多任务 计算机在同一时刻运行多个应用程序的能力。 2.多用户 计算机在同一时刻被多个用户访问的能力。如网络上的服务器必须是多用户的。因为网络上的服务器需要能够同时接受多个用户的同时访问。多用户操作系统最主要的特点是:同一时刻不同的用户访问。4.保护模式在linux下应用软件无法访问系统分配的内存以外的内存区域。如此,一个软件的错误不会造成整个系统的瘫痪。5.POSIX表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX 是为了读音更像UNIX)。6.SYSV和BSD扩展 可以理解为和SYSV和BSD源代码级的兼容。简单一点,就是Linux下的应用程序同时也能在这两个系统上运行。 linux具有对多种语言如:C、C++、Java、Tcl/tk、Perl等很多语言的编译器/解释器,以及集成开发环境、调试和其它开发工具。以前,我们一直对windows平台下如VB VC软件开发的高效和便捷津津乐道,也是windows对linux围剿的利器。可是现在一切都改变了,因为有了Borland公司的Kylix。提起borland公司,在业界几乎是无人不知无人不晓,Borland公司一向以高性能、高效率的应用程序开发工具而着称,最著名的是DOS平台上的Turbo C、Borland C++,Windows平台上的Delphi、C++Build和Java开发工具。以上这些产品都称得上是经典之作,尤其是以面向对象的Pascal为基础的Delphi,更是经典中的经典,C++Bulid也是脍炙人口。Kylix就提供了linux版的Delphi和C++Bulid。这两个版本被认为是linux平台上第一个RAD(Rapid Application Development,快速应用软件开发工具)开发工具。 光有内核还不能构成一个完整的操作系统,于是一些组织或公司将内核与一些应用程序包装起来就构成了一个完整的操作系统,这就是发行套件,不同的公司或组织的发行套件各不相同,版本号也不相同,尽管它们使用了同一版本号的内核。现在的发行公司很多,如:我们常听说的RedHat,中软,红旗。 虽说Linux还无法与拥有一亿多用户的Windows相比,但是它确立自身地位和影响力所花费的时间却只有Windows的一半。作为一种Unix操作系统,Linux的强大性能显然使得其它品牌的Unix黯然失色。有分析家认为,“Linux的广泛普及使其成为Unix市场上最具活力的一只新军。”甚至连Unix之父Dennis Ritchie也认为Linux“确实不错”。有一些分析家甚至认为,在未来数年间,Linux将成为NT真正强有对手,也是唯一可以冲破微软垄断性文化圈的出路所在。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值