#define DEFINE(sym, val)
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
那个宏定义在asm-offsets.c中,这个.c文件根本就不是用来编译运行的,只是在编译内核的时候,用它生成一个asm-offsets.s文件,然后使用一个脚本将这个asm-offsets.s再转换为asm-offset...
分类:
其他好文 时间:
2014-05-14 00:16:28
阅读次数:
425
内存屏障是指“由于编译器的优化和缓存的使用,导致对内存的写入操作不能及时的反应出来,也就是说当完成对内存的写入操作之后,读取出来的可能是旧的内容”(摘自《独辟蹊径品内核》)。内存屏障的分类:编译器引起的内存屏障缓存引起的内存屏障乱序执行引起的内存屏障1、编译器引起的内存屏障:我们都知道,从寄存器里面...
分类:
其他好文 时间:
2014-05-12 06:00:23
阅读次数:
283
最近看epoll 和 select
都涉及到一个东西叫做设备等待队列,等待队列是如何工作的,内核是怎么管理的?看这篇文章问题:进程是如何组织起来的?我们知道,进程是有很多种状态的:include/linux/sched.h#define
TASK_RUNNING 0#define TASK_INT....
分类:
系统相关 时间:
2014-05-11 23:08:52
阅读次数:
537
Unix操作系统紧紧依赖进程创建来满足用户需求...
分类:
其他好文 时间:
2014-05-11 22:22:49
阅读次数:
1391
ID为0的进程通常是调度进程,常被称为交换进程(swapper),是内核中的系统进程。
ID为1的进程叫做init进程,是一个普通用户进程,不属于内核,由内核调用。
一个现有进程可以调用fork函数创建一个新进程(子进程)。fork函数被调用一次,返回两次。子进程返回值为0,父进程返回值为子进程的进程ID。
当fork出一个子进程后,子进程便拥有独立的数据段、堆、栈的副本,但...
分类:
其他好文 时间:
2014-05-11 22:03:19
阅读次数:
251
GlusterFS 挂载需要 fuse 支持,如果你的内核版本低于 2.6.16 则需要下载fuse的源码包自行编译安装,也可下载 fuse 的rpm包。安装fuse的方法我就不说了,不会源码安装的直接去rpmfind.net上下载rpm即可。高于此版本的内核中已经有了fuse.ko的模块,需要的时候可以执行以下命令进行加载:
modprobe -b fuse
1、下载GlusterF...
分类:
其他好文 时间:
2014-05-11 20:18:31
阅读次数:
391
内核要执行一个应用程序,唯一的途径是通过系统调用,exec函数,exec又会调用启动程序,启动程序(通常是汇编语言)以类似下面的方式调用main函数:
void exit(main(argc, argv));
那么在main函数末尾使用exit(0)和使用return 0是等价的。这里有三个正常终止程序的函数:
void exit(int status); // 先执行一些清理操作,...
分类:
其他好文 时间:
2014-05-11 20:11:19
阅读次数:
394
进程切换
为了控制进程的执行,内核必须有能力挂起在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换,任务切换或上下文切换。
尽管每个进程可以拥有属于自己的地址空间,但所有进程必须共享CPU寄存器。因此,在恢复一个进程执行前,内核必须确保每个寄存器装入了挂起进程时的值。
进程恢复执行前必须装入寄存器的一组称为硬件上下文(hardware context)。硬件上下文是...
分类:
其他好文 时间:
2014-05-11 14:26:57
阅读次数:
316