Snowdream
posts - 403, comments - 310, trackbacks - 0, articles - 7
BlogJava
::
首页
::
新随笔
::
联系
::
聚合
::
管理
读核笔记(1) - 内核模块
Posted on 2008-02-07 11:22
ZelluX
阅读(558)
评论(3)
编辑
收藏
所属分类:
System
include/linux/module.h
struct module:
struct
module
{
//
用于在用户空间传入module对象时判断传入的结构是否有效
unsigned
long
size_of_struct;
/**/
/*
== sizeof(module)
*/
struct
module
*
next;
//
指向本module的名称,通常内核空间里申请的name内存位置都是紧跟在module{}结构后面的
const
char
*
name;
//
本module{}结构的空间 + 紧接着这段内存申请的归module{}结构使用的一部分空间
//
size = sizeof(struct module) + sizeof(misc data)
unsigned
long
size;
//
模块引用计数器,还没搞清楚这里的pad是干什么用的
//
i386中atomic_t的定义: typedef struct { volatile int counter; } atomic_t;
union
{
atomic_t usecount;
long
pad;
}
uc;
/**/
/*
Needs to keep its size - so says rth
*/
//
模块当前状态,已初始化/运行中/被移除/被访问过等
unsigned
long
flags;
/**/
/*
AUTOCLEAN et al
*/
//
定义的内核模块符号数
unsigned nsyms;
//
引用的模块链表节点数,遍历模块依赖性时使用
unsigned ndeps;
//
符号表
struct
module_symbol
*
syms;
//
记录依赖的其他模块的数组
struct
module_ref
*
deps;
//
记录引用该模块的其他模块的数组
struct
module_ref
*
refs;
//
初始化和删除模块时调用的函数指针
int
(
*
init)(
void
);
void
(
*
cleanup)(
void
);
//
中断向量表的入口和结束位置
const
struct
exception_table_entry
*
ex_table_start;
const
struct
exception_table_entry
*
ex_table_end;
#ifdef __alpha__
unsigned
long
gp;
#endif
/**/
/*
Members past this point are extensions to the basic
module support and are optional. Use mod_member_present()
to examine them.
*/
//
这两个指针维持一些模块相关信息,方便卸载后再次装载模块时的配置
const
struct
module_persist
*
persist_start;
const
struct
module_persist
*
persist_end;
int
(
*
can_unload)(
void
);
int
runsize;
/**/
/*
In modutils, not currently used
*/
const
char
*
kallsyms_start;
/**/
/*
All symbols for kernel debugging
*/
const
char
*
kallsyms_end;
const
char
*
archdata_start;
/**/
/*
arch specific data for module
*/
const
char
*
archdata_end;
const
char
*
kernel_data;
/**/
/*
Reserved for kernel internal use
*/
}
;
struct module_symbol:
保存目标代码中的内核符号,读取文件装入模块时通过这个数据结构将里面包含的符号信息读入。
struct
module_symbol
{
unsigned
long
value;
//
入口地址
const
char
*
name;
//
内核符号名称
}
;
struct module_ref:
注意这里dep和ref记录的不对称,应该可以看成是一个ref链表吧
module{} 中的deps数组分别指向了各个依赖的module_ref{}
struct
module_ref
{
struct
module
*
dep;
/**/
/*
"parent" pointer
*/
struct
module
*
ref
;
/**/
/*
"child" pointer
*/
struct
module_ref
*
next_ref;
}
;
struct kernel_sym:
在sys_get_kernel_syms()中用到的结构,该函数将内核符号拷贝到用户空间的kernel_sym{}中,从而可以在用户态存放模块信息。
struct
kernel_sym
{
unsigned
long
value;
//
内核符号地址
char
name[
60
];
/**/
/*
should have been 64-sizeof(long); oh well
*/
}
;
module.c中的一些函数先略去了,书上蛮详细的
模块的加载和卸载
insmod的任务:
从命令行中读入模块名,确定代码所在文件的位置
计算需要的内存
执行系统调用create_module(),传递新模块的名称和大小
用QM_MODULES获得所有已经链接模块的模块名
用QM_SYMBOL获得内核符号表和已经链接到内核的模块的符号表
使用这些信息重新定位该模块文件中的代码
在用户空间分配内存,拷贝相关信息
调用sys_init_module(),传递上面创建的用户态的内存区地址
释放用户态内存,结束
rmmod的任务:
用QM_MODULES和QM_REFS取得已经链接的模块列表和依赖关系
调用delete_module
评论
#
re: 读核笔记(1) - 内核模块
回复
更多评论
2008-02-07 14:27 by
Lee.MaRS
// 模块引用计数器,还没搞清楚这里的pad是干什么用的
// i386中atomic_t的定义: typedef struct { volatile int counter; } atomic_t;
union
{
atomic_t usecount;
long pad;
} uc; /**//* Needs to keep its size - so says rth */
看它这里的注释,似乎是为了保证sizeof(uc)至少为sizeof(long)
#
re: 读核笔记(1) - 内核模块
回复
更多评论
2008-02-07 14:33 by
ZelluX
@Lee.MaRS
哦,保证这个有什么用呢?对齐时方便吗?
#
re: 读核笔记(1) - 内核模块
回复
更多评论
2008-02-08 22:55 by
Lee.MaRS
@ZelluX
除了对齐我也想不出还有什么别的用了
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
Finding and Reproducing Heisenbugs in Concurrent Programs
Xen Notes [1]
几个并行计算、内核相关的链接
OS Lab 零散记录
OSLab之中断处理
最近读的两篇paper
Anti-CAPTCHA
读核笔记(6) - 虚拟存储
Patching CVE-2008-0600, Local Root Exploit
[zz]LKM Rootkits on Linux x86 v2.6
Powered by:
BlogJava
Copyright © ZelluX
日历
<
2008年2月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1
2
3
4
5
6
7
8
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(21)
给我留言
查看公开留言
查看私人留言
随笔分类
(390)
Algorithm(57)
C/C++(39)
Courses(15)
Economics(2)
Laboratory(25)
Linux(47)
Mathematics(12)
OOP(89)
Scripting(19)
Security(3)
System(28)
Web(10)
书、电影、音乐(11)
其他(14)
点滴(19)
随笔档案
(389)
2009年12月 (1)
2009年4月 (1)
2009年3月 (4)
2009年2月 (2)
2009年1月 (2)
2008年11月 (1)
2008年10月 (9)
2008年9月 (1)
2008年7月 (2)
2008年6月 (4)
2008年5月 (12)
2008年4月 (18)
2008年3月 (7)
2008年2月 (33)
2008年1月 (19)
2007年12月 (8)
2007年11月 (14)
2007年10月 (24)
2007年9月 (18)
2007年8月 (28)
2007年7月 (33)
2007年6月 (26)
2007年5月 (30)
2007年4月 (92)
文章档案
(7)
2007年7月 (2)
2007年5月 (4)
2007年4月 (1)
相册
Illustration
15ers
jonathan的BLOG
Right There...
宙斯鱼的小鱼缸
小鲍的世界
简单幸福
逃遁的Persephone
阿缪尔的锦瑟
风之语的BLOG
友情链接
(04CS) ljh
(05CS) 小菜虎的窝
(06CS) FreePeter
(06SS) Overboming
(06SS) Sherry
(06SS) 十指飞扬
(06SS) 银色子弹
luohandsome的专栏
平淡是真——啃啃不老阁
收藏夹
[ADN.cn]Library
Debian学习笔记
Dictionary of Algorithms and Data Structures
Gollum
Lex&Yacc
Max On Java
techInterview Discussion
核桃仁
程序员面试题精选100题
铁手
搜索
积分与排名
积分 - 334683
排名 - 168
最新随笔
1. 新博客
2. 慎用xen的make world...
3. 内存模型相关的资料
4. 安全方面的经典论文:A Logic of Authentication
5. Lock-Free 算法的几个链接
6. 10 Papers Every Programmer Should Read
7. PieTTY中按Ctrl+S导致挂起的问题解决
8. Finding and Reproducing Heisenbugs in Concurrent Programs
9. Ubuntu 8.10 浏览网页不稳定的解决方法
10. [zz]苏南经济模式兴衰亲历记
最新评论
1. re: C/C++中的序列点
说的太好了,解决我长久的困扰!
--除美灭日平韩
2. re: 原来GCC是支持尾递归的递推优化的
评论内容较长,点击标题查看
--darkhorse
3. re: Arch下配置samba服务
我按照你的方法,安装了SAMBA,但是 /etc/rc.d/samba start 启动不了samba服务。提示不存在这个文件或目录的,怎么办?
--zhangbear
4. re: [zz]LKM Rootkits on Linux x86 v2.6
rhel 5 系列 安装了 Xen 内核, 怎么rootkit xen kernel 呢?
--消息
5. re: CLRS 习题 16.2-6 部分背包问题的O(n)算法
@ynnej
T(n)=2T(n/2)+O(n) 才是 nlgn 注意其中有一个2
--荒废庭院
阅读排行榜
1. [zz]vim+ctags+taglist插件安装使用(18305)
2. memcpy函数代码分析(9372)
3. [zz]Zotero与Endnote的互相导入(8760)
4. BNF 文法 (1) - 语法树 | 二义性的解决(8228)
5. Java泛型中的? super T语法(6557)
评论排行榜
1. C# 学习笔记 (1)(14)
2. Windows - QQ、网页Flash视频无声音的解决方法(14)
3. URAL 1011(10)
4. 《编程之美》上的一道题目的讨论(8)
5. Singleton模式与双检测锁定(DCL)(7)