前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >将hello程序作为驱动程序编译进系统内核

将hello程序作为驱动程序编译进系统内核

作者头像
roobtyan
发布2019-02-21 15:49:25
1.4K0
发布2019-02-21 15:49:25
举报

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年11月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00开始
  • 0x01下载内核并解压
  • 0x02 编写程序
  • 0x03 选择挂载该“驱动”
  • 0x04 开始编译整个内核
  • 0x04 挂载(安装)模块
  • 0x05 更改启动grub
  • 0x06 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档