GCC 用户态&内核态 Makefile
转了一圈,今天再次回到C
网上一篇博文,个人感觉良心作品,故而拿来重新实现一遍,原作者原文有问题,我这里把他打通了
一.GCC Makefile
//hello.c
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
#ifdef DEBUG
printf("you ask for debug!\n");
#endif
printf("we must say goodbye\n");
return;
}
//Makefile
ifeq ($(DEBUG),y)
CFLAGS := $(CFLAGS) -DDEBUG
endif
hello: hello.c
$(CC) $(CFLAGS) $< -o $@
//result
# make
cc hello.c -o hello
# ./hello
we must say goodbye
# rm hello
# make DEBUG:=y
cc -DDEBUG hello.c -o hello
# ./hello
you ask for debug!
we must say goodbye
二.KBuild(kernel gcc) Makefile
//ville.c
/**
* * Author : ville lee villelee1987@gmail.com
* * Create Time : 2010/07/31
* * Description : This module implements a virtual file system.
* * Aimming at learning the theory of Linux VFS.
* *
* * Change Log :
* * version author Date Log
* *
* *
* *
* * */
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
/**
* * init function of the module
* *
* * */
static int __init
ville_init(void)
{
#ifdef DEBUG
/* we give the debug message like: module name : function name : debug message */
printk(KERN_ALERT "ville :ville_init: you ask for debug!\n");
#endif
printk(KERN_ALERT "ville :ville_init: ville module init!\n");
return 0;
}
static void __exit
ville_exit(void)
{
#ifdef DEBUG
/* we give the debug message like: module name : function name : debug message */
printk(KERN_ALERT "ville :ville_exit: you ask for debug!\n");
#endif
printk(KERN_ALERT "ville :ville_exit: ville module exit!\n");
return;
}
module_init(ville_init);
module_exit(ville_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ville lee");
//Makefile
## if module is built in the kernel module
## system. Give the work to kbuild.
# provide the default value to module name and ccflags-y
ifeq ($(MODULE),)
MODULE := ville
endif
ifeq ($(DEBUG),y)
ccflags-y += -DDEBUG
endif
ifneq ($(KERNELRELEASE),)
obj-m := $(MODULE).o
else
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
.PHONY:clean
clean:
echo "cleaning ...."
rm modules.order Module.symvers \
$(MODULE).ko $(MODULE).mod.c \
$(MODULE).mod.o $(MODULE).o
echo "clean up"
//result
# make
make -C /lib/modules/4.13.0-17-generic/build M=/home/woodzcl/c_develop/KMF modules
make[1]: Entering directory '/usr/src/linux-headers-4.13.0-17-generic'
CC [M] /home/woodzcl/c_develop/KMF/ville.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/woodzcl/c_develop/KMF/ville.mod.o
LD [M] /home/woodzcl/c_develop/KMF/ville.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.13.0-17-generic'
# insmod ville.ko
# rmmod ville
# cat /var/log/kern.log
Nov 22 22:05:35 ubuntu kernel: [ 1495.967374] ville :ville_init: ville module init!
Nov 22 22:05:39 ubuntu kernel: [ 1500.103238] ville :ville_exit: ville module exit!
# make clean
echo "cleaning ...."
cleaning ....
rm modules.order Module.symvers \
ville.ko ville.mod.c \
ville.mod.o ville.o
echo "clean up"
clean up
# make DEBUG:=y
make -C /lib/modules/4.13.0-17-generic/build M=/home/woodzcl/c_develop/KMF modules
make[1]: Entering directory '/usr/src/linux-headers-4.13.0-17-generic'
CC [M] /home/woodzcl/c_develop/KMF/ville.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/woodzcl/c_develop/KMF/ville.mod.o
LD [M] /home/woodzcl/c_develop/KMF/ville.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.13.0-17-generic'
# insmod ville.ko
# rmmod ville
# cat /var/log/kern.log
Nov 22 22:08:40 ubuntu kernel: [ 1680.874360] ville :ville_init: you ask for debug!
Nov 22 22:08:40 ubuntu kernel: [ 1680.874362] ville :ville_init: ville module init!
Nov 22 22:08:44 ubuntu kernel: [ 1685.649839] ville :ville_exit: you ask for debug!
Nov 22 22:08:44 ubuntu kernel: [ 1685.649841] ville :ville_exit: ville module exit!
Finally:
最后,发现自己还是个C程序员而已。
哎,但是改变还是要继续,时代在前进,我们每一个老东西都不能落后啊:)哈哈哈哈哈哈哈哈哈哈哈哈
GCC 用户态&内核态 Makefile的更多相关文章
- 42.Linux应用调试-初步制作系统调用(用户态->内核态)
1首先来讲讲应用程序如何实现系统调用(用户态->内核态)? 我们以应用程序的write()函数为例: 1)首先用户态的write()函数会进入glibc库,里面会将write()转换为swi(S ...
- linux 用户态 内核态
http://blog.chinaunix.net/uid-1829236-id-3182279.html 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在 ...
- 进程:linux用户态-内核态
用户态:Ring3运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permi ...
- 用户态和内核态&操作系统
用户态和内核态 内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序. 用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被 ...
- cpu内核态与用户态
1.操作系统需要两种CPU状态 内核态(Kernel Mode):运行操作系统程序,操作硬件 用户态(User Mode):运行用户程序 2.指令划分 特权指令:只能由操作系统使用.用户程序不能使用的 ...
- Linux用户态和内核态
究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例 ...
- Linux探秘之用户态与内核态
一. Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核).内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程 ...
- Linux 用户态和内核态
1.特权级特权级用来管理和控制程序执行.如Intel x86架构的CPU,有0~3四个特权级,0级最高,3级最低.硬件在执行每条指令时都会检查指令具有的特权级.硬件提供了特权级使用机制,对操作系统来说 ...
- 【转载】 Linux用户态和内核态
[说明]转载自 http://my.oschina.net/liubin/blog/27795 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分 ...
随机推荐
- Please check logcat output for more details
Please check logcat output for more details 小米第一次可以安装,后面就不行了,研究发现 手机里面有同名的apk,直接elipse重命名 就可以了. 小米us ...
- BZOJ 1002 - 轮状病毒 - [基尔霍夫矩阵(待补)+高精度]
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1002 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生 ...
- 【模板】HDU 1541 树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意:给你一堆点,每个点右一个level,为其右下方所有点的数量之和,求各个level包含的点数. 题解: ...
- hbase与sqoop的集成
1.sqoop抽取mysql表到hbase中 export HBASE_HOME=/opt/cdh-5.3.6/hbase-0.98.6-cdh5.3.6 export HADOOP_HOME=/op ...
- git bash 常用命令
1. cd : 切换到哪个目录下, 如 cd e:\fff 切换 E 盘下面的fff 目录. 当我们用cd 进入文件夹时,我们可以使用 通配符*, cd f*, 如果E盘下只有一个f开头的文件 ...
- present simple, continuous, and be going to 三者区别
https://www.youtube.com/watch?v=a03VKQL0dZg&list=PLZOJurmtexYozmvQGAJnVg3lgiZw0mj-y HOW TO USE F ...
- [daily] 使用diff和patch打补丁
diff org new > xxx.patch patch /path/org xxx.patch /path/org是相对路径时, 会报错. 这是一个bug.
- 苹果审核被拒,Guideline 1.1.6 - Safety - Objectionable Content;Guideline 3.1.1 - Business - Payments - In-App Purchase
Guideline 1.1.6 - Safety - Objectionable Content Thank you for your resubmission. We noticed that yo ...
- 转:spring data jpa、 hibernate、 jpa 三者之间的关系
原文链接:spring data jpa. hibernate. jpa 三者之间的关系 spring data jpa hibernate jpa 三者之间的关系 JPA规范与ORM框架之间的关系是 ...
- Appium-两个小报错
(1) 执行脚本appium报错:> info: [debug] Emulator not running appium设置中取消勾选launch avd解决 (2)执行脚本python ...