内核层可以看到当前调用文件处理的进程ID
这个数据结构是非常大的:
我们打印的pid,tgid就是从这里来的,然后只需要找到pid_t的数据类型就好了。
下图这是运行的日志信息:
从上述日志,其实我也把write的系统调用加了入口的打印信息,因为需要验证自己的想法是否正确,看到的日志是这样的(打印日志添加上文件,函数,行是多么的方便,一下子找到所需要的信息):
在心得里写到日志量非常大的问题,其中有部分是针对文件打开的系统调用,从系统开机 后大概2分钟内openat2这个接口被调用了63.8万次,详见:
test_log/syslog_filename_can_print · r77683962/linux-6.9.0 - Gitee.comhttps://gitee.com/r77683962/linux-6.9.0/blob/master/test_log/syslog_filename_can_print这也即是说打印日志一定要小心,不然内核产生的日志增长会非常非常快。
在对文件操作的时间,当时想到一个办法,打印日志的时候把文件名前4个字母跟目标比对,如果是某字符串则显示,代码如下:
登录 - Gitee.comhttps://gitee.com/r77683962/linux-6.9.0/commit/9a8f609089121ac6390d6ea562ec26a5254e4b4d
测试效果(截图前面其实也创建了test1.txt):
这样也可以大量减少日志打印,不过添加有些这样的日志判断有难度。
在修改内核后不能正常起来操作系统当前来看有三种情况:
1、代码内存越界,就是前一阵子碰到的打印filename这个变量,一般会出调用栈,不过不太容易看得到,因为开机日志显示翻页太快,页面显示到后边就卡死,黑白屏;
2、第二种:好像进入到 busybox,可以手动打印些dmesg的日志,黑白屏;
3、第三种:当图形化操作了,这里一直转,转二三十分钟,猜测是初始化日志打印太多:
其实这种过程是挺有意思,有些书讲内核运行原理,如果再配套查看内核运行实时日志,这样会更有意思,因为书上的知识是死的,而操作系统是活的,是动态的。