跟着简叔学的,可以B站搜索 简说linux
多进程访问驱动设备带来的问题
在驱动程序中,有些设备只允许打开一次。那么可以在驱动中定义一个全局变量,判断当前使用数目。比如在某驱动程序的open函数中这样定义。当count==0说明没有使用,可以打开。理想状态下是左边的情况,但是cpu对进程的调度是随机的,所以不可避免的发生右边的情况。就会打开多次。
为什么没有count—的操作?因为这是驱动的open函数。—肯定是在close函数里边。
参考链接:linux驱动开发第1讲:带你编写一个最简单的字符设备驱动-今日头条 (toutiao.com)
首先,驱动文件与一般的c文件不同,他有着自己独有的入口函数与出口函数,通过一下方式定义:
1 | module_init(hello_init); //入口函数 |
入口函数会在插入驱动insmod
时执行,出口函数会在rmmod
时执行。
参考链接:https://blog.csdn.net/song_lee/article/details/105815237
参考连接:从源码编译linux-4.9内核并运行一个最小的busybox文件系统(最新整理版) - 哔哩哔哩 (bilibili.com)
实验环境
首先需要确认CPU是支持虚拟化的
1 |
|
安装交叉编译工具
1 | sudo apt-get install gcc-arm-linux-gnueabi |
这里先使用Ubuntu自带的qemu
1 | sudo apt-get install qemu |
1 | wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.9.229.tar.xz |
太慢了,直接浏览器下完用vscode往上传的。
1 | dawnlake@dawnlake-virtual-machine:~/Downloads$ ls |
下列命令要在管理员权限下执行,root用户可以不用加sudo
指定硬件体系架构 , 因为开发环境是x86,要编译arm内核就需要指定ARCH=arm且需要安装交叉编译器。 前面已经装好。这只是个临时的环境变量
1 | sudo export ARCH=x86 |
配置board config,此处配置为 x86_64_defconfig。
1 | sudo make x86_64_defconfig |
配置内核,针对性配置,和实验不想关的就不做配置,避免内核臃肿。
1 | make menuconfig |
进来之后,([*]代表要选中哈)
操作时候一看就懂不解释了。
然后执行make编译
1 | make |
执行完毕后结果显示(找得到的),
1 | Kernel: arch/x86/boot/bzImage is ready (#1) |
这就是编译好的内核。
BusyBox combines tiny versions of many common UNIX utilities into a single small executable. It provides replacements for most of the utilities you usually find in GNU fileutils, shellutils, etc. The utilities in BusyBox generally have fewer options than their full-featured GNU cousins; however, the options that are included provide the expected functionality and behave very much like their GNU counterparts. BusyBox provides a fairly complete environment for any small or embedded system.
BusyBox has been written with size-optimization and limited resources in mind. It is also extremely modular so you can easily include or exclude commands (or features) at compile time. This makes it easy to customize your embedded systems. To create a working system, just add some device nodes in /dev, a few configuration files in /etc, and a Linux kernel.
下载busybox 地址Index of /downloads (busybox.net) 版本: 1.30.0 并解压 报错 建议下载更新版本的>=1.36.0
1 | tar xvf busybox-1.30.0.tar.bz2 |
然后进入到目录下
配置buysbox源码
在这里我们把busybox配置为静态编译,这样busybox在运行的时候就不需要额外的动态链接库了。
1 | make menuconfig |
操作时候就能看懂
然后编译安装
1 | make && make install |
解决方案:换更高版本的busybox
如果是老版本的ubuntu应该是不会报错,如果报错要么降低ubuntu版本,要么升级busybox版本。
重新执行上述步骤,安装成功
目前还不是完整的文件系统,还待完善,无法直接使用。现在只是目录,内核识别的是文件系统。内核启动需要consle打印信息,但是这里面连dev都没有,所以也不存在什么设备文件。
进入_install目录,补充一些必要的文件或目录,相关的shell命令如下:
1 | #创建一下三个目录 |
至此完整的文件系统制作完成
先制作一个空的镜像文件;
然后把此镜像文件格式化为ext3格式;
然后把此镜像文件挂载,并把根文件系统复制到挂载目录;
卸载该镜像文件。
打成gzip包。
1 | #!/bin/bash |
下面是重要的步骤成功时的输出
参数说明:
1 | $qemu-system-x86_64 \ |
注意:要在图形界面下执行!而且执行目录是linux-4.9.229
所在的目录。
很快啊!!!!