网上有关linux驱动编写的文章很多,各种视频也是一大把,随便一下好多个G,让人起来头大。
通常Linux驱动开发,一种是普通的linux平台下的驱动,另外一种就是嵌入式linux驱动开发。
对于我们的香蕉派,当然是后一种了。说到嵌入式linux驱动开发,首先需要提及的是交叉编译。所谓交叉编译,百度一下载录如下:
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码,而这种工具就是交叉编译器(cross compiler)。
为什么需要交叉编译环境呢?是利用性能强大的计算机环境来编译另外一种功能专一的环境下运行的代码。熟悉ARM7或者Cortex M系列MCU的朋友大都知道IAR或者Keil,其实他们就是一种交叉编译开发工具——在PC上编写代码,编译后下载到MCU中运行。
但是嵌入式Linux的交叉编译环境搭建起来相对复杂,不是仅仅双击程序进行安装,下一步,下一步,就可以完成的。事实上搭建交叉编译环境的交叉也是一搜一大把,而且都是洋洋洒洒上千字这里就不在重复转述了。而且就是按照其操作一遍都是一件很痛苦的事情。通常我们都是在虚拟机里面安装ubuntu,操作起来相对比较慢,在学着配置交叉编译……头大啦
事实上BananaPi的性能比较强大,而且仅仅利用它学习驱动程序的编写,所以直接利用自身的环境进行编译——怎么简单怎么来,怎么上手快怎么来——初学者嘛(先给自己留个后路)
我使用的是树莓派的系统,发现编译器已经集成,版本不是最新的,但是不影响使用
pi@bananapi:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.3-14+rpi1' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 4.6.3 (Debian 4.6.3-14+rpi1)
pi@bananapi:~$ make -v
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for arm-unknown-linux-gnueabihf
在这里我们可以找到相应的内核 https://github.com/LeMaker
下载地址为:https://github.com/LeMaker/linux-bananapi/archive/bananapi-3.4.zip
这里需要用到的命令为tar和ln
这里顺便载录一点有关tar和ln命令的详解
————————————————————————————
tar压缩解压缩命令详解tar命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。 下面的参数是根据需要在压缩或解压档案时可选的。 -z:有gzip属性的 -j:有bz2属性的 -Z:有compress属性的 -v:显示所有过程 -O:将文件解开到标准输出 参数-f是必须的 -f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。 # tar -cf all.tar *.jpg 这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。
# tar -rf all.tar *.gif 这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
# tar -uf all.tar logo.gif 这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。
# tar -tf all.tar 这条命令是列出all.tar包中所有文件,-t是列出文件的意思
# tar -xf all.tar 这条命令是解出all.tar包中所有文件,-x是解开的意思 查看
tar -tf aaa.tar.gz 在不解压的情况下查看压缩包的内容 压缩 tar –cvf jpg.tar *.jpg //将目录里所有jpg文件打包成tar.jpg tar –czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz tar –cjf jpg.tar.bz2 *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2 tar –cZf jpg.tar.Z *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z 解压 tar –xvf file.tar //解压 tar包 tar -xzvf file.tar.gz //解压tar.gz tar -xjvf file.tar.bz2 //解压 tar.bz2tar –xZvf file.tar.Z //解压tar.Z 总结 1、*.tar 用 tar –xvf 解压 2、*.gz 用 gzip -d或者gunzip 解压 3、*.tar.gz和*.tgz 用 tar –xzf 解压 4、*.bz2 用 bzip2 -d或者用bunzip2 解压 5、*.tar.bz2用tar –xjf 解压 6、*.Z 用 uncompress 解压 7、*.tar.Z 用tar –xZf 解压
————————————————————————————
[size=14.399999618530273px]ln命令用来给档案创建链接。 [size=14.399999618530273px]1. 使用ln命令给档案创建symbolic link。
linux系统下的symbolic link类似于windows系统的快捷方式一样。
使用ls命令查看,可以看到新创建的symbolic link有独立的inode,
也就是symbolic link会占用一个inode,但是其实际内容仍然是指向
源文件所指向的block区域。
# touch /tmp/file
# ls -lhi /tmp/file
3441 -rw-r--r-- 1 root root 0 Jan 1 00:09 /tmp/file
#
# ln -fs /tmp/file /tmp/symbolic_link
# ls -lhi /tmp/symbolic_link
3647 lrwxrwxrwx 1 root root 9 Jan 1 00:10 /tmp/symbolic_link -> /tmp/file
# [size=14.399999618530273px]2. 删除symbolic link文件,实际上就是删除这个inode,而不会影响到源文件所指向的block区域;
而如果删除了源文件,那这个symbolic link文件就基本上没用了。
# echo "link test" > /tmp/file
# cat /tmp/file
link test
#
# rm /tmp/symbolic_link
# cat /tmp/file
link test
#
# ln -fs /tmp/file /tmp/symbolic_link
#
# rm /tmp/file
# cat /tmp/symbolic_link
cat: can't open '/tmp/symbolic_link': No such file or directory
#
# ls -lhi /tmp/symbolic_link
7357 lrwxrwxrwx 1 root root 9 Jan 1 00:22 /tmp/symbolic_link -> /tmp/file
# [size=14.399999618530273px]3. 使用ln命令创建hard link。
可以看到,创建hard link是使用同一个inode,而copy了一份源文件的block区域出来。
如果修改档案的内容,源文件和hard link文件对应的block区域内容都会被修改,从而保持一致性。
# touch /tmp/file
# echo "hard link test" > /tmp/file
# cat /tmp/file
hard link test
# ln /tmp/file /tmp/hard_link
# ls -lhi /tmp/file
7996 -rw-r--r-- 2 root root 15 Jan 1 00:25 /tmp/file
# ls -lhi /tmp/hard_link
7996 -rw-r--r-- 2 root root 15 Jan 1 00:25 /tmp/hard_link
# cat /tmp/hard_link
hard link test
#
# echo "hard link test 2" > /tmp/file
# cat /tmp/file
hard link test 2
# cat /tmp/hard_link
hard link test 2
#
# echo "hard link test 3" > /tmp/hard_link
# cat /tmp/file
hard link test 3
# cat /tmp/hard_link
hard link test 3
# [size=14.399999618530273px]4. 删除hard link或者删除源文件,实际上只是删除其中其中一份block区域。
可以看到,虽然源文件被删除(实际上只是删除了源文件对应的block区),但是
inode仍然还在,所以仍然可以透过hard link档案来访问源文件的内容。
到了这里,就可以理解为什么inode信息中不包含文件名了;
因为如果文件名信息包含在inode中,并且创建了hard link,此时为何还需要两块不同的block区域
来储存文件信息呢?进而hard link还有什么意义呢?
# rm /tmp/file
# cat /tmp/file
cat: can't open '/tmp/file': No such file or directory
#
# cat /tmp/hard_link
hard link test 3
#
# ls -hli /tmp/hard_link
7996 -rw-r--r-- 1 root root 17 Jan 1 00:29 /tmp/hard_link
# [size=14.399999618530273px]5. 为目录创建symbolic link?
因为新建的symbolic link目录与源目录是同一个inode,所以对这两个目录的访问具有完全相同的表现。
# mkdir /tmp/directory
# ln -fs /tmp/directory/ /tmp/dir_sym_link
#
# ls -hdi /tmp/directory/
14018 /tmp/directory/
# ls -hdi /tmp/dir_sym_link/
14018 /tmp/dir_sym_link/
#
# touch /tmp/directory/file
# ls -hil /tmp/directory/file
14781 -rw-r--r-- 1 root root 0 Jan 1 00:47 /tmp/directory/file
# ls -hil /tmp/dir_sym_link/file
14781 -rw-r--r-- 1 root root 0 Jan 1 00:47 /tmp/dir_sym_link/file
#
# echo "directory symbolic test" > /tmp/dir_sym_link/file
# cat /tmp/dir_sym_link/file
directory symbolic test
# cat /tmp/directory/file
directory symbolic test
# [size=14.399999618530273px]6. 为目录创建hard link?
从结果看,为目录创建hard link失败了。
# ln /tmp/directory/ /tmp/dir_hard_link
ln: /tmp/dir_hard_link: Operation not permitted
|