本帖最后由 shenlanyouyu 于 2016-07-07 15:47 编辑
回复 40# Godbach
果断支持!
读了样章,收获挺大。作者分析了常见的文件操作相关的系统调用,从系统调用的使用,系统调用的实现方法,逐步分析到内核功能的实现。并根据自己的经验,分析了调用系统调用需要注意的问题,防止踩坑。建议:如果在基础知识那章,添加程序链接的基础知识,用图形来说明编译后的obj和C标准库之间的关系,动态链接的过程,会比较系统,容易理解。 曾经有过从应用层直接杀到内核态的经历,在父进程中,打开一个文件,然后fork出一个子进程,在进程读写文件,导致父进程的文件读写位置出现问题,trace系统调用fork的实现,分析fork过程中,子进程继承了父进程打开的文件描述符,增加了进程文件描述符表指向的file的引用计数。2.4节fdopen与 fileno,我曾经也研究过FILE和fd的关系。 研究select多路复用机制的内核实现,了解select的内核的实现,才能明白在文件数量上升时select效率底下的原因,以及为什么epoll更高效。每次调用select,都需要把fd集合从用户态拷贝到内核态,同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd数量上升时也很大。找到root’ cause,才能针对性设计新的系统调用。其次,掌握了select的内部实现,对编写driver的poll函数有极大的帮助。 还有把Android Binder driver搬到PC上调试,最初是直接编译module方式,结果每次编译成功,insmod失败。can_nice, put_files_struct…..没有定义,trace内核发现,这些API都没有EXPORT出来,binder只能built-in到内核中,然后下载最新的内核,config编译,然后内核安装到Ubuntu,添加grub启动项,重启选择进入搞定。ls /dev/binder找到,然后把android的service manger等等,搞过来调试。
|