2011年5月12日
摘要: 当进程A在用户态下执行着,出现了系统调用(int 0x80),CPU转而执行_system_call(system_call.s L80)中断处理过程, _system_call 保持了进程A在用户态时的现场信息,然后执行call _sys_call_table(, %eax, 4)指令,当执行完本指令时,进程 A请求的系统调用已经完成了,_system_call剩下的代码是该系统调用中断处理过程的退出阶段。 当执行到jne reschedule时,处于内核态的进程A希望主动放弃CPU,实现进程调度,reschedule代码如下: reschedule: pushl $ret_from_sy. 阅读全文
posted @ 2011-05-12 06:26 将军之盾 阅读(967) 评论(0) 推荐(1) 编辑
  2011年5月10日
摘要: 这个问题源自《The C Programming Language》P49 p3-2习题中,当输入一系列字符串后,再键入Ctrl - Z时,出现了。 代码:main.c 1 #include <stdio.h> 2 3 #define MAXLINE 100 4 5 int getLen(char s[], int lim); 6 char* escape(char t[], char s[]); 7 char* unescape(char t[], char s[]); 8 9 int main() 10 { 11 12 int len = 0; 13 char line[MAX 阅读全文
posted @ 2011-05-10 01:33 将军之盾 阅读(1573) 评论(1) 推荐(1) 编辑
  2011年5月8日
摘要: clock tick:时钟计时单元(而不把它叫做时钟滴答次数),一个时钟计时单元的时间长短是由CPU控制的, 一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。 clock函数:clock_t clock(); 这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间 的CPU时钟计时单元 (clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。 clock_t定义: #ifndef _CLOCK_T_DEFINED typedef long clock_t; #define _CLOCK_T_DEFINED#endi. 阅读全文
posted @ 2011-05-08 23:44 将军之盾 阅读(986) 评论(0) 推荐(1) 编辑
  2011年5月5日
摘要: 源自《The C Programming Language》P40 pr2-8: 编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位从最左端移入)n(二进制)位后所得的值。 代码:main.c 1 #include <stdio.h> 2 3 unsigned rightrot(unsigned x, int n); 4 5 int main() 6 { 7 8 unsigned num = 8; 9 int cnt = 3;10 11 printf("%u\n", rightrot(num, cnt));12 13 retur 阅读全文
posted @ 2011-05-05 01:31 将军之盾 阅读(887) 评论(0) 推荐(0) 编辑
  2011年5月4日
摘要: 源自《The C Programming Language》P40 pr2-6: 编写一个函数setbits(x, p, n, y),该函数返回对x执行下列操作后的结果值:将x中从第p位开始的n个(二进制)位设置为 y中最右边n位的值,x的其余各位保持不变。 代码:main.c 1 #include <stdio.h> 2 3 unsigned setbits(unsigned x, int p, int n, unsigned y); 4 5 int main() 6 { 7 8 unsigned num = 125; //待处理的十进制数 9 int pos = 7; //从数 阅读全文
posted @ 2011-05-04 05:24 将军之盾 阅读(942) 评论(0) 推荐(0) 编辑
  2011年4月29日
摘要: 源自《The C Programming Language》P38 pr2-4: 编写函数squeeze(s1, s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除。 代码:main.c 1 #include <stdio.h> 2 3 #define MAXLINE 100 4 5 char s[MAXLINE] = {'\0'}; //用于存储经过squeeze处理后的字符串 6 char* squeeze(char s1[], char s2[]); 7 int any(char s1[], char s2[]); 8 9 int main()10 阅读全文
posted @ 2011-04-29 23:47 将军之盾 阅读(1176) 评论(0) 推荐(0) 编辑
摘要: 源自《The C Programming Language》P37 pr2-3: 编写函数htoi(s),把由16进制数字组成的字符串(包含可选的前缀0X或0x)转换成与之等价的整形值, 字符串中允许包含的数字包括:0 ~ 9, a ~ f,A ~ F。 参考代码: main.c 1 #include <stdio.h> 2 3 #define YES 1 4 #define NO 0 5 6 int htoi(char s[]); 7 8 int main() 9 {10 11 char hex_str[] = "0x*1fe*";12 13 printf(& 阅读全文
posted @ 2011-04-29 04:24 将军之盾 阅读(1171) 评论(0) 推荐(0) 编辑
  2011年4月28日
摘要: 描述任务0的内核堆栈和用户堆栈是如何产生的: 1, linux0.11系统共使用了4种堆栈:系统初始化时临时使用的堆栈;供内核程序自己使用的堆栈(内核堆栈),只有一个,位于系统 地址空间固定的位置,也就是后来任务0的用户态堆栈;每个任务通过系统调用,执行内核程序时使用的堆栈,也即任务的内核态 堆栈,每个任务都有自己独立的内核态堆栈;任务在用户态执行的堆栈,位于任务(进程)地址空间末端,即任务的用户态堆栈 2, 从head.s程序起,系统正式在保护模式下运行,此时堆栈段被设置为内核数据段(0x10),堆栈指针esp设置成指向use_stack 数组的顶端,保留1页内存作为堆栈使用。head.s. 阅读全文
posted @ 2011-04-28 19:40 将军之盾 阅读(841) 评论(0) 推荐(0) 编辑
  2011年4月27日
摘要: 源自《The C Programming Language》P28 pr2-1: 编写一个程序以确定分别由signed及unsigned限定的char,short,int,long类型变量的取值范围。 参考代码:main.c 1 #include <stdio.h> 2 #include <limits.h> 3 #include <float.h> 4 5 int main() 6 { 7 8 printf("the range of char: %d ~ %d\n", SCHAR_MIN, SCHAR_MAX); 9 printf(& 阅读全文
posted @ 2011-04-27 23:59 将军之盾 阅读(3145) 评论(0) 推荐(2) 编辑
摘要: 源自《The C Programming Language》P25 p1-23: 编写一个删除C语言程序中所以的注释语句。要正确处理带引号的字符串和字符常量。在C语言中,注释不允许嵌套。 参考代码:main.c 1 /* 2 #include <stdio.h> 3 4 #define MAXLINE 1000 5 6 int getLine(char s[], int lim); 7 void copy(char to[], char from[]); 8 void delNotes(char **s, int row); 9 10 int main() 11 { 12 13 i 阅读全文
posted @ 2011-04-27 01:21 将军之盾 阅读(836) 评论(0) 推荐(0) 编辑