linux内核中的__read_mostly变量

linux内核中的__read_mostly变量

内核版本:2.6.14

嵌入式开发交流群:289195589,欢迎加入!

在阅读socket源码的时候,有如下一句(net/socket.c):

static struct vfsmount *sock_mnt __read_mostly;

感觉__read_mostly很奇怪,就深入分析了一下。

__read_mostly原语将定义为存放在.data.read_mostly段中。

#if defined(CONFIG_X86) || defined(CONFIG_SPARC64)
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
#else
#define __read_mostly
#endif

由此可见,我们可以将经常需要被读取的数据定义为 __read_mostly类型,这样Linux内核被加载时,该数据将自动被存放到Cache中,以提高整个系统的执行效率。另一方面,如果所在的平台没有Cache,或者虽然有Cache,但并不提供存放数据的接口(也就是并不允许人工放置数据在Cache中),这样定义为 __read_mostly类型的数据将不能存放在Linux内核中,甚至也不能够被加载到系统内存去执行,将造成Linux 内核启动失败。
解决的方法有两种:
  1. 修改include/asm/cache.h中的__ready_mostly定义为:#define __read_mostly
  2. 修改arch/xxx/kernel/vmlinux.S,将.data.read_mostly段的位置到实际内存空间中去,例如放置在 .data段之后等等。
此外,内核源码通过CONFIG_X86)和(CONFIG_SPARC64)来判断该怎样定义__read_mostly,因此在arm中这个宏没有意义。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核,lockdep是用于检测锁相关问题的一个工具。通过设置int debug_locks __read_mostly = 1;这个变量,我们可以开启lockdep的调试信息。接下来,我们可以使用创建/proc文件节点的方式来开启lockdep的调试信息。 具体步骤如下: 1. 在内核代码,定义一个全局的变量debug_locks,用于控制是否开启lockdep的调试信息。代码如下: ``` int debug_locks __read_mostly = 1; ``` 2. 使用create_proc_entry函数创建/proc目录下的一个文件节点,用于控制debug_locks变量的值。代码如下: ``` static struct proc_dir_entry *debug_locks_proc_file; static int debug_locks_proc_show(struct seq_file *m, void *v) { seq_printf(m, "%d\n", debug_locks); return 0; } static int debug_locks_proc_open(struct inode *inode, struct file *file) { return single_open(file, debug_locks_proc_show, NULL); } static const struct file_operations debug_locks_proc_fops = { .owner = THIS_MODULE, .open = debug_locks_proc_open, .read = seq_read, .llseek = seq_lseek, .release = single_release, }; static int __init debug_locks_init(void) { debug_locks_proc_file = proc_create("debug_locks", 0, NULL, &debug_locks_proc_fops); if (!debug_locks_proc_file) { return -ENOMEM; } return 0; } static void __exit debug_locks_exit(void) { if (debug_locks_proc_file) { proc_remove(debug_locks_proc_file); } } module_init(debug_locks_init); module_exit(debug_locks_exit); ``` 3. 在make menuconfig界面,选择“Kernel debugging”选项,将“Lock debugging”和“Debug Lockups and Hangs”选项打开。 4. 编译内核,并将新的内核安装到系统。 5. 在终端执行如下命令,开启lockdep的调试信息: ``` echo 1 > /proc/debug_locks ``` 现在,我们已经成功地通过设置debug_locks变量和创建/proc文件节点的方式,开启了lockdep的调试信息。如果出现锁相关问题,lockdep会输出相关信息,帮助我们分析和解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值