Linux内核实践

内核版本:2.6.34

接上篇《添加网络协议》。

为了用户方便查看brcm设备的工作状态,使用proc文件系统是很好的方 式。一个网络协议模块可以注册到网络空间中register_pernet_subsys(),这个函数会为子空间分配一个id号,通过id可以在网 络空间中找到分配给该子空间的内存:init_net->gen->ptr[id - 1]。而我们正是利用这块内存去存储proc中的相关信息 :struct brcm_net,它记录了brcm设备在proc文件系统中的位置。

struct brcm_net {
    /* /proc/net/brcm */
    struct proc_dir_entry *proc_brcm_dir;
    /* /proc/net/brcm/config */
    struct proc_dir_entry *proc_brcm_conf;
};

在加载brcm模块时会注册子空间,brcm_init_net创建在proc中的相关项,并记录路径在brcm_net中; brcm_exit_net删除在proc中的相关项;brcm_net_id记录分配给子空间的id,这样通过init_net->gen->ptr[brcm_net_id - 1]就可以操作brcm_net了。

err = register_pernet_subsys(&brcm_net_ops);
static struct pernet_operations brcm_net_ops = {
    .init = brcm_init_net,
    .exit = brcm_exit_net,
    .id = &brcm_net_id,
    .size = sizeof(struct brcm_net),
};

注意到在brcm_init_net和brcm_exit_net中添加和删除的仅仅是/proc/net/brcm目录和config文件,而在使用中 brcm设备是可以动态创建的,因此这部分代码应该发生在添加和删除brcm设备时,而不是在brcm模块注册和删除时。最简单的是 直接添加在register方法或unregister方法中,但内核提供了更好的机制:事件,将对proc的操作分离出来,因为proc的操作实 际上属于附加的操作而不是必须的操作。下面就来看event机制。

前面几篇已经有描述过event机制,这里的事件都是关于设 备的事件,使用的是register_netdevice_notifier()来,注册notifier到netdev_chain链表上。在加载brcm模块时注册 notifier,brcm_notifier_block包含了brcm设备对所关心的事件作出的反应。

err = register_netdevice_notifier

(&brcm_notifier_block);
static struct notifier_block brcm_notifier_block __read_mostly = {
    .notifier_call = brcm_device_event,
};

设备对哪些事件会感兴趣,首先,brcm设备对注册和注销是感兴趣的,要操作proc文件系统;其次,对于发往brcm 下层设备的事件,要考虑这些事件造成的连带影响(比如eth1被down掉,则其上的brcm设备也应该被down掉),一般是下层设备的 事件对其上的所有brcm设备都进行相应操作。

所以在brcm_device_event有两类进入的设备dev会进行操作,一类是brcm设备 ,它仅仅是操作proc文件系统。判断是否为brcm设备,是的话则由__brcm_device_event() 处理。

if (is_brcm_dev(dev))
    __brcm_device_event(dev, event);     

static void __brcm_device_event(struct net_device *dev, unsigned long event)
{
    switch (event) {
    case NETDEV_CHANGENAME:
        brcm_proc_rem_dev(dev);
        if (brcm_proc_add_dev(dev) < 0)
            pr_warning("BRCM: failed to change proc name for %s\n",
                    dev->name);
        break;
    case NETDEV_REGISTER:
        if (brcm_proc_add_dev(dev) < 0)
            pr_warning("BRCM: failed to add proc entry for %s\n",
                    dev->name);
        break;
    case NETDEV_UNREGISTER:
        brcm_proc_rem_dev(dev);
        break;
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索dev
, 文件
, struct
, 事件
, 设备
proc
linux内核编程实践、jquery内核详解与实践、linux内核、深入理解linux内核、linux内核学习路线,以便于您获取更多的相关知识。

时间: 2024-12-22 15:52:32

Linux内核实践的相关文章

Linux内核实践之工作队列【转】

转自:http://blog.csdn.net/bullbat/article/details/7410563 版权声明:本文为博主原创文章,未经博主允许不得转载.        工作队列(work queue)是另外一种将工作推后执行的形式,它和tasklet有所不同.工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行.这样,通过工作队列执行的代码能占尽进程上下文的所有优势.最重要的就是工作队列允许被重新调度甚至是睡眠.          那么,什么情

Linux内核实践之tasklet机制【转】

转自:http://blog.csdn.net/bullbat/article/details/7423321 版权声明:本文为博主原创文章,未经博主允许不得转载. 作者:bullbat          源代码分析与原理部分参见前面的文章linux中断延迟之tasklet,这里我们看看他的使用,和前面介绍的工作队列.等待队列等相同,声明采用两种方法,我们在init函数中直接采用tasklet_schedule(&my_tasklet);调度,内核中的实现很简单: void __tasklet_

十天学Linux内核之第一天---内核探索工具类

原文:十天学Linux内核之第一天---内核探索工具类 寒假闲下来了,可以尽情的做自己喜欢的事情,专心待在实验室里燥起来了,因为大二的时候接触过Linux,只是关于内核方面确实是不好懂,所以十天的时间里还是希望能够补充一下Linux内核相关知识,接下来继续待在实验室里想总结一下Linux内核编程,十天肯定完全掌握不了Linux内核,这里我也只是把自己认为不是很好懂并且很重要的难点疑点写出来,和大家一起分享,希望大家改正互相学习. Linux的具体概述这里就不多说了,今天主要讲的是Linux内核中

《Linux设备驱动开发详解 A》一一3.1 Linux内核的发展与演变

3.1 Linux内核的发展与演变 Linux操作系统是UNIX操作系统的一种克隆系统,是一种类UNIX操作系统,诞生于1991年10月5日(第一次正式向外公布的时间),起初的作者是Linus Torvalds.Linux操作系统的诞生.发展和成长过程依赖着5个重要支柱:UNIX操作系统.Minix操作系统.GNU计划.POSIX标准和Internet. 1.?UNIX操作系统 UNIX 操作系统是美国贝尔实验室的Ken. Thompson和Dennis Ritchie于1969年夏在DEC P

解决 Linux 内核代码审查人员短缺问题

操作系统安全是现在最重要的事情,而 Linux 则是一个主要被讨论的部分.首先要解决的问题之一就是:我们如何确定提交到上游的补丁已经进行了代码审核? Wolfram Sang 从 2008 年开始成为一名 Linux 内核开发者,他经常在各地召开的 Linux 峰会上发表讲话,比如在 2016 年柏林 Linux 峰会,他提出了如何提高内核开发实践的想法. 让我们来看看他的观点. 在 2013 年的时候,你曾在爱丁堡(Edinburgh)提醒 ELCE 委员会,如果不作出改变,那么子系统的潜在问

Linux 内核将于10月5号迎来24周岁生日:代码已达1900万行

自0.01版本发布以来,Linux内核已经历了24个年头.在接近1/4个世纪的时间里,它已经变得越来越强大,在世界上的扩张也不曾止步.Linus Torvalds表示,自己在1991年8月25日的时候从事了某个小软件的工作,并于同年10月5日发布了它.尽管距离其确切"生日"还有几天的时间,但这并不影响我们分享一些有关Linux内核的一些趣事. 时至今日,Linux内核已经变得相当巨大,其中包含了超过1900万行代码(最初只有1万行左右),超过12000人为内核开发作出了贡献--这也使得

戴文的Linux内核专题:21 配置内核 (17)

你好!这篇文章会覆盖不同的驱动. 首先"virtio console"是一种用于hypervisors的虚拟控制台驱动. "IPMI top-level message handler"是用于IPMI系统的消息管理器.IPMI代表的是"Intelligent Platform Management Interface"(智能平台管理系统).IPMI是一种不需要shell通过网络管理系统的接口. "/dev/nvram support&q

解析Linux内核的基本的模块管理与时间管理操作---超时处理【转】

转自:http://www.jb51.net/article/79960.htm 这篇文章主要介绍了Linux内核的基本的模块管理与时间管理操作,包括模块加载卸载函数的使用和定时器的用法等知识,需要的朋友可以参考下   内核模块管理Linux设备驱动会以内核模块的形式出现,因此学会编写Linux内核模块编程是学习linux设备驱动的先决条件. Linux内核的整体结构非常庞大,其包含的组件非常多.我们把需要的功能都编译到linux内核,以模块方式扩展内核功能. 先来看下最简单的内核模块 ? 1

使用 ftrace 调试 Linux 内核【转】

转自:http://blog.csdn.net/adaptiver/article/details/7930646 使用 ftrace 调试 Linux 内核,第 1 部分 http://blog.csdn.net/tommy_wxie/article/details/7340701 简介: ftrace 是 Linux 内核中提供的一种调试工具.使用 ftrace 可以对内核中发生的事情进行跟踪,这在调试 bug 或者分析内核时非常有用.本系列文章对 ftrace 进行了介绍,分为三部分.本文