免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3190 | 回复: 10
打印 上一主题 下一主题

求助>>关于进程0 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-26 20:33 |只看该作者 |倒序浏览
进程0由几个静态结构初始化,在head.S代码中设置内核栈,代码为:
  1. lss stack_start,%esp
复制代码
...
  1. ENTRY(stack_start)
  2.         .long init_thread_union+THREAD_SIZE
  3.         .long __BOOT_DS
复制代码
init_thread_union 变量为:
  1. union thread_union init_thread_union
  2.         __attribute__((__section__(".data.init_task"))) =
  3.                 { INIT_THREAD_INFO(init_task) };
复制代码
表示在.data.init_task段中定义一个变量 init_thread_union 并初始化。
小弟有两个问题不明白:1)在设置内核栈时,ss= __BOOT_DS,代表内核数据段,请问:init_thread_union+THREAD_SIZE 代表什么?init_thread_union是个共用体变量能引用其值吗?
                      2)此共用体变量共有4096个字节大小(THREAD_SIZE=4096),而 esp 指向栈顶,此时esp 是否越界?

望指教!谢谢!!!!

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
2 [报告]
发表于 2010-07-26 21:08 |只看该作者
1939union thread_union {
1940        struct thread_info thread_info;
1941        unsigned long stack[THREAD_SIZE/sizeof(long)];
1942};
从这里看内核栈与thread_info是共享空间的
.long init_thread_union+THREAD_SIZE应该计算的是变量 init_thread_union的起始地址与栈大小之和,即栈顶
不知道这里是不是 init_thread_union表示地址
因为在汇编里面一个符号或者标号表示地址
LZ可以自己写一段代码,里面定义一些变量,然后编译成汇编看一下,看看C中的变量名在汇编代码里是如何表示的

论坛徽章:
0
3 [报告]
发表于 2010-07-26 21:44 |只看该作者
回复 2# openspace


    我 google 了一下 init_thread_union 都被解释为地址 ,而init_thread_union+THREAD_SIZE 表示栈顶,就是不明白为什么 init_thread_union 表示地址呢?它可是个共用体变量啊!!

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
4 [报告]
发表于 2010-07-27 07:26 |只看该作者
看看AT&T汇编中对变量名的使用吧
可能在汇编代码中变量名对应的就是地址

论坛徽章:
0
5 [报告]
发表于 2010-07-27 13:31 |只看该作者
哎,还是不懂啊!求哪位知道的告诉小弟!急急急!!!!

论坛徽章:
0
6 [报告]
发表于 2010-07-27 21:32 |只看该作者
回复 4# openspace


    好像不是吧!

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
7 [报告]
发表于 2010-07-28 07:10 |只看该作者
回复 6# zd零

试验一下
  1. $ cat test.c
  2. int a = 1;

  3. int main(void)
  4. {
  5.         return 0;
  6. }
复制代码
gcc -s test.c得到test.s文件
  1. $ cat test.s
  2.         .file        "test.c"
  3. .globl a
  4.         .data
  5.         .align 4
  6.         .type        a, @object
  7.         .size        a, 4
  8. a:
  9.         .long        1
  10.         .text
  11. .globl main
  12.         .type        main, @function
  13. main:
  14.         pushl        %ebp
  15.         movl        %esp, %ebp
  16.         movl        $0, %eax
  17.         popl        %ebp
  18.         ret
  19.         .size        main, .-main
  20.         .ident        "GCC: (Ubuntu 4.4.1-4ubuntu8) 4.4.1"
  21.         .section        .note.GNU-stack,"",@progbits
复制代码
注意全局变量a的定义,在汇编中a对应一个label
具体忘了取其地址的语法,可能就是label_name

论坛徽章:
0
8 [报告]
发表于 2010-07-28 08:44 |只看该作者
回复 7# openspace


    万分感谢!谢谢!

论坛徽章:
0
9 [报告]
发表于 2010-07-28 12:31 |只看该作者
进程0 是哪个进程

论坛徽章:
0
10 [报告]
发表于 2010-07-28 13:20 |只看该作者
1. 进程0是所有其他进程的祖先, 也称作idle进程或swapper进程。

2. 进程0是在系统初始化时由kernel自身从无到有创建。(过程集中在start_kernel函数内)

3. 进程0的数据成员大部分是静态定义的,即由预先定义好的(如上)INIT_TASK, INIT_MM等宏初始化。



进程0的描述符init_task定义在arch/arm/kernel/init_task.c,由INIT_TASK宏初始化。 init_mm等结构体定义在include/linux/init_task.h内,为init_task成员的初始值,分别由对应的初始化宏如INIT_MM等初始化,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP