显永 的个人资料同一片天空下照片日志列表更多 工具 帮助
11月30日

etc的config文件

没办法,公司上不了blog,所以把搜到关于etc的都贴在这里。

关于init

Linux 启动时,运行一个叫做init 的程序,然后由它来启动后面的任务,包括多用户环境,网络等。
运行级是操作系统当前正在运行的功能级别。这个级别从1 到6 , 具有不同的功能。这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最先运行 的服务是那些放在/etc/rc.d 目录下的文件。
大多数的Linux 发行版本中,启动脚本位于 /etc/rc.d/init.d。这些脚本被ln 命令来连接到 /etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6)
例如/etc/rc.d/rc2.d 下面的S10network 就是连接到/etc/rc.d/init.d下的network 脚本的。 rc2.d 下面的文件就是和运行级2 有关的。
文件开头的S 代表start 就是启动服务的意思,后面的数字10 就是启动的顺序。
例如,在同一个目录下, 可以看到 S80postfix 这个文件,80 就是顺序在 10 以后,因为没有启动网络的情况下,启动postfix 是没有任何作用的。
再看一下 /etc/rc.d/rc3.d,可以看到文件S60nfslock,但是这个文件不存在于/etc/rc.d/rc2.d 目录下。 NFS 要用到这个文件,一般用在多用户环境下,所以放在rc3.d 目录下。
另外,在/etc/rc.d/rc2.d 还可以看到那些K 开头的文件,例如
/etc/rc.d/rc2.d/K45named ,K 代表 kill 。
标准的Linux运行级为3 或者5 ,如果是3 的话,系统就在多用户状态。如果是5,则是运行着X Window 系统。如果目前正在3或5,而你把运行级降低到2的话,init 就会执行 K45named 脚本。
不同的运行级定义如下:(可以参考Red Hat Linux 里面的/etc/inittab)
# 缺省的运行级,RHS 用到的级别如下:
# 0 - 停机(千万不要把initdefault 设置为0 )
# 1 - 单用户模式
# 2 - 多用户,但是没有 NFS 
# 3 - 完全多用户模式
# 4 - 没有用到
# 5 - X11 
# 6 - 重新启动 (千万不要把initdefault 设置为6 )
对各个运行级的详细解释:
0 为停机,机器关闭。
1 为单用户模式,就像Win9x 下的安全模式类似。
2 为多用户模式,但是没有NFS 支持。
3 为完整的多用户模式,是标准的运行级。
4 一般不用,在一些特殊情况下可以用它来做一些事情。
例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。
5 就是 X11 ,进到 X Window 系统了。
6 为重启,运行 init 6 机器就会重启。
不同的运行级有不同的用处,也应该根据自己的不同情形来设置。例如,如果丢失了root 口令,那么可以让机器启动进入单用户状态来设置。在启动后的 lilo 提示符下输入:
init=/bin/sh rw 
linux启动
就可以使机器进入运行级1 ,并把 root 文件系统挂为读写。他会跳过所有系统认证,让你使用passwd 程序来改变root口令,然后启动到一个新的运行级。
设置自己的虚拟内存子系统和根文件系统,一旦内核启动运行,对硬件的检测就会决定需要对哪些设备驱动程序进行初始化,挂载文件系统,启动init进程(pid=1)。
3、init进程
     init读它的配置文件/etc/inittab,决定需要启动的运行级别(Runlevel),对应不同运行级别,启动/etc/rc.d/rc$Runlevel.d下的服务,它们是一些链接文件,实现的程序在/etc/rc.d/init.d下,它们一般能接受 start、stop、restart、status等参数。/etc/rc.d/rc*.d/中的rc启动脚本通常是K或S开头的链接文件,对于以以S开头的启动脚本,将以start参数来运行。而如果发现存在相 应的脚本也存在K打头的链接,而且已经处于运行态了(以 /var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。这样做是为了保证是当 init改变运行级别时,所有相关的守护进程都将重启。  
 4、至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig或setup中的"System Services"来自行设定。常见的守护进程有:
  amd:自动安装NFS守护进程
  apmd:高级电源管理守护进程
  arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对数据库
  autofs:自动安装管理进程automount,与NFS相关,依赖于NIS
  crond:Linux下的计划任务的守护进程
  named:DNS服务器
  netfs:安装NFS、Samba和NetWare网络文件系统
  network:激活已配置网络接口的脚本程序
  nfs:打开NFS服务
  portmap:RPC portmap管理器,它管理基于RPC服务的连接
  sendmail:邮件服务器sendmail
  smb:Samba文件共享/打印服务
  syslog:一个让系统引导时起动syslog和klogd系统日志守候进程的脚本
  xfs:X Window字型服务器,为本地和远程X服务器提供字型集
  Xinetd:支持多种网络服务的核心守护进程,可以管理wuftp、sshd、telnet等服务
  这些守护进程也启动完成了,rc程序也就执行完了,然后又将返回init继续下一步。
一般的系统是先启动/sbin/init,但是也可通过启动参数指定init=来确定,如:我的系统就是制定的init=/linuxrc,因为文件系统是采用busybox的,而linuxrc。也是一个指向busybox的文件,不过不确认它指向具体哪个指令。不过可能是/sbin/init。

init进程的主要任务是按照inittab文件所提供的信息创建进程,由于进行系统初始化的那些进程都由init创建,所以init进程也称为系统初始化进程。

如inittab:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/login
::restart:/sbin/init

::ctrlaltdel:/bin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

inittab的格式如下:
id:rstate:action:process

1.id字段是最多4个字符的字符串,用来唯一标志表项。

2.rstate(run state)字段定义该记录项被调用时的运行级别,rstate可以由一个或多个运行级别构成,也可以是空,空则代表运行级别0~6。当请求init改变运行级别时,那些rstate字段中不包括新运行级别的进程将收到SIGTERM警告信号,并且最后被杀死;只有a、b、c启动的命令外(a、b、c不是真正的运行级别)

3.action字段定义了该进程应该运行在何种状态下:

boot 在系统启动时运行,忽略runlevel
bootwait 在系统启动时运行,init等待进程完成。忽略runlevel
ctrlaltdel 当Ctrl+Alt+Del三个键同时按下时运行,把SIGINT信号发送给init。忽略 runlevel
initdefault 不要执行这个进程,它用于设置默认runlevel
kbrequest 当init从键盘中收到信号时运行。这里要求键盘组合符合KeyBoardSigral(参见/usr/share/doc/kbd-*关于键盘组合的文档)
off 禁止进入,因此该进程不运行
once 每一个runlevel级别运行一次
ondemand 当系统指定特定的运行级别A、B、C时运行
powerfail 当init收到SIGPWR信号时运行
powerokwait 当收到SIGPWD信号且/etc/文件中的电源状态包含OK时运行
powerwait 当收到SIGPWD信号,并且init等待进程结束时运行
respawn 不管何时终止都重新启动进程
sysinit 在运行boot或bootwait进程之前运行
wait 运行进程等待输入运行模式
process 字段包含init执行的进程,该进程采用的格式与在命令行下运行该进程的格式一样,

因此process字段都以该进程的名字开头,紧跟着是运行时,紧跟着是运行时要传递给该进程的参数。

比如/sbin/shutdown -t3 -r now,该进程在按下Ctrl+Alt+Del时执行,在命令行下也可以直接输入来重新启动系统。
4.Process字段中进程可以是任意的守候进程、可执行脚本或程序。
另外:在任何时候,可以在文件inittab中添加新的记录项,级别Q/q不改变当前的运行级别,重新检查inittab文件,可以通过命令init Q或init q使init进程立即重新读取并处理文件inittab.
他会先执行/etc/init.d/rcS
#! /bin/sh

/bin/mount -a
mdev -s

而mount -a会执行/etc/fstab
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0

挂载一些ramfs。
11月27日

坚持

    越是在艰苦的时刻,越需要坚持。
    有时候,人往往分不清楚局势,就像下棋一样,当局者迷。
    无论是何种选择,都是选择罢了。还是把选择权留给自己吧。这样在感情上还容易接受一点。
    
11月23日

烦闷

    心情糟糕透了,但是找不到缘由。看了一天的nand,貌似还有好多地方不明白。DMA处理,ECC,OOB...
    又记起大约五年之前的那次考试,考完的时候和前后桌调侃的情景。那时的我,以为考试就是生活的全部。也因此感到受到了很大的伤害,一种自我心灵上的伤害。虽然现在已毕业二年,当时考试的同伴也都在经历了同学、工作后天各一方,但是也在一天一天过去的同时,感到自己老了。只是已分不清只是一种感觉,还是自己的心确实老了。
     我不知道是否应该放下。也在天津、北京和青岛之间不断的权衡着。
11月22日

skype

     这个月用skype打了很多电话,通话质量还不错,估计还会继续用下去。
     记得一年之前曾经听过的故事:女孩出国了,每天都会给国内的他打skype电话聊天,说是给他省钱。过了几个月(一个?记不清具体数字了),女孩入了教,嫁给了一个外国人。
     很快便过年了,没想好过年之前是否回家一次。状态不太好,不知是为什么。
11月21日

linux device model

    又看了一天的udev与uevent的资料。但是对其支持hotplug的auto module loading不理解是如何实现的。需要做更多的参考。
    另外,对采用何种方式管理dev node,没有确定用哪种方式。udev虽然灵活,但是对存储在nand上的dev node来讲,在每次启动时都需要做动态的写入操作,影响nand的使用寿命和系统的启动时间。况且对一个嵌入式系统来讲,所支持的动态hotplug设备并不多,更多的时候是作为从设备使用的。
     计划今天完成原理分析文档,然后开始下一项工作。
11月20日

udev

本来以为udev是比较 简单的东东,可是在查阅了一部分资料之后,发现远比我想的要复杂,并且不确定是否还在改进当中。
运行方式
udev是一个通用的内核设备管理器。它以守护进程的方式运行于Linux系统,并监听在新设备初始化或设备从系统中移除时内核(通过netlink socket)发出的uevent。
系统提供了一套规则用于匹配可发现的设备事件和属性的导出值。匹配规则可能命名并创建设备节点,并运行配置程序来对设备进行设置。udev规则可以匹配像内核子系统、内核设备名称、设备的物理等属性,或设备序列号的属性。规则也可以请求外部程序提供信息来命名设备,或指定一个永远一样的自定义名称来命名设备,而不管设备什么时候被系统发现。

系统架构
udev系统可以分为三个部分:
namedev函数库,处理设备的命名。
libsysfs函数库,进行设备信息的读取(080版本后废弃)
守护进程udevd,处于用户空间,用于创建虚拟/dev
系统获取内核通过netlink socket发出的信息。早期的版本使用hotplug,并在/etc/hotplug.d/default添加一个链接到自身来达到目的。而udev会最终取代hotplug。
其采用kobject_uevent在监测到sysfs变化时传递ADD或REMOVE事件到用户空间,udevd将解析事件并完成/dev下设备的动态管理。
需要继续参考研究:
11月16日

狙击手

    周末看了两部关于狙击手的片子,《双狙人》《狙击生死线》。虽然比不了《兵临城下》,却依然精彩。前部片子注重枪手如何利用环境,后部片子注重对全局的战略性把握。
     阿山从北京转车,小聚了一下。四年多不见,彼此都变了很多。
     发现做事情没有了目的性,因此便没有了效率。“效率”。
11月4日

题外话

SD/MMC driver还不是很熟,至少整个的架构与接口不是很清楚。目标是搞清楚层次关系。
MTD的内容几乎就是不知道,因为现在给一个Nand,需要实现驱动,改哪一部分也不知道。
好久没有写过程序了。现在也就是hello world的水平吧。所以这次要完成一个用户层的程序就感觉无从下手。
准备练习:
1. 字符串逆序输出。
2. 计算1+1/2!+1/3!...1/n!。
3. 重载加法函数,分别可以接受2,3,4,,,个参数并调用之。
4. const在c/c++中的应用测试。
5. 进程间通信的方法有几种,实例。
6. 对哪种嵌入式架构比较熟悉,并对其bootload过程进行描述。
7. 如何进行驱动编程。
8. 一个熟悉系统的架构。
9. 用C语言实现一个类似于PM状态机的状态迁移转换。
 
11月3日

岁月如梭

   两天的时间过的很快,在我没有反应过来的时候,已经是周一的凌晨了。
   虽然看了两天书,可是收获不大。对Linux中hotplug机制还是没有真正搞清楚,尤其在2.6中,又在不同的版本之间改动了很多。但不管怎样,应该不会影响到用户空间应用程序的实现。
   USB好像是很大的一块。
   另外想了一下这两年做的事情,收获了什么。结果有些让人沮丧。因为一开始的时候,就像刚上大一的感觉,什么都不会,都是从头学,那段时光反倒是迷茫而快乐的。但是之后的日子,失去了平衡点。不过也真的是笨的可以了,到现在才发现什么都是二把刀。
    燕子出差了。总之心里跟装了五味瓶似的。