首页 技术 正文
技术 2022年11月21日
0 收藏 682 点赞 4,815 浏览 1800 个字

linux内核分析第四周学习笔记

标签(空格分隔): 20135328陈都


陈都 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000


#

上周回顾:

  • installing 如何安装内核源代码
  • make mrproper 清理安装时生成的中间代码

启动Linux内核的三个参数:

  • kernel
  • initrd
  • root所在分区、目录

gdb (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

start_kernel:包括很多模块的初始化。


通过查询了解和使用man查看open的说明我了解到
open系统调用的服务例程是sys_open()函数,它接受三个参数:要打开文件的路径名filename, 访问模式的表示flags和文件权限掩码mode。在内核中,sys_open实际调用do_sys_open函数来完成所有操作。

do_sys_open主要执行如下操作:

1,通过getname()从进程地址空间获取该文件的路径名

2,调用get_unused_fd_flags(flags)函数从current->files结构中分配一个空闲的fd。

3,调用do_filep_open(dfd, pathname, flags, mode, 0)找到文件对象的指针struct file* f。

4,调用fd_install(fd, f),将f与fd关联起来。实际是将f保存在current->files->fdtab->fd数组的第fd位置处。

do_filep_open函数的主要功能,就是通过路径名来分配并填充这个文件对应的文件对象。

do_filep_open(dfd, pathname, flags, mode, acc_mode)函数主要执行如下操作:

1,设置一堆访问模式标志

2,调用get_empty_filep()函数从名为filp_cachep的slab缓存中分配一个struct file*的文件对象。

3,如果flags中有O_CREATE标志,跳到,否则到4

4,调用do_path_lookup(dfd, pathname, flags, &nd)做目录查找,将查找结果填充到struct nameidata *nd中。还记得目录查找么?见这里

5,调用finish_open(nd, flags, mode)做一些合法性验验证并从nd->intent.open.file中获取到struct file* filep

6,调用release_open_intent(nd)做一些清理工作。主要是减少nd->intent.open.file中的一些引用计数。

7,返回filep

8,到这一步说明flags中有O_CREATE标志,需要在目录查找过程中逐级创建对应的目录和文件,这一步依次调用path_init_rcu(), path_walk_rcu()和path_finish_rcu()完成创建文件的目录查找工作,最终依然是将查找结果填充到struct nameidata *nd中。(在标准的目录查找do_path_lookup()的实现中,主干流程也是依次调用着三个函数做查找工作)

9,调用do_last(&nd, &path, flags, acc_mode, mode, pathname)函数获取最终的struct file filep结构。在这个函数中,内核会根据nd->last_type做不同的处理,对于普通文件,会调用finish_open(nd, flags, mode)做一些合法性验验证并从nd->intent.open.file中获取到struct file filep

10,调用release_open_intent(nd)做一些清理工作。主要是减少nd->intent.open.file中的一些引用计数。

11,返回filep

内核源代码中涉及到sys_open实现的文件主要有fs/open.c fs/namei.c fs/compat.c fs/file.c fs/file_table.c等

linux内核分析第四周学习笔记

linux内核分析第四周学习笔记

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,983
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,500
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,344
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,127
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,761
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,838