1.进程加载函数:负责将硬盘上的进程加载到指定内存位置。返回进程的入口地址如 jinchengjiazaihans2.cpu调用函数第一次调用时传入进程的运行入口地址将入口地址作为基地址写入中断寄存器栈指针寄存器cpu基地址寄存器等,cpu开始运行后面会通过切换上下文自动运行。如cpudiaoyonghanshu()3.内存管理函数主要给用户进程使用查找空闲内存返回首地址给加载函数用调用进程加载函数将进程加载到空闲内存中返回该进程的入口地址。让cpu调用函数调用。如neicunguanlihs()空闲内存可以使用结构体数组构建在得到总内存大小后减去内核已经占用的内存将剩下的内存分配到结构体数组的每个结构体中( 程序员手工划分内存 )进程管理的实现在主函数中 如main()定义进程结构体typedef struct{结构体内部元素} jinchengjgt进程结构体包含了进程的全部信息进入主循环 如while(true){创建进程结构体链表调用内存管理函数将进程加载入内存更新进程的结构体信息可以通过中断的方式不断的加入进程最后形成一个链表( 也可以用结构体数组实现 最好是全局变量)如进程1-进程2-进程3-.........-进程n.进入cpu调用过程:while( true ){保存内核态时cpu中的数据到内存为后面恢复用。获取进程结构体的信息调用cpu调用函数 运行该进程时间片到结束该进程的运行时间片通过时间钟中断实现cpu每次运行完一条指令都会去检测有没有时间钟中断信号。如果有就进行上下文切换。cpu会自动保存该进程当前信息到进程结构体也就是内核栈中进程结构体中保存了内核栈的起始地址具体的是通过栈指针自动完成。cpu去执行时间中断函数此函数会恢复中断发生前保存的内核态数据。链表指针到下个进程}}注空闲内存结构体内有空闲内存块的起始地址和结束地址块的大小等信息。其中地址可以给进程加载函数使用。进程加载函数通过文件在硬盘的位置信息进行加载。单核单任务一个cpu核运行一个进程进程结束再运行另外一个进程。单核多任务一个cpu核运行多个进程一个进程暂停去运行另外一个进程。进程就是一个个可以单独运行的程序。中断通过中断寄存器中的地址访问中断向量表。中断向量表结构体数组构建好后 通过lidt把结构体数组的首地址( 也就是数组名)放到中断寄存器中。lidt [idt, 256*8 - 1] // 参数表地址界限用户栈到内核栈的切换是通过tss中rsp0栈指针实现rsp0栈指针指向当前进程的内核栈。cpu通过任务寄存器tr找到tss中rsp0的内存地址然后根据这个rsp0压栈。上面是x86-64架构实现过程在risc架构中用户栈到内核栈的切换是通过csr实现当cpu进入某个进程运行时这时cpu的栈指针指向当前进程的栈也就是用户栈。当发生进程切换时也就是上下文切换这时需要的是内核栈。保存cpu信息到内核栈。这时就需要切换。如果直接压栈就会把cpu数据存到用户栈中内核栈中是空的就会导致进程崩溃。所以就需要栈切换。当发生进程切换时为了保存当前进程在cpu主模块的数据此时cpu不能运行任何指令否则会改掉主模块里的数据因此cpu会用其它模块来保存当前数据。也就是进行压栈。函数调用都会进行栈的操作有时为了避免栈的操作可以把代码直接放在函数调用处实现内核主程序最好不要有函数调用。注意栈指针。用户态的程序要想访问内核态里的函数 也就是系统内核API函数 可以通过软中断指令syscall进入内核态通过cpu里的特殊寄存器传API函数编号参数实现。发生软中断时cpu会去执行软中断函数软中断函数会恢复cpu的内核态数据通过API函数编号查找API函数表里函数的入口地址。然后去执行该函数通过寄存器返回结果给用户态程序。创建内核态的系统服务进程记录这些进程的入口地址(也就是入口函数的函数指针)。让内核主函数来运行这些进程。实现一些服务功能。因为这些服务进程运行在内核态所以可以直接调用内核里的API函数变量数组结构体等内核态内存数据。标准的输入输出就是键盘产生中断对应的中断函数将中断数据赋值给内核态变量然后内核态显示进程访问这个内核态变量将这变量的值显示在屏幕上。也可以是内核态显示进程设置一块内存作为显示内存只要内核态函数内核API函数内核态进程往这块内存里写数据内核态显示进程都能将这块内存里的数据显示在屏幕上。内核态显示进程里还可以加入显示模式变量是否显示变量等内核态函数和内核API函数通过修改这个变量来确定是字符模式还是像素模式是显示还是不显示等。有的外设先发中断信号中断函数通过I/O总线读取外设中的数据像usb鼠标。对于数据量比较大的用户态程序各个用户程序的数据传递大多是通过硬盘中转来实现。比如用户态显示程序在硬盘上设置一个特定格式的文件用户态显示程序就能将此文件里的数据显示到屏幕其它程序只需要往此文件里写数据就行。所谓内核态就是与内核主函数一起编译的代码。用户态就是单独编译的程序。内核态进程的入口地址是通过入口函数的函数指针实现用户态进程入口地址是通过查找空闲内存结构体数组中的起始地址来实现。内核的主函数就是对进程的管理也是系统内核的入口。建议不要写用户态进程有点难内核态的也少写。建议不要写窗口麻烦。