在SOCKET创建过程用到一个奇怪变量static struct vfsmount *sock_mnt __read_mostly

static struct socket *sock_alloc(void)
{
	struct inode *inode;
	struct socket *sock;

	inode = new_inode(sock_mnt->mnt_sb);
	if (!inode)
		return NULL;

	sock = SOCKET_I(inode);

	kmemcheck_annotate_bitfield(sock, type);
	inode->i_mode = S_IFSOCK | S_IRWXUGO;
	inode->i_uid = current_fsuid();
	inode->i_gid = current_fsgid();

	percpu_add(sockets_in_use, 1);
	return sock;
}

转自:http://blog.csdn.net/ce123_zhouwei/article/details/8431995

linux内核中的__read_mostly变量

内核版本:2.6.14

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

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

[plain]  view plain  copy
  1. static struct vfsmount *sock_mnt __read_mostly;  

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

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

[plain]  view plain  copy
  1. #if defined(CONFIG_X86) || defined(CONFIG_SPARC64)  
  2. #define __read_mostly __attribute__((__section__(".data.read_mostly")))  
  3. #else  
  4. #define __read_mostly  
  5. #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中这个宏没有意义。

Logo

更多推荐