bootsect.s
setup.s
读取硬件参数
读取system到内存0x00位置
从16位模式 转到 32位模式,即从实时模式 转到 保护模式, 使得寻址方式发生了改变,跳转到0x00执行system,其实是转到head.s代码
实时模式: 地址翻译 CS<<4 + IP
保护模式 :根据CS查表 + IP
head.s
初始化GDT,IDT表
转到main()函数,main()是c函数
main()
各种初始化,包括mem_init 标记那些内存块被使用,哪些没有被使用
由系统提供的函数调用
硬件上隔离用户段和内核段,DPL CPL来实现, 其实是把内存分段了,进行隔离保护
从用户段访问内核段,必须通过中断0x80才能访问内核段
库函数write:
1)系统调用号 => %eax
参数1 => %ebx
参数2 => %ecx
参数3 => %edx
2) int 0x80 中断,进入内核,调用 system_call,
int 0x80 和 system_call函数的关系要先注册好 ,即设置IDT表,改变了DPL,以及段寄存器地址,还有偏移地址,实际上就是设置了DPL和中断函数地址 !!!
system_call:
call _sys_call_table(,%eax,4) //eax保存的是系统调用号,有查call_table表格
call_table :
//查找表,通过系统调用号查找对应的系统调用指针,然后去调用对应的sys_write
疑问
有system_call()的函数声明,但是没有实体,只有在.s文件中找到_system_call的标号
就是是_system_call,
在c语言中声明和调用的时候都写成system_call
在汇编中声明为_system_call,多一个下划线
汇编中调用汇编,则调用_system_call;
汇编中调用c函数,要在c函数前面加一个下划线,、_function;
Unix
进程图谱
文件操作
进程 和 线程 都是动态概念
进程 = 资源 (包括寄存器值,PCB,内存映射表)+ 指令序列
线程 = 指令序列
线程 的资源是共享的,
进程 间的资源是分隔独立的,内存映射表不同,占用物理内存地址是分隔的
线程 的切换只是切换PC,切换了指令序列
进程 的切换不仅要切换PC,还包括切换资源,即切换内存映射表
用户级线程:调用Yield函数,自己主动让出cpu,内核看不见,内核只能看见所属进程而看不见用户级线程,所以一个用户级线程需要等待,内核会切到别的进程上,不会切到该进程下的其他用户级线程!!!
内核级线程
本文发布于:2025-04-05 23:47:00,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/1743868047584390.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |