#define MINUTE 60 
#define HOUR (60*MINUTE) 
#define DAY (24*HOUR) 
#define YEAR (365*DAY)
 
/* interestingly, we assume leap-years */ 
static int month[12] = { 
 0, 
 DAY*(31), 
 DAY*(31+29), 
 DAY*(31+29+31), 
 DAY*(31+29+31+30), 
 DAY*(31+29+31+30+31), 
 DAY*(31+29+31+30+31+30), 
 DAY*(31+29+31+30+31+30+31), 
 DAY*(31+29+31+30+31+30+31+31), 
 DAY*(31+29+31+30+31+30+31+31+30), 
 DAY*(31+29+31+30+31+30+31+31+30+31), 
 DAY*(31+29+31+30+31+30+31+31+30+31+30) 
};
 
 
- 
3. 关于do_signal *(&eip) = sa_handler
 
 
(1) 
http://www.oldlinux.org/oldlinux/viewthread.php?tid=14839&extra=page%3D2
*(&eip) = sa_handler 与 eip = sa_handler 有什么不一样? 
网上有说 是因为 两个的类型不一样 一个long 一个 unsigned long ,感觉这不是原因。 
应该是另一种说法 eip = sa_handler 这条语句可能导致 编译器进行优化 而栈中的值没有改变  , 应该是这样。
(2)
 
ljmp tss段选择符这样的语句会造成任务切换,cpu自动保存当前任务tss内容,并恢复需要切换到的任务的tss内容,造成任务切换。任务1和任务2的描述内容与任务0类似。
 
 
为了介于物理内存,在调用fork()生成新进程时,新进程与原进程会共享同一内存区。只有当其中一个进程进行写操作,系统才会为其另外分配内存页面。这就是写时复制的概念。
 
 
 
- 
6.需求加载(load on demand)/需求分页(demand-paging)
 
 
 
SPARC为统一编址,ld,st指令访问
 
 
 
 

这里不同处理器用到的寄存器名字应该不一样吧。。。目前看到的资料都是对应x86的eax,ebx啥的。。。然而我要做的事sparc
 
  
 
 
ARINC 653项目遇到过。。。自己有定义了个end变量,值总是不对。。。原来是链接程序预定义的
 
不过给我启发的是,在裘宗燕翻译的《程序设计实践》里,这对术语并没有翻译为“大端”和小端,而是“高尾端”和“低尾端”,这就好理解了:如果把一个数看成一个字符串,比如11223344看成"11223344",末尾是个‘\0‘,‘11‘到‘44‘个占用一个存储单元,那么它的尾端(低字节)很显然是44,前面的高还是低就表示尾端放在高地址还是低地址,它在内存中的放法非常直观,如下图:
X86小端,SPARC大端
 
 
 
 
 
 
 
一致代码段: 
    简单理解,就是操作系统拿出来被共享的代码段,可以被低特权级的用户直接调用访问的代码.
    通常这些共享代码,是"不访问"受保护的资源和某些类型异常处理。比如一些数学计算函数库,为纯粹的数学运算计算,被作为一致代码段.
一致代码段的限制作用
    1.特权级高的程序不允许访问特权级低的数据:核心态不允许调用用户态的数据.
    2.特权级低的程序可以访问到特权级高的数据.但是特权级不会改变:用户态还是用户态.
非一致代码段: 
    为了避免低特权级的访问而被操作系统保护起来的系统代码. 
非一致代码段的限制作用
    1.只允许同级间访问.
    2.绝对禁止不同级访问:核心态不用用户态.用户态也不使用核心态.
通常低特权代码必须通过"门"来实现对高特权代码的访问和调用. 
不同级别代码段之间转移规则,是通过CPL/RPL/DPL来校验. 
 
 
 
 
 
 

 
 
 
 
    
                 
            版权声明:本文为博主原创文章,未经博主允许不得转载。
         linux内核完全剖析 学习笔记 打字太累 截图 持续更新
原文:http://blog.csdn.net/bill_xiang/article/details/46878699