转了一圈,今天再次回到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的更多相关文章

  1. 42.Linux应用调试-初步制作系统调用(用户态->内核态)

    1首先来讲讲应用程序如何实现系统调用(用户态->内核态)? 我们以应用程序的write()函数为例: 1)首先用户态的write()函数会进入glibc库,里面会将write()转换为swi(S ...

  2. linux 用户态 内核态

    http://blog.chinaunix.net/uid-1829236-id-3182279.html 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在 ...

  3. 进程:linux用户态-内核态

    用户态:Ring3运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permi ...

  4. 用户态和内核态&操作系统

    用户态和内核态 内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序. 用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被 ...

  5. cpu内核态与用户态

    1.操作系统需要两种CPU状态 内核态(Kernel Mode):运行操作系统程序,操作硬件 用户态(User Mode):运行用户程序 2.指令划分 特权指令:只能由操作系统使用.用户程序不能使用的 ...

  6. Linux用户态和内核态

    究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例 ...

  7. Linux探秘之用户态与内核态

    一. Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核).内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程 ...

  8. Linux 用户态和内核态

    1.特权级特权级用来管理和控制程序执行.如Intel x86架构的CPU,有0~3四个特权级,0级最高,3级最低.硬件在执行每条指令时都会检查指令具有的特权级.硬件提供了特权级使用机制,对操作系统来说 ...

  9. 【转载】 Linux用户态和内核态

    [说明]转载自 http://my.oschina.net/liubin/blog/27795 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分 ...

随机推荐

  1. CCPC-Wannafly Winter Camp Day4 Div1 - 置置置换 - [DP]

    题目链接:https://zhixincode.com/contest/18/problem/G?problem_id=265 题目描述 wls有一个整数 $n$,他想请你算一下有多少 $1...n$ ...

  2. CH 1401 - 兔子与兔子 - [字符串hash]

    题目链接:传送门 描述 很久很久以前,森林里住着一群兔子.有一天,兔子们想要研究自己的 DNA 序列.我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文 ...

  3. POJ 1102 - LC-Display

    Description A friend of you has just bought a new computer. Until now, the most powerful computer he ...

  4. MSSQL优化之————探索MSSQL执行计划

    最近总想整理下对MSSQL的一些理解与感悟,却一直没有心思和时间写,晚上无事便写了一篇探索MSSQL执行计划,本文讲执行计划但不仅限于讲执行计划. 网上的SQL优化的文章实在是很多,说实在的,我也曾经 ...

  5. [X][xrandr][archlinux] 手动调整显示器分辨率

    有一些时候,电脑并不能正确的识别出显示器的最大分辨率,这有可能是软件的原因,硬件的原因,显示器的原因,VGA线的原因等其他原因. 我遇到的情况,是开机时候连着VGA的话,就可以正确识别.如果使用中间进 ...

  6. EF-CodeFirst-域模型配置

    之前说到CodeFirst会使用默认约定从域模型创建数据库,同时也提供了方法重写这些约定;有两种方法可以实现 使用数据注解属性 使用Fluent API 数据注解属性 数据注释是一种简单的基于属性的配 ...

  7. 2018/04/24 PHP 设计模式之注册树模式

    之前学习了工厂模式和单例模式,明白了他们的意义. 但是我们在之后的使用中会发现一个问题,在新建一个实例的时候还是需要调用一个单例或者工厂,之后还是造成了代码和耦合和不好处理. 下面开始说一下: -- ...

  8. 洛谷P4570 [BJWC2011]元素 线性基

    正解:线性基+贪心 解题报告: 传送门! 这题其实没什么好写题解的,,,显然贪心一下尽量选魔力大的,不用证明趴挺显然的来着 所以就直接按魔力排个序,插入线性基里面,能插就加个贡献,over 放下代码趴 ...

  9. webmin小结

    centos7安装webmin https://www.cnblogs.com/andy9468/p/10537201.html webmin重置密码 重置webmin账户root的密码为例: htt ...

  10. SQL优化之踩过的坑【一】

    正看资料看的过瘾,突然收到报警,说服务器负载太高,好吧,登录服务器看看,我擦嘞,还能不能愉快的玩耍了?下面是当时的负载情况 看见mysql使用cpu已经到了2000,io没有等待.说明应该没有大的临时 ...