system initialization conclusion

 init/main.c 中的start_kernel 函数的分析,这是2.6.5 内核的启动流程图:





比较重要的函数包括:kernel_thread(init)系统内核启动了新的内核线程,do_basic_setup()函数中有一个do_initcalls函数,还包括了网络sock_init初始化函数,

我们观察到两个比较重要的全局变量,initcall start ,initcall end。

从start开始到end, 我们调用了(*call) 函数,但是我们不知道(*call)函数到底是什么函数。

补充以后移走(NIC初始化的目的1.NICs need to be assigned anIRQ and to use it to call for the kernel's attention when needed 2.It is common for a driver to map an area of its device's memory (its configuration registers, for

example) into the system memory so that read/write operations by the driver will be made on system
memory addresses directly; this can simplify the code.)

当编译器编译整个源代码的时候,它会把所有定义为__init 的函数放在以__initcall_start开始、以__initcall_end 结束的节(session)中,在basic_init 中会逐个的调用该节里所有的函数。


网络初始化的顺序:

1 core_initcall:sock_init
2 fs_initcall:inet_init
3 subsys_initcall:net_dev_init

4 device_initcall:设备驱动初始化

设备驱动初始化是分别被core_initcall、fs_initcall、subsys_initcall 、device_initcall函数修饰的,根据前文对初始化section的描述,这四个函数放在不同的section,而且执行顺序是从1 到4,2.5.1 网络基础系统初始化的。

sock_init()此函数只是分配一些内存空间,以及创建了一个sock_fs_type 的文件系统。

网络内存管理:sk_buff见前面的内容。



网络文件系统的初始化:

1. static int init_inodecache(void)
2. {
3. sock_inode_cachep = kmem_cache_create("sock_inode_cache",
4. sizeof(struct socket_alloc),
5. 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT,
6. init_once, NULL);
7. ......//错误处理
8. return 0;
9. }
代码段 2-22 init_inodecache 函数
为文件系统准备 inode 缓存部分了。

首先是调用 register_filesystem(&sock_fs_type);把文件系统类型注册到file_systems 链表上,然后调用kern_mount(&sock_fs_type);把该文件系统注册到super_blocks 上。

网络协议的初始化:

fs_initcall 初始化宏修饰inet_init 函数。

关心的只是BSD 套接字接口,通过参数来指定所使用的套接字地址族。
Linux 内核中为了支持多个地址族, 定义了这么一个变量: static struct net_proto_family
*net_families[NPROTO],NPROTO 等于32,也就是说Linux 内核支持最多32 种地址族。不过目前已经
够用了,我们常用的不外乎就是PF_UNIX(1)、PF_INET(2)、PF_NETLINK(16),Linux 还有一个自
有的PF_PACKET(17),即对网卡进行操作的选项。它们都通过如下的结构来定义,这个结构没有太多
的成员:


tcp_v4_init( )和tcp_init( )的不同:前者什么都不做(即不在本书的讨论范围内),而后者才是用来初
始化TCP 协议需要的各项hash 表和sysctl_xxx 全局配置项的。
arp_init 完成系统neighbour 表的初始化。
ip_rt_init 初始化IP 路由表rt_hash_table,






                             图为: tcp_prot, udp_prot, raw_prot 结构














综上所述,我们可以推断出在本节初始化的过程中出现的各种重要的数据结构之间的关系了,正如
上图所示,从左往右看,是用户界面的角度,分别代表了标识一个套接字的三元组:<地址族,类型,具
体协议>,正好是调用socket 系统函数的3 个参数。通过内核中这3 个数据结构,我们就可以创建sock{}
结构。从右到左看,是内核中3 个重要的数据结构,从上到下分别是socket{}、sock{}、sk_buff{},正好
是数据流的连接通道。比如,发送报文时,数据会由socket{}通过相应的proto_ops{}把数据传给sock{},
sock{}又通过proto{}把数据传到sk_buff;反过来,当收到报文时,sk_buff{}通过net_protocol{}把数据传
www.Linuxidc.com
Linux2.6 协议栈源代码分析
第 58 页
给 sock{},后者又通过proto{}把数据传给socket{},socket{}最后把数据传给用户层。通过这几个重要的
数据结构和变量,大家是不是看出了所谓“栈”的模式?












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值