文章目录
- 1.测试是否能够连接到路由器
- 2.刷breed
- 3.Padavan firmware编译
- 4.烧板
- 5.验证
- 杂文
- 1.1内核模块编写(使用insmod方式)
- 1.2内核模块编写(跟随内核一起编译)
- 参考资料
1.测试是否能够连接到路由器
插上网线和电脑相连,网线插在路由器那端要插在LAN接口而不是WAN接口,在电脑的设置中找到新增的网络4,
点击下,我们就可以看到它的ip地址是192.168.144.1,在这里和通常的有点区别,比如一般的是192.168.11.1,路由器背后贴图显示地址也是wifi.youku.com,但对我这都没用,我感觉应该是我买的二手路由器已经被刷机过一次了。
然后我们ssh连接试试,成功!
2.刷breed
(这步可以选择不看,因为感觉大多数人的机子都自带了breed,检测是否有breed的方法是:拔出电源,按住路由器reset的键不放,并同时插上电源,继续按个大概5s钟的reset键就可以松手了,把网线一端连接在路由器LAN口一端连接在本机,在本机上输入192.168.1.1
,看有没有breed的页面。)
进入 https://breed.hackpascal.net/
,直接找到对应的编译好的二进制文件,我们的话就是breed-mt7620-youku-yk1.bin
,接下来我们就想把这个文件放到路由器里,一些方法说的是用U盘,但巧了U盘不在我身边,图省事,我就直接在mobaxterm里连接上这个路由器,直接用mobaxterm自带的文件传输搞定。
我们cat /proc/mtd
来看看flash的分区情况
接下来就把breed烧进去,mtd write /tmp/breed-mt7620-youku-yk1.bin u-boot
(PS:这步我其实一直没成功,一开始是显示没有u-boot的权限,无法写入,因为自带的固件openwrt会把u-boot给锁了,之后刷过一遍padavan后,却又提示我-sh: mtd: not found
,有点头疼,但不重要,感觉大家买的机子应该都自带了breed)
3.Padavan firmware编译
先安装需要的依赖包,本次运行环境是Ubuntu16.04,我知道这版本极度老。。。但是推荐是这样的,我试了试用新的Ubuntu22,但是编译时出现了我无法解决的问题,就乖乖回来Ubuntu16了。
apt-get install language-pack-zh-hans apt-utils gcc g++ gdb binutils build-essential make bison flex autoconf automake patch gawk bzip2 gettext pkg-config libtool zlib1g-dev libgmp3-dev libmpfr-dev libmpc-dev libreadline-dev vsftpd lrzsz lftp telnet curl astyle exfat-fuse ethtool sysstat bridge-utils p7zip-full help2man libtool-bin libncurses5-dev git gperf texinfo python-docutils mc autopoint
接下来开始做镜像了,复制git仓库,编译所需工具链,编译fireware
git clone https://gitlab.com/padavan-ng/padavan-ng.git
cd padavan-ng/toolchain
sh build_toolchain.sh #编译工具链,这步大概要花20分钟这样子,我是4核CPU
cd ../trunk
cp configs/templates/youku/yk_l1_full.config .config #复制yk-l1的配置文件,已经提供好模板了
sh build_firmware.sh #编译固件,这步大概也要花20分钟这样子
我们会发现在padavan-ng/trunk/images
目录下多了一个YK-L1_3.4.3.9L-100.trx
,这个就是我们想要的固件,把这个文件拷贝到我们本机上。
4.烧板
由于已经刷好breed了,现在更新固件很容易,按住路由器reset的键不放,并同时插上电源,继续按个大概5s钟的reset键就可以松手了。
把网线一端连接在路由器LAN口一端连接在本机,在本机上输入192.168.1.1
进入breed页面,
上传我们刚编译好的镜像,等待烧录即可。
5.验证
待路由器自动重启后,重新进入192.168.1.1
,注意了,初始的用户名和密码均是 admin
欸嘿,成功了!
如若想进入命令行页面的话,可以用telnet连接,使用命令telnet 192.168.1.1
,跟我们熟悉的ssh差不多,但是padavan默认是把ssh关了的,我们也可以开,在Advanced Settings的Administration里把Enable SSH Server改成Yes即可。
杂文
1.1内核模块编写(使用insmod方式)
众所周知,每一个新程序新语言第一步都是从helloworld开始,我们先写一个test.c输出helloworld叭
//test.c
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
MODULE_LICENSE("GPL");
int init_module()
{
printk(KERN_INFO "init_module hello world!\n");
return 0;
}
void cleanup_module()
{
printk(KERN_INFO "cleanup_module hello world!\n");
}
这里init_module是这个内核模块(就是这个test)被刚插入(insmod)时执行的,cleanup_module是内核模块在被卸除的时候执行的。
接下来为了生成这个内核文件,我们要写个makefile
KERNELDIR ?=/lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
obj-m := test.o
all:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mode.c .tmp_versions *.mod *.order *.symvers
这里这个 make -C $(KERNELDIR)
指明跳转到源码目录下读取那里的Makefile;M=$(PWD)
表明然后返回到当前目录继续读入、执行当前的Makefile。
而后我们就能在目录下面看到这个test.ko了
然后我们依次输入
sudo insmod test.ko #插入模块
sudo rmmod test #移除模块
sudo dmesg #显示内核日志
就可以看到如下满意的结果
1.2内核模块编写(跟随内核一起编译)
虽说上述方式可以插入内核模块,但是总感觉差点意思,比如,每次重启一遍就得重新插入一遍(这个弊端可以通过设置开机启动解决),最关键的事,感觉不像原生内核模块一样,我们想要的是内核模块跟着原本的内核一起编译结合为一体,这样才感觉比较有意思。
我们进入padavan-ng/trunk/linux-3.4.x/drivers#
目录下,这是驱动目录,也是我们下面主要进行操作的目录
完成下需要的文件结构
mkdir hello #新建一个hello文件夹
cd hello
touch Kconfig Makefile hello.c
Kconfig
menu "hello KM"
comment "hello kernel module"
config HELLO
tristate "hello module"
default y
help
hello kernel module test
endmenu
Makefile
obj-${CONFIG_HELLO} += hello.o
hello.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/ktime.h>
#include <linux/kthread.h>
#include <linux/delay.h>
static struct task_struct *ht = NULL;
static int thread_hello(void *para)
{
int i = 0;
while(!kthread_should_stop())
{
printk(KERN_DEBUG "hkm thread run, %d\n", i++);
msleep(1000);
}
return 0;
}
static int __init hello_init(void)
{
printk(KERN_DEBUG "hello, cbh\n");
ht = kthread_run(thread_hello, NULL, "hello_thread");
if(NULL == ht)
{
printk(KERN_ERR "kernel thread create failed\n");
return -1;
}
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_DEBUG "bye, sdc\n");
if(NULL != ht)
{
kthread_stop(ht);
}
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("cbh");
MODULE_DESCRIPTION("TEST in kernel source");
接下来我们来修改 drivers/Kconfig 和 drivers/Makefile
在 driver/Kconfig 中添加 source "drivers/hello/Kconfig
在 driver/Makefile 中添加 obj-${CONFIG_HELLO} += hello/
至此,添加内核模块便大功告成了,我们可以返回到 3.Padavan firmware编译进行编译。
最后我们上板检验,照例使用命令dmesg
查查系统日志,欸嘿成功了
参考资料
最新版本breed下载地址
AR/QCA/MTK Breed,功能强大的多线程 Bootloader (这个是breed作者的更新贴)
Linux kernel:如何向内核中添加自定义内核模块