读《怎么样阅读一本书》| 做积极阅读的人

1.当我们每一趟插入u盘后,都会活动创键U盘的设备节点/dev/sda%d

推介本书

这是因为其中调用了device_create()实现的, busybox的mdev机制就会遵照程序设备号等音讯,在/dev下创立设备节点,如下图所示:

  
 
自然我是不欣赏读实用性的图书,总觉得有指手画脚的疑心,做事格局得按它所说的才终于妥当。周末逛购书中央偶然见到这本书,才发觉它是自我待读书目里面的首先本,于是细细翻阅,觉得不容错过,是值得细读的实用书,特别看到附录中提议阅读书目,就下定决定买下来。

 图片 1

  
 在自身这几月读过的书,我都没推荐阅读的,重尽管认为都还没到非读不可的境界,错过了也不算太可惜。《怎么着阅读一本书》看书名就掌握,这是本教人出色读书的书,了解读书的目的和读不同书的点子。推荐的理由是因为它会对人的读书模式有深刻的熏陶(毕竟读书是终身的事),可以养成一个得益终生的好习惯。

而想接纳方面的sda1装备节点,读写多少时,还索要动用mount /dev/sda1
 /mnt,来挂载u盘才行,会显得特别麻烦,一般来说图所示:

阅读目标

 图片 2

  
 一、为了获得信息、娱乐自己;二、提升领悟力;在读某本书的时候,明确自己的目标是充分关键的,因为它决定了你哪些去读那本书。假使读这本书只是为了拿走情报,那么就很快阅读、阅后总结即可;虽然是为了增进自己的领会力,拓宽思维,就得最好最完好的读书;

 

    如培根说,有些书可以浅尝辄止,有些要生吞活剥,只有少数书是要咀嚼与消化的。如若读其他书的快慢都是一律的,那么可能就只是浪费时间而已,因为有些书可能连略读都不值得。目标的不同,读书的快慢、整理总计情势也要不等。

 

判定值得读的书

 

   
要确认读书的目标,其实有个前提是你必须对要读的书有所了然,才能看清一本书是否值得读,然后用怎么着艺术读。如倘使广为推崇的名士名文,这应该是值得的。但多数的书是你未曾接触过的,该书的提出是:

2.其实,可以在/etc/mdev.conf文件里进入一行语句就能促成全自动装载u盘,也可以在其间干任何与设备节点相关的事

    1、看书名、序、目录页、索引、出版者信息

2.1而/etc/mdev.conf又是什么?

    2、挑多少个跟大旨相关随笔看

它是属于mdev的一个配备文件,而mdev以前就讲过了,它重要的职能是管理/dev目录底下的装置节点

    3、随意翻阅,读小部分

当系统中有机关注册设备节点的时候,mdev就会调用/etc/mdev.conf四遍,
该公文可以兑现与设备节点相关的事,比如自动装载usb,打印创立的装置节点消息等

   
一般这样做,大概十分钟,基本上都能领略您想不想去读,也能大概知道所得收获。但假若这么如故判定不了,这就快读。当然用这种办法的二三步去检查小说是不太好的,总给人多少剧透的痛感,所以随笔故事类可以只做第一步。

 

  
 我有一种偏激的想法,就是绝大多数小说都不值得细细阅读,除非你是要上学其中的写作技巧。因为自己以为小说里讲的是经历故事,而这种经历对你的话是很好理解的,你不会有认知上的阻力,也就不会让你思绪开阔或精通为人处世之道,你只是多了一段你不明了的故事,那东西没有也不算可惜。

3.咱们率先来分析device_create(),是怎么来调用到/etc/mdev.conf的,后边再讲什么采纳mdev.conf(也得以直接跳过,直接看下边第4小节,如何运用)

读书所要做的事

(PS:
此前创造字符设备节点用的class_device_create(),其实是和device_create功效差不多)

    该书是有将阅读分为三个层次,基础阅读、检视阅读、分析阅读、焦点阅读。

3.1
device_create()最后调用了:device_create()->device_register()->device_add():

    基础阅读:能正常读。

device_create()->device_register()->device_add()函数如下所示:

int class_device_add(struct class_device *class_dev)
{
       ... ...
       kobject_uevent(&class_dev->kobj, KOBJ_ADD);         // KOBJ_ADD是一个枚举值
              //调用了kobject_uevent_env(kobj, action, NULL);              // action=KOBJ_ADD
}

    检视阅读:一定时间内,找出书的重要。(快读)

3.2
device_create()->device_register()->device_add()->kobject_uevent_env()函数如下所示:

    分析阅读:无限时间里,最好最完好的阅读。

int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,char *envp_ext[])
{
       char **envp;
       char *buffer;
       char *scratch;
       int i = 0;
       ... ...

       /* 通过KOBJ_ADD获取字符串"add",所以action_string="add"  */
       action_string = action_to_string(action);              // action=KOBJ_ADD


       /* environment index */
       envp = kzalloc(NUM_ENVP * sizeof (char *), GFP_KERNEL);      //分配一个环境变量索引值

       /* environment values */
    buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL);     //分配一个环境变量缓冲值      

/* event environemnt for helper process only */
/*设置环境变量*/
       envp[i++] = "HOME=/";
       envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
       scratch = buffer;
       envp [i++] = scratch;
       scratch += sprintf(scratch, "ACTION=%s", action_string) + 1;  //"ACTION= add"
       envp [i++] = scratch;
       scratch += sprintf (scratch, "DEVPATH=%s", devpath) + 1;
       envp [i++] = scratch;
       scratch += sprintf(scratch, "SUBSYSTEM=%s", subsystem) + 1;
       ... ...
       /*调用应用程序,比如mdev*/
       if (uevent_helper[0]) {
            char *argv [3];
              argv [0] = uevent_helper;       // uevent_helper[]= "/sbin/hotplug";
              argv [1] = (char *)subsystem;
              argv [2] = NULL;
              call_usermodehelper (argv[0], argv, envp, 0);        //调用应用程序,根据传入的环境变量参数来创建设备节点
       }
}

    主旨阅读:按照核心相比阅读多本书。

从上面的代码和注释来看,最终经过*argv[],
*envp[]五个字符串数组里面存的环境变量参数来创建设备节点的

   
在我看来,不必太过火纠结自己是用哪些层次形式去阅读,重点在于要做咋样。我收拾出自己以为该做的东西:

3.2接下去便在kobject_uevent_env()函数里添加打印信息,
然后再次烧内核:

    1、区分书的序列

 图片 3

    2、找出重点字、关键句

 

    3、找出作者提的题目以及作者的解答(焦点)

3.3然后大家以登记一个按键驱动为例 

    4、整理书的纲领,总括书的内容,回答作者的题材。

输入 insmod
key.ko,打印了以下语句:

    5、客观评价这本书及其观点,演讲所获得的诱导。

class_device: argv[0]=/sbin/mdev                 //调用mdev

class_device: argv[1]=sixth_dev                      //类名

class_device: envp[0]=HOME=/

class_device: envp[1]=PATH=/sbin:/bin:/usr/sbin:/usr/bin

class_device: envp[2]=ACTION=add             //add:表示添加设备节点,  若=remove:表示卸载设备节点

class_device: envp[3]=DEVPATH=/class/sixth_dev/buttons   //设备的路径

class_device: envp[4]=SUBSYSTEM=sixth_dev                //类名

class_device: envp[5]=SEQNUM=745

class_device: envp[6]=MAJOR=252                          //主设备号

class_device: envp[7]=MINOR=0

   
后两个步骤,一定要用自己的话来总结,不然就是您实际自己也没读懂这本书。(一个人假如说他了然他在想些什么,却说不出来,通常是她骨子里并不知道自己在想些什么。)快读和剖析阅读都要做那多少个步骤,只不过力度不等同。快读是足以放低要求的,像第4步成功知道书在谈什么就行了。

3.4末尾这么些参数遵照/sbin/mdev就进入了busybox的mdev.c的mdev_main()函数里:

批评和赞许的前提

int mdev_main(int argc, char **argv)
{
... ...
action = getenv("ACTION");           //获取传进来的执行参数,它等于“add”,则表示创建设备节点
env_path = getenv("DEVPATH");      //获取设备的路径“/class/sixth_dev/buttons”
sprintf(temp, "/sys%s", env_path);   //指定temp (真正设备路径)为“/sys/class/sixth_dev/buttons”

if (!strcmp(action, "remove"))           //卸载设备节点
                    make_device(temp, 1);

else if (!strcmp(action, "add")) {       //创建设备节点
                     make_device(temp, 0);
 ... ... 
}

   
在这本书里,令我映像深切,最讨巧的地点,就是评价一本书的态势。在您说出“我同意”,“我不允许”或者“暂缓评论”此前,你早晚要能肯定地说,“我精晓了”。换言之,你不可能不清楚书到底在讲怎样,你才有资格对其做出评论,不然你都不亮堂在评头论足怎么样。

3.5结尾调用mdev_main
()->make_device()函数来创造/卸载设备节点,该函数如下所示:

   
延伸到为人处世的艺术,评论人和事,批评和称颂是有前提的,你不可能不明白您在放炮和称扬什么,能拿出如何证据来。批评和称扬都亟待证据,没有证据的,大家一般称为讨厌和欣赏。

static void make_device(char *path, int delete) //delete=0:创建, delete=1:卸载
{
       /*判断创建的设备节点是否是有效的设备*/
       if (!delete) {
              strcat(path, "/dev");
              len = open_read_close(path, temp + 1, 64);
              *temp++ = 0;
              if (len < 1) return;
       }

device_name = bb_basename(path);    //通过设备路径,来获取要创建/卸载的设备节点名称
                      //例: path =“/sys /class/sixth_dev/buttons”,那么device_name=“buttons”



type = path[5]=='c' ? S_IFCHR : S_IFBLK;     //判断如果是在/sys/class/目录下,那么就是字符设备
                                              //因为块设备,是存在/sys/block/目录下的


/* 如果配置了支持mdev.conf选项,那么就解析里边内容并执行   */
 if (ENABLE_FEATURE_MDEV_CONF) { 
       /* mmap the config file */
fd = open("/etc/mdev.conf", O_RDONLY);     //调用/etc/mdev.conf配置文件

      ... ...         //开始操作 mdev.conf配置文件
}



       if (!delete) {                  //如果是创建设备节点

              if (sscanf(temp, "%d:%d", &major, &minor) != 2) return;   //获取主次设备号

        /*调用mknod ()创建字符设备节点*/
if (mknod(device_name, mode | type, makedev(major, minor)) && errno != EEXIST)
                     bb_perror_msg_and_die("mknod %s", device_name);


              if (major == root_major && minor == root_minor)
                     symlink(device_name, "root");

              /*若配置了支持mdev.conf选项,则调用chown命令来改变属主,默认uid和gid=0 */
              if (ENABLE_FEATURE_MDEV_CONF) chown(device_name, uid, gid);
}

     if (delete) unlink(device_name);           //如果是卸载设备节点
}

做积极阅读的读者

从下面的代码和注释分析到,要采纳mdev.conf配置文件,还亟需配置busybox的menuconfig,
使mdev帮忙mdev.conf选项才行

  
 实用书就有这么一点,假设读者不收受,这虽然是笔者说得舌灿莲花、天昏地暗,也是没用的。现代的新闻,作者为了让读者短时直接受自己主旨,一般会把自己每个观点总计并高亮标识出来,然后大多读者也就养成了接受旁人结论的习惯,缺失了自家思考。那种景象问题在于,读者只是简单接受的下结论,并不知道为啥,该如何考虑,不是当真精通。

如下图,进入busybox目录,然后输入make
menuconfig,发现我们曾经布置过了该选项了

   
勉励的话,说起来有点责怪的表示,但要么盼望,多主动阅读,自己发现题目、解答题目,读得慢也还好。

 图片 4

    至少你在阅读,而不是在玩手机。

 

附录

 

1、遭受难读的书,从头到尾读五次,不懂地点不要停下来查询或思想。

 

2、不同系列书读的措施

4.接下来,便来探望怎么着拔取mdev.conf, 
参考busybox-1.7.0/docs/mdev.txt文档

    实用性的书:总括作者要你如何做,你想咋办。

应用办法如下所示:

    故事书:连忙,全神投入,不要停。

the format:

    史诗:集中注意力,全心出席。

       <device
regex
> <uid>:<gid> <octal
permissions
> [<@|$|*>
<command>]

    戏剧:假装能看到演出的实景。

The special characters
have the meaning:

    抒情诗:第一遍,不要停,第二遍,大声读,反复读。

@ Run after
creating the device.

    历史书:感兴趣的风波或时期多读几本,并着眼为何有这样行进的原委。

$ Run before
removing the device.

    文学书:发现问题,回答问题。(书是怎么回应,你又是如何回答) 

* Run both after
creating and before removing the device.

约莫就是:

配置文件格式:

<device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]  

逐条参数代表的含义如下:  

device regex:

正则表明式,来抒发哪一个装置 ,正则表达式讲解链接:https://deerchao.net/tutorials/regex/regex.htm

uid: 

owner       (uid,gid:注册设备节点时,就会被chown命令调用,来改变设备的属主,默认都填0即可)

gid: 

组ID  

octal permissions:

以八进制表示的权能值,会被chmod命令调用,来改变设备的走访权限,默认填660即可

@
创制设备节点之后执行命令  

$  :
 
去除设备节点在此之前执行命令  

*  
创设设备节点之后 和 删除设备节点在此之前 执行命令  

command
要实践的通令  

 

5.接下来便来使用mdev.conf,实现u盘自动装载

vi /etc/mdev.conf

增长以下一句:

sda[1-9]+ 0:0 660 * if
[ $ACTION = “add” ]; then mount /dev/$MDEV /mnt; else umount /mnt;
fi

 


[1-9] : 匹配1~9的数字,


 :  重复匹配一次或更频繁

$ACTION==”add”   :意味着注册设备节点,否则就是吊销设备节点

/dev/$MDEV      :代表要创设/注销的可怜设备节点


 

之所以当我们插上u盘,自动创制了/dev/sda1时,mdev便会进入/etc/mdev.conf配置文件,然后实施mount
/dev/
命令,即可自行装载U盘,正如图所示:

 图片 5

输入ls
/dev/sda1
 -l,可以见见都是经过mdev.conf里安排音讯来创设的装置节点,如下图所示:

图片 6

而取出u盘时,同样自动umount
 /mnt来卸载