【linux kernel】start_kernel函数详解系列之proc_root_init

72 篇文章 56 订阅
订阅专栏
一、开篇

​ 本文所有代码出自linux内核版本:4.1.15

​ 在start_kernel函数中将调用proc_root_init()初始化proc文件系统的目录。该函数定义如下(/fs/proc/root.c):

void __init proc_root_init(void)
{
	int err;

	proc_init_inodecache();
	err = register_filesystem(&proc_fs_type);
	if (err)
		return;

	proc_self_init();
	proc_thread_self_init();
	proc_symlink("mounts", NULL, "self/mounts");

	proc_net_init();

#ifdef CONFIG_SYSVIPC
	proc_mkdir("sysvipc", NULL);
#endif
	proc_mkdir("fs", NULL);
	proc_mkdir("driver", NULL);
	proc_create_mount_point("fs/nfsd"); /* somewhere for the nfsd filesystem to be mounted */
#if defined(CONFIG_SUN_OPENPROMFS) || defined(CONFIG_SUN_OPENPROMFS_MODULE)
	/* just give it a mountpoint */
	proc_create_mount_point("openprom");
#endif
	proc_tty_init();
	proc_mkdir("bus", NULL);
	proc_sys_init();
}

proc_root_init()函数开始处,调用proc_init_inodecache()函数分配proc的inode缓存(proc_inode_cachep),如下代码片段(/fs/proc/inode.c):

void __init proc_init_inodecache(void)
{
	proc_inode_cachep = kmem_cache_create("proc_inode_cache",
					     sizeof(struct proc_inode),
					     0, (SLAB_RECLAIM_ACCOUNT|
						SLAB_MEM_SPREAD|SLAB_PANIC),
					     init_once);
}

上述代码中,proc_inode_cachep是一个指向struct kmem_cache结构的指针。当对proc文件系统分配inode时,将在proc_inode_cachep指向的slab缓存区域中分配内存,这个操作由proc_alloc_inode()函数完成,如下代码:

static struct inode *proc_alloc_inode(struct super_block *sb)
{
	/* 省略了部分代码 */
    
	ei = (struct proc_inode *)kmem_cache_alloc(proc_inode_cachep, GFP_KERNEL);
    
	/* 省略了部分代码 */
	return inode;
}

当释放proc文件系统分配的inode时,将调用proc_i_callback()函数释放proc_inode_cachep指向的slab缓存区(proc_i_callback()函数被proc_destroy_inode()调用),如下代码所示:

static void proc_i_callback(struct rcu_head *head)
{
	struct inode *inode = container_of(head, struct inode, i_rcu);
	kmem_cache_free(proc_inode_cachep, PROC_I(inode));
}

对于proc文件系统来说,对proc_inode_cachep指向的slab缓存区域的分配和释放两个操作函数都被注册到了proc文件系统超级块的操作集合(proc_sops)中,如下代码所示(/fs/proc/inode.c):

static const struct super_operations proc_sops = {
    /* 分配inode */
	.alloc_inode	= proc_alloc_inode,
    /* 释放inode */
	.destroy_inode	= proc_destroy_inode,
    
	/* ......*/
    
};

回到proc_root_init()函数中,会继续调用register_filesystem()向linux内核注册proc文件系统,其文件系统的类型描述定义如下:

static struct file_system_type proc_fs_type = {
	.name		= "proc",
	.mount		= proc_mount,
	.kill_sb	= proc_kill_sb,
	.fs_flags	= FS_USERNS_VISIBLE | FS_USERNS_MOUNT,
};

在向内核中注册了proc文件系统后,会调用proc_self_init()函数(fs/proc/self.c)为self分配索引节点号(/proc/self目录指:访问/proc文件系统的进程)。

接着,将调用proc_setup_thread_self()函数,该函数将设置/proc/thread-self目录,其中包含有关当前线程的信息。如下代码片段:

	proc_self_init();
	proc_thread_self_init();

紧接着,会创建/proc/self/mounts,它将包含调用的挂载点:

proc_symlink("mounts", NULL, "self/mounts");

接着会创建/proc/fs、/proc/driver、/proc/mounts、/proc/net、/proc/sys、/proc/tty相关proc文件系统的信息条目,如下代码:

   proc_net_init();

#ifdef CONFIG_SYSVIPC
	proc_mkdir("sysvipc", NULL);
#endif
	proc_mkdir("fs", NULL);
	proc_mkdir("driver", NULL);
	proc_create_mount_point("fs/nfsd"); /* somewhere for the nfsd filesystem to be mounted */
#if defined(CONFIG_SUN_OPENPROMFS) || defined(CONFIG_SUN_OPENPROMFS_MODULE)
	/* just give it a mountpoint */
	proc_create_mount_point("openprom");
#endif
	proc_tty_init();
	proc_mkdir("bus", NULL);

proc_root_init()函数的最后,会调用proc_sys_init()函数创建/proc/sys目录并初始化sysctl。


二、结尾

至此,proc_root_init()函数就分析完毕啦。总结一下,该函数主要用于为proc文件系统创建目录

我们可以使用proc_mkdir()函数创建自己的proc文件系统目录,例如小生这里创建了一个目录如下:

proc_mkdir("iriczhao", NULL);

编译linux内核后运行,在bash shell中输入ls /proc/,命令将显示我们自己定义的目录,如下图所示:
在这里插入图片描述
(当然,以上操作似乎无任何意义,这么做,无非加深对linux内核的理解啦。毕竟动手实践,永远是把控linux内核的最佳方式!)

linux内核如何向proc文件系统递交内核本身的信息,这又是另外的话题了…

搜索/关注【嵌入式小生】wx公众号,获取更多精彩内容>>>>
请添加图片描述

Linuxkernel:start_kernel 启动
mzhan017的博客
06-20 294
x86_64 从 head_64.S 文件开始调用 x86_64_start_kernel -> x86_64_start_reservations -> x86_intel_mid_early_setup (启动intel相关的硬件初始化函数) apic_intr_mode_init - > apic_intr_mode_init -> apic_bsp_setup -> setup_IO_APIC -> setup_IO_APIC_irqs() -> pin_2
【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_kernel() 源码分析
最新发布
|~~~热爱生活、努力学习的小伙汁~~~|
09-15 801
【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_kernel() 源码分析
linux proc_root_init
chenliang0224的专栏
12-04 1387
1. proc_root_init()函数 路径:linux-3.10.x\init\main.c-->start_kernel()   static struct file_system_type proc_fs_type = { .name = "proc", .mount = proc_mount, .kill_sb = proc_kill_sb, .fs_flag...
linux内核初始化及启动之start_kernel
jayz的技术博客
01-23 799
导读:   Linux的源代码可以从www.kernel.org得到,或者你可以查看linux代码交叉引用网站:http://lxr.linux.no/ 进行在线的代码查看,这是一个很好的工具网站。   在start_kernel中将调用到大量的init函数,来完成内核的各种初始化。如:   page_address_init();   sched_init();   page_alloc
proc_root_init
wuye110的专栏
11-12 1130
1.self_inum:是一个唯一的proc inode number. 虽然它是从proc 文件系统中分配的inode number, 但仅用在nsfs中, 它被用做nsfs的inode number, 只需要保证这个number在nsfs中唯一就可以了. 2.__xlate_proc_name:This function parses a name such as “tty/driver/se
基于arm的Linux的启动分析(至start_kernel
liucong2004的专栏
03-19 1540
启动过程分析如下:压缩的内核zImage 的入口程序为 Commpressed的head.S,它依次完成以下工作:开启 MMU 和 Cache,调用 decompress_kernel()解压内核,最后通过调用 call_kernel()进入非压缩内核 Image 的启动。下面将具体分析在此之后 Linux 内核的启动过程。 Linux内核入口  Linux 非压缩内核的入口位于文
Linux学习之start_kernel()概述
编程老王
02-26 895
start_kernel()内容 \linux-4.18\init\main.c asmlinkage __visible void __init start_kernel(void) { char *command_line; char *after_dashes; set_task_stack_end_magic(&init_task); smp_setup_processor_id(); debug_objects_early_init(); cgroup_init_early
linux 内核 重启函数,Linux系统启动函数start_kernel探秘
weixin_30920223的博客
05-03 767
asmlinkage__visiblevoid__initstart_kernel(void){...//lockdep_init()是个宏,定义在kernel/fork.c中第388行,如下://#definelockdep_init()do{}while(0)// 可见没做什么事,留作未来扩展之用。lockdep_init();// init_ta...
Linux内核分析课程3_start_kernel()函数分析
Eijsan
03-22 999
Linux内核课第三周作业。本文在云课堂中实验楼完成。 唐国泽 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000   -----------------------------------------分割线--------------------------------------
全面解析Linux 内核 3.10.x - start_kernel()
何文的专栏
11-30 2868
From: 全面解析Linux 内核 3.10.x - 本文章完全基于MIPS架构 赶得早,不如赶得巧 - 古语start_kernel前几年穿越题材很火爆,如神话,宫,步步惊心等,可是这些剧都有一些共性,那就是总是穿越到了过去! 为什么穿越一定要到过去呢?在我看来无非就是觉得回到过去题材丰富,因为在中国科幻题材很难火爆,题材有限!换言之就是,中国人总是喜欢活在过去,我祖上怎样怎样..我去年买了个表
Linux内核函数Start_kernel()的功能
03-04
Linux内核函数Start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置。这些动作有的是公共的,有的则是需要配置的才会执行的。本文介绍了在start_kernel()函数中的一些功能。
Linux start_kernel
happy08god的专栏
03-31 4638
Linux start_kernel 转自: http://www.cnitblog.com/zouzheng/archive/2008/08/04/47574.html 先Mark下。 如果以为到了c代码可以松一口气的话,就大错特措了,linux的c也不比汇编好懂多少,相反到掩盖了汇编的一些和机器相关的部分,有时候更难懂。其实
Linux 内核启动流程之 start_kernel
qq_38769551的博客
01-02 302
Linux 内核启动流程
linux内核源码分析之start_kernel函数
03-10 510
start_kernel函数 内核启动 root@ubuntu:~# ps -A PID TTY TIME CMD 1 ? 00:00:01 init 2 ? 00:00:00 kthreadd 3 ? 00:00:01 ksoftirqd/0 4 ? 00:00:00 kworker/0:0 5 ? 00:00:00 kworker/0:0H 7 ?
linux 内核 之 start_kernel()
traveler's blog
12-27 1226
//Linux内核由 start_kernel开始,到用户进程init 结束 调用了一系列的初始化函数 对所有的内核组件 //进行初始化 其中 start_kernel rest_init kernel_init init_post 等4个初始化函数 构成了整个 //初始化的主线 asmlinkage void __init start_kernel(void) { char * c
Linux内核4.14版本:ARM64的内核启动过程(二)——start_kernel
yangguoyu8023的博客
11-21 3016
asmlinkage __visible void __init start_kernel(void) { char *command_line; char *after_dashes; set_task_stack_end_magic(&init_task);/* 设置任务栈结束魔术数, *用于栈溢出检测 */ smp_setup_processor_id(); /* 跟 SMP 有关(多核处理器),设置处理器 ID。 * 有很.
<Linux>Linux内核启动分析(二)——start_kernel
Stephen_Lu_Fahai
04-20 1310
在前一篇对head.S的分析中,我们知道内核启动的第一阶段的是处理u-boot传进来的机器id,由此来判断内核是否支持这个CPU以及该单板。而head.S最后跳到start_kernel函数中作进一步的处理。分析如下: 一、start_kernel 在start_kernel这个函数中首先进行一系列的初始化,咱们就先不去具体分析每一个初始化函数,主要看最后两行的的setup_arch
linux的start函数,介绍Linux内核函数Start_kernel()的功能
weixin_30305029的博客
05-09 279
Start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置。这些动作有的是公共的,有的则是需要配置的才会执行的。在start_kernel()函数中,输出Linux版本信息(printk(linux_banner))设置与体系结构相关的环境(setup_arch())页表结构初始化(paging_init())使用"arch/alpha/kernel/entry.S"中的入...
Linux内核启动流程-第二阶段start_kernel 函数
wojiaxiaohuang2014的博客
09-25 334
Linux内核启动流程-第二阶段 start_kernel 函数
kernel 5.4 nfs3_proc_create函数流程解析
07-15
`nfs3_proc_create` 函数Linux 内核中用于处理 NFSv3 协议的 `CREATE` 操作的函数。它负责在 NFS 服务器上创建一个新文件。 以下是 `nfs3_proc_create` 函数的大致流程: 1. 首先,函数会检查所传递的参数的...
211
原创
909
点赞
3860
收藏
1万+
粉丝
关注
私信
写文章

热门文章

  • 【Qt】使用Qss设置QPushButton图标和显示文本的位置 26479
  • 【ubuntu】在虚拟机中如何给ubuntu硬盘扩容 17652
  • 【Qt】一篇全面的信号和槽函数机制总结 17574
  • 【linux kernel】记一次linux内核裁剪总结 16121
  • 【Qt】一篇全面的关于Qt对图像数据的操作总结 14410

分类专栏

  • 小生聊【linux kernel】 72篇
  • 小生聊【嵌入式linux】 24篇
  • 小生聊【Android】 2篇
  • 小生聊【OSG】 4篇
  • 小生聊【Qt】 58篇
  • 小生聊【ubuntu】 5篇
  • 小生【Qt作品展】 5篇
  • 小生聊【Qml】 29篇
  • 小生聊【u-boot】 11篇
  • 小生聊【busybox】 7篇
  • 小生聊【buildroot】 5篇
  • 笔记 6篇
  • 小生笔记 7篇
  • 小生聊【C语言】 2篇
  • 小生聊【C++】 4篇
  • 小生聊【MCU】 2篇

最新评论

  • 【小生作品展】库存管理软件

    canfanlove: 你好,有没有项目代码

  • 如何在VMware虚拟机上安装运行Mac OS系统(详细图文教程)

    欲买桂花酒: i请问镜像文件具体在那个文件夹下呢 没有找到 求回答

  • 【ubuntu】在虚拟机中如何给ubuntu硬盘扩容

    呼啦月马: 之前安装的东西已经文件不好不见吧

  • 嵌入式Qt | 如何交叉编译Qt模块

    m0_47775639: global/qrandom.h:204:9: 错误: ‘is_trivially_destructible’不是‘std’的成员 global/qrandom.h:204:9: 错误: ‘::value’未被声明 global/qrandom.h:204:9: 错误: expected primary-expression before ‘bool’ global/qrandom.h:204:9: 错误: expected ‘,’ before ‘bool’ global/qrandom.h:204:9: 错误: expected string-literal before ‘bool’ global/qrandom.h:204:9: 错误: expected ‘)’ before ‘bool’ 大佬按照您的方法,这个报错咋解决表情包

  • 【linux kernel】一文浅析linux HID核心

    普通网友: 阅读这篇博文真是一次愉快的体验!作者的文字真是动人心弦,语言精准而生动。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

最新文章

  • 【linux kernel】一文总结linux的clk框架
  • 【linux kernel】一文总结linux的uevent机制
  • 【linux kernel】一文总结linux输入子系统
2024年11篇
2023年24篇
2022年134篇
2021年44篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iriczhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家陕西玻璃钢雕塑供应家用玻璃钢花盆采购沈阳特色玻璃钢雕塑开封玻璃钢雕塑小品制作江苏开业商场美陈价钱安康玻璃钢圆门头雕塑佛像玻璃钢彩绘雕塑定制厂家大型的玻璃钢仿铜雕塑吉林玻璃钢小羊动物雕塑厂家玻璃钢鱼雕塑湖北商场美陈报价湘潭长沙玻璃钢雕塑公司推荐玻璃钢桃子雕塑型号商场美陈吉祥物玻璃钢雕塑一般用什么树脂红色玻璃钢卡通雕塑参考价青海室内雕塑玻璃钢河源工艺玻璃钢雕塑四川大型玻璃钢雕塑价格保定口碑好玻璃钢雕塑品牌企业日照公仔玻璃钢雕塑出售玻璃钢花盆周口商场美陈雕塑供应商大连定制玻璃钢造型雕塑杭州商场美陈布置工期几天玻璃钢青苹果商场美陈张掖城市玻璃钢雕塑公司江苏特色玻璃钢雕塑销售电话山东玻璃钢雕塑摆件销售公司江西人物玻璃钢雕塑优势香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化