Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1306429
  • 博文数量: 254
  • 博客积分: 1586
  • 博客等级: 上尉
  • 技术积分: 2295
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-15 16:38
个人简介

linux学习中

文章分类

全部博文(254)

文章存档

2016年(6)

2015年(2)

2014年(74)

2013年(93)

2012年(12)

2011年(2)

2010年(51)

2009年(14)

分类: LINUX

2010-05-04 11:36:37

前言

很多朋(无论是单片机出身的底层软件工程师还是 PC 机的 Windows 程序员都很想学习 Linux觉 得只有嵌入式 Linux 才有钱途而我觉得无论什么只要比别人做的好都会有前途同时却觉得它很难, 把它神密化(就象当初神密化 ARM 一样还认为必须要先买个 ARM 开发板才能开始 Linux 或问 是否应先装个虚拟机等等然后一直在徘徊(时间就这样一天天过去了我讨厌徘徊宁可花时间去尝 试失败,然后总结经验。这份笔记基本上按时间顺序记录了我刚接触 Linux 到对它有个整体认识的学习、 调试,出现的及心得总,也是我工作中不少的手册想按内容整理,但后来 还是保持着原来的时间顺序因为觉得这样更容易让初学者借鉴学习过程和方法Linux我还只是一个新 手,一定会有错误,很常不恰当法和问题请见谅和指正!如得它对您有帮 助,非常的棒您写m诉我给我最大励!如果表示感谢, 那么请您上 21IC BBS  ARM 和我一起帮助那些需要帮助的朋友吧我知道中国足球很差但还会一 如既关注和支自己也会的抽出时千方百计找踢球机培养激情样,也知道中 国的技术环境,但还会追求、学去,发表与大伙共亲爱的工们,让我们象 伊拉克足球一样战斗吧!!

第一阶段  PC 机上学习熟悉 Linux

刚学会 ARM 久,就遇到很多工程师在学习和使用 Linux,当时很是好奇和羡慕!注意到几乎所有工 程师都拥GNU/Linux 编程指南故也买来收藏着看了些介绍性的篇幅也有了在 PC 机上装个 Linux 系统的念头。由于对 RedHat 还不了解,包括基本的操作,于是买了本《Redhat9.0 入门,在电脑城找了 张 Readhat9.0 光盘(现在肯定找不到了,去网上下吧,还担心在原来硬盘上安装会破坏原来的数据(担 心是多佘的,后来都用 PartitionMagic 在原盘符下直接分区,于是花了 75 元买了 8.4G 的旧硬盘,就这 样回家瞎玩起来后来又买了Redhat9.0 系统管理应付 RedHat9.0 的基本操作已经足够熟悉一两 个星期的 Redhat9.0 基本操作与环境后,是该玩点深入的东东了,觉得自己将来应该是先以嵌入式 Linux 驱动为主而不是应用编程所以在还没有进一步学GNU/Linux 程指南的情况下Linux 设 备驱序》钻研来证明这误的,有功近Linux 设备程序》看较费劲,通读 了一遍后 PC 机做的第二个实验就遇到了困难编译总是出错去书店参考其它驱动的书上网查找等 试了很多方法都没有解决困惑了很久后来又开始研GNU/Linux 编程指南读了这本书Linux 设备程序》就多了。问有解决总个结,会有针对性书店翻些的书,上网查 些资料等在了解到了内核源码树结构编译等之后才知道驱动和应用程序是有区别的是属于内核级, 在编译时要指定 Linux 内核源代码树下的头文件(I/usr/src/linux-2.4/include,问题就这样解决, 以后习、实验得顺利了现问题基能很快排总结这阶学习顺序觉得应该是: 首先 PC 上安装 Linux 系统再买本相应的入门书籍主要是熟悉 Linux 学习常用的命令和操


(不一定多基本的就可以以后在使用过程中慢慢积累理解各目录结构与作用等其次学 习在 Linux 境下编程GNU/Linux 编程指南就可会介绍文件描述符的概念打开等操作 的系列基础知识,没有这些基础而直接看《Linux 设备驱动程序》会觉得累。后来研读了《UNIX 环境高级 编程觉得也很好它讲了很多前者没有的细节再次拿本内核的书翻翻了解一下 linux 核源码 树的目录结构编译等后学Linux 设备驱动程序理解驱动程序的结构框架等得学习 不需要都直接记住,有点不现实(但应该理解,不要留下疑问,如果有,应及时的用实验去证实再记录, 在以后的应用中再查阅巩固,这阶段也不例外。

一.Red Hat Linux 9 下的常用操作


1. 如何修改在开机引导装载程序中,等待自动登录默认操作系统的时间? 答:如果引导装载程序是 GRUB,则修改/etc/grub.conf 文件中的 timeout=秒数。 如果引导装载程序是 LILO, 则修改的是/etc/lilo.conf 文件。可用 vi 等编辑器修改,下同。

2. 在字符(Text)模式下,如何关机、重启、注销?

关机poweroff  shutdown h nowreboot  shutdown r now(即重新登入logout; 其中在 shutdown 指令中的now 是指现在就执行,也可以指定多少时间后再执行此命令。

3. U 盘的使用

答:先创建/mnt/usb 目录,再执行 mount /dev/sda1 /mnt/usb 挂载,此时/mnt/usb 就是 盘的目录,在 拔出 盘时要执行umount /mnt/usb 进行卸载。

4. 在字符模式(Text)下,如何进入 X Window 模式(Graphic)?在 X Window 模式下,如何返回字符模式? 答:执行 startx 命令 启动 X Window 模式;鼠标点击“Main Menu(主菜单)->Log out(注销)”打开对话框 中,选择“注销”进入字符模式;或CRTL+ALT+F1~F6 来进入不同的虚拟控制台(即文本模式下)。

5. 如何重新指定开机默认进入的执行模式(字符或 X Window 模式)? 答:修改/etc/inittab 文件中的内容(id:5:initdefault:)。

其中,表示以 X Window 模式(Graphic)登入,为字符模式(Text)登入

6. 在字符模式下,如何使用户登入时,系统不要求输入密码?如何恢复或更改用户密码? 答:取消输入密码:passwd d  用户帐号。如要取消root登入时的密码,则执行passwd d root。也可 以用vi打开/etc/shadow文件,删除密码的方法取消。恢复或更改密码则执行passwd 用户帐号(如果是取消 自己则不用)命令后会提示输入New passwordRetype new password

7. 字符模式下,如何新增用户帐号?

答:使用“useradd 用户帐号” 命令来增加,但在新增后还不能登入使用,还需要用 passwd 命令来设置 密码后才行。

8. 在 X Window 下,如何选择系统默认使用的语言? 答:鼠标点击“主菜单->系统设置->语言”打开选择语言对话框中选择。

9. 用 ls 等命令查看的内容太多,超过一页时,如何分页显示?

答:可用 ls | more 或 ls | less 进行分页查看。其中,在用 more 浏览时,按空格键(Space)则会显示 下一页的内容;按回车(Enter)键则会向下多显示一行;按 键则离开浏览模式。

在用 less 浏览时,按 键会出现在线使用说明;按 键离开浏览模式。

10.如何获得命令的使用方法?

答:可利用在线手册—man(Manual),用法是输入 man 和待查的命令名称。如要查询 ls 命令的使用方法, 则输入以下命令:man ls。也可以 ls --help

11.搜索文件及目录和搜索包含特定字符串的文件?

答:搜索文件及目录可以用 find 命令,如要在根目录(/)上搜索 apache 文件则输入命令:find / -name apache print,注意:如果没有指定目录,则系统会以当前的目录为搜索的范围;搜索包含特定字符串的 文件可以用 grep 命令,如要在/etc 目录下搜索包含字符串“password


的文件则输入:grep password’ /etc/*.*,其中加入-n 参数会标出符合指定的字符串的列数,另 外不可指定在目录中搜索,否则会出现错误信息,如上述不能写成:grep password /etc/ 另外如果想停止搜索可以直接按“Ctrl + C”键结束该命令就可以。现在我常用:grep ir password /etc

12.控制台间的切换

答:在文本模式下,用 ALT+F1~F6 来分别在 个虚拟控制台间切换,它们可分别用不同的用户名登入和执 行不同的命令与程序,如果已经启动了 X Window(:在文本模式下用”startx”命令启动),则按 ALT+F7 切换到 X Window 图形模式。

 X Window 图形模式下,用 CRTL+ALT+F1~F6 分别切换到文本模式下的 6 个虚拟控制台。CRTL + ALT + BackSpace 结束图形模式。

因为 linux 多任务的系统,所以可以在不同的控制台下用不同(或同一)的用户登陆来运行不同的程序。 我觉个功能很便,因为有文本模式需要打开终端来处示多个的,如:一个终 端运行 minicom 作为目标板的控制,一个终端作为宿主机编译目标板要运行的文件,还有多个终端打开多 个源文件在浏览等等。如果习惯在 X Window 模式下就例外,因为用鼠标右键就可以打开多个终端。

13.查看 PDF 和浏览网页?

答:在 X Window 下打开 shell 终端,输入”xpdf  filename.pdf”和“mizzo filename.html” 命令分 别查看。注:必须在 X Window 下才能运行这两个程序,文本模式不能运行。

14.查看磁盘使用情况 答:#df h

15/proc 目录下,几个关于系统资源非常有用的文件

/proc/modules/proc/ioports/proc/iomen/proc/devices/proc/interrupts/proc/filesystems

16.关于内核代码调试时输出打印信息的 printk 语句

如:printk(KERN_DEBUG Here I am : %s :%i\n,  FILE  ,   LINE_&_) ;

printk(KERN_INFO “ Driver Initional \n) ;等同于 printk(<6>” “ Driver Initional

\n) ;

printk( <1> Hello, World!\n) ;

没有指定优先级的 printk 语句采用默认日志级别(DEFAULT_MESSAGE_LOGLEVEL) kernel/printk.c 中被指 定,根据日志级别,内核可能会把消息输出到当前控制台上。当优先级小于 console_loglevel 整数值时, 消息才会被显示出来如果系统同时运行了 klogd syslogd则无论 console_loglevel 为何值都将把 内核消息追加到/val/log/messages console_loglevel 的初始值是DEFAULT_CONSOLE_LOGLEVEL可以 通过文本文件/proc/sys/kernel/printk 读取和修改它及控制台的当前日志别等。也可以简单的输入 下面命令使所有的内核消息得到显示:

#echo 8 > /porc/sys/kernel/printk

17.查看当前正在运行的进程 答:#ps

18.解压缩到指定目录

答:#tar xvzf linutte.tgz C /linuette

19.当/etc/grub.conf 文件中的内容被修改或破坏时不能正常启动时,如何在 GRUB 引导时修改设置使其 正常启动

答:以修改了/etc/grub.conf 文件中的 vga 项使启动时显示器不能显示为例,在 GRUB 启动引导菜单中 windows XP 和 Red Hat Linux(2.4.20-8)两项中使用键头键选中 linux 系统,不按[Enter],而按[E]键进 入菜单项目编辑器,再使用键头键选中 kernel 项,也按[E]键进行编辑,在行的后面输入 vga=791 fb=on 后按[Enter],最后按[b]键执行命令,并引导操作系统。

20.包管理器 RPM 使用,以 tmake 为例

安装:#rpm ivh tmake-1.7-3mz.noarch.rpm

升级:#rpm –Uvh tmake-1.7-3mz.noarch.rpm

查询:#rpm –q tmake

删除:#rpm –e tmake

 

二.Minicom 的使用

1. 启动 Minicom

输入minicom启动,或输入minicom s直接进入设置模式。

2. 设置

1> 选择串口:在选择菜单中的“Serial port setup”,按回车,再按“A”以设置“Serial Device

(如果使用串口1则输入/dev/ttyS0如果您使用串口2则输入/dev/ttyS1注意其中的S是大写),按 回车返回。

2> 设置波特率:按E入设bps/par/Bits特率界面如果I设置波特率为

115200,按回车返回。

3> 数据流控制:按“F”键设置“Hardware Flow Control”为“NO”。

其它为缺省设置 ,然后按回车到串口设置主菜单,,选择“Save setup as dfl”,按回车键保存刚 才的设置(保存到“/etc/minirc.dfl),再选择“Exit”退出设置模式,回到minicom操作模式。

此时可像Windows下的超级终端一样使用了。

3. 退出 minicom

按下“Ctrl+A”键,松开后紧接着再按下“Q”键,在跳出的窗口中,选择“Yes”。

4. 其它有用的功能

命令帮助 -- Ctrl+A”后按 “ Z ” 清屏  -- Ctrl+A”后按 “ C” 设置     -- Ctrl+A”后按 “ O ” 发送文件 -- Ctrl+A”后按 “ S ” 退出     -- Ctrl+A”后按 “ Q 

三.NFS 的使用

    为什么要使用 NFS:网络文件系统(NFSNetwork File System)是一种在网络上的计算机间共享文 件的方法通过它可以将计算机上的文件系统导出给另一台计算机我们在宿主机上编辑编译好的程序, 可以通过它导出到目标板上进行实际的运行。

    1. 宿主机配置

 NFS 服务中共享文件又称导出目录/etc/exports 文件控制 NFS 务器要导出哪些目录格式如 下:

共享的目录  可以连接的主机 (读写权限,其它参数如果允许目标板(IP192.168.0.*)挂载主机的/home目录,则/etc/exports 文件的内容如下:

/home 192.168.*.*(rwsync)

注:如果出现 mount 不成功,可将 sync 试试 更改后要使用如下命令重新载入配置文件:

#/sbin/services nfs reload          #/etc/init.d/nfs reload

然后启动 NFS 服务器,命令如下:

/sbin/services nfs start

上面两个命令也可以用下面的一条指令完成,如下:

/sbin/service nfs restart

设置好后也可以通过 mount 自己来测试 NFS 服务设置是否成功如果本机 IP  192.168.0.1,则可以 用 mount 192.168.0.1:/home/mnt,如果 mount 成功,则在/mnt 的目录就可以看到/home 目录下面的西 了。

2. 使用 mount 命令挂载 NFS 文件系统

下面将宿主机(IP192.168.0.1)配置的/home 目录挂载到(IP192.168.0.7)目标板上的/mnt 目 录。

在宿主机启动 minicom 作为目标板的显示终端,启动目标板的 linux 统,再使用下面命令:

mount o nolock 192.168.0.1:/home /mnt

注意:如果没有“-o nolock”选项,而直接使用命令:mount 192.168.0.1:/home /mnt 时将出现如 下错误:portmapserver localhost not respondingtimed out

目前我都用:mount t nfs 192.168.0.1:/home /mnt




四.应用程序编程实验

 

     《GNU/Linux 编程》一书的是非常全,下载它代码后,直接编译,基上 不会有什么问题。

五.模块编程实验

 

 

参考《Linux 设备驱动程序》P25 页,hello.c 源程序如下:

#define MODULE

#include

int init_module(void){

printk (<1>Hello,world\n);

return 0;

}

void cleanup_module(void){

printk(<1>Goodbye cruel world\n);

} 用以令进行编译:

#gcc c hello.c

#insmod ./hello.o hello,world

#rmmod hello           //注:不是#rmmod hell.o

Goodbye cruel world

 的问 在执行#insmod ./hello.o 时并没出“hello,world是出了下述错 误:./hello:kernelmodule version mismatch

hello.o was compiled for kernel version 2.4.20 while this kernel is version 2.4.20-8

原因:模块内核版本不匹配,即编译内核的编译器与现在编译模块的编译器版本不一致。 解决1>/usr/include/linux/version.h #define 2.4.20”修改成#define

2.4.20-8(),再重新编译!

2>  insmod -fforce,强制)选项强行装入模块,如下:insmod f ./hello.o

3> 因用 vi /usr/include/linux/version.h 查看到定义的内核版本是 2.4.20,而在内核原代码树下

/usr/src/linux-2.4/include/linux/version.h 中定义为 2.4.20-8 版本所以用如下命令进行编译:gcc c I/usr/src/linux-2.4/include hello.c,再装载就 OK 注:/proc/modules 件。

 

六.简单的字符设备驱动实验

 

 

驱动程序源代码如下:

/*CharDriver.c*/

#define  _NO_VERSION

#include

#include

char kernel_version[] = UTS_RELEASE;

#define  KERNEL

#include

#include

#include

#include

#include

#define  SUCCESS 0

 

 

static int device_read(struct file *file, char *buf, size_t count, loff_t *f_pos);

static int device_open(struct inode *inode, struct file *file);

static void device_release(struct inode *inode, struct file *file);

 

 

struct file_operations tdd_fops = {

read: device_read, open: device_open, release: device_release,

};

#define DEVICE_NAME "char_dev" static int Device_Open = 0; unsigned int test_major = 0;

//static char Messaege[1024];

static int device_open(struct inode *inode, struct file *file){

#ifdef DEBUG

printk ("device_open(%p)\n", file);

#endif

if (Device_Open)

return -EBUSY; Device_Open++; MOD_INC_USE_COUNT; return SUCCESS;

}

 

 

static void device_release(struct inode *inode, struct file *file){

#ifdef DEBUG

printk ("device_release(%p,%p)\n", inode, file);

#endif

Device_Open--; MOD_DEC_USE_COUNT;

}

 

 

static int device_read(struct file *file, char *buf, size_t count, loff_t *f_pos){

int left;

if (verify_area(VERIFY_WRITE, buf, count) == -EFAULT)

return -EFAULT;

for (left = count; left > 0; left--){

put_user(1, buf);

buf++;

}

return count;

}

 

 

int init_module(void){

int result;

result = register_chrdev(0, "char_dev", &tdd_fops);

if (result < 0){

printk("char_dev:can't get major number\n");

return result;

}

if (test_major == 0)

test_major = result;

printk ("Hello,I'm in kenel mode\n");

return 0;

}

 

 

void cleanup_module(void){

printk("Hello,I'm goint to out\n");

unregister_chrdev(test_major,"char_dev");

} 用下令进行编译:

#gcc O2 -DMODULE D  KERNEL   -c CharDriver.c

出现错误:

CharDriver.c 18Tvariable fops has initializer but incomplete type CharDriver.c 19unknown field read specified in initializer CharDriver.c 20unknown field open specified in initializer CharDriver.c 20unknown field release specified in initializer CharDriver.c 53storage size of fops isnt known

原因在用 gcc 进行编译时默认搜索的 include 文件路径为/usr/include/usr/include/linux/fs.h

中没有定 file_operations 结构体(可以打开该文件看一下file_operations 是在原代码树目录


/usr/src/linux-2.4/include 下的 linux/fs.h 中定义,而且用了#ifdef   KERNEL  条件编译。因此编 译时必须指定该目录和定义 KERNEL  。编译命令如下:

#gcc O2 -DMODULE D   KERNEL__ I/usr/src/linux-2.4/include -c CharDriver.c

经过编译得到的文件 CharDriver.o 就是设备驱动程序,执行以下命令把它安装到系统中:

#insmod CharDriver.o

如果安装成功,用#vi /proc/devices 打开文件将看到设备 char_dev 主设备号。如果需要卸载,可运行

#rmmod char_dev

然后就需要创建设备文件了,执行以下命令:mknod /dev/char_dev c 254 0中“/dev/char_dev”是 要生成的设备名及目录,选项c 是指字符设备,254 是生成的主设备号,可用上面方法查看到,也可能是

253 或其它,从设备号设成 0 就可以。另外可以用 rm f /dev/char_dev 将删除 mknod 命令创建的设备文 件。可用下述测试程序源代码进行测试。

驱动的测试程序如下:

/*DriverTest.c*/

#include

#include

#include

#include

int main(int argc, char *argv[]){

int testdev;

int i;

char buf[10];

testdev = open("/dev/char_dev", O_RDWR);

if (testdev == -1){

printf("Cann't open file \n");

exit(0);

}

read(testdev, buf, 10);

for (i = 0; i < 10; i++){

printf("%d\n", buf[i]);

}

close(testdev);

}

需要的是将驱序数据传户程序时 put_user(1,buf),而 put_user(1,buf1); 出现。还有copy_to_user(buf,Buffer++,1)函数 Buffer 变量不是具体据,如果写  copy_to_user(buf,1,1)也会错。

第二阶段 在开发板上学习研究 Linux

公司虽然用 ARM 已经多年但都是裸奔产品在功能和性能上的提升都出现了瓶颈急需软件平台的 突破也增大了学习动力年假期没家(尽管生病刚动术,但还着泪在电话里 告诉爸爸我的决定,而是抓紧时间专心研究基于 s3c2410 的嵌入式 Linux 平台。硬件是一块普普通通的 s3c2410 开发板,软件选择 MIZI Linux SDK (Software Development Kit) for S3C2410,因为我觉得 s3c2410 最原始的平台,国内大部分的开发板都是在它的基础上发展过来,选择它比较可靠,心里也比较


踏实以后应用于产品也是如此 mizi ftp 站点下载的 SDK 光盘包含了开发板原理图BOM linux 开发平台所需的所有软件工具及使用手册等资料是比较齐全的完全可以参考它设计出自己的开发板。 下面的软件安装工具使用等内容摘自和总结于它的操作手册LED按键驱动实验的源代码摘自广州友善 之臂科技有限公司的 SBC-2410X-UM.pdf

 
 
 
 
阅读(1405) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~