配色: 字号:
Linux内核分析
2014-09-19 | 阅:  转:  |  分享 
  
内核模块开发及加载解析未定位symbol系统已加载模块符号表,定位要加载模块中未定位的符号。如果要加载模块中所有符号得到解析,则模
块加载成功,否则失败。内核模块开发及加载内核模块加载1、加载模块至用户空间。2、将模块中未定位的符号进行重定位。3、建
立module数据结构,并预定所需系统空间。4、将模块从用户空间装入系统空间,并注册模块接口,建立内核同模块的链接。内核
模块开发及加载sys_query_module查找系统符号表。内核模块开发及加载sys_create_module创
建内核映像内核模块开发及加载sys_init_module加载模块映像至系统空间,注册模块接口。内核模块开发及加载内
核模块开发1、module_init(fn) 实现初始化fn,fn的功能是初始化并注册。Module_init将fn放入对象文
件的.initcall.init区,在系统加载中将调用这个接口。2、module_exit(fn) 实现退出fn,fn的
功能是退出注销。内核模块开发及加载内核模块开发module_exit将fn放入对象文件的exitcall.exit,当卸载
模块时,调用这个接口。3、EXPORT_SYMBOL输出变量或接口,供其他模块访问。EXPORT_SYMBOL将变量及
接口放入对象文件的.kstrtab区,只有对象文件的.kstrtab内核模块开发及加载内核模块开发可供访问及链接。内核
模块开发注意1、在同一内核版本下进行编译。2、编译时试着不加入版本信息。3、只引用内核及其他模块的接口及变量,不要使用库中
资源。64位开发int和指针32位系统:int:32位指针:32位64位系统:int:32位指针:64位
64位开发int和long32位系统:int:32位long:32位64位系统:int:32位long:
64位64位开发符号扩展structfoo{unsignedintbase:19,rehash:13;};
structfooa;unsignedlongaddr;a.base=0x40000;addr=a.base
<<13;/符号扩展/printf(“addr0x%lx\n”,addr);addr=(unsigned
int)(a.base<<13);/无符号扩展/printf("addr0x%lx\n",addr);64位
开发符号扩展32位下结果:addr0x80000000addr0x8000000064位下结果:addr0xff
ffffff80000000addr0x8000000064位开发调整structure在32位系统中根据ABI32标
准,long,指针以32位对齐。在64位系统中根据ABI64标准,long,指针以64位对齐。64位开发调整str
ucturestructbar{ inti; longj;//64位对齐,前面pad4字节 intk; ch
arp;//64位对齐,前面pad4字节};sizeofbar=32//64位系统sizeofbar=24
//32位系统64位开发检查uniontypedefunion{ double_d; long_l[2];}
llx_t;?typedefunion{ double_d; int_l[2];}llx_t;
文件系统Dentry和inodeInode中包含了对文件或目录的操作集合。文件系统文件系统的实现1、实现对su
perblock的操作和解释。Superblock的位置是固定的,从存储介质1K开始的1K字节。Superblock
中的magic字段表明是什么文件系统。2、实现对目录操作.3、实现对文件操作.文件系统Superblock操作rea
d_super:读取并解释superblock.write_super:写superblock.read_inode,
write_inode:读写inode.文件系统对文件操作open:文件打开。read:文件的读。write:
文件的写。lseek:文件定位。….文件系统对目录操作mkdir:建立目录。rmdir:删除目录。link:
建立链接。unlink:删除链接。mknod:建立设备节点。文件系统EXT2文件系统分析EXT2文件系统在硬盘上
的分布文件系统Superblock(从1024字节开始)BlockdescriptorBlockbitmapIno
debitmapInodetable…….BlockbitmapInodebitmap文件系统Inodeta
ble……文件系统EXT2文件系统硬盘空间被分为以块为单位。(1k或4k)块被分为组。每组分配inode数。文件
系统文件系统和块设备的接口getblk块设备驱动程序块设备驱动接口(block_device_operations)op
enreleaseioctlcheck_media_change块设备驱动程序Open打开设备接口,对于块设备,
如无硬件的开启工作,则一般是增加使用计数。Release关闭设备接口,如无硬件的关闭工作,则是减少使用计数。Ioctl
块设备IO控制接口,如获取块设备大小,获取设备分区信息等。块设备驱动程序check_media_change一般用于可热
插拔设备。块设备的输入输出接口呢?块设备驱动程序与系统接口的例程中没有输入输出接口,系统如何与驱动程序打交道呢。块设备驱
动程序的特点:数据的输入是主动的,即如果不请求则无数据输入。块设备驱动程序块设备数据输入接口块设备中断例程。requ
est_irq注册设备中断。块设备驱动程序块设备输出接口块设备驱动的输出接口是由块设备的队列实现的。blk_dev_s
truct每个块设备都有一个blk_dev_struct结构,这个机构中最重要的是设备的请求队列,request_queue
_t。块设备驱动程序设备请求队列。request_queue_t请求队列中包含的要素:读请求数据包队列。写请求数据包队
列。请求处理函数接口。向后合并接口。向前合并接口。合并请求接口。块设备驱动程序设备请求队列构造请求包接口。数据请
求包用于块设备读写请求。请求读写的设备。读写设备的开始地址。读写设备的大小。块设备驱动程序数据请求包数据缓冲区地址。
块设备驱动相关的全局变量gendisk:包含设备的名字,major,分区,每个分区的大小…blksize_size
:块设备驱动程序块设备驱动相关的全局变量块设备的块大小。hardsect_size:块设备的扇区大小。blk_size
:块设备大小。max_sectors:块设备读写的最大扇区数。块设备驱动程序块设备驱动程序初始化初始化设备队列(输出接
口)。 分配数据请求包缓冲区。 注册数据请求接口,合并接口…初始化gendisk结构。 将驱动程序的gendisk链接到
系统的gendisk_array结构中。块设备驱动程序块设备驱动程序初始化初始化设备的块大小blksize_size,扇区
大小hardsect_size,最大读取扇区数max_sectors注册块设备中断(设备输入接口)request_irq注
册块设备,register_disk.块设备驱动程序块设备中断处理例程b_end_io块设备请求队列合并请求(向前合
并,向后合并)电梯算法。生成请求数据包。发送数据请求。内核线程和系统同步内核线程内核线程的特点:共享系统栈无私有
栈空间运行于系统空间clone()调用生成执行内核函数,而不是可执行映像文件内核线程和系统同步系统栈系统栈空间:8
K,连续的两个页面Task_struct内核线程和系统同步ForkVforkClone内核线程和系统同步系统
同步机制Spin_lockspin_lock不释放cpu资源,用于smp下。关闭中断的spin_lockSpin_loc
k读Spin_lock写内核线程和同步机制关中断,开中断用于保护和中断例程的共享资源cliSti系统线程和同步机制
信号量同步共享资源Down占有共享资源会引起进程调度,并释放cpu资源Up释放共享资源系统线程和同步机制原子
操作锁总线,并对共享资源操作原子加atomic_add原子减atomic_sub内核模块开发及加载内核模块内核模块
是经过编译,但为经过链接的.o文件。内核模块的加载简单说就是两个问题:1、内核模块链接内核的符号。2、内核链接内核模块的符
号。内核模块开发及加载ELF文件格式内核模块是.o文件,未链接的文件,.o文件的ELF文件格式:ElfHeaderP
rogramHeaderTable(option)Section1…..SectionN…..SectionHeade
rTable内核模块开发及加载ELF文件格式模块加载的重点既是分析ELF文件中symbolsection中未能解析的sy
mbol。解析未定位symbol内核模块调用了内核的函数,访问了内核的数据,调用了其他模块的函数,访问了其他模块的数据
。但是没有链接,所以加载程序的任务就是查找内核符号表,查找Linux内核分析Linux引导和初始化Linux引导简述
Linux初始化(head.S)0~0xfff0x1000~0x9ffff0xa0000~0xbffff0
xc0000~0xc7fff0xf0000~0xfffff0xc8000~0xdffffLinux引导和初始化0
~0x1000:BIOS0xa0000~0xbffff:VideoRAM0xc0000~0xc7fff:Vi
deoROM0xc8000~0xdffff:ExtensionROM0xf0000~0xfffff:Syste
mROM内核映像驻存在:0x100000~Linux引导和初始化段寄存器初始化CS,DS,ES,SS保护模
式初始化EnableMMU映射0x0~0x800000?0xc0000000~0xc0800000.根据ABI
386标准,系统空间从0xc0000000开始。内存管理Linux虚拟空间结构0xc0000000~0xf7ffffff
(系统空间)用户空间(低3G空间)用户空间(低3G空间)用户空间(低3G空间)内存管理0xc0000
000~0xf7ffffff:系统空间,896M0xf7ffffff~0xffffffff:用于vmalloc,
128M内存管理系统空间初始化E820中断获取RAM资源系统初始化物理空间0~896M构造内存页面位图,用于初始阶
段的内存分配。内存管理MMU0x0~0x38000000?0xc0000000~0xf8000000页面大小=
4K32位地址:22bit~31bit:页目录索引12bit~21bit:页面索引0bit~11bit:
页内位移内存管理MMU01….1023….….01…..102301….1023内存管理分配
页结构系统中每个物理页面相应有一个物理页结构。每个页结构对应物理的一个页面。内存管理Zone管理系统空间被分为3个zon
e.DMA:0~16M(0xc0000000~0xc0100000)NORMAL: 16M~896M(0xc
0100000~0xf8000000)HIGHMEMORY:896M以上内存管理Zone页面管理zone中的页面是
按着buddy算法管理。什么是buddy算法?Buddy算法管理的页面:从1个至512个连续页面。内存管理系统空间
DMA区(按buddy算法管理1~512个连续页面)NORMAL区(按buddy算法管理1
~512个连续页面)HIGHMEM区(按buddy算法管理1~512个连续页面)内存管理Slab高速缓存什么
是slab?Slab和高速缓存关系。如何利用高速缓存。(染色算法)什么是染色算法。内存管理通用slab32字节~1
28k字节专用slabprocslabcache.Vfsslabcache.……内存管理系统内存管理结构
DMAZONEBuddy结构slabNORMALZONEBuddy结构slab
HIGHMEMZONEBuddy结构内存管理建立私有slabcachekmem_cache_crea
te功能:建立slabcache参数:name:slabcache名字。Size:slab对象大小,对象大小小
于32个页面(128k)Offset:页面偏移量。Flags:对齐属性Ctor:对象创建函数Dtor:对象释放函数
,为空返回值:slabcache管理区,即kmem_cache_s结构。内存管理从私有slab管理区中分配slab对
象kmem_cache_alloc功能:从slab中分配一个对象参数:cachep:slabcache管理结构,
即mem_cache_s.flag:建立slabflag返回值:slab中的对象。内存管理释放私有slab对象_
_kmem_cache_free功能:释放slab队列中对象。参数:cachep:slabcache管理区objp:
释放对象。内存管理从通用slabcache中分配对象Kmalloc功能:从通用SLAB队列中分配空间参数:siz
e:空间大小(32~128K)flag:分配flag,如果为DMA,从通用SLAB的DMA队列中分配。内存管理
释放通用slabcache对象Kfree功能:释放通用slab对象参数:objp:释放的对象。内存管理从bu
ddy管理区中分配页面__get_free_pages功能:分配页面参数:gfp_mask:分配策略,即从DMA,
NORMAL,或HIGHzone分配页面。Order:分配页面的大小,2的幂,小于10。内存管理释放分配的页面
__free_pages功能:释放页面参数:page:释放的页面。Order:页面大小,2的幂。内存管理虚拟地
址转换为物理地址__pa(addr)addr–0xc0000000物理地址转换为虚拟地址__va(addr)a
ddr+0xc0000000文件系统VFS和文件系统VFS是虚拟的文件系统,提供给用户和特定文件系统统一接口。文件
系统VFS和文件系统VFSEXT2EXT3UFSFAT文件系统文件系统的操作1、对superblock的操作
2、对目录的操作3、对文件的操作文件系统Dentry和inodedentry在物理上是不存在的,dentry代表文件名,目录名。Inode在物理上是存在的,在存储介质上存在,代表文件,目录在存储介质上的存储结构。目录也是文件,包含目录名和文件名。文件系统Dentry和inode由于链接的引入,一个inode可能对应几个dentry.Eg:touchtestln–stest1testln–stest2test文件系统Dentry和inodeDentrytextDentrytext1Dentrytext2inodetext文件系统Dentry和inode查找文件:如/usr/tmp/test查找usr的dentry,根据dentry中的inode,得到/usr目录在存储介质上的位置,读取/usr目录,从/usr目录中查找tmp的inode信息,在系统中创建/usr/tmp的dentry,从/usr/tmp的inode信息中读取/usr/tmp目录,查找test。
献花(0)
+1
(本文系海漩涡首藏)