将hello程序作为驱动程序编译进系统内核
0x00开始
恩,可能是我比较愚钝,一个内核编译搞了一天,各种问题,各种bug,几度无奈,也是因为我突发奇想,并没有按照原来的那种操作,我直接把helloworld程序放到内核模块中编译成了一个驱动程序,虽然其中遇到了不知道多少的问题,不过最终是个完美的结局,给自己点个赞!
好了,废话不多说,直接开始还原我的helloworld驱动内核程序编译流程。
0x01下载内核并解压
编译内核,首先要做的就是有一个内核能够供你编译,我选择的操作系统是Ubuntu14.04,低版本的系统的编译难度要小很多,所以当然要选个简单的了。内核是在官网中直接下载的,网址如下:https://www.kernel.org/
版本我选择的是3.16.50,这里我们要选择一个与当前内核版本相近的内核。
内核完成下载以后,首先用su命令启动管理员权限,接着将内核压缩包移动至/root文件夹下,并将linux-3.16.50压缩文件解压到/usr/src目录下。
0x02 编写程序
1.新建文件
首先,新建一个名为helloworld的文件夹,接着在文件夹内新建helloworld.c文件,c语言程序的内容如下:
#include <linux/module.h>
#include <linux/kernel.h>
int init_hello_module(void)
{
printk("***************Start***************\n");
printk("Hello World! Start of hello world module!\n");
return 0;
}
void exit_hello_module(void)
{
printk("***************End***************\n");
printk("Hello World! End of hello world module!\n");
}
MODULE_LICENSE("Dual BSD/GPL");
module_init(init_hello_module);
module_exit(exit_hello_module);
随后,再在文件夹内新建一个Makefile文件,文件的内容是
obj-$(CONFIG_HELLOWORLD)+=helloworld.o
这时候,执行编译命令后,就会自动进入该目录下,并且会将helloworld.c编译成helloworld.o。
继续,在该文件夹下新建一个Kconfig文件,添加代码:
menu "helloworld driver"
config HELLOWORLD
tristate"HELLOWORLD"
default y
---help---
Say 'Y' here, it will be compiled into thekernel; If you choose 'M', it will be compiled into a module named ashelloworld.ko.
endmenu
注意:help下面的文字千万不能添加空格,否则在后续操作当中会出现问题,会报错
最后,将helloworld文件夹整体移动到/src/linux-xxxx/drivers目录下。
2.修改文件
首先,修改/usr/src/linux-xxxx/drivers目录下的Kconfig文件,在endmenu之前添加一条语句:
source "drivers/helloworld/Kconfig"
很明显,这里的作用是引用刚刚我们新建的Kconfig文件,或者更标准一点的用语是挂载。
其次,修改/drivers目录下的Makefile文件,添加:
obj-$(CONFIG_HELLOWORLD) += helloworld/
这行编译指令告诉模块构建系统在编译模块时需要进入 helloworld/ 子目录中。此时的驱动程序的编译取决于一个特殊配置 CONFIG_HELLOWORLD配置选项。
最后,修改arch/arm目录下的Kconfig文件,在menu “Device Drivers……endmenu”或者其他类似的地方直接添加语句:
source "drivers/helloworld/Kconfig"
0x03 选择挂载该“驱动”
由于我们是将这个程序的当做驱动程序来启动,所以在执行命令:
make menuconfig
后,在DeviceDrivers菜单下选择helloworld驱动,按空格键将选项前面的标志调整为[*]即可。
0x04 开始编译整个内核
使用命令:make -j2 ,
2代表的是编译的速度,为了加快速度,我们这里选择2,你可以自行选择,但也不要太高。
大约在虚拟机编译下两个小时左右,编译工作就完成了。
0x04 挂载(安装)模块
使用命令:
make modules,模块编译
make modules_install 安装模块
make install 最后安装内核
0x05 更改启动grub
grub就是管理Ubuntu系统启动的一个程序,我们编译好的内核要运行就要修改对应的grub,其实很简单。
mkinitramfs 3.16.50 -o /boot/initrd.img-3.16.50
update-grub2
update-grub2命令会帮我们自动修改grub
最后,重启选择新编译的内核就ok啦!
0x06 结语
感谢您的阅读,欢迎指正博客中存在的问题,也可以跟我联系,一起进步,一起交流!
微信公众号:进击的程序狗
邮箱:roobtyan@outlook.com
个人博客:https://roobtyan.github.io
将hello程序作为驱动程序编译进系统内核的更多相关文章
- linux设备驱动程序——将驱动程序编译进内核
linux驱动程序--将驱动程序编译进内核 模块的加载 通常来说,在驱动模块的开发阶段,一般是将模块编译成.ko文件,再使用 sudo insmod module.ko 或者 depmod -a mo ...
- 【转】Linux驱动模块编译进内核中
原文网址:http://blog.chinaunix.net/uid-29287950-id-4573481.html BQ27501驱动编译进内核 一. 驱动程序编译进内核的步骤 在 l ...
- 将MPLS编译进linux内核中
系统环境:linux kernel 2.6.35.(此环境是上一篇文章中将ubuntu内核替换后的环境) 编译过程如下: 1)首先需要下载patch文件:linux-kernel-v2.6.35-mp ...
- 使用objcopy实现将文件编译进执行程序
一.简介 工作中可能遇到将一个文件编译进执行程序的需求,例如bin文件.jpg文件等等.实现的方法可以使用脚本来将文件内容写入一个新的C源文件数组,达成编译进程序的目的. 现在介绍一种简单.快捷的方 ...
- dk.exe自动填报程序的反编译
dk.exe自动填报程序的反编译 dk.exe用于学校每日健康报的自动填写.
- .NET程序的简单编译原理
1.不管是什么程序,最终的执行官是CPU,而CPU只认识1和0的机器码. 2.我们现在写的一般是高级语言写的程序.CPU是不认识我们用高级语言写的源代码的,那应该怎么办才能让CPU执行我们写好的程序尼 ...
- Matlab 运行C程序出现的编译出错问题
2016-03-18 17:18:34 最近在运行一些公开的Matlab代码包时,比如LibSVM.crfChain等,遇到了需要在Matlab环境下编译C程序的问题,对于我所遇到的问题,给出以下解决 ...
- C#基础--.net平台的重要组成部分以及.net程序简单的编译原理
.net平台的组成只要有两部分 FCL:框架类库 CLR:公共语言运行时 .net程序简单的编译原理 1.0:使用C#编译器(csc.exe) 将C#源代码编译成程序集+{编译之前:会检查C ...
- Linux C 程序 空语句-gcc编译命令(SIX)
C语言语句1.空语句:当一个if或者while判断部分能完成工作,空语句可以用来表示if或者while内的空循环体 if(a == b ); 2.gcc编译器 //程序的编译过程: // 预处理:pr ...
随机推荐
- Window Server 2019 配置篇(7)- 利用脚本创建OU,组和用户
好的,服务器到上一步为止,基本的雏形已经确立了,接下来我们要完善一些细节 打开AD-admin服务器,创建一个脚本,要求能够从csv文件中读出数据并建立OU,组和用户,以及他们的密码 这里有一个参考的 ...
- CAN编写完分帧发送, 分帧接收,J1939位域型结构体心得
关于由多个不同的C文件构成的工程,我采用以下方法 以为400Hz数字电源程序为例 假设工程由以下文件组成 DC_Comm.c 主要完成串口通讯部分 DC_Config.c 主要完成时钟,外设 中断初始 ...
- PlayJava SpringMVC与Struts2杂谈
一 先做一个简单对比: 1. SpringMVC的入口是Servlet,核心是DispatcherServlet,Struts2是Filter,核心是FilterDispatcher 2. Sprin ...
- 十、SAP小数需要用引号括起来
一.我们定义一个浮点型f的变量,然后赋值,检查会报错 二.我们把引号括起来之后,就正常了,如下: 三.输出效果如下: 注意:f类型的变量,输出不是准确值
- UVA 10564 计数DP
也是经典的计数DP题,想练练手,故意不写记忆化搜索,改成递推,还是成功了嘞...不过很遗憾一开始WA了,原来是因为判断结束条件写个 n或s为0,应该要一起为0的,搞的我以为自己递推写挫了,又改了一下, ...
- 操作系统类型&操作系统结构&现代操作系统基本特征
五大类型操作系统 (1). 批处理操作系统 用户脱机使用计算机 用户提交作业之后直到获得结果之前就不再和计算机打交道. 作业提交的方式可以是直接交给计算中心的管理操作员,也可以是通过远程通讯线路提交. ...
- python 网页爬虫 基础篇
首先要连接自己的数据库 import pymysql import requests #需要导入模块 db = pymysql.connect('localhost', 'root', '****** ...
- Java算法练习——盛最多水的容器
题目链接 题目描述 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) ...
- PageHelper使用
之前我们整合过SSM框架,可以查询数据库数据,项目中一般不会全部查询所有数据,为了美观和性能,都是采用分页形式查询数据 一:pom.xml导入pagehelper.jar <!-- https: ...
- Element.scrollIntoView() 和 document.elementFromPoint ()
Element.scrollIntoView() 让当前的元素滚动到浏览器窗口的可视区域内 element.scrollIntoView(); // 等同于element.scrollIntoV ...