Ubuntu下驱动开发HelloWorld
1.3.2为DDK_HelloWorld添加卸载驱动例程-(10课)
1.3.2为DDK_HelloWorld添加卸载驱动例程-(10课)1.3.2为DDK_HelloWorld添加卸载驱动例程 (10课)A、输出调试信息-KdPrintB、认识PDRIVER_OBJECT结构C、注册驱动卸载例程D、卸载例程回调函数构建E、查看驱动调试信息课时22:12===============教案内容====================1、VC环境新建一个项目工程#define INITCODE code_seg("INIT") //入口函数一般需要放在INIT标志的内存中,INIT标志指明该函数只是在加载的时候需要载入内存,而当驱动成功加载后,该函数可以从内存中卸载掉#define PAGEDCODE code_seg("PAGE") //讲的过程中漏了这点不好意思VOID DDK_Unload (IN PDRIVER_OBJECT pDriverObject);KdPrint(("")); //DbgPrint用DriverMonitor工具载入驱动用DebugView 查看驱动调试信息===============教案内容====================这节课以VC6来书写代码,但是并不用它来编译.我们先新建一个空的控制台程序,然后将上节课的3个代码文件复制进来,然后在编译器中将mini_ddk.c文件添加进来,然后加入卸载信息,最后代码如下//_stdcall#include //驱动头文件#define INITCODE code_seg("INIT") //这个是卸载函数的预处理#pragma INITCODE //预编译,将INITCODE指定为INITVOID DDK_Unload (IN PDRIVER_OBJECT pDriverObject); //前置说明卸载例程NTSTA TUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING B) //TYPEDEF LONG NTSTA TUS这个函数是一个别名,也就是32位无符号整数{KdPrint(("驱动成功被加载...OK++++++++"));//注意这里要用双括号pDriverObject->DriverUnload=DDK_Unload;//回调函数的指针return (1);}VOID DDK_Unload (IN PDRIVER_OBJECT pDriverObject)//卸载函数已经前置声明{KdPrint(("驱动成功被卸载...OK-----------")); //需要这样一个宏相当于sprintf,printfDbgPrint("卸载成功");//当然如果用这条语句就是单括号}这里呢还是用DDK进行编译,以后再用IDE,如果编译第二次有出错的话就加上参数-c,这样就覆盖编译,而编译错误可以看.log文件,里面有详细记录信息.我们加载驱动要用到一个工具DriverMonitor,而为了查看驱动信息还是用到DebugView,查看信息要选上”捕获内核调试信息”和”捕获消息事件”(“Capture Kernel” and “Capture Events”)加载一下发现前面已经加载过了,这里需要重新启机了,但是我们也可以通过改名字来不用关机,经过调试发现了加载和卸载的信息.以后要用到WInDBG来调试驱动,相当于OllyDbg.未加密的教程就到此课,下课开始加密内容.。
linux驱动开发(一)
linux驱动开发(⼀)1:驱动开发环境要进⾏linux驱动开发我们⾸先要有linux内核的源码树,并且这个linux内核的源码树要和开发板中的内核源码树要⼀直;⽐如说我们开发板中⽤的是linux kernel内核版本为2.6.35.7,在我们ubuntu虚拟机上必须要有同样版本的源码树,我们再编译好驱动的的时候,使⽤modinfo XXX命令会打印出⼀个版本号,这个版本号是与使⽤的源码树版本有关,如果开发板中源码树中版本与modinfo的版本信息不⼀致使⽆法安装驱动的;我们开发板必须设置好nfs挂载;这些在根⽂件系统⼀章有详细的介绍;2:开发驱动常⽤的⼏个命令lsmod :list moduel 把我们机器上所有的驱动打印出来,insmod:安装驱动rmmod:删除驱动modinfo:打印驱动信息3:写linux驱动⽂件和裸机程序有很⼤的不同,虽然都是操作硬件设备,但是由于写裸机程序的时候是我们直接写代码操作硬件设备,这只有⼀个层次;⽽我们写驱动程序⾸先要让linux内核通过⼀定的接⼝对接,并且要在linux内核注册,应⽤程序还要通过内核跟应⽤程序的接⼝相关api来对接;4:驱动的编译模式是固定的,以后编译驱动的就是就按照这个模式来套即可,下⾯我们来分下⼀下驱动的编译规则:#ubuntu的内核源码树,如果要编译在ubuntu中安装的模块就打开这2个#KERN_VER = $(shell uname -r)#KERN_DIR = /lib/modules/$(KERN_VER)/build# 开发板的linux内核的源码树⽬录KERN_DIR = /root/driver/kernelobj-m += module_test.oall:make -C $(KERN_DIR) M=`pwd` modulescp:cp *.ko /root/porting_x210/rootfs/rootfs/driver_test.PHONY: cleanclean:make -C $(KERN_DIR) M=`pwd` modules cleanmake -C $(KERN_DIR) M=`PWD` modules这句话代码的作⽤就是到 KERN_DIR这个⽂件夹中 make modules把当前⽬录赋值给M,M作为参数传到主⽬录的Makefile中,实际上是主⽬录的makefile中有⽬标modules,下⾯有⼀定的规则来编译驱动;#KERN_VER = $(shell uname -r)#KERN_DIR = /lib/modules/$(KERN_VER)/build我们在ubuntu中编译内核的时候⽤这两句代码,因为在ubuntu中为我们保留了⼀份linux内核的源码树,我们编译的时候直接调⽤那个源码树的主Makefile以及⼀些头⽂件、内核函数等;了解规则以后,我们设置好KERN_DIR、obj-m这两个变量以后直接make就可以了;经过编译会得到下⾯⼀些⽂件:下⾯我们可以使⽤lsmod命令来看⼀下我们ubuntu机器现有的⼀些驱动可以看到有很多的驱动,下⾯我们使⽤insmod XXX命令来安装驱动,在使⽤lsmod命令看⼀下实验现象可以看到我们刚才安装的驱动放在了第⼀个位置;使⽤modinfo来打印⼀下驱动信息modinfo xxx.ko这⾥注意vermagic 这个的1.8.0-41是你⽤的linux内核源码树的版本号,只有这个编译的版本号与运⾏的linux内核版本⼀致的时候,驱动程序才会被安装注意license:GPL linux内核开元项⽬的许可证⼀般都是GPL这⾥尽量设置为GPL,否则有些情况下会出现错误;下⾯使⽤rmmod xxx删除驱动;-------------------------------------------------------------------------------------5:下⾯我们分析⼀下驱动。
Linux环境下编写C语言的HelloWorld程序
Linux环境下编写C语⾔的HelloWorld程序1.先创建⼀个.c⽂件,⽅法有很多,以下列出⼏种,仅供参考:$ touch Hello.c #使⽤touch命令创建.c⽂件。
$ vim Hello.c #使⽤vim创建。
$ nano Hello.c #使⽤nano创建。
2.编写“Hello World”程序的代码://包含了输出函数printf()的头⽂件#include <stdio.h> //main()函数是C语⾔程序的⼊⼝,int是main()的返回类型为整形,整形可以理解为整数,void是main()的参数,void表⽰main()不接受参数。
int main(void) //main()函数的有效范围在这个打括号内,⼤括号是main()的函数体。
{ //printf()函数可以在屏幕上打印⼀些内容,"Hello World"是⼀⾏字符串,'\n'是⼀个转义字符,是换⾏的意思。
printf("Hello World!\n"); //return 是返回的意思, return 0;即表⽰main()函数返回值为0。
return 0;}3.使⽤GCC编译器编译代码:如果没有装GCC编译器的话,解决好安装源的问题之后⽤包管理器安装。
例如:$ sudo pacman -S gcc #Arch安装GCC$ sudo apt install gcc#Debian/Ubuntu/Deepin等安装GCC$ sudo yum -y intall gcc#Centos安装GCC安装好了之后⽤GCC编译代码:$ gcc Hello.c #编译C语⾔⽂件。
4.运⾏可执⾏⽂件:$ ./a.out #执⾏a.out⽂件。
$ Hello World! #运⾏结果。
在Ubuntu下开发驱动程序
在Ubuntu下开发驱动程序⾸先,建⽴⼀个⽬录作为⾃⼰的⼯作⽬录,⽐如我的是~/kernel/mymodule。
然后,新建⼀个hello.c⽂件,代码如下:#include <linux/init.h>#include <linux/module.h>MODULE_LICENSE("Dual BSP/GPL");static int hello_init(void){ printk(KERN_ALERT "Hello,world.\n"); return 0;}static int hello_exit(void){ printk(KERN_ALERT "Goodbye, cruel world.\n"); return 0;}module_init(hello_init);module_exit(hello_exit);再建⽴⼀个Makefile⽂件,注意⽂件名字是“Makefile”,不能是“makefile”或其它名字。
⽂件内容如下:# If KERNELREALEASE is defined, we've been invoked from the# kernel build system and can use its languageifneq ($(KERNELRELEASE),) obj-m := hello.o# Otherwise we were called directly from the command# line; invoke the kernel build systemelse KERNELDIR ?= /usr/src/linux-headers-3.2.0-23-generic-pae/ PWD := $(shell pwd)default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modulesendif其中,“linux-headers-3.2.0-23-generic-pae”是我机器上使⽤的内核版本。
Docker运行helloworld
Docker运⾏helloworldDocker 允许你在容器内运⾏应⽤程序,使⽤ docker run 命令来在容器内运⾏⼀个应⽤程序。
输出Hello worlddocker run ubuntu:15.10 /bin/echo "Hello world"各个参数解析:docker: Docker 的⼆进制执⾏⽂件。
run:与前⾯的 docker 组合来运⾏⼀个容器。
ubuntu:15.10指定要运⾏的镜像,Docker⾸先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
/bin/echo "Hello world": 在启动的容器⾥执⾏的命令以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建⼀个新容器,然后在容器⾥执⾏ bin/echo "Hello world",然后输出结果。
运⾏交互式的容器我们通过docker的两个参数 -i -t,让docker运⾏的容器实现"对话"的能⼒docker run -i -t ubuntu:15.10 /bin/bash各个参数解析:-t:在新容器内指定⼀个伪终端或终端。
-i:允许你对容器内的标准输⼊ (STDIN) 进⾏交互。
此时我们已进⼊⼀个 ubuntu15.10系统的容器在容器中运⾏命令 cat /proc/version和ls分别查看当前系统的版本信息和当前⽬录下的⽂件列表可以通过运⾏exit命令或者使⽤CTRL+D来退出容器。
启动容器(后台模式)使⽤以下命令创建⼀个以进程⽅式运⾏的容器docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"在输出中,我们没有看到期望的"hello world",⽽是⼀串长字符72e0cb1ea551bcd1328c08c0d35a5f8aca0ab7a8f89ad7517cf98408be1367f4这个长字符串叫做容器ID,对每个容器来说都是唯⼀的,我们可以通过容器ID来查看对应的容器发⽣了什么。
helloworld程序编写
helloworld程序编写编写一个Hello World程序是学习任何编程语言的经典起点。
下面,我将为您展示如何使用几种不同的编程语言来编写Hello World程序。
1.PythonPython是一种高级解释型编程语言,以简洁易懂的语法和丰富的库而闻名。
以下是使用Python编写Hello World程序的示例:print("Hello, World!")2.JavaJava是一种面向对象的编程语言,被广泛用于企业级应用开发。
以下是使用Java编写Hello World程序的示例:public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}}3.C++C++是C语言的扩展,它提供了面向对象和泛型编程的功能。
以下是使用C++编写Hello World程序的示例:#include <iostream>int main() {std::cout << "Hello, World!" << std::endl;return 0;}4.JavaScriptJavaScript是一种主要用于Web开发的脚本语言。
以下是使用JavaScript编写Hello World程序的示例:console.log("Hello, World!");5.C#C#是微软开发的一种面向对象的编程语言,它与Java有些相似。
以下是使用C#编写Hello World程序的示例:using System;class Program {static void Main(string[] args) {Console.WriteLine("Hello, World!");}}在以上示例中,每个程序都打印出了"Hello, World!"。
虚拟机搭建ubuntu驱动编程环境
这几天学习用虚拟机搭建了ubuntu的驱动编程环境,大部分资料都是在网上找的,但是没有找到从虚拟机搭建一直到第一个helloworld程序调通的文章,所以自己总结一下。
菜鸟水平,大家不要扔砖。
虚拟机的安装虚拟机:VMware-workstation-full-v7.1.4,Linux系统:ubuntu-11.04-desktop-i386.iso这两个网上都能下到,很容易找到。
虚拟机的安装就直接按照默认安装就可以了,没有什么特别。
之后是在虚拟机上安装ubuntu系统。
(1)首先进入file,选择new VirtualMachine(2)弹出对话框后选择typical下一步(3)在弹出的对话框中选择安装硬盘镜像文件(本人没有刻碟,直接安装镜像),点击下一步(4)在弹出的对话框中输入用户名和密码(要记住,后面进系统的时候需要),点击下一步(5)之后弹出对话框,输入虚拟机名称和文件的位置,点击下一步,弹出对话框中设置最大硬盘大小,用默认的20G就可以了(6)点击next会出现虚拟机的配置,以及给虚拟机加电的选项,之后就会进入系统安装(7)系统的安装很简单,几乎不需要设置什么东西,这里就不再啰嗦了,如果想要找系统安装的方法的话,可以参考一下网上的一篇文章,百度上搜:详解:Vmware虚拟机下Ubuntu 8.04安装,和这个差不多。
(8)系统装好之后就可以进入页面了,用之前设置的用户名和密码登陆,系统安装完成。
虚拟机以及系统的设置(1)设置root用户。
首先用之前设置的用户名和密码进入系统(直接点击power on virtual machine)之后进入终端。
进入终端后执行sudo passwd root,回车Password:后输入刚建立的用户密码回车Enter new UNIX password:这时输入要设置的root密码两次就会看到password updated successfully了。
Linux设备驱动程序学习(0)-Hello, world!模块
Linux设备驱动程序学习(0)-Hello, world!模块Linux设备驱动程序学习(0)-Hello, world!模块一个学习Linux设备驱动程序都会碰到的第一个例程:我将其复制到我的工作目录,并编写了一个简单的Makefile文件:说实话,以上是我参考了《Linux设备驱动程序(第3版)》的Makefile源码修改得来的。
我对Makefile不是很了解,是该好好学习学习了!然后就是make modules 、make modules_install 。
在我的开发板上的操作:学习心得:(1)驱动模块运行在内核空间,运行时不能依赖于任何函数库和模块连接,所以在写驱动时所调用的函数只能是作为内核一部分的函数。
(2)驱动模块和应用程序的一个重要不同是:应用程序退出时可不管资源释放或者其他的清除工作,但模块的退出函数必须仔细撤销初始化函数所作的一切,否则,在系统重新引导之前某些东西就会残留在系统中。
(3)处理器的多种工作模式(级别)其实就是为了操作系统的用户空间和内核空间设计的。
在Unix类的操作系统中只用到了两个级别:最高和最低级别。
(4)要十分注意驱动程序的并发处理。
(5)内核API中具有双下划线(_ _)的函数,通常是接口的底层组件,应慎用。
(6)内核代码不能实现浮点书运算。
(7)Makefile文件分析:obj-m :=hello.o 代表了我们要构造的模块名为hell.ko,make 会在该目录下自动找到hell.c文件进行编译。
如果hello.o 是由其他的源文件生成(比如file1.c和file2.c)的,则在下面加上(注意红色字体的对应关系):hello-objs := file1.o file2.o ......$(MAKE)-C $(KERNELDIR) M=$(PWD) modules其中-C $(KERNELDIR) 指定了内核源代码的位置,其中保存有内核的顶层makefile文件。
在Ubuntu10.04下驱动开发环境搭建
在Ubuntu10.04驱动开发环境搭建一、准备开发工具开发工具主要有gcc、gdb、make在Ubuntu中可以通过下面这个命令安装:$apt-get install build-essential我没有执行上面的命令,因为我在之前编译过Android,相关工具已经配置好了:$sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev x11proto-core-dev libx11-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos libncurses5-dev二、下载Linux源代码linux源码可以通过以下几种途径获得:1)直接去下载2)通过包管理工具下载源码用下面指令查看可用的源码包:$ sudo apt-cache search linux-sourcelinux-source - Linux kernel source with Ubuntu patcheslinux-source-2.6.32 - Linux kernel source for version 2.6.32 with Ubuntu patches在Ubuntu中可以通过下面这个命令下载:$apt-get install linux-source-(版本号)$sudo apt-get install linux-source-2.6.32下载后的文件linux-source-2.6.32.tar.bz2在/usr/src目录中,解压:$su – root$cd /usr/src$tar jxvf linux-source-2.6.32.tar.bz2解压后在/usr/src目录下产生了一个linux-source-2.6.32源码目录三、编译内核依次执行下列命令(必须都执行,否则编译错误,如果不是root用户,命令前加sudo):1)配置内核$su – root$cd /usr/src/linux-source-2.6.32$make config或$make menuconfig或者$ sudo cp ../linux-headers-2.6.32-21-generic/.config ./.config如果当前运行内核打开了CONFIG_IKCONFIG_PROC参数,则可以$zcat /proc/config.gz > .config$make oldconfig2)编译内核2.6版本后前两步不需要,直接make即可$make prepare$make scripts$make3)安装模块$make modules 这一步不需要$make module_install执行结束之后,会在/lib/modules下生成新的目录/lib/modules/2.6.32.44+drm33.19四、生成镜像文件1)生成内核镜像文件$make bzImage执行完成后将在arch/i386/boot/目录下生成bzImage镜像文件,使用下面命令安装到系统的/boot目录下:$sudo make installsh /usr/src/linux-source-2.6.32/arch/x86/boot/install.sh 2.6.32.44+drm33.19 arch/x86/boot/bzImage \ System.map "/boot"命令完成后在/boot目录下,将多了vmlinuz-2.6.32.44+drm33.19和System.map-2.6.32.44+drm33.19两个文件或者直接拷贝$ sudo cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.32.44+drm33.192)生成要载入ramdisk的映像文件如果linux系统按照在scsi磁盘上,这部是必须的,否则可以跳过。
Nano之HelloWorld驱动(学习如何单独编译.ko模块)
Makefile
1 把下面3个参数改成你自己的: 2 obj-m (.o文件) 3 KERNELDIR (内核目录全路径) 4 CROSS_ARCH (架构及其编译器)
1 #set KERNELDIR and CROSS_COMPILE path yourself
2#
3 ifneq ($(KERNELRELEASE),)
1、准备下面两个文件:
1 Makefile 2 nano_hello_module.c
nano_hello_module.c
1 #include <linux/kernel.h> 2 #include <linux/module.h> 3 4 static int __init nano_hello_module_init(void) 5{ 6 printk("Hello yfw, Nano module is installed !\n"); 7 return 0; 8} 9 10 static void __exit nano_hello_module_cleanup(void) 11 { 12 printk("Good-bye yfw, Nano module was removed!\n"); 13 } 14 15 module_init(nano_hello_module_init); 16 module_exit(nano_hello_module_cleanup); 17 18 MODULE_LICENSE("GPL");
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
Nano之 HelloWorld驱动(学习如何单独编译 .ko模块)
Linux下如何编写第一个C语言helloworld程序
Linux下如何编写第一个C语言helloworld程序
Linux下如何编写第一个C语言hello world程序
我想很多人不知道Linux下编写第一个C语言hello world程序是怎么做的,下面是店铺收集整理的.Linux下如何编写第一个C语言hello world程序,希望对大家有帮助~~
Linux下编写第一个C语言hello world程序的方法
进入Linux系统后,启动一个shell命令终端,在Ubuntu的三键启动终端方法是同时按下 Ctrl键+Alt键+t 启动后如下图所示:在终端下敲入命令gedit helloworld.c 后按下回车键。
这个命令会用gedit软件打开文件名为helloworld.c的文件,如果该文件不存在工作目录,则gedit软件会自动新建一个名为helloworld.c的文件。
命令如下图所示:
gedit软件启动后操作类似Windows下的记事本,编辑代码如图所示,并保存退出。
图中的代码为:
#include
int main()
{
printf("hello world! ");
return 0;
}
现在我们回到终端操作,输入命令 gcc helloworld.c ,按下回车键进行编译,稍等片刻编译完成,请看图。
如果不是如图所示结果也不要着急,检查下你的代码是否和我的一样哦。
上面我们使用gcc命令把helloworld.c文件转换为了名为a.out 的可执行文件输入命令 ./a.out 就可以运行程序了,请看运行结果图。
【Linux下如何编写第一个C语言hello world程序】。
Ubuntu编译的第一个内核模块hello
所有模块都要使用头文件module.h,此文件必须包含进来。
头文件kernel.h包含了常用的内核函数。
头文件init.h包含了宏_init和_exit,它们允许释放内核占用的内存。
lkp_init是模块的初始化函数,它必需包含诸如要编译的代码、初始化数据结构等内容。
使用了printk()函数,该函数是由内核定义的,功能与C库中的printf()类似,它把要打印的信息输出到终端或系统日志。
lkp_cleanup是模块的退出和清理函数。
此处可以做所有终止该驱动程序时相关的清理工作。
module_init()和cleanup_exit()是模块编程中最基本也是必须的两个函数。
module_init()是驱动程序初始化的入口点。
而cleanup_exit()注销由模块提供的所有功能。
2 编写Makefile 文件,与hello.c 放在同一个目录里obj-m := hello.oKERNELBUILD :=/lib/modules/$(shell uname-r)/builddefault: make -C $(KERNELBUILD) M=$(shell pwd) modulesclean: rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions(注意makefile里面要求的tab)KERNELBUILD :=/lib/modules/$(shell uname -r)/build是编译内核模块需要的Makefile的路径,Ubuntu下是/lib/modules/2.6.31-14-generic/buildmake -C $(KERNELBUILD) M=$(shell pwd) modules 编译内核模块。
-C 将工作目录转到KERNELBUILD,调用该目录下的Makefile,并向这个Makefile传递参数M的值是$(shell pwd) modules。
Ubuntu+ARM9(mini2440)环境下第一个程序Hello world!
Ubuntu+ARM9(mini2440)环境下第一个程序Hello world!呵呵,买来的第二天,成功在板子上跑了第一个程序。
helloword。
软件环境:Ubuntu8.04 ,Kermit,FTP(板子上的内嵌Linux自带)硬件环境:友善之臂mini2440,USB转串口,网线1、配置ARM交叉编译环境,见/liheyuan87/blog/item/7d9819a4065693f09152ee2b.html2、编写程序#include <stdio.h>int main(){printf("Hello,Li heyuan!\n");}3、编译,切换到程序的目录下arm-linux-gcc -o hello hello.c如果没有错误,并且该目录下多了一个hello的“可执行程序”,就成功了~当然,这个程序是ARM的可执行格式,在linux下是无法执行的,您可以自己试试~4、设定FTP传输mini2440的传输方式很多样。
居然还有U盘传输。
这里用最简单的FTP传输吧这个牵扯到配置一些东西:1、连接串口(包括串口转USB)和一个串口通信程序,这里用的是kermit,韦东山那本书上推荐的。
配置方法见:/liheyuan87/blog/item/b9068a1c9efe388c86d6b6bd.html 2、设置FTP传输默认的MINI2440,选择NAD FLASH(就是能启动linux那个设置),启动linux之后,自动开启了一个FTP的设置。
很强大。
IP是192.168.1.230 用户名密码都是plg因此把本地网卡和ARM上用网线练好,然后把本机IP设定为192.168.1.x,不是230就好5、传输#登录lhy@liheyuan-laptop:~$ ftp 192.168.1.230#如果没有提示HOST无法路由的话,则物理网络链路成功~Connected to 192.168.1.230.220 FriendlyARM FTP server (Version 6.4/OpenBSD/Linux-ftpd-0.17) ready. #用户名和密码都是plgName (192.168.1.230:lhy): plg331 Password required for plg.Password:230 User plg logged in.Remote system type is UNIX.Using binary mode to transfer files.#更改bin模式ftp> bin200 Type set to I.#切换到本地目录(含有hello和编译好文件的目录)ftp> lcd ~/arm-linux/work#传输吧~ftp> put hellolocal: hello remote: hello200 PORT command successful.150 Opening BINARY mode data connection for 'hello'.226 Transfer complete.7983 bytes sent in 0.00 secs (93926.5 kB/s)至此,传输完毕。
实验4 Hello World
实验四 Hello World一、实验目的:第一次正面接触嵌入式Linux的开发,第一次编写嵌入式的应用程序,亲身实践一下开发步骤。
二、实验环境:PC机一台、虚拟机系统(Ubuntu系统)、ARM2410嵌入式开发板。
三、实验内容:编写、编译并运行Hello World程序。
四、实验记录:1、实验步骤::1)、打开计算机电源,进入Linux系统;2)、正确连接计算机与实验仪的连接线,其中包括串口线、交叉网线等;3)、在PC机上打开一个终端;4)、输入minicon后回车。
minicom程序应该在以前的步骤中已经设置过了;5)、打开实验仪的电源,在minicom的终端上按回车键进入提示符状态;6)、输入sufo ifconfig eth1 192.168.2.122Mount –t nfs –o nolock 192.168.2.122:/source/rootfs /mnt;7)、宿主机上打开另一个终端输入如下命令,进入/nfs目录cd / source/rootfsvi helloworld.c此时会显示一个空白窗口,可进行程序的编写,最后存盘退出,先按“Esc”键,然后按“:”,此时左下角会出现冒号然后输入“wq”最后按“Enter”确认;8)、交叉编译helloworld.carm-linux-gcc –o helloworld helloworld.cls;9)、回到开有minicom 的终端输入ls./ helloworld查看程序运行输出结果。
2、实验具体操作及结果:再开一个终端:3.实验程序如下:#include<stdio.h>Main(){printf(“hello world!/n”);}五、实验小结:通过这次试验熟悉了嵌入式交叉编译,进一步加强了对linux指令的运用,熟悉及回顾了vi编辑器的用法。
ubuntu配置vscode全过程(下载安装配置优化插件)
ubuntu配置vscode全过程(下载安装配置优化插件)⼀、安装vscode下载vscode当然啦,我们安装vscode,当然要先下载啦,但是但是但是!不要在ubuntu的软件中⼼(Ubuntu Software)下载!贼坑!下载完不能⽤!推荐下载⽅式:但是勒,官⽹由于是外⽹,下载巨慢,放⼼,这坑我踩过了官⽹的下载链接,你copy出来,发现长这样:没错,要修改的地⽅我已经标红了,替换为以下内容:替换后的链接:把这个链接复制到浏览器打开就好啦,下载速度soso的~PS:原理就是⽤国内的镜像服务器加速啦~但是相关的镜像信息我着实没找到。
安装vscode下载之后呢,我们能得到上图所⽰的⽂件,然后呢在这个⽂件夹右击 在终端中打开,最后执⾏以下命令:sudo dpkg -i code_1.52.1-1608136922_amd64.deb最后我们就⼤功告成啦!⼆、配置环境这⾥呢我配置的是c、c++和python的环境,其他的我没有配置哦⾸先我假如你是刚刚装好的ubuntu,啥都没有install,那么先安装下g++和gcc:sudo apt-get install gccsudo apt-get install g++安装好了之后呢,我们打开vscode,下载安装Code Runner插件,等到安装成功!我们来测试⼀下!这⾥是三种语⾔的hello word哦,省的重新敲了:C语⾔版本HelloWorld:#include<stdio.h>int main(){printf("hello world!\n");return 0;}C++版本HelloWorld:#include<iostream>using namespace std;int main(){cout<<"hello world!\n";return 0;}Python版本HelloWorld:print('hello world!')(⼩声bb,还是python简洁!)看到运⾏成功后,也就开始了第三步,优化啦~三、优化运⾏成功后,看看是不是多了⼀个同名的⽂件?⽽且每运⾏⼀个就会产⽣⼀个?对的!这将导致⽂件夹的不美观,不好看,占⽤资源!那么解决⽅法来啦:在vscode中按下Ctrl+Shift+P,输⼊settings,打开配置json⽂件,复制以下代码:"code-runner.executorMap": {"cpp": "cd $dir && g++ $fileName -std=c++11 -o /home/allen/Documents/code/tmp/cpp && /home/allen/Documents/code/tmp/cpp", "c":"cd $dir && gcc $fileName -o /home/allen/Documents/code/tmp/c && /home/allen/Documents/code/tmp/c","python":"cd $dir && python3 -u $fileName"},这是什么意思呢?这⾥是coderunner的执⾏命令映射,如果是cpp⽂件,则执⾏cpp对应的命令,这⾥我们单拉出来⼀条来解析,其他的也就懂啦。
linux下的vscode的cmake helloworld 的例程 -回复
linux下的vscode的cmake helloworld 的例程-回复Linux下的VSCode的CMake HelloWorld的例程在Linux系统中,VSCode是一种广泛使用的开源代码编辑器。
通过使用VSCode和CMake,我们可以轻松地开发和构建C/C++项目。
本篇文章将介绍如何使用VSCode和CMake在Linux下创建一个简单的HelloWorld例程。
我们将按照以下步骤进行:1. 安装VSCode和CMake:首先,我们需要安装VSCode和CMake。
在终端中输入以下命令来安装它们:sudo apt-get updatesudo apt-get install codesudo apt-get install cmake2. 创建项目目录:在您选择的位置创建一个新的项目目录。
可以使用以下命令:mkdir HelloWorldcd HelloWorld3. 打开VSCode并初始化项目:在终端中输入以下命令来打开VSCode 并初始化一个新的CMake项目:code .这将在VSCode中打开当前目录。
4. 创建CMakeLists.txt文件:在VSCode中,创建一个名为CMakeLists.txt的文件,并将以下内容复制到文件中:cmake_minimum_required(VERSION 3.10)project(HelloWorld)add_executable(HelloWorld main.cpp)这个CMakeLists.txt文件指定了CMake的最小版本和项目的名称,以及源代码文件的位置和名称。
5. 创建main.cpp文件:在VSCode中,创建一个名为main.cpp的文件,并将以下内容复制到文件中:#include <iostream>int main() {std::cout << "Hello, World!" << std::endl;return 0;}这个main.cpp文件是一个简单的HelloWorld例程。
编写helloworld驱动
编写helloworld驱动编写hello world驱动1、建立makefile文件在路径/lib/modul es/3.13.0-32-generic下建立文件文件夹testyan:mkdir testdriver进入testdriver文件:cd testdriver建立makefile文件并编辑vim Makefile输入:obj-m:=hell o_yilia_driver.o保存退出2、建立linux驱动的源码文件同样在/lib/modul es/3.13.0-32-generic/testdriver路径下建立文件hell o_yilia_driver.c编辑hell o_yilia_driver.c内容:vim hello_yilia_driver.c3、编译、安装和卸载linux驱动模块生成.ko文件make –C /usr/src/linux-head er-3.13.0-32-genericM=/lib/modul es/3.13.0-32-generic/testdriver执行完成后会生成多个文件,其中一个为hello_yilia_driver.ko 安装驱动文件:insmod hell o_yilia_driver.ko卸载驱动:rmmod hell o_yilia_driver4、查看驱动设备信息的有关命令查看当前linux内核安装的全部驱动lsmod查看某个驱动lsmod | grep –i hello_yilia_driver查看驱动输入信息dmesgdmesg | grep -i hello_yilia_driver查看日志信息cat /var/l og/sysl og |grep hell o_yilia_driver查看驱动信息modinfo查看设备号ls –al /d ev/hello_yilia_driver附一:Hello_yilia_driver.c#includ e#includ e#includ e#includ e#includ e#includ e#d efine DEVICE_NAME "hell o_yilia_driver"static unsigned char mem[1000];static ssize_t char_count = 0;static ssize_t hell o_yilia_driver_read(struct fil e *file, char __user *buf, size_t count, l off_t *ppos);static ssize_t hell o_yilia_driver_write(struct fil e *file, const char __user *buf, size_t count, l off_t *ppos);static struct fil e_operations d ev_fops ={.owner=THIS_MODULE,.read = hell o_yilia_driver_read,.write= hello_yilia_driver_writestatic struct miscd evice misc ={.minor=MISC_DYNAMIC_MINOR, .name=DEVICE_NAME, .fo ps=&d ev_fop s};static ssize_t hell o_yilia_driver_read(struct fil e *file, char __user *buf, size_t count, l off_t *ppos){ssize_t read_count = char_count;if(copy_to_user(buf,(void*)mem,char_count)){return -EINVAL;}printk("read :count : %d\n", (int)count);printk("read :char_count: %d\n",(int)char_count);char_count = 0;return read_count;}static ssize_t hell o_yilia_driver_write(struct fil e *file, const char __user *buf, size_t count, l off_t *ppos){char_count = count;if(copy_from_user(mem,buf,count)){return -EINVAL;}mem[count] = '\0';printk("write:char_count:%d\n", (int)char_count);return char_count;static int __init hello_yilia_driver_init(void){int ret;ret = misc_register(&misc);printk("hell o yilia yan init");return 0;}static void __exit hell o_yilia_driver_exit(void){misc_d eregister(&misc);printk("hell o yilia yan exit");modul e_init(hell o_yilia_driver_init);modul e_exit(hell o_yilia_driver_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("yilia");附二:Makefileifd ef CONFIG_HELLO_YILIA_DRIVERobj-$(CONFIG_HELLO_YILIA_DRIVER):=hello_yilia_driver.o elseobj-m:=hell o_yilia_driver.oendif。
编写 Hello world 模块驱动
编写 Hello world 模块驱动,(1)模块动态加载驱动方式在内核源码的“drivers/char/”目录下新建一个名为“hello .c”的文件,内容如下:#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>MODULE_LICENSE ("GPL");static int __init hello_init (void){printk (KERN_INFO "Hello world\n");return 0;}static void __exit hello_exit (void){printk (KERN_INFO "Goodbye world\n");}module_init (hello_init);module_exit (hello_exit);修改Makefile里面的内核源码包的路径,这里我们必须用到一个已经编译好的内核的源码这里我们用了KERNELDIR ?= /mnt/mengyang/source/kernel/linux-2.6.12根据自己的实际情况修改,一定确保你的内核可以编译通过,内核可以正常运行!在命令行里运行make命令,顺利的会生成*.ko文件。
将*.ko文件复制到nfs目录,或是其他的存储设备。
在命令行里运行插入模块的命令ismod *.ko顺利的可以看到init函数将会被调用。
同样,运行rmmod *.ko顺利的可以看到clean函数被执行了。
执行上面命令时,可能报错误rmmod: chdir(2.6.33.2-TE2440): No such file or directory 这是由于busybox 1.13.1导致的,,原来是现在的内核模块在插入卸载时都会要转到/lib/modules/内核版本号/ 这个目录里。
Ubuntu18.04下搭建VSCode集成开发环境
Ubuntu18.04下搭建VSCode集成开发环境想学习Linux编程(C/C++)的小伙伴在刚开始的时候可能都会有这样的困惑,我用什么工具来编辑代码?又如何对编写的代码进行编译?遇到程序bug的时候该如何调试呢?今天我们就来学习一下如何在Ubuntu18.04下搭建VS Code(全称为visual studio code)集成开发环境。
安装VS Code首先介绍一下如何在Ubuntu18.04下安装VS Code工具,进入VS Code官网https:/// ,下载Ubuntu下的安装包,安装包的后缀名为.deb。
安装包下载完成后,可以通过两种方法进行安装:方法1:双击安装包,通过Ubuntu软件安装工具安装;方法2:打开终端,输入命令sudo dpkg -i <.deb file name>。
安装C/C++插件打开VS Code软件,点击界面左侧的extensions按钮,切换到extensions界面,如下图所示。
在输入框中输入C/C++,选择C/C++调试和代码编写提示的插件,点击install按钮安装,安装完成后,就可以进行C/C++代码的编写,编译和调试了。
使用VS Code进行开发以一个简单的helloworld例子来介绍一下如何使用VS Code进行开发。
首先,需要创建一个文件夹作为workspace,文件夹名称为helloworld,我们会将开发过程中的代码文件放在这个文件夹下。
然后打开VS Code,点击Explorer按钮,展开Explorer页面,点击Open Folder按钮,在弹出的文件夹选择界面中选择上一步创建的helloworld文件夹。
接着创建我们要编写的第一个代码文件helloworld.cpp。
将鼠标放置上图页面左侧的蓝色小框内,右键单击鼠标,选择New File,然后输入文件名helloworld.cpp。
接下来,在helloworld.cpp里编写代码:#include <iostream>int main(){std::cout << "hello world"<<std::endl;return 0;}接下来对我们刚刚编写的代码进行编译。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Ubuntu下驱动开发本文是参考了网上多篇帖子而写的算不上什么原创。
唯一值得欣慰的只不过在本机上实现罢了。
因为毕竟失败了几次。
也因为本人是初学驱动编程很多简单的问题在我来说是相当的困难的。
望有识之士不要笑话。
最后,希望本文能给刚学驱动而还没开头的人提供一些帮助。
刚看O'REILLY 写的《LINUX 设备驱动程序》时。
作者一再强调在编写驱动程序时必须建立内核树。
所谓内核树,我的理解和网上资料说的一致就是内核源码的一种逻辑形式。
那怎么建立呢?为此上网“翻云覆雨”起来而结果却是“惨败而归“。
为此托了一天又4个小时(当然包括吃饭睡觉的时间),连个简单的hello wrold 都没实现。
(书中p22页最简单也最没用的驱动事列)不过功夫不负有心人。
在今天终于弄明白了怎么回事。
下面就请让我慢慢道来吧。
先查看自己OS使用的内核版本shana@shana:~$ uname -r2.6.22-14-generic /* 这是我显示的结果*/如果安装系统时,自动安装了源码。
在/usr/src 目录下有对应的使用的版本目录。
例如下(我是自己下的)shana@shana:/usr/src$ lslinux-headers-2.6.22-14linux-headers-2.6.22-14-genericlinux-source-2.6.22 /*这个就是解压后的源码目录*/linux-source-2.6.22.tar.bz2 /* 这是我下的源码包*/shana@shana:/usr/src$如果没有源码。
(一般ubuntu 都没有吧)查看一下可一下载的源码包(切记不要使用超级用户使用此命令否则……会提示没有此命令)shana@shana:/usr/src$ apt-cache search linux-sourcelinux-source - Linux kernel source with Ubuntu patchesxen-source-2.6.16 - Linux kernel source for version 2.6.17 with Ubuntu patcheslinux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patchesshana@shana:/usr/src$我选择了 linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches 这个~然后install 之shana@shana:/usr/src$ sudo apt-get install linux-source-2.6.22下载完成后,在/usr/src下,文件名为:linux-source-2.6.22.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码:注意已经切换到超级用户模式root@shana:/usr/src#tar jxvf linux-source-2.6.20.tar.bz2解压后生成一个新的目录/usr/src/linux-source-2.6.22,所有的源代码都在该目录下。
进入该目录开始配置内核选择最快的原版的配置(默认)方式(我是如此)root@shana:/usr/src/linux-source-2.6.22# make oldconfig当然你也可以使用自己喜欢的配置方式如 menuconfig , xconfig(必须有GTK环境吧)。
反正不用剪裁什么,所以不管那种方式能配置它就行了。
完成后,开始make 吧这儿比较久一般有1一个小时吧。
(保证空间足够我编译完成后使用了1.8G)我分区时分给/目录30G的空间,我没遇到这问题。
倒是我朋友遇到了。
shana@shana:/usr/src/linux-source-2.6.22$ makeshana@shana:/usr/src/linux-source-2.6.22$ make bzImage当然,第一个make也可以不执行,直接make bzImage。
执行结束后,可以看到在当前目录下生成了一个新的文件: vmlinux, 其属性为-rwxr-xr-x。
然后:root@shana:/usr/src/linux-source-2.6.22#makemodules /* 编译模块*/root@shana:/usr/src/linux-source-2.6.22#make modules_install /* 安装模块*/执行结束之后,会在/lib/modules下生成新的目录/lib/modules/2.6.22-14-generic/。
在随后的编译模块文件时,要用到这个路径下的build目录。
至此,内核编译完成。
可以重启一下系统。
至此内核树就建立啦原来不是很难.....写一个最简单最没用的驱动吧我在/home/shana/linux_q/ 目录下创建2个文本文件hello.c Makefile //hello.c#include#includeMODULE_LICENSE("Dual BSD/GPL");static int hello_init(void){printk(KERN_ALERT "Hello, world\n");return 0;}static void hello_exit(void){printk(KERN_ALERT"Goodbye, cruel world\n");}module_init(hello_init);module_exit(hello_exit);程序我就不解释了……Makefile 文件obj-m := hello.oKERNELDIR := /lib/modules/2.6.20/buildPWD := $(shell pwd)modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesmodules_install:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install如果以上你都完成了在make 时出现这样的错误shana@shana:~/linux_驱动开发$ makemake: 没有什么可以做的为`modules'。
原因很简单你肯定是从我这直接复制的吧~~~呵呵,Makefile格式错误啦~解决办法就是你把如$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install 移动到行首然后按Tab 键自动对齐这时里边的变量都变成绿色了~然后在make 吧shana@shana:~/linux_驱动开发$ makemake -C /lib/modules/2.6.22-14-generic/buildM=/home/shana/linux_驱动开发modulesmake[1]: Entering directory`/usr/src/linux-headers-2.6.22-14-generic'CC [M] /home/shana/linux_驱动开发/hello.oBuilding modules, stage 2.MODPOST 1 modulesCC /home/shana/linux_驱动开发/hello.mod.oLD [M] /home/shana/linux_驱动开发/hello.komake[1]: Leaving directory`/usr/src/linux-headers-2.6.22-14-generic'shana@shana:~/linux_驱动开发$shana@shana:~/linux_驱动开发$ ls -l总用量124-rw-r--r-- 1 shana shana 303 2008-03-16 10:43 hello.c-rw-r--r-- 1 shana shana 49039 2008-03-16 12:11 hello.ko-rw-r--r-- 1 shana shana 687 2008-03-16 12:11 hello.mod.c-rw-r--r-- 1 shana shana 25840 2008-03-16 12:11 hello.mod.o-rw-r--r-- 1 shana shana 24360 2008-03-16 12:11 hello.o-rw-r--r-- 1 shana shana 8344 2008-03-16 09:17linux_qudong_qu.txt-rw-r--r-- 1 shana shana 266 2008-03-16 12:09 Makefile-rw-r--r-- 1 shana shana 0 2008-03-16 12:11 Module.symvers shana@shana:~/linux_驱动开发$然后加载模块(超级用户)root@shana:/home/shana/linux_驱动开发# insmod ./hello.ko按照书上的例子会在终端显示hello , world 但是运行后什么都没有出现(原因不解)root@shana:/home/shana/linux_驱动开发# insmod ./hello.koroot@shana:/home/shana/linux_驱动开发#查看加载模块root@shana:/home/shana/linux_驱动开发# lsmodModule Size Used byhello 2560 0已经加载上咯~~删除模块root@shana:/home/shana/linux_驱动开发# rmmod helloroot@shana:/home/shana/linux_驱动开发#那程序的输出在那呢?书中说明如果不出现在终端则会写进syslog 文件中shana@shana:~/linux_驱动开发$ cat /var/log/syslog |grep world Mar 16 12:14:53 shana kernel: [ 5937.529297] Hello, worldMar 16 12:16:05 shana kernel: [ 6009.439036] Goodbye, cruel world shana@shana:~/linux_驱动开发$至此全部工作都完成了。
是否对你有用呢?/techdoc/system/2008/06/02/1008819.shtml。