
helloworld.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)1234567891011121314151617181920
Makefile:
# To build modules outside of the kernel tree, we run "make"# in the kernel source treethe Makefile these then includes this# Makefile once again.# This conditional selects whether we are being included from the# kernel Makefile or not.# called from kernel build system: just declare what our modules areobj-m := helloworld.oCROSS_COMPILE =
CC= gcc# Assume the source tree is where the running kernel was built
# You should set KERNELDIR in the environment if it's elsewhere
KERNELDIR ?= /usr/src/linux-headers-$(shell uname -r)# The current directory is passed to sub-makes as argument
PWD := $(shell pwd)all: modulesmodules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean:
rm -rf *.o *~ core .depend *.symvers .*.cmd *.ko *.mod.c .tmp_versions $(TARGET)
在Makefile中,在obj-m := helloworld.o这句中,.o的文件名要与编译的.c文件名一致。
KERNELDIR ?= /usr/src/linux-headers-$(shell uname -r)指示当前linux系统内核的源码位置。
学嵌入式Linux要先学以下几点:1.C语言。要有C语言的基础,当然越熟练越好,不熟也没关系,具备基本技能就可以:比如写一个数组排序、输入数字求和什么的。C语言的学习就是多些多练。
2.Linux基础
Linux *** 作系统的概念、安装方法,详细了解Linux下的目录结构、基本命令、编辑器VI ,编译器GCC,调试器GDB和 Make 项目管理工具, Shell、 Makefile脚本编写等知识,嵌入式开发环境的搭建。
3.Linux系统编程
重点学习标准I/O库,Linux多任务编程中的多进程和多线程,以及进程间通信(pipe、FIFO、消息队列、共享内存、signal、信号量等),同步与互斥对共享资源访问控制等重要知识,主要提升对Linux应用开发的理解和代码调试的能力。
4.Linux网络编程
计算机网络在嵌入式Linux系统应用开发过程中使用非常广泛,通过Linux网络发展、TCP/IP协议、socket编程、TCP网络编程、UDP网络编程、Web编程开发等方面入手,全面了解Linux网络应用程序开发。重点学习网络编程相关API,熟练掌握TCP协议服务器的编程方法和并发服务器的实现,了解HTTP协议及其实现方法,熟悉UDP广播、多播的原理及编程方法,掌握混合C/S架构网络通信系统的设计,熟悉HTML,Javascript等Web编程技术及实现方法。
5.数据结构与算法
数据结构及算法在嵌入式底层驱动、通信协议、及各种引擎开发中会得到大量应用,对其掌握的好坏直接影响程序的效率、简洁及健壮性。此阶段的学习要重点理解数据结构与算法的基础内容,包括顺序表、链表、队列、栈、树、图、哈希表、各种查找排序算法等应用及其C语言实现过程。
6.Cortex A8 、Linux 平台开发
通过基于ARM Cortex-A8处理s5pv210了解芯片手册的基本阅读技巧,掌握s5pv210系统资源、时钟控制器、电源管理、异常中断控制器、nand flash控制器等模块,为底层平台搭建做好准备。Linux平台包括内核裁减、内核移植、交叉编译、GNU工具使用、内核调试、Bootloader介绍、制作与原理分析、根文件系统制作以及向内核中添加自己的模块,并在s5pv210实验平台上运行自己制作的Linux系统,集成部署Linux系统整个流程。同时了解Android *** 作系统开发流程。Android系统是基于Linux平台的开源 *** 作系统,该平台由 *** 作系统、中间件、用户界面和应用软件组成,是首个为移动终端打造的真正开放和完整的移动软件,目前它的应用不再局限于移动终端,还包括数据电视、机顶盒、PDA等消费类电子产品。
7.驱动开发
驱动程序设计是嵌入式Linux开发工作中重要的一部分,也是比较困难的一部分。本阶段的学习要熟悉Linux的内核机制、驱动程序与用户级应用程序的接口,掌握系统对设备的并发 *** 作。熟悉所开发硬件的工作原理,具备ARM硬件接口的基础知识,熟悉ARM Cortex-A8处理器s5pv210各资源、掌握Linux设备驱动原理框架,熟悉工程中常见Linux高级字符设备、块设备、网络设备、USB设备等驱动开发,在工作中能独立胜任底层驱动开发。
“一个好一点儿的计算机硕士毕业的学生。写一个 *** 作系统的内核绝对是应该办到而且肯定可以办到的事儿。” ------这句话我们可以理解为”一个好的计算机硕士掌握的理论知识足够他搭建起一个简单的 *** 作系统框架“。\x0d\x0a\x0d\x0a我上 *** 作系统课(大二)的第一天就问我的老师,学完了这门课可以自己实现一个 *** 作系统了吗?老师说:”你可以基本掌握 *** 作系统中要处理的主要问题,但是即使实现最简单的五脏俱全的 *** 作系统还需要掌握很多很多东西,而且前提是你已经有很不错的代码能力。“\x0d\x0a\x0d\x0a回到题目上来,我们要实现一个简单的 *** 作系统,最先需要解决的是哪些问题?这个问题我相信翻开任何一本 *** 作系统书都可以得到答案,一般都是 *** 作系统书的前五,六章内容(第一章基本是 *** 作系统概念及发展历史)。\x0d\x0a包括:\x0d\x0a\x0d\x0a进程管理\x0d\x0a存储管理\x0d\x0a文件系统\x0d\x0a输入/输出\x0d\x0a这些大部分是讨论理论类的书,比如我们上课用的书是西电汤子瀛老师的《计算机 *** 作系统》,后来自己为了深入学习买了Andrew S. Tanenbaum的《Modern Operating Systems》。\x0d\x0a\x0d\x0a如果想写个 *** 作系统,除了理论知识外,动手之前最好先看看 *** 作系统源代码,Linux的代码都是开源的,可以先学习学习。不过对于我们这种初学者千万不要看最新的Linux内核代码,因为那是很多人的杰作,可能一辈子都看不完。最好先看看国内同济大学赵炯基于0.11的《Linux完全注释》,即使只看懂30%也至会让自己懂很多之前不知道的东西。\x0d\x0a\x0d\x0a理论类的书很少有提到Bootload问题的,就是加电之后从哪里开始执行的部分。仅仅是这个步骤也需要花不少时间去了解CPU知识,汇编语言知识等,相当不容易。不话说回来,这部分如果能处理好之后会发现组成原理,汇编语言,微机原理的知识被自己运用到了,成就感巨大。这部分内容,可以参看MIT的课程6.828 Operating System Engineering的课程,Google一下就能搜到不少大牛关于这门课的博客。如果英语不太好我记得华中科技大学有一个叫32位 *** 作系统实践的课,资料都放到网上了,看起来很不错。\x0d\x0a\x0d\x0a过了这一关,用《深入理解计算机系统》加上《现代 *** 作系统》看一下虚拟存储器的内容,这两本书这部分说得都很棒。虚拟存储器的概念贯穿所有,如果能弄懂,对很多方面都有很大的帮助,不仅仅是 *** 作系统这块。有了虚拟存储器概念之后对于链接,加载等知识理解就会深刻许多。 不过,这部分内容也需要对硬件部分有所了解,又是一坑。\x0d\x0a\x0d\x0a之后回到进程上来之后,终于可以把工作重心从硬件部分转移过来了。但是我们又将面对进程创建,进程调度,进程通信三大问题,既然是简单实现,就先不考虑线程的事。算法书中会给很多,不过这些算法都是有一定的局限性,比如调度算法,对应的调度算法优劣差异很大,至于如何抉择就看个人需求。不过话说回来, *** 作系统里的”算法“和ACM里的算法在难度上差很多,还是比较容易实现的。\x0d\x0a\x0d\x0a内容太多了,就不完全展开了,后面就看自己“耐力”了,写 *** 作系统是需要坚持很长实践+大量知识积累的。有些问题还涉及到哲学的观点,这里推荐上海交大邹恒明教授的《 *** 作系统之哲学原理》。除了理论方面的书,现在市面上也有直接教如何实现一个 *** 作系统的,比如《Orange'S:一个 *** 作系统的实现》和《30天自制 *** 作系统》(仅有的几本“XX天XX”而不是烂书的书),起步阶段跟着这些书来还是很不错的。\x0d\x0a\x0d\x0a总之,实现最最基本的功能也许可以做到。实现功能强大,鲁棒性强的 *** 作系统极难。欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)