最新Linux复习大汇总
- 格式:doc
- 大小:201.00 KB
- 文档页数:19
__________________________________________________
收集于网络,如有侵权请联系管理员删除
第一章 概述
1、什么是POSIX标准,为什么现代造作系统的设计必须遵循POSIX标准?
答:POSIX表示可移植操作系统接口(Portable Operating System Interface)。
POSIX是在Unix标准化过程中出现的产物。
POSIX 1003.1标准定义了一个最小的Unix操作系统接口。
任何操作系统只有符合这一标准,才有可能运行Unix程序。
2、什么是GNU?Linux与GNU有什么关系?
答:GNU是GNU Is Not Unix的递归缩写,是自由软件基金会的一个项目。
GNU项目产品包括emacs编辑器、著名的GNU C和Gcc编译器等,这些软件叫做GNU
软件。
GNU软件和派生工作均适用GNU通用公共许可证,即GPL(General Public License)。
Linux的开发使用了众多的GUN工具。
3、Linux系统由哪些部分组成?Linux内核处于什么位置?
答:(1)符合POSIX标准的操作系统内核、Shell和外围工具。(2)C语言编译器和其他开发工
具及函数库。(3)X Window窗口系统。(4)各种应用软件,包括字处理软件、图象处理软件等。
Linux内核是所有Linux 发布版本的核心。
第二章 内存寻址
1、在80x86的寄存器中,哪些寄存器供一般用户使用?哪些寄存器只能被操作系统使用?
答:通用寄存器EAX,EBX,ECX,EDX,EBP(基址指针),ESP(堆栈指针),ESI(扩展源指
针),EDI(扩展目的指针),还有EFLAGS(标志寄存器).
专供操作系统使用的寄存器:IDTR中断描述符寄存器,GDTR全局描述符表寄存器,LDTR
局部描述符表寄存器,TaskRegisters任务寄存器,DebugRegister调试寄存器,ControlRegister
控制寄存器,Model-SpecificRegisters模型专用寄存器。
3、请用C语言描述段描述符表。
答:#include
#include
#define BASE_H 0xff00
#define BASE_M 0x00ff
#define BASE_L 0xffff
#define LIMIT_H 0x000f
__________________________________________________
收集于网络,如有侵权请联系管理员删除
#define LIMIT_L 0xffff
#define GRANULARITY 0x0080
#define SEGMENT_P 0x8000
#define SYSTEM_TYPE 0x1000
#define DPL 0x6000
#define TYPE_E 0x0800
#define TYPE_ED_C 0x0400
#define TYPE_RW 0x0200
#define TYPE_A 0x0100
struct {
unsigned char base_high;
unsigned char g : 1;
unsigned char other : 3;
unsigned char limit_high : 4;
unsigned char P : 1;
unsigned char dpl : 2;
unsigned char S : 1;
unsigned char E : 1;
unsigned char ED_C : 1;
unsigned char RW : 1;
unsigned char A : 1;
unsigned char base_middle;
unsigned short base_low;
unsigned short limit_low;
} gdt_t;
int main(int argc, char *argv[])
{
// int gdt[4] = {0x0fff, 0x0000, 0x9a00, 0x00c0} ; // 0x08
// int gdt[4] = {0x7fff, 0x0000, 0x9a01, 0x00c0} ; // 0x10
// int gdt[4] = {0x0002, 0x8000, 0x920b, 0x00c0} ; // display memory
__________________________________________________
收集于网络,如有侵权请联系管理员删除
// int gdt[4] = {0xffff, 0xffff, 0xffff, 0xffff} ; // test
int gdt[4] = {0x03ff, 0x0000, 0xf201, 0x00c0} ; // ldt0
unsigned int base, limit;
unsigned int granularity;
unsigned int present, dpl, system_type, segment_type;
unsigned int type_e, type_ed_c, type_rw, type_a;
base = (gdt[3] & BASE_H) << 16;
base += (gdt[2] & BASE_M) << 16;
base += gdt[1] & BASE_L << 0;
limit = (gdt[0] & LIMIT_L) << 0;
limit += (gdt[3] & LIMIT_H) << 16;
granularity = (gdt[3] & GRANULARITY) >> 7;
present = (gdt[2] & SEGMENT_P) >> 15;
dpl = (gdt[2] & DPL) >> 13;
system_type = (gdt[2] & SYSTEM_TYPE) >> 12;
type_e = (gdt[2] & TYPE_E) >> 11;
type_ed_c = (gdt[2] & TYPE_ED_C) >> 10;
type_rw = (gdt[2] & TYPE_RW) >> 9;
type_a = (gdt[2] & TYPE_A) >> 8;
printf("base\t\t0x%x\t%d\n", base, base);
printf("limit\t\t0x%x\t%d\n", limit, limit);
printf("\n");
printf("G\t\t%d\t(0=bype, 1=4KB)\n", granularity);
printf("\n");
printf("P\t\t%d\n", present);
printf("DPL\t\t%d\n", dpl);
printf("S\t\t%d\t(0=system, 1=code or data)\n", system_type);
printf("TYPE_E\t\t%x\n", type_e);
printf("TYPE_ED_C\t%x\n", type_ed_c);
printf("TYPE_RW\t\t%x\n", type_rw);
__________________________________________________
收集于网络,如有侵权请联系管理员删除
printf("TYPE_A\t\t%x\n", type_a);
printf("\n");
printf("E=0, data segment\n");
printf("ED=0, data segment\n");
printf("ED=1, stack segment\n");
printf("W=0, not writable\n");
printf("W=1, writable\n");
printf("\n");
printf("E=1, code segment\n");
printf("C=0, ingore privilege\n");
printf("C=1, use privilege\n");
printf("R=0, not readable\n");
printf("R=1, readable\n");
return EXIT_SUCCESS;
}
4、Linux是如何利用段机制又巧妙的绕过段机制的?在内核代码中如何表示各种段,查找
最新源代码并进行阅读和分析。
答:IA32规定段机制是不可禁止的,因此不可能绕过它直接给出线性地址空间的地址。万
般无奈之下,Linux的设计人员干脆让段的基地址为0,而段的界限为4GB,这时任意给出
一个偏移量,则等式为“0+偏移量=线性地址”,也就是说“偏移量=线性地址”。另外由于段
机制规定“偏移量 < 4GB”,所以偏移量的范围为0H~FFFFFFFFH,这恰好是线性地址空间
范围,也就是说虚拟地址直接映射到了线性地址,我们以后所提到的虚拟地址和线性地址指
的也就是同一地址。看来,Linux在没有回避段机制的情况下巧妙地把段机制给绕过去了。
另外,由于IA32段机制还规定,必须为代码段和数据段创建不同的段,所以Linux必
须为代码段和数据段分别创建一个基地址为0,段界限为4GB的段描述符。不仅如此,由
于Linux内核运行在特权级0,而用户程序运行在特权级别3,根据IA32的段保护机制规定,
特权级3的程序是无法访问特权级为0的段的,所以Linux必须为内核和用户程序分别创建
其代码段和数据段。这就意味着Linux必须创建4个段描述符——特权级0的代码段和数据
段,特权级3的代码段和数据段。
5、为什么在设计两级页表的线性地址结构时,给页目录和页表各分配10位?如果不是这