linux thread_info结构的疑问

xjgarchermind 2011-07-21 03:51:13
最近在研究linux内核设计知识,

由于以前一直没搞过linux,所以现在开始转入这领域 探索一下内核设计的奥秘,

struct thread_info{
struct task_struct * task;
struct exec_domain * exec_domain;
unsigned long flags;
__u32 cpu;
__s32 preempt_count;
mm_segment_t addr_limit;
u8 supervisior_stack[0];
};

看一下这个结构体的supervisior_stack声明,显然在这里u8 supervisior_stack[0];表示的就是
u8 * supervisior_stack;

可是设计者们为何没有这样用呢?

谁能解答一下吗?
...全文
311 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
z08053520 2012-05-03
  • 打赏
  • 举报
回复
thread_info 位于进程核心栈的最后,可以通过"thread_info对象->supervisior_stack"得到进程核心栈的栈顶地址




louyong0571 2011-07-21
  • 打赏
  • 举报
回复
学习了,O(∩_∩)O~
xjgarchermind 2011-07-21
  • 打赏
  • 举报
回复
恩 但是不知道的 一不小心
这样用
struct Node *p = (struct Node *)malloc(sizeof(struct Node ));
*(((struct Node * )p)->posOfStr) = 'a';
岂不是很危险嘛

(unsigned long)(((struct thread_info*)0)->supervisior_stack)
这一招我是从内核代码中刚看到的用法 觉得很牛
justkk 2011-07-21
  • 打赏
  • 举报
回复
通常这样用吧
char buf[1000];
struct Node *p = (struct Node *)buf;
xjgarchermind 2011-07-21
  • 打赏
  • 举报
回复
恩 这样看起来还有点道理 posOfStr和str用同一个基址 这样的话
(unsigned long)(((struct thread_info*)0)->supervisior_stack)应该可以得到thread_info结构体的大小了

按照这样的理解 假如结构如下
struct Node{
int data;
char posOfStr[0];
};
*(((struct Node * )p)->posOfStr) = 'a';

岂不越界的风险 应该是非法的操作吧
昵称很不好取 2011-07-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xjgarchermind 的回复:]

如果不占空间 那么有如何去存放一个地址呢?
[/Quote]
编译器会搞掂的
举个例子:
struct Node{
int data;
char posOfStr[0];
char str[32];
};
posOfStr的地址和str地址是一样的,有的时候会在内存池之类的东西中运用这种方法,减少空间的占用
xjgarchermind 2011-07-21
  • 打赏
  • 举报
回复
如果不占空间 那么有如何去存放一个地址呢?
昵称很不好取 2011-07-21
  • 打赏
  • 举报
回复
指针占用空间,这个不占用空间,且可以起到标识作用
有点柔性数组的意思
justkk 2011-07-21
  • 打赏
  • 举报
回复
猜测一下

应该是为了内存连续吧,u8信息可以直接跟在mm_segment_t addr_limit后面
如果使用u8 *,那么还需要另外一个空间存放u8信息,这个空间在堆上分配

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧