1、逻辑地址:虚拟地址
2、线性地址:内存管理自动补全的地址
3、物理地址:真实地址
4、内存分页管理机制---将线性区划分成为4096字节为一页
5、CR3---页目录基地址寄存器
6、linux中指令和数据合用一块内存
7、任务号*64MB 为任务空间的地址
8、可编程中断控制器
9、内联函数-----编译器将子函数放到调用函数中,关键字--inline
10、一个栈结构为一帧ebp 为帧指针 esp为栈指针
11、as86编译器和ld86连接器,专门用于编译连接运行在实地址模式下的16位内核代码
12、bootsect.s内核引导区程序
13、build。c生气build工具,用于去掉bootsect、setup、system中文件的执行头,组成一个image映像
14、Systemp.map 我们把发送到标准输出设备的链接映像信息重定向到一个文件中
15、makefile文件格式 目标 :先决条件
制表符 命令
16、全局描述符表 GDTR
17、中断描述表寄存器 IDTR
18、局部描述符表寄存器 LDTR
19、任务寄存器 TR
20、协处理器----用于浮点运算,图像处理
21、cs 代码段寄存器指向当前段 ss 堆栈段寄存器 eip指向下一条要执行的指令的段内偏移地址
22、在当前代码段中,下一条要执行的指令的地址表示为cs:[eip]
23、ss指向当前代码段 esp指向栈顶 所以栈顶地址是ss:[esp]
24、ds 默认是数据段
25、偏移地址 = 基地址+(变址比例因子)+偏移量
26、地址转换:
逻辑地址---通过分段机制转换到线性地址(也就是说,将代码和数据集中安放,分为数据段、代码段等)---通过分页机制(可选)转换为物理地址
27、段基地址---段在线性地址中的开始地址
28、使用LDT表,可以使每个任务隔离开来,因为寻址是要通过ldt来映射的,其他任务不在表中,所以不会被寻址,只有本任务才可以被寻址
29、GDT采用内存8字节对齐
30、分页机制--对固定大小的块进行处理 4K
31、当前特权级--CPL
32、进程调度模块、内存管理模块、文件系统模块、进程间通信模块、网络接口模块 组成linux内核
33、高速缓冲区在内存1M之后,前1M是内核模块
34、虚拟空间相同,但线性空间不同,因为使用相同的页目录表
35、进入保护模式后,描述表需要重定位 GDTR IDTR
36、任务的线性地址空间其实位置为nr*64MB (linux0.11的核,每个任务64MB的空间)
37、cli禁止中断 sti使能中断
38、系统调用---是linux内核与上层应用程序进行交互通信的唯一接口
39、用户程序直接或间接调用中断0x80(syscalls),并在eax寄存器中指定系统调用功能号,则可以使用硬件资源
携带参数可以一次存放到ebx、ecx、edx
40、C语言嵌入汇编程序
asm("汇编语句"
:输出寄存器
:输入寄存器
:会被修改的寄存器
);
带冒号的行可以省略,“输出寄存器”表示汇编执行完后,存放输出数据的寄存器,“输入寄存器”开始执行代码的时候,指定指定寄存器存放值
实例代码:
funftion(seg,addr)
{
char __res;
__asm ("push %%fs;\
mov %%ax,%%fs;\
movb %%fs:%2,%%al;\
pop %%fs"\
:"=a"(__res)\
:"0"(seg),"m"(*(addr)));
}
代码解析:“=a”表示输出寄存器是eax,执行完后,eax的值将赋给_res,“0”表示这里使用的寄存器和上面输出寄存器的一样,这里面有个寄存器编号问题。编译器规定,标号从输出寄存器的最左边开始,被编号为0,往右和往下将被依次编号。所以这里的“0”表示eax。如果要使用寄存器,如上面的%%fs:%2.通过使用编号2,就可以使用到addr这个变量
41、实时时钟芯片使用的是MC146818
42、只有应用程序寻址到新的空间,才分配物理空间
43、从head。s开始,系统运行在保护模式中
44、每个任务都有两个堆栈--用户态、内核态
45、intel
CPU只想能够堆栈操作的时候是先将堆栈指针递减,得到esp值,然后在将数据存在esp指向的地址
46、ss 段选择符为0x10 为内核LDT数据 段选择符 为0x17 则是用户LDT
47、bootimage
引导启动Image文件,主要保举哦磁盘引导扇区代码,操作系统加载程序和内核执行代码
48、rootimage 提供最基本支持的根文件系统
49、中断处理函数将在trap。c中被调用
50、首先进入0xffff0开始执行代码,这个地址通常是ROM-BIOS地址,执行系统检测,并在物理地址0处初始化中断向量。它将可启动设备的第一扇区(磁盘引导扇区,512个字节)读入绝对地址0x7c00处,并跳转到这里。
也就是说,BIOS是引导作用的,他将启动代码拷到内存中,然后跳转到启动代码中启动系统。前面的代码是8086汇编写的,当它执行的时候,就会将自己移动到内存绝对地址0x90000处(576k),并把启动设备中后2K字节代码读入内存0x90200处。
而内核的其他部分被读到从内存地址0x10000(64K)开始处。
51、段寄存器是因为对内存的分段管理而设置的。16位CPU有四个16位段寄存器,所以,其程序可同时访问四个不同含义的段。
段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。
段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶。
段寄存器DS指向数据段,ES指向附加段,在存取操作数时,二者之一和一个偏移量合并就可得到存储单元的物理地址。该偏移量可以是具体数值、符号地址和指针寄存器的值等之一,具体情况将由指令的寻址方式来决定。
通常,缺省的数据段寄存器是DS,只有一个例外,即:在进行串操作时,其目的地址的段寄存器规定为ES。当然,在一般指令中,我们还可以通过改变前缀中的“段取代”字段来改变操作数的段寄存器。
“可选用的段寄存器”即是可以用强置说明这些段寄存器的值来作为其操作数地址的段地址。
52、head.s文件会生成system模块,位于system模块头部
53、FS寄存器指向当前活动线程的TEB结构(线程结构)
偏移
54、实模式下,ds代表段地址。
保护模式下,ds代表指定段描述符表的表内偏移。所以当前地址为ds+eip
55、系统执行完head.s后将跳到main.c
56、main.c文件首先设置根文件设备号以及一些内存全局变量。这些变量指明主内存的开始地址、系统所用的内存容量
57、告诉缓存还包括显存和ROM BIOS
58、mian.c组合程序工作在任务0
59、mian.c要做的工作----内存管理、中断处理、块设备、字符设备、进程管理、硬盘和软盘的硬件的初始化。
60、写时复制(或COW)。这种思想相当简单:父进程和子进程共享页面而不是复制页面。然而,只要页面被共享,它们就不能被修改。无论父进程和子进程何时试图写一个共享的页面,就产生一个错误,这时内核就把这个页复制到一个新的页面中并标记为可写。原来的页面仍然是写保护的:当其它进程试图写入时,内核检查写进程是否是这个页面的唯一属主;如果是,它把这个页面标记为对这个进程是可写的。
61、这里要说说BCD码和二进制码的区别。BCD码是指将4位二进制数看作一位十进制数,比如10001000 表示的是88
62、访问cmos地址空间(时钟信息内存)要通过端口来读,而不是内存地址总线。0x70地址端口,0x71数据端口
63、控制进程 ---- 会话期首进程
64、一个进程若要访问控制终端,可以直接对/dev/tty文件进行读写操作
64.init进程的主要任务是根据/etc/rc/文件中设置的信息,执行其中设置命令,然后根据/etc/inittab文件中的信息,为每个登录终端设备使用fork创建一个子进程,然后就是getty程序~~~
65、每次登录时都要执行的命令放到。profile,每次运行shell都要执行的命令放到ENV变量指定的文件中
66、虚拟文件系统--------不同文件系统和介质之间执行文件操作、也就是说,介质只是提供一个接口,该接口和虚拟文件系统VFS保持一致,才让我们读取到了文件目录。
67、在linux中 索引节点-----是独立于文件本身的文件信息(大小、时间等)
68、超级块对象-----存储特定文件系统的信息
69、VFS把目录看作文件对待,
70、系统中应用程序调用内核功能是通过中断调用int0x80进行的。寄存器eax放调用号
71、对于硬件中断请求,首先是向中断控制芯片8259A发送结束硬件中断控制字指令EOI,然后调用相应的C函数处理程序
72、Linux内核默认地把段寄存器ds,es用于内核数据段,而fs用于用户数据段。这样就可以进行内核数据与用户数据的复制
73、_booga 下划线是汇编程序在c语言中获得静态全局变量的方法
74、闰年----能被4整除且不能被100整除,或能被400整除
75、根据时间片和优先权
76、在就绪任务表中,根据就绪任务的时间值,选取该值最大的任务。如果所有就绪任务的时间值都为0,则根据优先级重新设置
77、说明一下volatile --- 通常程序申明一个变量时,编译器会尽量把它放到通用寄存器
中以提高访问效率,若程序要改变这个值的话,通用寄存器中的值并不会改变。
78、intel cpu 先操作堆栈指针sp(递减) 再操作指针对应地址。堆栈向上生长
79、对intel8253时钟中断操作------写端口0x43 ,也就是A1,A0为
“11”,时,计数器被写进芯片,0x40-0x42用于选择芯片计数器。注意,先写控制字再写入初始计数值
80、 进程对信号的处理:1、忽略信号 两个信号无法忽略,sigkill sigstop 2、捕获信号 4、执行默认信号
81、对于阻塞的多个同一信号,只会调用一次
82、也就是当发生任务切换时,才检查信号是否存在,若存在,则先调用信号处理函数,再返回用户程序
83、sa_restorer是函数库里面的函数
84、这里要说一下, C函数是传值函数,也就是比如线面的 long eip参数,当调用的时候,C会开辟局部变量 esp,然后,将你
赋的值(不管是变量还是常量)传给了这个局部变量,所以像这种操作是不会影响到外部传入来的变量的、如果我们要改变,那
就需要传指针,或则是使用 *(&temp )
85、C语言是传值函数,使用*(&eip)
86、linux中所有的进程都是进程0的子进程
87、在执行内核代码的时候,用户数据页面的页面保护标志不起作用,80486开始有wp保护标志,保护用户数据
88、每个TSS被保存在任务数据结构task_struct中,TSS中有各状态寄存器和通用寄存器和ldt段选择符
89、GDT只有一个,每个任务都有自己的ldt。ldt地址保存在GDT中,可以用nr来算出
90、IO比特位图,每一位对应1个IO端口
91、一个用户有用户ID和一个用户组ID
92、如果文件的set-user-ID标志置位,那么进程的有效ID就会被设置成文件的宿主用户ID,那么进程就有访问权限
93、操作系统的所有设备可以大致分为两类:块设备和字符型设备
94、块设备 ---
可以以固定大小的数据块为单元进行寻址和访问的设备,例如硬盘和软盘设备
95、字符设备 -----
以字符流为操作对象,不能进行寻址操作,例如打印机设备、网络接口设备、
96、进行IO操作时,要考虑的三个对象:系统、控制器、驱动器
97、文件系统---超级快存放分区的大小和类型等信息
98、文件夹也是一种文件,我们之所以可以打开文件夹,看到里面的东西,是因为文件系统对文件夹的内容进行了解析,最终显示给我们
99、在minix 1.0
文件系统中的第一个盘块是一个引导块,无论是否作为引导盘
100、打开一个文件的时候,文件系统会根据文件名找到其节点号i,从而找到文件所在的磁盘块位置。
101、串口设备的设备号是4、控制台的是5
102、在linux系统中,所有的输入输出都是通过读写文件完成的
103、代码重定位---从代码段开始处计数 。
数据重定位 --- 从数据段开始计算
104、Intel 8086 ,Linux采用分页管理 -----
页目录 页表结构
一个页面为连续的4Kb字节的物理内存
105、寻址时,使用的是段和偏移值构成
106、
107、
108、CPU将造成异常的用于访问的线性地址存放在CR2中
109、asm文件夹下存放的是与计算机体系密切相关的函数声明或数据结构头文件
110、a.out文件结构
执行头
代码段
数据段
代码重定位
数据重定位
符号表
字符串表
111、malloc函数的执行基本步骤:首先搜索目录,查找空闲描述符
112、tools文件夹下有个build.c的文件,这个文件将被单独编译,然后被Makefile使用来组合编译其他文件生成Image内核映像。
build的工作是去掉bootsect和setup的minix执行文件头、去掉system文件的a.out头信息,只保留代码和数据部分,然后写入Image
113、boot下的bootsect。s和setup.s各自编译。而其他程序使用GNU编译器编译生成system模块,然后使用build工具将三块合成映像文件Image
114、
115、汇编器在引用C程序中的变量的时候需要在变量名前加下划线'_'
116、虚拟盘是为了制作集成盘时为文件系统盘开辟的内存区域,总之是给文件系统盘占用的区域
117、bootimage是引导盘,引导做的是一些系统的初始化工作,比如创建临时的LDT、GDT,和挂载文件系统盘rootimage等,之后就跳到shell下
118、编译bochs 软件
./configure
--enable-gdb-stub
119、地址转换图