一,系统调用结构
从上图可知,系统系统课分为3层,第一层为app软件层,第二层为glibc库,第三层位内核层,第一,二层为用户空间,第三层为内核空间,当app调用open/read等函数时,会触发异常,在触发异常时,会保留异常的原因,然后内核会去处理异常。
app层使用系统函数——>glibc层触发异常:设置原因和触发SWI或SVC中断标识符——>分辨原因与调用处理函数。
ABI
ABI 是编译器和链接器遵守的一组规则,以让编译后的程序可以正常工作。
OABI:将中断原因嵌入到中断标识符中,使用SWI进行触发中断;
ABI:把中断原因存储到R7寄存器中,也使用SWI进行触发中断;
EABI:嵌入式触发中断,使用SVC进行触发,把触发原因存储到R8中;
注:内核的ABI要与APP的ABI相同。
进程文件
我们可以使用ps查看文件进程号,在使用cd /proc/“进程号”/fd 打开进程,在使用ls -l进行查看程序文件,查看结果如上图,进程文件0是存储输入数据,scanf()的数据就是存储到这里,文件1是输出数据,printf()数据存放在这里,文件2是存储错误信息,文件3是文件句柄,指的是应用程序本身,每个进程都有自己“文件句柄的空间”。
内核处理函数(大致理解)
当我们运行do_sys_open()程序时 :
1,获取未使用的文件句柄,就是上述进程文件的3号
2,打开文件,得到file结构体,在结构体中,存储了程序相关参数,如 f_pos是打开文件读取指定位置。
3,记录当前进程,会创建一个task_strult结构体,里面嵌套一个files,在嵌套一个fdt,在在嵌套一个fd数组,fd里面每一位代表一个进程文件,每个文件中存在一个file的变量,层层嵌套。
2024/5/16,冲冲冲