linux 内核源代码结构及阅读代码

linux内核源代码位于/usr/src/linux/目录下
include/ 子目录包含了建立内核代码时所需的大部分包含文件(例如 #include<linux/types.h>),这个模块利用其他模块重建内核
 
init/ 子目录包含了内核的初始化代码,这是内核开始工作的起点。
 
arch/ 子目录包含了所有硬件结构特定的内核代码
 
drivers/ 目录包含了内核中所有设备驱动程序,如块设备
 
fs/ 目录包含所有文件系统的代码,如ext2,vfat模块
 
net/ 目录包含了内核的连网代码
 
mm/ 目录包含了所有的内存管理代码
 
ipc/ 目录包含进程间通信的代码
 
kernel/ 目录包含了主内核代码
 
整体式结构
核心服务 init/, kernel/, mm/, ipc/
 

阅读代码
 
1.linux系统的启动和初始化
    在基于Intel的系统上,当loadlin.exe 或 LILO把内核装入到内存并把控制权传递个内核时,内核开始启动。关于这一部分,看arch/i386/kernel/head.S(AT&T汇编), head.S进行特定结构的设置,然后跳转到init/main.c 的 main()例程
 
2.内存管理
    内存管理的代码主要在/mm, 但特定结构的代码在arch/*/mm。缺页中断处理的代码在mm/memory.c,而内存映射和页高速缓存器的代码在mm/filemap.c。缓冲器告诉缓存是在mm/buffer.c 中实现, 而交换高速缓存是在mm/swap_state.c 和 mm/swapfile.c 中实现。
 
3.内核
    内核中,特定结构的代码在arch/*/kernel, 调度程序在kernel/sched.c, fork的代码在kernel/fork.c, task_struct 数据结构在include/linux/sched.h 中
 
4.PCI
    PCI伪驱动在driver/pci/pci.c ,其定义 其定义在include/linux/pci.h。每一种结构都有一些特定的 PCI BIOS 代码, Intel的在arch/alpha/kernel/bios32.c。
 
5.  进程间通信
    所有System V IPC 对象权限都包含在 ipc_perm 数据结构中,这可以在  include/linux/ipc.h中找到。 System V 消息是在 ipc/msg.c中实现, 共享内存在 ipc/shm.c中,信号量在  ipc/sem.c中,管道在 ipc/pipe.c中实现。
 
6. 中断处理
    内核的中断处理代码是几乎所有的微处理器所特有的。中断处理代码在 arch/i386/kernel/irq.c中,其定义子在 include/asm-i386/irq.h中。
 
7. 设备驱动程序
        Linux内核源代码的很多行是设备驱动程序。Linux设备驱动程序的所有源代码都保存在/driver,根据类型可进一步划分为:
 
/block
    块设备驱动程序如ide(在ide.c)。如果你想看包含文件系统的所有设备是如何被初始化的,你应当看drivers/block/genhd.c中的device_setup(),device_setup()不仅初始化了硬盘,当一个网络安装nfs文件系统时,它也初始化网络。块设备包含了基于IDE和SCSI的设备。
 
/char
    这是看字符设备(如tty,串口及鼠标等)驱动程序的地方。
 
/cdrom
    Linux的所有CDROM代码都在这儿,如在这儿可以找到Soundblaster CDROM的驱动程序。注意ide CD的驱动程序是 ide-cd.c,放在drivers/block,SCSI CD的驱动程序是scsi.c,放在drivers/scsi。
/pci
    这是PCI伪驱动程序的源代码,在这里可以看到PCI子系统是如何被映射和初始化的。
 
/scsi
    在这里可以找到所有的SCSI代码及Linux所支持的scsi设备的所有设备驱动程序。
 
/net
    在这里可以找到网络设备驱动程序,如DECChip 21040 PCI 以太网驱动程序在tulip.c中。
 
/sound
    这是所有声卡驱动程序的所在地。
 
8. 文件系统
   EXT2 文件系统的源代码全部在  fs/ext2/ 目录下,而其数据结构的定义在  include/linux/ext2_fs.h, ext2_fs_i.h 及 ext2_fs_sb.h中。 虚拟文件系统的数据结构在 include/linux/fs.h中描述,而代码是在fs/*中。 缓冲区高速缓存与更新内核的守护进程的实现是在 fs/buffer.c中 。
 
8. 网络
    网络代码保存在/net中,大部分的include文件在include/net下,BSD套节口代码在net/socket.c中,IP 第4版本的套节口代码在net/ipv4/af_inet.c。一般的协议支持代码(包括sk_buff 处理例程)在net/core下,TCP/IP联网代码在net/ipv4下,网络设备驱动程序在/drivers/net下。
 
9. 模块
    内核模块的代码部分在内核中,部分在模块包中,前者全部在kernel/modules.c中,而数据结构和内核守护进程kerneld的信息分别在include/linux/module.h和include/linux/kerneld.h 中。如果你想看ELF目标文件的结构,它位于include/linux/elf.h中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值