显永 的个人资料同一片天空下照片日志列表更多 ![]() | 帮助 |
|
4月6日 初到天津 到天津一个星期了,我“体验”到了“改变”。不单单是外界环境,还有来自于内心的。只是不知道这是不是刚到一个地方的新鲜感。总感觉有人在后面追我似的。
离开的伤感总是会被新的体验迅速替代,我也不例外。况且一切的结果都是必然的,我只不过是在适应中而已。
周末看了场电影,貌似开始有了看电影的感觉了。
调整,调整。 3月20日 离职 离职了,3月19日。整整两年。离职手续办的异常的迅速,以至于在我还没有回过神来的时候,Manager已经开始送我出门了。从提交离职申请到走出维亚大厦,用了29.5个小事。 两年的时光,留在了群硕,这个曾经承载着我梦想的地方。离职的时候,总是免不了的有些伤怀,感慨于眼前的人和物。在两年之中发生的很多事情,是我这一生之中宝贵的财富,虽然有很多事情我还没有想明白,也看不透。 这两年的大部分时间,是比较快乐的,因为我踏入了一个从来没有接触过的领域。慢慢的我发现,很多自己在学校学过的知识,在没有经历过实践的时候,只是在纸上浅浅的一层。实践,才是这个领域的根本。我很庆幸,自己遇到了一个很好的团队,在这里面,像白痴一样的我一点一点的学会了思考。我承认自己是愚钝的,可是骨子里却认为自己很聪明。这种所谓的“自欺欺人”害苦了我,因为在整个学习的过程中,我被打击的很严重,尤其到最后,我不敢把自己的code写出来,更不敢对别人说我写过什么什么code。好在我遇到的人都是很nice的,面对我许多“简单”的问题,他们总是不厌其烦的把自己的精辟理解讲解给我,从来都没有什么保留。 在经历了很多同事的变动之后,我的心也跟着浮动起来,因为我理解不了这些举措。在过了大约2个月之后,我渐渐的明白了一些,在这样的一个萧条的环境下,每个决策,都是那么的不易。但总归起来一句话:尽量保留下最合适的(我称之为“战斗中减员不可避免,但是要保持建制完整”)。 一起经历过这段时光的兄弟,可能是我离职时最大的眷恋吧。所有的不舍也都源于此。 Stanley,Clive,Mark,Kelvin,Den,Lincoln,Linus,Kurt,Maggie,Dassy,Geogria... 3月4日 沉闷 我陷入了一个漩涡,不知道对与错。沉迷于自己对“道”的追求,忽略了对周围事物的感知。突然之间,追求与感知在刹那间失去了平衡,于是乎,我变得更加的动荡与不安。 理解,似乎很难。我难以理解别人的作为,别人也难以理解我的想法。甚至于当我表达出来,都很少能让人明白,在这样的一种状况下,似乎是在慢慢的沉沦。 拼命的想要逃离这样的状态,在经历了挣扎与痛苦之后,变得比原先更要麻木,以至于要推翻以前的一切,否定太多太多。“为学者日益,为道者日损”,但是这个世界,最终是要归于“道”的。所以,技术只占很小的一部分,而已。 2月5日 1月30日补记 在家里一个星期的假期,我完全放松了自己,什么都不去想,什么也不去问。即便是如此,我依然感到很累,开始的几天只是后背有些不舒服,惹得母亲很担心。随后又成了心口不舒服,所以这几天成了我养病的日子。 听闻一个初中同学自杀的消息,很震惊。上初中的时候,有幼儿园的同学意外溺水身亡,上高中的时候有同学跳河自杀,工作两年的时候有初中同学卧轨自杀。往年的记忆是那么的清晰,涂抹不掉,可是生活就是一如既往的用意外的残酷的事实,让人们不得不去面对,即使不想不愿。生命,比任何东西都要脆弱,转瞬即逝。更大的痛苦,往往留给依旧活着的人。 面对现实,无法改变的,只能坚强的脆弱的去面对。 睡眠 最近两个月来的睡眠一直很差,晚上醒来的次数很多,因此白天没有一点精神。包括回家的一个星期,情形没有丝毫的改善,反而比在北京的时候更恶劣,不得已早上6点就起床。与此同时,似乎对什么都没有了兴趣,甚至连想都懒得去想了。
直到最近两天,索性睡不着的时候就不去睡,直到困的时候再去睡,似乎比先前的状态好了很多,因为慢慢的有些恢复了,包括对一些事情的兴趣。
再大的困难,只要人能撑住了,都会克服。明天是周末了,这个周末需要认真的计划、考虑很多事情。 1月19日 规律 每天习惯了睡的很晚,总是以为在和黑夜抢夺时间。可是很多时候白天提不起精神,直到最近的恍惚,才明白原来“抢”的那些时间是需要白天来还的。
从某种角度上讲,是一种恶性的循环。一旦成为一种习惯,很难改掉。
所以,从今天晚上开始,决定10点准时睡觉。
周末的时间过的很快,买了张车票,去沃尔玛买东西丢了柜子钥匙(50元的光盘没了),全都是由于心不在焉所致。
吃饭的时候问朋友:你们平时的工作做什么?得到的回答是:写代码。看代码,写代码,就是工作的全部么?
很快过年了,冬天也很快就会过去了。北京的冬天还没有下雪,到今天为止。 12月19日 态度 这个星期严重睡眠不足,早晨居然睡到8点近10分,没吃早饭就上班了。在我的记忆中一共三次这样的经历:第一次是进公司前三个月。第二次是进项目大约3个多月的时间,然后就是这次了。
明天(应该是今天)需要请半天或者一天假期,来处理很棘手的问题。很后悔,但愿可以过这一关。
昨天搞定rootfs的问题。今天利用上午的时间把文档初稿结束,虽然只是明白一点OTG的原理,对其实际的实现还没有认真找到相应的代码。
真的要崩溃了。
12月17日 测试 这几天在惶恐中度过,我犯了很大的错误。极小的概率事件,几乎不可能,但愿不可能。
测试:
1. nandwrite,flash_erase似乎不太好用,写完还是mount不上。
2. /dev下即使在只读情况下也需要有console,null.
3. inetd不能启动telnetd,但是手动添加/usr/sbin/telnetd -l /bin/login还是有效的。只是不知道inetd不工作的原因。
明天结束所有的 rootfs脚本。 12月11日 结束 日子就这样一天一天过去了,没有任何的滋味。
北京的天气很差,今天浮尘,像雾一样。
最想去的是天津。
调试还是没有通过,主要有2个问题:
1. 如果在config中去掉devfs的支持,rootfs不能被正确mount,block在"can not open initial console!"
2. telnetd好像不管用。即使配置了inetd.conf和service也不行。
关键是找到感兴趣的事情去做。 12月3日 busybox initbusybox init启动首先会运行/etc/init.d/rcS,然后是inittab中的wait,respawn,once等。因此,作为系统的开机或者关机脚本的管理,可以有两种处理方法。
其一,在rcS中加入启动脚本,如sys_start.sh
#!/bin/sh
#travel the start up scripts folder and
#start daemons as request
case $1 in
start)
....
stop)
....
esac
....
其二,修改inittab.
加入
::wait:/etc/rc.d/sys_start.sh start
::shutdown:/etc/rc.d/sys_start.sh stop
另外busybox忽略runlevel,那么默认的会从哪个目录开始执行?
关于initLinux 启动时,运行一个叫做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月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日 狙击手 周末看了两部关于狙击手的片子,《双狙人》《狙击生死线》。虽然比不了《兵临城下》,却依然精彩。前部片子注重枪手如何利用环境,后部片子注重对全局的战略性把握。
阿山从北京转车,小聚了一下。四年多不见,彼此都变了很多。
发现做事情没有了目的性,因此便没有了效率。“效率”。 |
|
|