Linux Mdev 2015年07月08日 linux

    mdev官方的叫法是mini udev in busybox,mdev实际只是busybox的一个符号链接。执行mdev -s时会扫描/sys/class和/sys/block中的所有目录,如果目录中有名为dev的文件,就从中读取设备号,并利用设备号在/dev下面创建节点。

    启动时需要设置热插拔处理程序为mdev,当有热插拔事件产生时,内核调用mdev。 mdev通过环境变量ACTION和DEVPATH确定热插拔事件和影响目录,接着查看目录下是否有dev文件,并利用其信息创建/dev节点。如果ACTION为add,就会创建设备节点,如果为remove则删除设备节点。

    Linux DKMS 2015年07月06日 linux

    DKMS全称是Dynamic Kernel Module Support,它可以帮我们维护内核外的驱动程序,在内核版本变动之后可以自动重新生成新的模块。在使用dkms之前首先需要确保系统中已经安装了DKMS,在Ubuntu下可以执行下面这个命令安装。

    sudo apt-get install dkms
    

    Redhat安装指南 2015年07月05日 linux

    RHEL的全称为Red Hat Enterprise Linux,面向商业市场,红帽公司对每个版本提供10年的技术支持,大约三年才发布一个新版本。相比于其它Linux发行版,RHEL是收费才能使用的。 RHEL有三个发行版本, Client面向娱乐办公,Workstation面向开发程序,Server面向服务器。不论是哪个版本,在安装的时候都可以选择GUI软件包装上图形界面。

    Linux MMC Subsystem 2015年07月03日 kernel

    本文参考linux-4.2内核源代码进行讲述,侧重介绍软件结构,简要介绍协议。在介绍MMC子系统之前,先看一下MMC子系统在内核中的位置。 Linux内核系统的分层结构如下图所示。

    mmc-in-linux.png

    C语言笔记 2015年06月10日 language

    有些表达式的优先级和直觉相反,有些表达式看起来有二义从而难以确定应该怎么理解,出现二义时需要引入结合性来分析,下面列举几个建议添加括号说明的例子。

    if (flags & NEED_READ != 0)             // A
        read_data();
    
    r = hi << 4 + low;                      // B
    
    while (c = getc(in) != EOF)             // C
        putc(c, out);
    
    p = n * sizeof * q;                     // D
    
    apple = sizeof(int) * p;                // E
    

    Linux内核内存管理 2015年06月06日 kernel

    虚拟地址空间由CPU决定字长决定,按3:1将低地址部分分给用户空间,少的部分留给内核。

    内核将内核地址空间分为如下三个区:

    ZONE_DMA
    可以执行DMA操作
    ZONE_NORMAL
    即线性映射部分
    ZONE_HIGHMEM
    非永久性映射区

    内核部分的地址和物理内存可以直接关联,也就是线性映射。如果内核分到的物理地址比地址空间大,那么多余的部分就不能通过线性映射访问,这就是所谓的高端内存。而64位CPU由于其寻址空间非常大,就没有高端内存了。高端内存只对内核空间有影响,用户空间进程总是通过页表访问内存。

    Linux内核进程管理 2015年06月05日 kernel

    在Linux内核中用task_struct描述一个进程,也被称之为进程描述符。该结构体很大,在32位机上有17KB,之所以这么大,是因为要保存一个进程所需要知道的全部信息,如打开的文件,进程地址空间,信号,进程状态等等。进程描述符可以通过thread_info查找,对于向下生长的栈,这个结构保存在栈底,内核提供了一个接口current_thread_info()->task用于获取进程描述符。每个进程有一个进程编号,系统支持的最大进程编号可以通过文件 /proc/sys/kernel/pid_max查看。

    Linux内核文件系统 2015年06月04日 kernel

    在Linux中,一切对象皆文件,为了用户层面能够以比较一致的接口访问文件,提供了VFS,VFS简单来说就是一个转换功能,将上层命令,根据具体对象转发到对应的驱动去。

    虚拟文件系统是典型的面向对象方法设计出来的一个东西,包括四个重要类型:

    superblock
    用于表示一个挂载的文件系统,相当于文件系统总信息
    inode
    表示一个真正的文件
    dentry
    表示一个目录项,请不要和文件系统中的目录混淆,它只不过是路径中的一个节点而已
    file
    表示进程打开的文件,很显然多个进程可以打开同一个文件,所以可以有很多个file指向同一个inode

    Linux内核并发与同步 2015年06月03日 kernel

    硬件事件在不知道何时发生的情况下发生,因此要知道有没有事件发生,一种方式是CPU不断的去询问硬件,一种方式是发生之后硬件通知CPU。大多数情况下,由硬件去通知CPU是很好的处理方法,但是硬件在某些情况下密集发生事件时,采用询问更快,因为只要保证每次询问都能拿到消息,就可以省掉中断时间了。

    设备通过中断线关联到特定中断,中断线IRQ就是一个整数值。中断产生时由中断控制器将信号发送给CPU,CPU调用中断处理函数。中断处理函数是一个普通C函数,但是要求不能睡眠,并且要快速处理返回。因为中断会打断别的进程,所以必须要快,但是有时候又有很多事情要做,所以内核中引入了两半处理法,中断上半部做必要的标记,把真正麻烦的工作交给下半部,这样中断处理函数就可以快速返回了。

    Linux内核数据结构 2015年06月02日 kernel

    在Linux内核中经常用到的数据结构有链表、队列、映射和二叉树。这里介绍的链表包括双向链表和哈希链表,队列是内核提供kfifo。映射是idr,所谓idr就是根据整数查询指针。