《Linux设备驱动开发详解 A》一一1.5 Linux设备驱动的开发环境构建

本节书摘来华章计算机出版社《Linux设备驱动开发详解 A》一书中的第1章,第1.5节,作者:宋宝华 更多章节内容可以访问云栖社区“华章计算机”公众号查看。1

1.5 Linux设备驱动的开发环境构建

1.5.1 PC上的Linux环境
本书配套资源提供了一个Ubuntu的VirtualBox虚拟机映像,该虚拟机上安装了本书涉及的所有源代码、工具链和各种开发工具,读者无须再安装和配置任何环境。该虚拟机可运行于Windows、Ubuntu等操作系统中,运行方法如下。
1)安装VirtualBox。
如果主机为Windows系统,请安装VirtualBox WIN版本:
VirtualBox-4.3.20-96997-Win.exe
如果主机为Ubuntu系统,请安装VirtualBox DEB版本:
virtualbox-4.3_4.3.20-96996~Ubuntu~precise_i386.deb
2)安装VirtualBox extension。
Oracle_VM_VirtualBox_Extension_Pack-4.3.20-96996.vbox-extpack
3)准备虚拟机镜像。
解压Baohua_Linux.vmdk.rar为Baohua_Linux.vmdk
4)新建虚拟机。
运行第1步安装的Oracle VM VirtualBox,单击“新建(N)”图标创建虚拟机,“类型”选择Linux,“版本”选择Ubuntu(32 bit),名称可以取名为“linux-training”,如图1.6所示。
image

图1.6?新建Ubuntu 32位虚拟机
单击“下一步(N)”按钮,设置内存,如图1.7所示。
image

图1.7?设置虚拟机的内存
继续单击“下一步(N)”按钮。设置硬盘,注意选择“使用已有的虚拟硬盘文件(U)”单选按钮,虚拟硬盘文件是第3步解压之后的“Baohua_Linux.vmdk”,如图1.8所示。
image

图1.8?设置虚拟机硬盘镜像
最后,单击“创建”按钮以完成虚拟机的构建工作。
5)启动虚拟机。
在VirtualBox上选择先前创建的“linux-training”虚拟机并单击“启动”图标,如图1.9所示。
image

图1.9?启动虚拟机
虚拟机的账号和密码都是“baohua”,如果要执行特权命令,sudo密码也是“baohua”,如图1.10所示。
image

图1.10?虚拟机登录界面
本书配套的Ubuntu版本是14.04,但是内核版本升级到了4.0-rc1,以保证和本书讲解内容的版本一致。
注意事项:
如果发现VirtualBox不稳定或者有兼容性问题(经过测试,有极少数PC存在此问题),也可以安装VMware(Baohua_Linux.vmdk也是支持VMware的)。
如果光盘不小心损坏,可以从链接: http://pan.baidu.com/s/1c08gzi4(密码为 puki)处提取网盘上的文件。
1.5.2 QEMU实验平台
QEMU模拟了vexpress Cortex-A9 SMP四核处理器开发板,板上集成了Flash、SD、I2C、LCD等。ARM公司的Versatile Express系列开发平台提供了超快的环境,用于为下一代片上系统设计方案建立原型,比如 Cortex-A9 Quad Core。
http://www.arm.com/zh/products/tools/development-boards/versatile-express/index.php上可以发现更多关于Versatile Express系列开发平台的细节。
本书配套虚拟机映像中已经安装好了工具链,包含arm-linux-gnueabihf-gcc和arm-linux-gnueabi-gcc两个版本。
Linux内核在/home/baohua/develop/linux目录中,在该目录下面,包含内核编译脚本:

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make LDDD3_vexpress_defconf?ig
make zImage -j8 
make modules -j8 
make dtbs
cp arch/arm/boot/zImage extra/
cp arch/arm/boot/dts/*ca9.dtb   extra/
cp .conf?ig extra/

由此可见,我们用的默认内核配置文件是LDDD3_vexpress_defconfig。上述脚本也会自动将编译好的zImage和dtbs复制到extra目录中。
extra目录下的vexpress.img是一张虚拟的SD卡,将作为根文件系统的存放介质。它能以loop的形式被挂载(mount),譬如在/home/baohua/develop/linux目录下运行。
sudo mount -o loop,offset=$((2048*512)) extra/vexpress.img extra/img
可以把vexpress.img的根文件系统分区挂载到extra/img,这样我们可以在目标板的根文件系统中放置我们喜欢的内容。
/home/baohua/develop/linux目录下面有个编译模块的脚本module.sh,它会自动编译内核模块并安装到vexpress.img中,其内容如下:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules
sudo mount -o loop,offset=$((2048*512)) extra/vexpress.img extra/img
sudo make ARCH=arm modules_install INSTALL_MOD_PATH=extra/img
sudo umount extra/img
运行extra下面的run-nolcd.sh可以启动一个不含LCD的ARM Linux。run-nolcd.sh的内容为qemu-system-arm -nographic -sd vexpress.img -M vexpress-a9 -m 512M -kernel zImage -dtb vexpress-v2p-ca9.dtb  -smp 4 -append "init=/linuxrc root=/dev/mmcblk0p1 rw rootwait earlyprintk console=ttyAMA0" 2>/dev/null,运行结果为:
baohua@baohua-VirtualBox:~/develop/linux/extra$ ./run-nolcd.sh 
Uncompressing Linux... done, booting the kernel.
Booting Linux on physical CPU 0x0
Initializing cgroup subsys cpuset
Linux version 3.16.0+ (baohua@baohua-VirtualBox) (gcc version 4.7.3 (Ubuntu/
        Linaro 4.7.3-12ubuntu1) ) #3 SMP Mon Dec 1 16:53:04 CST 2014
CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c53c7d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
Machine model: V2P-CA9
bootconsole [earlycon0] enabled
Memory policy: Data cache writealloc
PERCPU: Embedded 7 pages/cpu @9fbcd000 s7232 r8192 d13248 u32768
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 130048
Kernel command line: init=/linuxrc root=/dev/mmcblk0p1 rw rootwait earlyprintk 
        console=ttyAMA0
PID hash table entries: 2048 (order: 1, 8192 bytes)
Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
Memory: 513088K/524288K available (4583K kernel code, 188K rwdata, 1292K rodata, 
        247K init, 149K bss, 11200K reserved)
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    f?ixmap  : 0xffc00000 - 0xffe00000   (2048 kB)
    vmalloc : 0xa0800000 - 0xff000000   (1512 MB)
    lowmem  : 0x80000000 - 0xa0000000   ( 512 MB)
    modules : 0x7f000000 - 0x80000000   (  16 MB)
      .text : 0x80008000 - 0x805c502c   (5877 kB)
      .init : 0x805c6000 - 0x80603c40   ( 248 kB)
      .data : 0x80604000 - 0x80633100   ( 189 kB)
       .bss : 0x80633108 - 0x806588a8   ( 150 kB)
SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
Hierarchical RCU implementation.
    RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=4.
RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
NR_IRQS:16 nr_irqs:16 16
L2C: platform modif?ies aux control register: 0x02020000 -> 0x02420000
L2C: device tree omits to specify unif?ied cache
L2C: DT/platform modif?ies aux control register: 0x02020000 -> 0x02420000
L2C-310 enabling early BRESP for Cortex-A9
L2C-310 full line of zeros enabled for Cortex-A9
L2C-310 dynamic clock gating disabled, standby mode disabled
L2C-310 cache controller enabled, 8 ways, 128 kB
L2C-310: CACHE_ID 0x410000c8, AUX_CTRL 0x46420001
smp_twd: clock not found -2
sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956969942ns
Console: colour dummy device 80x30
…

运行extra下面的run-lcd.sh可以启动一个含LCD的ARM Linux,运行结果如图1.11所示。
image

图1.11 含LCD的ARM Linux
除了QEMU模拟的ARM电路板以外,本书配套的Ubuntu中还包含一些直接可以在Ubuntu上运行的案例,譬如/home/baohua/develop/training/kernel中就包含了globalfifo、globalmem等,这些目录的源代码都包含了Makefile,在其中直接make,生成的.ko可以直接在Ubuntu上运行。
1.5.3 源代码阅读和编辑
源代码是学习Linux的权威资料,在Windows上阅读Linux源代码的最佳工具是Source Insight,在其中建立一个工程,并将Linux的所有源代码加入该工程,同步这个工程之后,我们将能非常便捷地在代码之间进行关联阅读,如图1.12所示。
类似http://lxr.free-electrons.com/http://lxr.oss.org.cn/这样的网站提供了Linux内核源代码的交叉索引,在其中输入Linux内核中的函数、数据结构或变量的名称就可以直接得到以超链接形式给出的定义和引用它的所有位置。还有一些网站也提供了Linux内核中函数、变量和数据结构的搜索功能,在google中搜索“linux identifier search”可得。
image

图1.12 在Source Insight中阅读Linux源代码
在Linux主机上阅读和编辑Linux源码的常用方式是vim + cscope或者vim + ctags,vim是一个文本编辑器,而cscope和ctags则可建立代码索引,建议读者尽快使用基于文本界面全键盘操作的vim编辑器,如图1.13所示。
image

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux设备驱动详解【第二版】,作者宋宝华,此版PDF是经过本人整理的文字版PDF,带目录、高清无水印版。 内容简介 《Linux设备驱动开发详解(第《Linux设备驱动开发详解(第2版)》内容全面,实例丰富,操作性强,语言通俗易懂,适合广大Linux开发人员、嵌入式工程师参考使用。 图书目录 第1篇 Linux设备驱动入门 第1章 Linux设备驱动概述及开发环境构建 2 第2章 驱动设计的硬件基础 21 第3章 Linux内核及内核编程 53 第2篇 Linux设备驱动核心理论 第4章 Linux内核模块 82 第5章 Linux文件系统与设备文件系统 92 第6章 字符设备驱动 118 第7章 Linux设备驱动中的并发控制 139 第8章 Linux设备驱动中的阻塞与非阻塞I/O 161 第9章 Linux设备驱动中的异步通知与异步I/O 176 第10章 中断与时钟 193 第11章 内存与I/O访问 213 第12章 工程中的Linux设备驱动 242 第3篇 Linux设备驱动实例 第13章 Linux设备驱动 272 第14章 Linux终端设备驱动 304 第15章 Linux的I2C核心、总线与设备驱动 333 第16章 Linux网络设备驱动 363 第17章 Linux音频设备驱动 388 第18章 LCD设备驱动 440 第19章 Flash设备驱动 479 第20章 USB主机与设备驱动 507 第21章 PCI设备驱动 547 第4篇 Linux设备驱动调试、移植 第22章 Linux设备驱动的调试 564 第23章 Linux设备驱动的移植 602

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值