免费注册 查看新帖 |

Chinaunix

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

诚心求教,关于 thread_info结构体 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-02 20:24 |只看该作者 |倒序浏览
基于linux-2.6.23        /usr/src/linux-2.6.23.1/include/asm-x86_64/thread_info.h

struct thread_info {
    struct task_struct    *task;        /* main task structure */
    struct exec_domain    *exec_domain;    /* execution domain */
    __u32            flags;        /* low level flags */
    __u32            status;        /* thread synchronous flags */
    __u32            cpu;        /* current CPU */
    int             preempt_count;    /* 0 => preemptable, <0 => BUG */

    mm_segment_t        addr_limit;   
    struct restart_block    restart_block;
};

请教这个结构体中各个分量的具体含义以及作用,由于刚开始接触内核源码,很多东西不了解。
以下是我自己揣测的意思:
   struct task_struct    *task;   /*指向当前进程task_struct结构的指针*/
   struct exec_domain    *exec_domain;    /* 运行域??不太懂,求教*/
    __u32            flags;        /* flags译为标志?什么标志? */
    __u32            status;        /* 进程同步标志,同步的意思?*/
    __u32            cpu;        /* 当前cpu的值,指的是占用cpu的大小? */
    int             preempt_count;    /* 当前进程在调度时是否可抢占 */

    mm_segment_t        addr_limit;    /*这个表示地址的范围:0-0xBFFFFFFF代表用户进程地
                                                                    址,0-0xFFFFFFFF则代表的是内核进程的地址。*/   
    struct restart_block    restart_block;  /*重启动块?什么意思?*/


   望各位不吝指教,越详细越好,能够给出一些参考更好,谢谢。

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
2 [报告]
发表于 2009-11-02 22:42 |只看该作者

回复 #1 fantasticeb 的帖子

只知道几个字段

__u32            cpu;      
#  当前cpu编号,这个应该是对应与SMP来说的,内核管理中在进程调度或者数据访问时
# 都尽量在同一个CPU上,可能是想最近访问的数据就在与CPU最近的memory上吧,这样
# 进程执行时获取数据会快一些,内核中应该称为affinity,中文为亲密关系,应该就是
# 这个意思吧。有了这个值,进程调度的时候机会考虑这一点

struct exec_domain    *exec_domain;
# 这个可以看一下ULK3的20.3. Execution Domains
# 不过这个一直没有看明白,可能需要看一下ELF实现以及exec实现来看看有什么用处

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
3 [报告]
发表于 2009-11-02 22:53 |只看该作者

回复 #1 fantasticeb 的帖子

struct restart_block    restart_block;
# 这个可能与重新启动系统调用有关

看了一下select.c中的一段代码
869static long do_restart_poll(struct restart_block *restart_block)
870{
871        struct pollfd __user *ufds = restart_block->poll.ufds;
872        int nfds = restart_block->poll.nfds;
873        struct timespec *to = NULL, end_time;
874        int ret;
875
876        if (restart_block->poll.has_timeout) {
877                end_time.tv_sec = restart_block->poll.tv_sec;
878                end_time.tv_nsec = restart_block->poll.tv_nsec;
879                to = &end_time;
880        }
881
882        ret = do_sys_poll(ufds, nfds, to);
883
884        if (ret == -EINTR) {
885                restart_block->fn = do_restart_poll;
886                ret = -ERESTART_RESTARTBLOCK;
887        }
888        return ret;
889}

# 注意这里的ret == -EINTR
# 在系统编程中,如果返回该值可以重新尝试发起中断的系统调用
# 这里应该也是用作内部参数或者其他信息的记录的
# 这样当系统调用失败以后,记录下来,然后若是系统支持重启动系统调用
# 那么可以重新尝试一下
# 搜了一下,用到它的场合不多,可能与具体对应的系统调用的语义有关系
# 可以看一下APUE2的10.5. Interrupted System Calls
# 具体内核中的实现可以参考一下相关的POSIX语义,比如poll、select函数

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
4 [报告]
发表于 2009-11-02 23:04 |只看该作者

回复 #1 fantasticeb 的帖子

int             preempt_count;   
# 这个就是在内核态判断进程是否可以抢占
# 应该在获取一些锁或者禁止中断的时候都是不可抢占的
# 总的情况比较复杂,自己一直也没有完全搞明白
# 具体的可以看看ULK3的Chapter 5. Kernel Synchronization

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
5 [报告]
发表于 2009-11-02 23:14 |只看该作者

回复 #1 fantasticeb 的帖子

__u32            flags;        /* low level flags */
# 这个标志比较多,你可以注意一下thread_info.h文件
# 它里面定义了大量标志常量,而且也定义了一些
# 操作该字段的宏或者函数
# 那些标志常量可以从字面猜测它们的意思

__u32            status;
# 这个也是类似,头文件中也定义了一些常量



===============================
只能说这么多了,我是一边看一边推测的
不一定准确,仅作参考吧
具体这些常量什么的都比较复杂,你可以留个记号,
以后读代码遇到哪些标志啊回过头看看

[ 本帖最后由 openspace 于 2009-11-2 23:19 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-11-02 23:42 |只看该作者
感谢openspace的热心回答,我也是看着英文推测意思的。刚开始,没有足够的代码阅读量,不过我会努力的,再次感谢

[ 本帖最后由 fantasticeb 于 2009-11-2 23:44 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-11-03 20:41 |只看该作者

回复 #2 openspace 的帖子

你说的ULK3指的是哪本书?

论坛徽章:
381
CU十二周年纪念徽章
日期:2014-01-04 22:46:58CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52CU大牛徽章
日期:2013-03-14 14:08:55CU大牛徽章
日期:2013-04-17 11:17:19CU大牛徽章
日期:2013-04-17 11:17:32CU大牛徽章
日期:2013-04-17 11:17:37CU大牛徽章
日期:2013-04-17 11:17:42CU大牛徽章
日期:2013-04-17 11:17:47CU大牛徽章
日期:2013-04-17 11:17:52CU大牛徽章
日期:2013-04-17 11:17:56
8 [报告]
发表于 2009-11-03 21:05 |只看该作者

回复 #7 sairy 的帖子

OREILLY-Understanding_The_Linux_Kernel

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
9 [报告]
发表于 2009-11-12 15:23 |只看该作者
今天看Professional Linux Kernel Architecture第2章
2.4.1下的Copying Processes那一节对thread_info有些介绍
LZ可以看看,好像这本书其他地方也有讲解,刚开始看,还不太熟悉,LZ可以自己翻翻

论坛徽章:
0
10 [报告]
发表于 2009-11-20 18:03 |只看该作者
原帖由 openspace 于 2009-11-2 23:04 发表
int             preempt_count;   
# 这个就是在内核态判断进程是否可以抢占
# 应该在获取一些锁或者禁止中断的时候都是不可抢占的
# 总的情况比较复杂,自己一直也没有完全搞明白
# 具体的可以看看ULK3的 ...


这个preempt_count是比较复杂
0-7:抢占计数器
8-15:软中断计数器
16-27:中断计数器
28:PREEMPT_ACTIVE标志
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP