1 内核编译:Makefile
(1)下载linux源码
解压:sudo tar -xvf
(3)编译内容
条件编译:
在内核的Makefile中,你可以通过检查.config
文件中定义的配置宏来决定是否编译某个模块或文件
obj-$(CONFIG_LED) += xx1.o
obj-$(CONFIG_XX2) += xx2.o
obj-$(CONFIG_XX3) += xx3.o
这里的关键是obj-
变量。这个变量用于告诉make工具哪些源文件应该被编译成对象文件(.o
),这取决于.config
中相应的配置宏是否被设置为y
(表示编译进内核)或m
(表示编译为模块)。
- 如果
CONFIG_LED=y
,则xx1.o
会被编译进内核。 - 如果
CONFIG_XX2
没有被设置为y
或m
,则xx2.o
不会被编译。 - 同理,如果
CONFIG_XX3=y
,则xx3.o
会被编译进内核。
(2)配置内核
make menuconfig
//可视化配置菜单
①先拷贝一个默认的配置到.config(官方认真的) vim .config --- 编译会直接编译
>②找到.config 所在目录> ③选择拷贝内容为->
->④进行配置(是否需要修改)make menuconfig
可视化配置:运行make menuconfig会启动一个基于文本的用户界面,允许你选择或更改内核的配置选项。
在这个界面中,你可以启用或禁用各种功能
(4)如果想编译uImage:
①此处的address 与point 不一样如果一样则需要修改:
②如果在编译中遇到此问题
修改:
进入将此行 注释#
②如果想实现需要将uImage 拷贝到 tftp目录下(chomd 777 uImage)
sudo minicom
tftp 0x30008000 uImage
bootm 30008000
实现:
2 如何修改kconfig
(1)dirver/char 下kconfig
(2)
vim .config ->可以查看变化
(1)自己编写一个目录
进入上级目录 ---->
other关键字:
default:
depends:
select:
3 实现.c文件的编译
/char 下 vim Makefile 里添加 OBJ-$(CONFIG_XXX) += XXX.o
4 .练习
因为要实现驱动所以在 /drivers 下操作
- 编写一段简单的历程:编写 demoy.c
1 #include<linux/init.h> 2 static int __init demo_init(void) 3 { 4 return 0; 5 } 6 static void __exit demo_exit(void) 7 { 8 9 } 10 11 module_init(demo_init); 12 module_exit(demo_exit);
- 想要实现注册 得要调用到相关函数
#include<linux/kernel.h>
- 将uimage 拷贝到 tytpboot下
-
sudo minicom tftp 0x30008000 uImage bootm 30008000
实现:
5 . 驱使设备行动的程序编译
①删除交换文件 改变只读文件
②想要查看相关函数的头文件或者信息 Ctrl + } 相当于 man
(1)
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
#include <linux/cdev.h>
#include <linux/module.h>
#define MAJOR_NUM 255
#define MINOR_NUM 0
#define DEV_NAME "demo"
#define DEV_NUM 1
int open (struct inode * inode, struct file * file)
{
printk("demo open ...\n");
return 0;
}
ssize_t read (struct file * file, char __user * buf, size_t len, loff_t * offset)
{
printk("demo read ...\n");
return 0;
}
ssize_t write (struct file * file, const char __user * buf, size_t len, loff_t * offset)
{
printk("demo write ...\n");
return 0;
}
int close (struct inode * inode, struct file * file)
{
printk("demo close ...\n");
return 0;
}
static struct file_operations fops =
{
.owner = THIS_MODULE,
.open = open,
.read = read,
.write = write,
.release = close
};
static struct cdev cdev;
static dev_t dev;
static int __init demo_init(void)
{
dev = MKDEV(MAJOR_NUM, MINOR_NUM);
cdev_init(&cdev, &fops);
cdev_add(&cdev, dev, DEV_NUM);
register_chrdev_region(dev, DEV_NUM, DEV_NAME);
printk("demo_init ###############################\n");
return 0;
}
static void __exit demo_exit(void)
{
unregister_chrdev_region(dev, DEV_NUM);
cdev_del(&cdev);
printk("demo_exit ###############################\n");
}
module_init(demo_init);
module_exit(demo_exit);
(2)
(3)
去找一个字符设备主设备号255 次设备号0 的链接节点 就可以找到 demoy_app
(4)再次编译就可以实现
在内核里实现了打印