碰到的问题
我在移动硬盘中下载了一套代码,在编译的时候出现了如下错误:
1 | Checking build tools versions... |
很明显,我的编译路径存在空格,也就是我移动硬盘的盘符名称My Passport
有空格,突然感觉WD的硬盘好low啊。。。
此时就要去修改硬盘盘符名称。
thinking all the time
我在移动硬盘中下载了一套代码,在编译的时候出现了如下错误:
1 | Checking build tools versions... |
很明显,我的编译路径存在空格,也就是我移动硬盘的盘符名称My Passport
有空格,突然感觉WD的硬盘好low啊。。。
此时就要去修改硬盘盘符名称。
在kernel中将所有的warning当做error处理,这样可以保证编译的时候没有warning。
在Kernel中的Makefile
中的KBUILD_CFLAGS
的变量中加上-Werror
选项,通常如下:
1 | KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ |
由于自己写博客,总有些词语不能碰,比如说公司相关的机密以及法律严禁的词语,因此自己写了个小的程序来查找特定目录下所有文件是否包含指定的中文或英文词语,有的话将对应的文件和行号输出。
下面的代码只是实现简单的功能,效率非常的差,因为嵌套了多层循环。但是没办法,python的语法和库不是很懂,只能按照写C的逻辑来实现功能了。
对中文字符的处理,必须使用UTF-8
的格式,否则有可能出现如下类似的错误:
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xc6 in position 18: invalid continuation byte
代码如下:
1 | #!/usr/bin/env python3 |
以下方法虽说是修复硬盘分区,但是操作过程中有可能导致数据丢失,请先做好备份,任何后果自己负责。
之前在/etc/fstab
中新增如下命令开机自动挂载/dev/sdb1
:
1 | /dev/sdb1 /home/victor/disk2 ext4 defaults 0 2 |
某个时候,启动ubuntu,发现启动不了,只能进入recovery模式。然后看了下启动log,提示挂载/dev/sdb1
分区失败。
自己手动去挂载,提示如下错误:
1 | victor@victor-HP:~$ mount -t ext4 /dev/sdb1 /home/victor/disk2/ |
参照 https://ubuntuforums.org/showthread.php?t=1245536&p=7822694#post7822694 中的办法一步步解决,碰到选择yes or no
的,直接全部选择y。由于执行的过程时间较久,所以在执行的过程中,不能强制退出。大概的执行步骤如下:
1 | # sudo e2fsck -f /dev/sdb1 |
同样的,还有一个修复无法删除文件的问题:Ubuntu下无法删除文件
一般情况下,如果需要编译kernel的某个模块,我们通常在Makefile中使用如下格式:
1 | drivers/usb/host/Makefile |
通过配置CONFIG_XXX
来决定编译某个模块为 build-in 或者是编译成module。
但是,在 drivers/usb/gadget/Makefile
文件中,有如下的用法:
1 | obj-$(CONFIG_USB_LIBCOMPOSITE) += libcomposite.o |
其中libcomposite
为目标,下面两行表示要生成这个目标的依赖,也就是需要usbstring.c
、config.c
、composite.c
等。
关于这两种用法的解释,在Documentation/kbuild/makefiles.txt
的3.1 Goal definitions
和3.3 Loadable module goals - obj-m
做了详细的描述,现摘录如下:
1 | --- 3.1 Goal definitions |
1 | --- 3.3 Loadable module goals - obj-m |
有时候需要监控应用程序关键动作,因此需要将应用程序的log写入到kernel log的缓冲区去。另外,有时候为了查看应用程序和kernel的时序,需要结合应用程序打印的log和kernel的log来查看前后关系。关于打印输出,https://elinux.org/Debugging_by_printing 做了详细的介绍。
在做新版本kernel bring up的时候,由于我们没有使用到网络的功能,因此一上来就将内核的CONFIG_NET
配置disable掉。
kernel启动后在去启动init
进程的时候总是启动失败,报panic重启,每次启动都这样,panic log如下:
1 | [ 22.476539] (EE) init: /init.rc: 193: invalid option 'seclabel' |
受到Android系统启动-Init篇的启发,在启动init
进程的时候会进行socket通信。而socket通信又是基于网络的功能。所以,我们将CONFIG_NET
整个网络功能关掉了,肯定要出问题的。net/socket.c
是effectively the top level interface to the BSD socket paradigm
,因此,需要将CONFIG_NET
打开。
insmod xxxdrv.ko
时候出现如下错误:
1 | [ 55.775651] xxxdrv: version magic '3.14.19+ SMP mod_unload ARMv7 p2v8 ' should be '3.14.19 SMP mod_unload ARMv7 p2v8 ' |
很明显,版本号3.14.19+
后面多了个+
号,+
是为了标记说这个kernel是不干净的。这个+
号是scripts/setlocalversion
文件中调用scm_version()
函数检查Kernel_SrcDir/
目录下的.scmversion
文件。
1 | # CONFIG_LOCALVERSION and LOCALVERSION (if set) |
如果要去除掉+
号,需要设置
LOCALVERSION
设为为空;defconfig
中设置CONFIG_LOCALVERSION_AUTO is not set
;Kernel_SrcDir/
目录下创建空的.scmversion
文件。Valgrind
是构建动态分析工具的框架,Valgrind
工具可以自动检测许多内存管理和线程错误,并详细介绍您的程序,还可以使用Valgrind
构建新工具。
官网:http://valgrind.org/
valgrind的使用:http://valgrind.org/docs/manual/manual.html
下载地址:git clone git://sourceware.org/git/valgrind.git
在Linux Benchmark Suite Homepage网站上列举了诸多Linux性能测试工具,包括CPU/RAM/ROM/Cache/net等性能测试。iozone
工具我们在前面的文章中已经介绍和使用过了。今天,我们主要来玩一下关于RAM
的读写性能测试。