免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: escapedog
打印 上一主题 下一主题

如果全局变量是由寄存器指向的,那么CPU怎么会有那么多寄存器呢? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-08-14 10:12 |只看该作者
原帖由 flw 于 2007-8-14 10:10 发表

哦,不好意思,我不问了。是你们公司的商业机密,你一定不肯说的。抱歉。


说了你也理解不了,别给自己找台阶下了!

论坛徽章:
0
12 [报告]
发表于 2007-08-14 10:15 |只看该作者
没有一种,是多中。但必须有实例来说明。我拿LINUX说明,你可以用其他的来说明。
如果什么也不用,自己想象不可以。对吗

原帖由 escapedog 于 2007-8-14 10:12 发表


天下的操作系统是不是只有 linux 一种?

论坛徽章:
0
13 [报告]
发表于 2007-08-14 10:16 |只看该作者
原帖由 思一克 于 2007-8-14 10:15 发表
没有一种,是多中。但必须有实例来说明。我拿LINUX说明,你可以用其他的来说明。
如果什么也不用,自己想象不可以。对吗






QUOTE:
原帖由 flw 于 2007-8-14 10:09 发表

请问是何 kernel?
哦,不好意思,我不问了。是你们公司的商业机密,你一定不肯说的。抱歉。




斑竹我可以投诉么?

这不是讨论问题的态度,对不?

[ 本帖最后由 escapedog 于 2007-8-14 10:25 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2007-08-14 10:25 |只看该作者
倾向于escapedog 的说法,任务切换时保存的应该是描述任务的数据结构,而不是任务本身。对于全局变量,只要进程没有退出,它就应当一直在那儿存在着,当然也有可能通过换页操作换出物理内存,但无论如何它与任务的切换没什么直接关系。

论坛徽章:
0
15 [报告]
发表于 2007-08-14 10:27 |只看该作者
原帖由 coldwarm 于 2007-8-14 10:25 发表
倾向于escapedog 的说法,任务切换时保存的应该是描述任务的数据结构,而不是任务本身。对于全局变量,只要进程没有退出,它就应当一直在那儿存在着,当然也有可能通过换页操作换出物理内存,但无论如何它与任务 ...


谢谢。

进程目前通常被认为是 resource holder, 而不是切换的基本单位。

论坛徽章:
0
16 [报告]
发表于 2007-08-14 10:33 |只看该作者
原帖由 escapedog 于 2007-8-14 10:27 发表

进程目前通常被认为是 resource holder, 而不是切换的基本单位。


我是针对linux来说的,有的书里将进程定义为资源申请的基本单位,线程定义为任务切换的基本单位,但对linux而言,它的线程就是通过task_struct这个进程描述符结构来实现的。

论坛徽章:
0
17 [报告]
发表于 2007-08-14 10:35 |只看该作者
原帖由 coldwarm 于 2007-8-14 10:33 发表


我是针对linux来说的,有的书里将进程定义为资源申请的基本单位,线程定义为任务切换的基本单位,但对linux而言,它的线程就是通过task_struct这个进程描述符结构来实现的。


linux 的我大概听人讲过一些,确实有些与众不同的地方。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
18 [报告]
发表于 2007-08-14 10:35 |只看该作者
to coldwarm:
你的观点也是错的。

论坛徽章:
0
19 [报告]
发表于 2007-08-14 10:54 |只看该作者
原帖由 flw 于 2007-8-14 10:35 发表
to coldwarm:
你的观点也是错的。


麻烦老大指出来哪里有问题。


  1. kernel/sched.c
  2. 1048 /*
  3. 1049 * context_switch - switch to the new MM and the new
  4. 1050 * thread's register state.
  5. 1051 */
  6. 1052 static inline
  7. 1053 task_t * context_switch(runqueue_t *rq, task_t *prev, task_t *next)
  8. 1054 {
  9. 1055   struct mm_struct *mm = next->mm;
  10. 1056   struct mm_struct *oldmm = prev->active_mm;
  11. ...
  12. 1063     switch_mm(oldmm, mm, next);
  13. ...
  14. 1072   switch_to(prev, next, prev);
  15. 1073
  16. 1074   return prev;
  17. 1075 }

  18. /include/asm-i386/mmu_context.h
  19. 026  static inline void switch_mm(struct mm_struct *prev,
  20. 027     struct mm_struct *next,
  21. 028     struct task_struct *tsk)
  22. 029  {
  23. 030   int cpu = smp_processor_id();
  24. 031
  25. 032   if (likely(prev != next)) {
  26. 033    /* stop flush ipis for the previous mm */
  27. 034    cpu_clear(cpu, prev->cpu_vm_mask);
  28. 035  #ifdef CONFIG_SMP
  29. 036    cpu_tlbstate[cpu].state = TLBSTATE_OK;
  30. 037    cpu_tlbstate[cpu].active_mm = next;
  31. 038  #endif
  32. 039    cpu_set(cpu, next->cpu_vm_mask);
  33. 040
  34. 041    /* Re-load page tables */
  35. 042    load_cr3(next->pgd);
  36. 043
  37. 044    /*
  38. 045    * load the LDT, if the LDT is different:
  39. 046    */
  40. 047   if (unlikely(prev->context.ldt != next->context.ldt))
  41. 048     load_LDT_nolock(&next->context, cpu);
  42. 049   }
  43. 050  #ifdef CONFIG_SMP
  44. 051   else {

  45. /include/asm-i386/system.h
  46. 012  extern struct task_struct * FASTCALL(__switch_to(struct task_struct *prev, struct
  47. task_struct *next));

  48. 015  #define switch_to(prev,next,last) do {     \
  49. 016   unsigned long esi,edi;       \
  50. 017   asm volatile("pushfl\n\t"       \
  51. 018   "pushl %%ebp\n\t"        \
  52. 019   "movl %%esp,%0\n\t"  /* save ESP */    \
  53. 020   "movl %5,%%esp\n\t"  /* restore ESP */    \
  54. 021   "movl $1f,%1\n\t"   /* save EIP */   \
  55. 022   "pushl %6\n\t"   /* restore EIP */   \
  56. 023   "jmp __switch_to\n"        \
  57. 023   "1:\t"          \
  58. 024   "popl %%ebp\n\t"        \
  59. 025   "popfl"         \
  60. 026   :"=m" (prev->thread.esp),"=m" (prev->thread.eip),  \
  61. 027   "=a" (last),"=S" (esi),"=D" (edi)     \
  62. 028   :"m" (next->thread.esp),"m" (next->thread.eip),   \
  63. 029   "2" (prev), "d" (next));       \
  64. 030  } while (0)

复制代码

这段是上下文切换的代码。它保存的只是对任务的当前状态的描述。从操作系统的角度来看,在这个层次上,它所认知的单位仅仅是页面,至于页面上到底存放的是什么,它根本就不知道,那只能由应用程序来解释。

论坛徽章:
0
20 [报告]
发表于 2007-08-14 11:03 |只看该作者
原帖由 coldwarm 于 2007-8-14 10:54 发表


麻烦老大指出来哪里有问题。


kernel/sched.c
1048 /*
1049 * context_switch - switch to the new MM and the new
1050 * thread's register state.
1051 */
1052 static inline
1053 task_t *  ...


兄台的 linux 似乎很熟,能不能找机会交流一下?
站内短信联系行不?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP