当你在linux下运行了一个hello world,linux操作系统发生了啥
“重点讲一下printf 和 glibc库、操作系统的调用细节”题主你赢了,我真的没看过linux和glibc的源码啊我不知道啊摁下回车,键盘向ioapic发出中断请求(irq)ioapic查表将irq引脚号转换为中断号ioapic将irq转发到cpu的lapiclapic向cpu发出irq,cpu#intq引脚升高cpu检查rflags.IF,IF取值为1cpu以中断号为索引查中断描述符表(IDT)对应的门描述符为一中断门,rflags,rip入栈,IF清零,cpu从门描述符中获取目的地址,cpu查页表,TLB命中,栈切换(我不确定具体过程),特权级切换,cpu跳转到目的地址中断处理程序保存现场并处理中断,中断处理程序向内核发出键盘输入信号,shell进程进入就绪态,进程切换触发。进程调度程序保存当前进程的上下文,做一(好)些(多)后续的工作(记不清都有啥了),恢复shell的现场并执行iret指令cpu切换CR3(页表首地址),查页表,TLB命中,触发栈切换,特权级切换shell的读取-执行-打印循环的读取部分结束,shell解释器运行脚本shell执行vfork()api,执行系统调用(int 80h)80号中断是任务门,rflags,rip入栈,cpu查页表,栈切换,栈复制,特权级切换,转到目标地址。系统调用处理程序根据rax值查系统调用表,跳转到vfork调用处理程序vfork调用处理程序新建进程(其中包括好多工作),进程切换触发进程调度程序转到新建的进程,新进程执行exec()api……exec处理程序读硬盘,新进程进入等待态。……硬盘中断处理程序发出读硬盘完成信号,新进程进入就绪态,进程切换触发……shell进程执行wait(),进入等待态,触发进程切换……新进程的glibc初始化(这个过程也好长的),跳转到main函数,main函数输出到stdout,强行清空缓冲区(以下过程我不清楚)某程序处理对stdout的写操作,(发送给某程序)渲染字体,并向xserver提交屏幕刷新请求。xserver接到屏幕刷新请求,某程序将要进行的更改提交给xserver,xserver将更改提交给显卡驱动显卡驱动写显存,屏幕上显示输出以及其他依次返回…………main函数返回,glibc执行退出的相关步骤,并执行exit系统调用进程结束,进程表项删除,进程结束信号触发,shell进入就绪态,进程切换触发shell获得子进程返回值,一次REPL循环结束,在屏幕打印提示符,准备读键盘输入,进入等待态
■网友
先是shell,分析命令行然后调用syscall SYS_EXEC然后调用文件系统读取文件然后分析elf格式然后分配内存加载各个段然后设置分页,设置读写权限等执行fork,分配进程句柄原进程返回shell。新进程跳转到elf的入口函数处。main函数开始执行调用系统调用,写"hello world"到stdout文件。main结束调用系统调用终止当前进程回收用户态空间分页销毁进程句柄通知父进程,该进程结束。
■网友
【当你在linux下运行了一个hello world,linux操作系统发生了啥】 要说清楚这个东西,都可以写几本书了
推荐阅读
- 还记得,那些年5点钟就起床的你吗?
- linux 应用层可以使用DMA进行数据传输吗
- 00后都在用啥软件或者app社交
- 你在国外用过哪些实用的相见恨晚的APP,在国内却还没有相应的推广
- 知识点|开车时带上这些知识点,让你在大雪纷飞的冬季一路平安
- 你在喜马拉雅上听过哪些节目能否满足以下条件
- 目前整个嵌入式linux行业的发展前景咋样
- 有逼格高的XX卫士吗?
- 你在刷知乎的同时还会浏览哪些网站
- 知乎丑陋吗,能说说你在知乎上看到的丑陋事吗