标签:
陈巧然 原创作品
转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
1.第一周:计算机如何工作
2.第二周:操作系统是如何工作的
4.第四周:扒开系统调用的三层皮(上)
5.第五周:扒开操作系统的三层皮(下)
6.第六周:进程的描述与创建
7.第七周:可执行程序的装载
硬件:CPU与内存通过主线连接;CPU上有一块寄存器叫做IP,该寄存器相当于指针,总是指向内存的代码段;CPU总是执行IP指向的指令然后IP自加一
软件(计算机如何识别指令):通过ABI(程序与计算机的接口界面
存储程序计算机工作模型,计算机系统最最基础性的逻辑结构;
函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那么重要,但有了高级语言及函数,堆栈成为了计算机的基础功能;函数参数传递机制和局部变量存储
中断,多道程序操作系统的基点,没有中断机制程序只能从头一直运行结束才有可能开始运行其他程序。
下载安装完后,启动并使它一开始就停止:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
然后启动gdb调试,设置断点,单步运行等,这个在后面的学习过程中都会经常使用
x86 CPU启动的第一个动作CS:EIP=FFFF:0000H(换算为物理地址为000FFFF0H,因为16位CPU有20根地址线),即BIOS程序的位置;
BIOS例行程序检测完硬件并完成相应的初始化之后就会寻找可引导介质,找到后把引导程序加载到指定内存区域后,就把控制权交给了引导程序;
引导程序BootLoader开始负责操作系统初始化,然后启动操作系统。启动操作系统时一般会指定kernel、initrd和root所在的分区和目录;
内核启动过程包括start_kernel之前和之后,之前全部是做初始化的汇编指令,之后开始C代码的操作系统初始化,最后执行第一个用户态进程init(这里和讲解中以及实际的代码main.c是一致的);
一般分两阶段启动,先是利用initrd的内存文件系统,然后切换到硬盘文件系统继续启动。initrd文件的功能主要有两个:
(1)提供开机必需的但kernel文件(即vmlinuz)没有提供的驱动模块(modules)
(2)负责加载硬盘上的根文件系统并执行其中的/sbin/init程序进而将开机过程持续下去
trap_gate函数中,涉及到了系统调用的中断向量和system_call的汇编代码入口;一旦执行int 0x80,CPU直接跳转到system_call
(1)save cs:eip/esp/eflags(current) to kernel stack;
(2)then load cs:eip(系统调用的起点,entry of a specific ISR) and ss:esp(point to kernel stack)
标签:
原文地址:http://www.cnblogs.com/20135310cqr/p/5450464.html