文档库 最新最全的文档下载
当前位置:文档库 › Linux驱动开发笔记8Proc文件操作

Linux驱动开发笔记8Proc文件操作

Linux驱动开发笔记8Proc文件操作
Linux驱动开发笔记8Proc文件操作

Linux驱动开发笔记8 proc文件操作

一、proc文件系统简介

linux系统对/proc的使用很频繁,现代Linux发行版中的很多工具都是通过/proc来获取它们所需要的信息,例如:ps、top等,有些设备驱动程序也通过/proc导出信息。我们自己的驱动程序当然也可以这么做。因为/proc文件系统是动态的,所以驱动程序模块可以在任何时候添加或删除其中的入口项。这些/proc文件不仅可以用于读出数据,也可以用于写入数据。不过,大多数时候,/proc入口项是只读文件。proc文件系统是一个虚拟的文件系统,内核使用它来输出一些信息,每一个在/proc下的文件都绑定一个内核函数,操作这个文件就是在调用这个函数,该文件系统下的文件是动态生成的,当某个进程读取proc文件时,内核会分配一个页大小的内存,驱动程序可以向这个内存中写入要返回用户态的数据。

一、proc文件系统操作

1.读取只读文件接口

当读取proc文件时会调用这个函数

int(*read_proc)(char *page, char **start, off_t off, int count, int*eof, void *data);

page内核分配的那段内存空间的指针

start用来记录要返回用户态的数据写到了内存页的哪个位置,比如第一次读了五个,就可以把*start设置为5,下次读得时候就从5这个偏移量开始读off start==NULL的时候这个值就无效了

count用户态要读取的字节数

eof当内核态没有要返回用户态的数据时要设置这个值

data内核态在创建proc文件时保存的一个数据,在调用读取函数时传到这里这个函数必须返回放到缓存当中的字节数

2.创建只读proc文件接口

staticinline struct proc_dir_entry *create_proc_read_entry(constchar *name, mode_t mode, struct proc_dir_entry *base, read_proc_t*read_proc, void * data) name要创建的proc文件的名字

mode文件的权限

base该文件的父目录,如果为NULL则默认创建到/proc下

read_proc这个是传入实现读取这个文件的函数

data这个data的值就是当调用读取函数时候传入读取函数的data的值这个函数如果返回NULL代表创建失败

3.删除proc文件接口

void remove_proc_entry(const char *name, struct proc_dir_entry *parent)

name要删除的文件的名字

parent该文件所在的父目录

4.创建读写proc文件接口

staticinline struct proc_dir_entry *create_proc_entry(constchar *name, mode_t mode, struct proc_dir_entry *parent)

name要创建的文件的名字

mode文件的权限

parent要创建的文件的父目录,如果为NULL则代表在/proc下创建

在该函数的返回值中初始化这个文件的读和写函数

例如:file->read_proc= my_read

file->write_proc= my_write

5.读取proc文件接口

当读取proc文件时会调用这个函数

int(*read_proc)(char *page, char **start, off_t off, int count, int*eof, void *data);

page内核分配的那个内存空间的指针

start用来记录要返回用户态的数据写到了内存页的哪个位置比如第一次读了五个,就可以把*start设置为5,下次读得时候就从5这个偏移量开始读offstart==NULL的时候这个值就无效了

count用户态要读取的字节数

eof当内核态没有要返回用户态的数据时要设置这个值

data内核态在创建proc文件时保存的一个数据,在调用读取函数是传到这里这个函数必须返回放到缓存当中的字节数

6.写proc文件接口

int(*write_proc)(struct file *file, const char __user *buffer, unsignedlong count, void *data);

7.创建proc目录

struct proc_dir_entry *proc_mkdir(const char *name, struct

proc_dir_entry*parent)

name目录的名字

parent父目录,如果为NULL则在/proc目录下创建

8.删除proc目录

同3

近写程序需要内核得到用户态的参数,比较幸福的是虽然ioctrl 用不了,可以用proc实现,proc文件系统提供了一种内核和用户态交互的方法。

proc文件系统的详细接口看

主要需要关注的是这几个函数:

struct proc_dir_entry *proc_mkdir(const char *name, struct

proc_dir_entry *parent)

struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent);

void remove_proc_entry(const char *name, struct proc_dir_entry *parent);

函数proc_mkdir用于在proc文件系统下创建文件夹,proc_mkdir的第一个参数是要创建的目录的名字,第二个参数是指向父目录结构的指针。需要注意一下几点:

1. 创建过程没有对于名字的检查,完全可以调用proc_mkdir 创建出一堆同样名字的文件(检查一下会死啊!)

2. 其实名字可以包含路径,例如“dev/new_p roc”, 如果存在dev目录,函数会在dev目录下创建new_proc目录。

3. 如果第二个参数是NULL,会在根目录也就是/proc/目录下创建目录

函数的返回值就是新创建目录对应的proc_dir_entry,保存这个就可以用来在此目录下创建文件啦,其实,即使不保存,利用上面介绍的第二点性质也可以在目录下创建文件,而且删除目录只用知道路径就可以了~

函数create_proc_entry用来创建文件,mode 参数如果为NULL的话默认的文件访问权限是755,其他的参数与proc_mkdir 类似

函数remove_proc_entry用来删除创建的目录或者文件,有意思的是,这个函数只需要知道名字和父目录就可以删除了。

说了这么多,怎么交换数据尼?

需要了解下proc_dir_entry 的结构了

struct proc_dir_entry {

unsigned int low_ino;

unsigned short namelen;

const char *name;

mode_t mode;

nlink_t nlink;

uid_t uid;

gid_t gid;

loff_t size;

struct inode_operations * proc_iops;

const struct file_operations * proc_fops;

get_info_t *get_info;

struct module *owner;

struct proc_dir_entry *next, *parent, *subdir;

void *data;

read_proc_t *read_proc;

write_proc_t *write_proc;

atomic_t count; /* use count */

int deleted; /* delete flag */

void *set;

};

其他的参数可以忽略,这里需要注意的是两个成员变量:

read_proc 和write_proc

这两个变量的类型如下:

typedef int (read_proc_t)(char *page, char **start, off_t off, int count, int *eof, void *data);

typedef int (write_proc_t)(struct file *file, const char __user *buffer, unsigned long count, void *data);

对proc文件的读写操作,最终将转化为对read_proc和write_proc的调用。

看到这里明白了吧,只要在内核里注册proc文件,实现read_proc 和write_proc函数,然后设置proc_dir_entry对应成员变量的值,在用户态进行读写就可以和内核交互了

解释这两个函数的参数:

对于read_proc_t

1. 第一个参数:为啥叫page?答案就是如果对proc文件调用读操作,内核会分配一个页大小的缓冲区。如何输出大于一个页的数据呢,这得依赖于第二个和第三个参数了。

为了理解第二三个参数,回忆下与文件操作相关的系统调用:

int open(const char *pathname, int flags);

off_t lseek(int fildes, off_t offset, int whence);

ssize_t read(int fd, void *buf, size_t count);

ssize_t write(int fd, const void *buf, size_t count);

对于proc文件,一次read操作最多只能读取一个page的数据,如果需要读取大于一个页的数据需要保存read的返回值,然后使用lseek设定offset,然后再次调用read。回到参数的说明:

2. start和off参数:off对应于lseek里面的offset(lseek whence为SEEK_END,offset为负的情况下,传进来的off为零,具体原因待考古)。

如果不设置*start的值,off的取值只能在[0, count - 1]之间,且能够读取的数据大小为:count - off。可以理解系统拷贝了[page + off, page+count - 1]之间的数据到用户的buffer里。如果off的取值超出范围,read将读不到数据。

如果设置了*start的值,系统认为*start指向的地址就是off指定的地址,off的值会被忽略,系统会拷贝[start,start+count-1]之间的数据到用户空间。当然我们在实现start地址的定位时,可能会需要off的值。

3. count 参数与read中的count一致

4. eof参数,设置了这个参数表明不想再提供数据了,神马意思呢?

如果不设置这个参数,对于上面说的start为空的情况,read_proc返回后,系统如果发现(count - off)< count 会接着下发写请求,读取off大小的数据。

例如:有这样的读取操作:

lseek(fd, 2, SEEK_SET); read(fd, buff_r, 30)

第一次调用read_proc, off=2, count=30, 由于我们没有设置start的值,将读取28字节的数据,由于没有设置*eof, 系统会再次下发read_proc

第二次调用read_proc, off=30, count=2, 在参数start的说明里提到,对于这个调用,系统默认读不到数据(怨念啊,为啥要下发)

于是read返回28

如果设置了这个参数就不会有第二次的下发了。

5. data参数,这个是给驱动程序预留的参数。

对于write_proc函数,参数是很简单的,需要说明的只有一点,就是write_proc的第二个参数buffer 是用户态的地址,需要用copy_from_user从用户态把数据拷到内核态的缓冲区里

在学习Linux内核驱动的时候,经常会碰到copy_from_user和copy_to_user这两个函数,设备驱动程序中的ioctl函数就经常会用到。这两个函数负责在用户空间和内核空间传递数据。首先看看它们的定义(linux/include/asm-arm/uaccess.h),先看copy_from_user:

static inline unsigned long copy_from_user(void *to, const void __user *from, unsigned long n)

{

if (access_ok(VERIFY_READ, from, n))

n = __arch_copy_from_user(to, from, n);

else /* security hole - plug it */

memzero(to, n);

return n;

}

先看函数的三个参数:*to是内核空间的指针,*from是用户空间指针,n表示从用户空间想内核空间拷贝数据的字节数。如果成功执行拷贝操作,则返回0,否则返回还没有完成拷贝的字节数

这个proc文件终于看明白了,要是不明白其调用原理看卡这个文件就明白了,在内核源码中fs/proc/generic.c的这个文件中有这段代码:

static ssize_t

__proc_file_read(struct file *file, char __user *buf, size_t nbytes,

loff_t *ppos)

{

struct inode * inode = file->f_path.dentry->d_inode;

char *page;

ssize_t retval=0;

int eof=0;

ssize_t n, count;

char *start;

struct proc_dir_entry * dp;

unsigned long long pos;

/*

* Gaah, please just use "seq_file" instead. The legacy /proc * interfaces cut loff_t down to off_t for reads, and ignore * the offset entirely for writes..

*/

pos = *ppos;

if (pos > MAX_NON_LFS)

return 0;

if (nbytes > MAX_NON_LFS - pos)

nbytes = MAX_NON_LFS - pos;

dp = PDE(inode);

if (!(page = (char*) __get_free_page(GFP_TEMPORARY))) return -ENOMEM;

while ((nbytes > 0) && !eof) {

count = min_t(size_t, PROC_BLOCK_SIZE, nbytes);

start = NULL;

if (dp->read_proc) {

/*

* How to be a proc read function

* ------------------------------

* Prototype:

* int f(char *buffer, char **start, off_t offset,

* int count, int *peof, void *dat)

*

* Assume that the buffer is "count" bytes in size.

*

* If you know you have supplied all the data you

* have, set *peof.

*

* You have three ways to return data:

* 0) Leave *start = NULL. (This is the default.)

* Put the data of the requested offset at that

* offset within the buffer. Return the number (n) * of bytes there are from the beginning of the

* buffer up to the last byte of data. If the

* number of supplied bytes (= n - offset) is

* greater than zero and you didn't signal eof

* and the reader is prepared to take more data

* you will be called again with the requested

* offset advanced by the number of bytes

* absorbed. This interface is useful for files

* no larger than the buffer.

* 1) Set *start = an unsigned long value less than

* the buffer address but greater than zero.

* Put the data of the requested offset at the

* beginning of the buffer. Return the number of

* bytes of data placed there. If this number is

* greater than zero and you didn't signal eof

* and the reader is prepared to take more data

* you will be called again with the requested

* offset advanced by *start. This interface is

* useful when you have a large file consisting

* of a series of blocks which you want to count * and return as wholes.

* and return as wholes.

* (Hack by Paul.Russell@https://www.wendangku.net/doc/9610824518.html,.au)

* 2) Set *start = an address within the buffer.

* Put the data of the requested offset at *start.

* Return the number of bytes of data placed there.

* If this number is greater than zero and you

* didn't signal eof and the reader is prepared to

* take more data you will be called again with the

* requested offset advanced by the number of bytes

* absorbed.

*/

n = dp->read_proc(page, &start, *ppos,

count, &eof, dp->data);

} else

break;

if (n == 0) /* end of file */

break;

if (n < 0) { /* error */

if (retval == 0)

retval = n;

break;

}

if (start == NULL) {

if (n > PAGE_SIZE) {

printk(KERN_ERR

"proc_file_read: Apparent buffer overflow!\n");

n = PAGE_SIZE;

}

n -= *ppos;

if (n <= 0)

break;

if (n > count)

n = count;

start = page + *ppos;

} else if (start < page) {

if (n > PAGE_SIZE) {

printk(KERN_ERR

"proc_file_read: Apparent buffer overflow!\n");

n = PAGE_SIZE;

}

if (n > count) {

/*

* Don't reduce n because doing so might

* cut off part of a data block.

*/

printk(KERN_WARNING

"proc_file_read: Read count exceeded\n");

}

} else /* start >= page */ {

unsigned long startoff = (unsigned long)(start - page);

if (n > (PAGE_SIZE - startoff)) {

printk(KERN_ERR

"proc_file_read: Apparent buffer overflow!\n");

n = PAGE_SIZE - startoff;

}

if (n > count)

n = count;

}

n -= copy_to_user(buf, start < page ? page : start, n);

if (n == 0) {

if (retval == 0)

retval = -EFAULT;

break;

}

*ppos += start < page ? (unsigned long)start : n;

nbytes -= n;

buf += n;

retval += n;

}

free_page((unsigned long) page);

return retval;

}

就是这个函数调用read_proc这个接口函数的,看看代码就知道原理了

如果返回的数值n减去offset大于0,或者eof的值没有设置为1,则要继续读一次,如果eof的值设置为1就不会再去读第二次了,这里都是start == NULL

的情况,nbytes就是要读的字节数,

例子:

app:

fd = open(“/proc/mydir/myat”,O_READONLY);

read(fd,buf,30);

module:

int read_att(char *page, char **start, off_t off, int count, int *eof, void *data)

{

int ret;

ret = sprintf(page,"hello %s nihao\n","tangzhi");

printk("read_att is called off = %d,count = %d,ret = %d\r\n",(int)off,count,ret );

*eof = 1;

return ret;

}

执行app后

nbytes = 30;

n=20;

offset = 0;

最后nbytes = 10;大于0还要执行,但是eof = 1,所以就不执行了。如果eof = 0,则还要再执行一次。所以要是一次就可以把数据全部放到buf中,就设置eof=1了,小数据的时候使用,数据不大于3K的时候,一般使用的这种情况。

linux读书笔记

12.29 Linux系统 Linux是真正的多用户、多任务操作系统。它继承了UNIX系统的主要特征,具有强大的信息处理功能,特别在Internet和Intranet的应用中占有明显优势。是一个完整的UNIX类操作系统。它允许多个用户同时在一个系统上运行多道程序。真正的32位操作系统。 用户接口 用户接口定义了用户和计算机交互作用的方式。Linux操作系统提供4种不同的用户接口。命令行接口 命令行是为具有操作系统使用经验,熟悉所用命令和系统结构的人员设计的。功能强大,使用方便的命令行是UNIX/Linux系统的一个显著特征。支持命令行的系统程序是命令解释程序。它的主要功能是接收用户输入的命令,然后予以解释并执行。 “$ ”是系统提示符。 在UNIX/Linux系统中,通常将命令解释程序称为shell。各种Linux环境下都安装了多种shell。这些shell由不同的人编写并得到一部分用户的青睐,各有其优势,最常用的几种是Bourne shell(sh),C shell(csh),Bourne Again shell(bash)和Korn shell(ksh)。红旗Linux 的默认shell是bash。 Bash 菜单 图形用户接口 程序接口 程序接口也称为系统调用接口。用户在自己的C程序中使用系统调用,从而获得系统提供的更基层的服务。 系统调用是操作系统内核与用户程序,应用程序之间的接口。在UNIX/Linux系统中,系统调用以C函数的形式出现。例如:fd=fopen(“file1.c”,2);其中,open是系统调用。 所有内核之外的程序都必须经由系统调用才能获得操作系统的服务。系统调用只能在C程序中使用,不能作为命令在终端上执行。由于系统调用能直接进入内核执行,所以其执行效率高。 Linux的版本 Linux有两种版本:核心(Kernel)版本和发行(Distribution)版本。 核心版本 核心版本主要是Linux的内核。Linux内核的官方版本由Linus Torvalds本人维护着。核心版本的序号由三部分数字构成,其形式为:major.minor.patchlevel 其中,major是主版本号,minor是次版本号,二者共同构成了当前核心版本好;patchlevel 表示对当前版本的修订次数。例如:2.6.34表示对2.6核心版本的第34次修订。

linux驱动开发的经典书籍

linux驱动开发的经典书籍 结构、操作系统、体系结构、编译原理、计算机网络你全修过 我想大概可以分为4个阶段,水平从低到高 从安装使用=>linux常用命令=>linux系统编程=>内核开发阅读内核源码 其中学习linux常用命令时就要学会自己编译内核,优化系统,调整参数 安装和常用命令书太多了,找本稍微详细点的就ok,其间需要学会正则表达式 系统编程推荐《高级unix环境编程》,黑话叫APUE 还有《unix网络编程》 这时候大概还需要看资料理解elf文件格式,连接器和加载器,cmu的一本教材中文名为《深入理解计算机系统》比较好 内核开发阅读内核源码阶段,从写驱动入手逐渐深入linux内核开发 参考书如下《linux device drivers》,黑话叫ldd 《linux kernel development》,黑话叫lkd 《understading the linux kernel》,黑话叫utlk 《linux源码情景分析》 这四本书为搞内核的必读书籍 最后,第三阶段和第四阶段最重动手,空言无益,光看书也不罩,不动手那些东西理解不了 学习linux/unix编程方法的建议 建议学习路径: 首先先学学编辑器,vim, emacs什么的都行。 然后学make file文件,只要知道一点就行,这样就可以准备编程序了。 然后看看《C程序设计语言》K&R,这样呢,基本上就可以进行一般的编程了,顺便找本数据结构的书来看。 如果想学习UNIX/LINUX的编程,《APUE》绝对经典的教材,加深一下功底,学习《UNP》的第二卷。这样基本上系统方面的就可以掌握了。 然后再看Douglus E. Comer的《用TCP/IP进行网际互连》第一卷,学习一下网络的知识,再看《UNP》的第一卷,不仅学习网络编程,而且对系统编程的一些常用的技巧就很熟悉了,如果继续网络编程,建议看《TCP/IP进行网际互连》的第三卷,里面有很多关于应用

达内linux基本操作笔记

登陆服务器时输入公帐号openlab-open123 telnet 192.168.0.23 自己帐号sd08077-you0 ftp工具192.168.0.202 tools-toolss 老师测评网址http://172.16.0.198:8080/poll/ 各个shell 可互相切换 ksh:$ sh:$ csh:guangzhou% bash:bash-3.00$ 一、注意事项 命令和参数之间必需用空格隔开,参数和参数之间也必需用空格隔开。 一行不能超过256个字符;大小写有区分。 二、特殊字符含义 文件名以“.”开头的都是隐藏文件/目录,只需在文件/目录名前加“.”就可隐藏它。 ~/ 表示主目录。 ./ 当前目录(一个点)。 ../ 上一级目录(两个点)。 ; 多个命令一起用。 > >> 输出重定向。将一个命令的输出内容写入到一个文件里面。如果该文件存在,就将该文件的内容覆盖; 如果不存在就先创建该文件,然后再写入内容。 输出重定向,意思就是说,将原来屏幕输出变为文件输出,即将内容输到文件中。 < << 输入重定向。本来命令是通过键盘得到输入的,但是用小于号,就能够使命令从文件中得到输入。 \ 表示未写完,回车换行再继续。 * 匹配零个或者多个字符。 ? 匹配一个字符。 [] 匹配中括号里的内容[a-z][A-Z][0-9]。 !事件。 $ 取环境变量的值。 | 管道。把前一命令的输出作为后一命令的输入,把几个命令连接起来。 |经常跟tee连用,tee 把内容保存到文档并显示出来。 三、通用后接命令符 -a 所有(all)。 -e 所有(every),比a更详细。 -f 取消保护。 -i 添加提示。 -p 强制执行。

linux驱动程序的编写

linux驱动程序的编写 一、实验目的 1.掌握linux驱动程序的编写方法 2.掌握驱动程序动态模块的调试方法 3.掌握驱动程序填加到内核的方法 二、实验内容 1. 学习linux驱动程序的编写流程 2. 学习驱动程序动态模块的调试方法 3. 学习驱动程序填加到内核的流程 三、实验设备 PentiumII以上的PC机,LINUX操作系统,EL-ARM860实验箱 四、linux的驱动程序的编写 嵌入式应用对成本和实时性比较敏感,而对linux的应用主要体现在对硬件的驱动程序的编写和上层应用程序的开发上。 嵌入式linux驱动程序的基本结构和标准Linux的结构基本一致,也支持模块化模式,所以,大部分驱动程序编成模块化形式,而且,要求可以在不同的体系结构上安装。linux是可以支持模块化模式的,但由于嵌入式应用是针对具体的应用,所以,一般不采用该模式,而是把驱动程序直接编译进内核之中。但是这种模式是调试驱动模块的极佳方法。 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。同时,设备驱动程序是内核的一部分,它完成以下的功能:对设备初始化和释放;把数据从内核传送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据和回送应用程序请求的数据;检测和处理设备出现的错误。在linux操作系统下有字符设备和块设备,网络设备三类主要的设备文件类型。 字符设备和块设备的主要区别是:在对字符设备发出读写请求时,实际的硬件I/O一般就紧接着发生了;块设备利用一块系统内存作为缓冲区,当用户进程对设备请求满足用户要求时,就返回请求的数据。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。 1 字符设备驱动结构 Linux字符设备驱动的关键数据结构是cdev和file_operations结构体。

linux笔记

1.ls:查看当前路径下的文件以及文件夹的名字 2.ls /bin:查看根目录下的bin文件夹的东西 3.cd Desktop进入到Desktop文件夹 4.cd ..跳转到当前路径的上一层 5.pwd:显示当前操作的路径(绝对路径) 6.clear:清屏 7.绝对路径:/home/python 8.相对路径:cd downloads 9..表示当前路径 10...表示上一层路径 11.c d -:跳转到上一层所在的路径 12.t ab自动补全 13.t ouch 1.txt 创建文件 14.l s * 表示显示所有文件 15.l s *.txt 表示显示以所有.txt结尾的文件 16.l s*.t[xn]t 表示显示以txt或者tnt结尾的所有文件 17.m ore 查看文件的内容 18.l s–alh | more 查看文件的内容并以管道符号进行连接 19.c d ~切换到当前用户的主目录 20.m kdir 创建文件夹 21.m kdira/b/c –p 连续创建文件夹 22.t ree 以目录数的方式显示

23.r mdir 删除文件夹(必须是空目录) 24.实物图操作的文件不会被删除直接进回收站 25.用命令删除的文件是不会进入回收站的 26.r m 删除文件/文件夹 27.r m haha.txt –r 直接删除文件夹(-r表示递归的删除) 28.r m haha.txt –i 给将删除的文件一个删除提示 29.r m haha.txt –f 强制删除 30.l inux建立链接影响(相当于创建windows下的快捷方式) 31.l n 01.txt 创建快捷方式 32.g edit 01.txt 编辑文件的内容 33.c at 01.txt 查看所编辑的内容 34.c at 01.txt > 02.txt 合并文件 35.g rep–n ‘a’grep.txt 搜素文件当中带a的文件 36.g rep–i ‘a’grep.txt搜素文件当中带a的文件(忽略大小写) 37.–-help 查找帮助文档 38.f ind 查找文件 39.c p a b 将a文件下的内容整体复制到b文件夹下(无效的文 件无法复制) 40.c p a/* b 将a文件夹下的所有内容复制到b文件夹下 41.m v a b 将a文件夹整体移动到b文件夹下 42.–v 显示移动进度 43.–I 表示操作的时候显示的提示(y表示确定)

Linux驱动工程师成长之路

本人此刻还不是什么驱动工程师,连入门都谈不上,但我坚信在未来的3-5年我肯定能成为我想像中的人,因为我马上就要进入这一行工作了。写下这个日志来记录我是怎么最后成为我想像中的人才的,呵呵。 《Linux驱动工程师》这个东西是我在大二的时候看到有一篇讲如何学习嵌入式的,点击这里下载PDF,里面讲到嵌入式分为四层:硬件,驱动,系统,应用程序;还说linux驱动最难然后工资也最高就冲着他这句话我就决定我大学毕业的时候要去做这个linux驱动工程师,随后我就先后买了51单片机,ARM7,ARM9还有一大堆的视频教程准备来进行学习。我还跟我旁边那个哈工大哥们说:“我们学校像我这样的人很少,你们学校呢?”他说:“太少了,不过我们学校都是做这种板子卖的人比较多!”。行,你们牛!即使是买了这些东西,从大二到现在都快毕业了但感觉还是没有入门。回想一下我都学过什么啊:1:自己在ARM9上写bootloader(主要锻炼了三方面的知识:C语言应该写了有近万行的代码,ARM9的外设的基本操作方法如UART,LCD,TOUCH,SD,USB,ETHERNET...,makefile);2:移植和学习linux驱动。下面我说一下我学习Linux驱动的一个思路这也是我在面试的时候自我介绍中最重要的部分;1:硬件知识学习Linux驱动首先得了解这个驱动对应的硬件的一些基本原理和操作方法比如LCD你得了解它的场同步,行同步,像素时钟,一个像素的表示模式,还有就是这个LCD是怎么把图像显示在屏幕上的。如果是USB,SD卡就得了解相关协议。可以通过spec(协议)、datasheet来了解,这就是传说中的Linux驱动开发三件宝之二,还有一个就是linux相关源码。2:了解linux驱动框架linux下的每一类驱动差不多都是一个比较完善的子系统,比如FLASH的驱动它就属于MTD子系统从上到下分为四层:设备节点层,设备层,原始设备层,最下面的与具体硬件相关的硬件驱动层,通常要我们自己来实现就是最下面这个与具体硬件相关那部分代码。3:了解这个驱动的数据流。这个过程与第二个过程紧密相关,如果了解了驱动的框架差不多这个过程也算了解了。比如flash.在/dev/目录下有对应flash的字符设备文件和块设备文件,用户对这些文件进行读、写、ioctl操作,其间通过层层的函数调用最终将调用到最下面的硬件驱动层对硬件进行操作。了解这个过程我相信在调试驱动的时候是很有帮助。3:分析与硬件相关通常需要我们实现的那部分源代码。4:三板子上将驱动调试出来。每次调试都会出问题,但我买的板子提供的资料比较全调试过程中遇到的问题都比较浅显,即使是浅显的问题也要把它记录下来。(这个是我上次在华为面试的时候,那个人问我你调试驱动遇到过什么问题吗?你是如何解决的。当时我学习还没有到调试驱动这一步,所以那次面试也惨败收场)。 好像说了这么多,还没有进入正题《工作的选择》。在年前去了龙芯,实习2.8K,转正3.5k,环境还是不错,经理很好,头儿也很帅都是中科院的硕士。不过去了两周我就没去了身边的人都不太理解,我也一度有过后悔的时候,从龙芯出来应该是1月6号,也就是从那个时候开始我就没有再找工作,转而学习linux驱动。一直到上周日。上周日的晚上我就开始投简历一开始要找linux驱动,在智联里面输入linux驱动出来500来个职位,点开一看没有一个自己符合要求的,差不多都要3-5年经验本科,有时候好不容易有个实习的关键字在里面,一看要求硕士,严重打击了我的信心,哎不管了随便投,最后又投了一下嵌入式关键字的职位。最后就瞎申请,看看职位要求差不多就申请。周一来了,这周一共来了6个面试,创下了我求职以来的历史新高。周一下午面了一家感觉还不错不过到现在也没有给我一个通知,估计当时我要了4500把他给要跑了,这家是做测量的不是Linux驱动,差不多是把ARM当单片机用。周二上午一家也是要招linux驱动面了估计不到二分钟,他

传智 韩顺平 linux 课程笔记1(吐血整理)

Linux视频教程(韩顺平)听课笔记1 (RedHat) 1、老师联系方式:hanshunping@https://www.wendangku.net/doc/9610824518.html, 2、linux for工作 (1)linux系统管理员——linux系统的维护、配置等 (2)linux程序员——需c/c++、java,php、jsp等 ①linux软件工程师(pc) ②linux嵌入式开发(单片机、芯片) 3、学习linux的步骤 (1)第一阶段:linux平台上的开发,包括vi,gcc,gdb,make,jdk,tomcat,mysql...和linux基本操作 (2)第二阶段:加厚c语言功底《c专家编程》或是java语言 (3)第三阶段:学习unix环境高级编程《unix环境高级编程》 (4)第四阶段:linux应用系统开发/linux嵌入式开发 4、计算机学习的正确道路 5、推荐书籍 -《鸟哥的Linux的私房菜基础学习篇》鸟哥、许伟、林彩娥等编著 -《Linux编程从入门到精通》宫虎波编著 -《Linux内核完全剖析》赵炯编著 6、关机命令 shutdown -h now立即进行关机 shutdown -r now现在重新启动计算机 -t sec : -t后面加秒数,即”过几秒后关机” -k: 不是要真的关机,只是发送警告信息

-r: 在将系统的服务停掉之后就重新启动 -h: 将系统服务停掉后,立即关机 -n: 不经过init程序,直接以shutdown关机 -f: 关机并启动之后,强制略过fsck的磁盘检查 -F: 系统重新启动之后,强制进行fsck的磁盘检查 -c: 取消已经在进行的shutdown命令内容 reboot 现在重新启动计算机 7、用户登录 登录时尽量少用root账户登录,因为它是系统管理员,最大的权限,难免操作失误。可以利用普通用户登录,登录后再用“su -”命令来切换成系统管理员身份。 8、进入桌面(命令行界面进入图形界面) startx 9、用户注销 在提示符下输入logout即可。 10、vi进行开发java和c/c++程序 -java程序 -vi Hello.java -输入i,进入到插入模式,写好代码 -输入Esc键,进入命令模式 -输入冒号:[wq 表示退出保存,q!表示退出不保存] -编译javac Hello.java -运行java Hello -c程序 -gcc o自定义文件名Hello.cpp[参数o表示可自定义生成的out文件名,否则默认为a. out]

从零开始搭建Linux驱动开发环境

参考: 韦东山视频第10课第一节内核启动流程分析之编译体验 第11课第三节构建根文件系统之busybox 第11课第四节构建根文件系统之构建根文件系统韦东山书籍《嵌入式linux应用开发完全手册》 其他《linux设备驱动程序》第三版 平台: JZ2440、mini2440或TQ2440 交叉网线和miniUSB PC机(windows系统和Vmware下的ubuntu12.04) 一、交叉编译环境的选型 具体的安装交叉编译工具,网上很多资料都有,我的那篇《arm-linux- gcc交叉环境相关知识》也有介绍,这里我只是想提示大家:构建跟文件系统中所用到的lib库一定要是本系统Ubuntu中的交叉编译环境arm-linux- gcc中的。即如果电脑ubuntu中的交叉编译环境为arm-linux-

二、主机、开发板和虚拟机要三者互通 w IP v2.0》一文中有详细的操作步骤,不再赘述。 linux 2.6.22.6_jz2440.patch组合而来,具体操作: 1. 解压缩内核和其补丁包 tar xjvf linux-2.6.22.6.tar.bz2 # 解压内核 tar xjvf linux-2.6.22.6_jz2440.tar.bz2 # 解压补丁

cd linux_2.6.22.6 patch –p1 < ../linux-2.6.22.6_jz2440.patch 3. 配置 在内核目录下执行make 2410_defconfig生成配置菜单,至于怎么配置,《嵌入式linux应用开发完全手册》有详细介绍。 4. 生成uImage make uImage 四、移植busybox 在我们的根文件系统中的/bin和/sbin目录下有各种命令的应用程序,而这些程序在嵌入式系统中都是通过busybox来构建的,每一个命令实际上都是一个指向bu sybox的链接,busybox通过传入的参数来决定进行何种命令操作。 1)配置busybox 解压busybox-1.7.0,然后进入该目录,使用make menuconfig进行配置。这里我们这配置两项 一是在编译选项选择动态库编译,当然你也可以选择静态,不过那样构建的根文件系统会比动态编译的的大。 ->Busybox Settings ->Build Options

Linux核心笔记

wolves 2014.3.20 总结 Linux 前提: 1保证Linux 和window 可以ping通 (ps:原因window上的防火墙没有关闭、或者Linux 上的防火墙和强制安全策略) 2.保证安装Linux的时候选择了网络配置,现在定制(gcc 的默能安装) 3.命令分析: tar -cvf a.tar a 和 tar -czvf a.tar.gz a 要是a是普通的文件那么a.tar和a.tar.gz的大小都会比a要大(物极必反).那么要是a文件的或那么a.tar的大小比a要大,但是a.tar.gz的大小比a要小. 4.-rw-r--r--:第一个-表示是普通文件rw-表示当前账户的权限r--表示同一组的权限,最后一个r--表示不同组的用户的权限 chmod (u,g,o,a) +/-/= filename 或者chmod 777 filename r=4 w=2 x=1 5.ln a b 表示的是硬连接(测试是往其中一个写代码) ln -s a c 表示的是符号连接(c-->a)

6.ls -al tftp*表示的是看tftp*的内容而ls -al | grep tftp表示的是把前面的结果集中找出tftp文件不能和*连用. Tftp服务 1.Linux和window可以ping通. 2.Setenforce 0和service iptables stop 3.在mnt下面mkdir cdr再mount /dev/cdrom cdr 4.cd Server 再ls -al | grep tftp (发现客户端和服务器) 5.安装tftp发现要先安装xinetd服务(tftp是xinetd的子类) 6.先安装xinted.语法:rpm -ivh xinetd....再重启服务service xinetd restart 7.再次安装tftp.语法:rpm -ivh tftp...再重启服务chkconfig tftp on(因为是小服务不能用service) 8.最后cd / 看是否有个tftpboot的文件夹.进入里面创建一个down.txt。 9.在windows这边的dos中写入:tftp Linux_ip get down.txt 【e:\1.txt】即可. 10.测试tftp客户端.在cd /下面建立day02.在day02里面创建up.txt.再tftp-->localhost-->put up.txt(发现错误是file not found 是因为默能不支

一篇非常好的linux学习笔记分享(Linux入门绝佳)

作者:佚名字体:[增加减小] 来源:互联网时间:03-06 21:54:44我要评论 一篇非常好的linux学习笔记分享,对于常用命令整理的比较详细,推荐使用。 linux目录架构 / 根目录 /bin 常用的命令binary file 的目錄 /boot 存放系统启动时必须读取的档案,包括核心(kernel) 在内 /boot/grub/menu.lst GRUB设置 /boot/vmlinuz 内核 /boot/initrd 核心解壓縮所需RAM Disk /dev 系统周边设备 /etc 系统相关设定文件 /etc/DIR_COLORS 设定颜色 /etc/HOSTNAME 设定用户的节点名 /etc/NETWORKING 只有YES标明网络存在 /etc/host.conf 文件说明用户的系统如何查询节点名 /etc/hosts 设定用户自已的IP与名字的对应表 /etc/hosts.allow 设置允许使用inetd的机器使用 /etc/hosts.deny 设置不允许使用inetd的机器使用 /etc/hosts.equiv 设置远端机不用密码 /etc/inetd.conf 设定系统网络守护进程inetd的配置 /etc/gateways 设定路由器 /etc/protocols 设定系统支持的协议 /etc/named.boot 设定本机为名字服务器的配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 设置IP /etc/resolv.conf 设置DNS /etc/X11 X Window的配置文件,xorg.conf 或XF86Config 這兩個X Server 的設定檔/etc/fstab 记录开机要mount的文件系统 /etc/inittab 设定系统启动时init进程将把系统设置成什么样的runlevel /etc/issue 记录用户登录前显示的信息 /etc/group 设定用户的组名与相关信息 /etc/passwd 帐号信息 /etc/shadow 密码信息 /etc/sudoers 可以sudo命令的配置文件 /etc/securetty 设定哪些终端可以让root登录 /etc/login.defs 所有用户登录时的缺省配置

Linux 操作系统shell学习笔记 (linux系统)

Linux 操作系统shell学习笔记(linux系统) linux软件开发 No.001 文件安全与权限 1. umask 决定了新建文件的权限 2. 软链接(符号链接) ln -s source_path target_path No.002 find和xargs 1. find pathname -options [-print -exec -ok] 其中exec参数的命令格式:'command-' {} \; 注意必须包含【{} \;】 -perm 按权限来查找ex. find . -perm 755 -print -mtime 按修改时间来查找ex. find / -mtime -5 -print 更改时间5天以内 find / -mtime +5 -print 更改时间5天以前 2. xargs与-exec和-ok类似,但是限制更少,也更快 3种参数的命令:find . -name "*.c" -exec wc -l {} \; find . -name "*.c" -ok wc -l {} \; 每次执行命令前有提示 find . -name "*.c" | xargs wc -l No.003 后台执行命令 1. [crontab] [at] [&] [nohup]四种

No.004 文件名置换 1. 列出隐藏文件ex. ls .* No.005 shell输入与输出 1. echo输出时加上-n 参数不换行,ex. echo -n "aaaa" 2. tee 命令可以同时输出到屏幕和文件中ex. ls | tee file.out 3. 标准输入0 标准输出1 标准错误2 4. 将标准输出和标准错误输入到一个文件ex. command >file.out 2>&1 No.006 命令执行顺序 1. 命令1 && 命令2 命令1执行成功后才会执行命令2 2. 命令1 || 命令2 命令1执行失败后才会执行命令2 No.007 正则表达式 1. 正则表达式元字符及含义 ^ 只匹配行首 $ 只匹配行尾

linux学习笔记

Linux 一、Linux文件及文件夹命名规则 1)除了/之外,所有的字符都合法。因为/是系统的根目录名 2)有些字符最好不要用,如空格、制表符、退格符和@#$&-等字符。因为Linux命令以空格、-进行分开的;而#表示管理员命令行,$表示用户命令行等 3)避免使用.作为普通文件名的第一个字符。因为Linux系统以.开头的文件是隐藏文件4)Linux系统对英文字符大小写敏感 建议:不要把windows使用习惯带到Linux系统使用上 二、Linux操作命令 2.1、命令格式 命令格式:命令-选项参数 示例:ls –la /etc,参数是命令操作的对象 说明:1)当有多个选项时,可以写在一起。 2)两个特殊的目录.和..,分别代表当前目录和当前目录的父目录 2.2、命令种类及用法 Linux系统里命令按权限分为:1、只有管理员即root才能使用的命令,这些命令位置在/sbin 和/usr/sbin目录;2、管理员和所有用户都能使用的命令,这些命令的位置在/bin和/usr/bin 目录。bin是二进制文件夹binary缩写,usr是user的缩写,sbin是super binary缩写;3、Linux系统里内核处理任务文件都需要一个数字标识(inode-i节点),因为Linux只认i节点不认字符的,一个i节点可以对应多个文件 2.2.1、文件处理命令 2.2.1.1、ls命令-查看 1)命令名称:ls 2)命令英文原意:list 3)命令所在路径:/bin/ls 4)执行权限:所有用户

5)命令作用:查看目录下的文件和文件夹 6)命令语法:ls 选项[-ald] [文件或目录] 7)用法示例:#ls –ald /etc 选项说明:-a all缩写,显示所有文件,包括隐藏文件 -l long缩写,显示文件和文件夹详细信息显示 -d 查看目录属性 -i 查看文件的inode(i节点:一个数字标识) 文件和文件夹详细信息说明: 1、第一部分如:drwxr-xr-x、-rwxr-xr-x、lrwxr-xr-x这部分分成4个部分, 其各个字符说明: d 第一个字符d表示目录directory - 如果是第一个字符表示二进制文件,其它表示无权限 l 第一个字符l表示软链接文件link r 读权限read w 写权限write x 执行权限execute 第一部分:即第一个字符,表示文件类型 第二部分:第2-10个字符,表示三种用户对该文件的权限 第2-4个字符,表示所有者u-user对该文件的权限 第5-7个字符,表示所属组g-group对该文件的权限 第8-10个字符,表示其它人o-others对该文件的权限 2、第二部分如:2,表示该文件硬链接数 3、第三部分如:root,表示该文件所有者权限 4、第四部分如:root,表示该文件所属组权限 5、第五部分如:4096,表示该文件大小;以数据块block表示最小存储数 据单位,每个数据块为512字节 6、第六部分如:12-01 20:52,表示该文件创建时间或最后修改时间 7、第七部分如:bin,表示该文件的名 2.2.1.2、cd命令-切换 1)命令名称:cd 2)命令英文原意:change directory 3)命令所在路径:shell内置命令 4)执行权限:所有用户 5)命令作用:切换目录 6)命令语法:cd [目录] 7)用法示例:#cd / 切换到根目录 注:这个命令一般配合pwd命令使用

Linux读书笔记

Linux读书笔记 Linux读书笔记 /.bashrc 就可以看到文件的内容 二进制文件: linux中的可执行文件就是这种格式的,命令cat就是一个二进制文件 数据格式文件: 这些程序在运行过程中,会读取某些特格式的文件,那些特定格式的文件可以称数据文件。如linux在用户登录时,都会将登录数据记录在/var/log/wtmp文件内,该文件是一个数据文件,它能通过 last 命令读出来。但使用cat 时,会读出乱码,因为它属于一种特殊格式的文件。 2.目录: 就是目录,第一个属性为,例如。 3.连接文件: 类似windows下面的快捷方式。第一个属性为,例如 4.设备与设备文件: 与系统外设及存储相关的一些文件,通常都集中在/dev目录下。该文件又分为两种: 块设备文件: 就是存储数据以供系统访问的接口设备,简单而言就是硬盘。例如一号硬盘的代码是/dev/hdal等文件,第一个属性为。 字符设备文件:

即串行端口的接口设备,例如键盘、鼠标等。第一个属性为。 5.套接字: 这类文件通常用在网络数据连接。第一个属性为 6.管道: FIFO也是一种特殊的文件类型,其主要目的是,解决多个程序同时访问一个文件所造成的错误,第一个属性为。 二、文件扩展名 *.sh:批处理文件,因为批处理文件使用shell写成,所以扩展名就是.sh。 *.z *.tar *.tar.gz *.zip *.tgz : 经过打包的压缩文件。 *.html *.php: 网页相关文件,分别表示HTML语法与PHP语法的网页文件。 三、如果当前在\home目录下,如果想进入/var/log目录时,怎么写呢? 1.cd /var/log 一定由根目录/写起 2.cd ../var/log回为在\home中,要回到上一层之后,才能继续向/var移动,不是由/写起,例如由/usr/share/doc到 /usr/share/man,可以写成 cd ../man ,相对路径是指相对于当前工作目录的路径。 四、常用的命令 ls:例文件 mv rm 删除文件

linux基本命令学习笔记

一、常用系统工作命令 1.echo 用于在终端输出字符串或者变量提取后的值 2.date 用于显示系统的时间或者日期 date "+%Y-%m-%d %H:%M:%S" 指定格式查看当前系统时间 date -s "20180901 8:53:00" 设置系统当前时间 date "+%j" 3.reboot 4.poweroff 5.wget(暂时了解即可) 6.ps 查看系统中的进程状态ps aux -a 显示所有进程 -u 用户以及其他详细信息 -x 显示没有控制终端的进程 //linux系统中有长短格式之分长长不能合并,长短不能合并,短短可以合并; 合并后保留一个- 号、ps命令允许参数不加减号(-),因此直接写成ps aux ·五种常见进程状态: R (运行)S(中断)D(不可中断)Z(僵死)T(停止) 7.top 动态的监视进程活动与系统负载等信息“Linux中的强化班的Windows任务管理器” 8.pidof 用于查询某个指定服务进程的PID值,格式为“pidof[参数][服务名称]” 9.kill 终止某个指定的PID的服务进程。 10.killall 用于终止某个指定名称的服务所对应的全部进程、killall[参数][进程名称] 如果我们在系统终端中执行一个命令后想立即停止它,可同时按下Ctrl+C组合键,这样将立即终止该命令的进程。或者有些命令在执行时不断的在屏幕上输出信息,影响后续命令的输入,则可以在执行命令时在末尾加上一个&符号,这样命令将进入系统后台来执行。 二、系统状态检测命令 1.ifconfig 查看本机当前网卡配置与网络状态的信息 主要查看网卡名称inet参数后面的ip地址ether参数后面的网卡物理地址(MAC 地址)以及RX TX的接受数据包和发送数据包的个数及累计流量 2.uname 用于查看系统内核与系统版本等信息 uname -a 若要查看当前系统版本的详细信息,则需要查看redhat-release文件 cat /etc/redhat-release 3.uptime 用于查系统的负载信息 显示当前系统时间系统已运行时间启用终端数量以及平均负载值 平均负载值:系统在最近一分钟五分钟十五分钟内的压力情况 4.free用于显示当前系统的内存使用量信息free -h 5.who 用于查看当前登入主机的用户终端信息 https://www.wendangku.net/doc/9610824518.html,st 用于查看所有系统的登录记录。(日志文件形式保存在系统中,因此黑客很容易对其进行篡改,不要用该命令的输出信息判断系统有无被恶意入侵) 7.history 显示历史执行过的命令(1000条)如果不够,可自定义/etc/profile文件中的HISTSIZE变量值。使用-c参数会清除所有命令历史记录。还可以使用“!编码数字”的方式重复执行某一次命令。

老男孩linux笔记[整理版]

老男孩linux笔记[整理版] 老男孩linux笔记 设定目标、寻找方法、勤奋努力、坚持不懈 学习运维六重 1、重目标:设定具体的短期目标,今天要完成哪些内容,本周要完成的内容,具体到每天的学习规划 2、重思路:工作中结果重要,学习时过程重要,要思考,多问个为什么。 3、重方法: (1)通过具体的时间案例来学习记忆,远胜过直接记枯燥的理论。 (2)通过画逻辑图帮助记忆枯燥的难以记忆的理论知识(如管道的概念) (3)睡觉前回顾当天的学习内容,早晨醒来后计划今天的学习内容 4、重实践:自己提出问题,自己通过实践验证,自己得出结论 (1)问:centos5.9执行yum upgrade会不会升级到6.0以上。答:实践一下便知。 (2)linux运维应用性偏多,要多实践:命令、服务、架构。 5、重习惯 (1)操作文件之前要备份,并确认备份成功正确,“备份名字.源文件名.操作用户.日期“ #cp /etc/hosts /etc/hosts.bldon.20140528 复制文件 #diff /etc/hosts /etc/hosts.bldon.20140528 比较两个文件的不同 #vimdiff /etc/hosts /etc/host,bldon.20140528 对照比较文件的不同 (2)操作后要检查,并确认操作的正确,不能想当然的认为是正确的。 (3)无故不要在“root”下操作命令,少用rm –ft,,mv移动到临时目录,可以用find替换(定时任务)。

(4)命令行操作命令后,确认是否生效达到预期。 (5)启动服务前检查语法, 启动服务后立刻检查启动结果 6、重总结 人类的历史如果没有前人的总结(数学、计算机、历史、地理),给自己总结, 让书本变薄。 系统中常用的安装包,每个安装包可能包含若干个组件,F2可查看包含的组件: base editors development librarys development tool x software development system tools #yum grouplist 查看已安装和未安装的组件#yum groupinstall “develop tools” 装完系统后独立安装安装包 #yum install 软件名称安装单个软件 #rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY* #rpm upgrade 配置yum源 查看包组的用途 # setup 调出配置界面 #ifconfig 查看网络配置 #/etc/init.d/network restart 重启网卡配置,输入命令可以用Tab键补全#cat /etc/redhat release 查看系统版本 #uname –r 查看内核 #uname –m 查看32 or 64位系统 #uname –a 查看内核完整信息 Alt+F2 切换终端 常用软件:

linux系统学习笔记

==============================智能娱乐系统=================== 硬件:中控:UI,音视频数据处理能力 操作:显卡,声卡、LED、游戏机、触控屏 ARM :cortex - A 软件:开发环境:vmware + linux(ubuntu) 程序开发:linux C 程序移植:交叉开发 效果:自动处理程序 一、Linux 命令 linux : 图形简陋---> 追求效率高 移植性强,开源性 linux :命令行形式进行交互 ls: 查看全部文件名/ --->根目录 pwd: 打印当前的路径/home/gec 等于~ ---> 家目录 cd : 直接回到/home/gec cd / : 回到根目录/ cd ..: 回到上一级的目录 ls -l 类型权限链接数创建者工作组大小日期目录名d rwxrwxr-x 2 gec gec 4096 Jul 2 2013 Desktop d:目录(第一个字母:-:普通文件d:目录) rwxrwxr-x:文件的权限r:读权限w:写权限x:执行权限 用户权限:rwx(创建者的权限)rwx(同组人)r-x(其他人) clear: 清除屏幕信息 touch 创建文件 touch xxxx ----> 因为身份是gec,所以必须在/home/gec中创建 rm 删除文件/目录 rm xxxx(文件名) ----> 因为身份是gec,所以必须在/home/gec中删除rm xxxx(目录名) -rf

gedit 编辑文件 gedit xxxx cat 查看文件内容 cat xxxx mkdir 创建目录 mkdir xxxx ----> 因为身份是gec,所以必须在/home/gec中创建 cp 拷贝命令 cp 文件名目录名---> cp abc.c 123/ chmod 修改文件的权限 -rw-rw-r-- 1 gec gec 20 Apr 14 19:43 abc.c 421421421 6 6 4 希望三个人都是可读可写可执行7 7 7 chmod 777 xxxx chmod 777 abc.c -rwxrwxrwx 1 gec gec 20 Apr 14 19:43 abc.c 二、linux与windows间的共享目录 1,在windows系统中的D:\创建一个名字为share的目录 2, "虚拟机" --- "设置" ---- "选项" --- "共享文件夹" --- "总是启用" ---"确定" 3,在linux系统输入以下命令来进入共享目录 cd /mnt/hgfs/share/ 4,在linux与windows分别创建目录和文件,观察两个系统的变化 =====================开发板的使用========================= 一、核心板

linux简单操作笔记

1.创建一个目录文件/data。 解答: 方法一: [root@localhost ~]# cd / #切换到根 [root@localhost /]# mkdir data #在根目录下创建data目录 方法二:使用绝对路径 [root@localhost ~]# mkdir /data 方法三:使用;分号连接多个命令,顺次执行 [root@localhost ~]# cd /;mkdir data 递归创建目录 mkdir –p /tmp/new/ldh #在tmp目录下创建目录new,在new目录下创建ldh 目录 ll /tmp/new #查看ldh目录的属性 2.在/data下面创建一个名叫shizhi.txt的文件。 解答: [root@localhost ~]# touch /data/shizhi.txt touch:创建空文件如果文件已经存在更新时间戳 touch后所跟文件名,可使用绝对路径或相对路径 [root@localhost ~]# cd /data ; touch shizhi.txt 3.为shizhi.txt文件增加内容为“I am studying linux.”。 解答: 方法一: [root@localhost ~]# vim /data/shizhi.txt 按i、a或o进入插入模式, 输入文字I am studying linux. 按Esc键退出插入模式,输入:wq,保存并退出。 [root@localhost ~]# cat /data/shizhi.txt I am studying linux. 方法二:使用Here Document功能 [root@localhost ~]# cat >>/data/shizhi.txt< I am studying linux too. #键盘输入 > EOF#键盘输入 [root@localhost ~]# cat /data/shizhi.txt I am studying linux.

兄弟连linux学习笔记

4.1.1 文件处理命令 命令格式 命令+选项+参数 ls -la /etc 命令ls 显示目录文件 语法:-a 显示所有文件-l详细信息显示-d查看目录属性-rw-r--r-- - 文件类型(-文件d目录l软链接文件) rw -r-- r-- u g o u所有者g所属组o其他人 r读w写x执行 4.1.2 目录处理命令 mkdir创建新目录 语法:mkdir -p(目录名)递归创建 cd 切换目录

语法:cd (目录) pwd 显示当前目录 语法pwd 4.1.2.4 rmdir 删除空目录 语法:rmdir (目录) cp 复制文件或者目录 语法:cp -rp (源文件或目录)(目标目录)-r 复制目录 -p保留文件属性 mv 剪切文件、改名 语法:mv (原文件或目录)(目标目录)rm

删除文件 语法:rm -rf (文件或目录) -r 删除目录 -f 强制执行 4.1.3 文件处理命令 touch 创建空文件 语法:touch (文件名) cat 显示文件内容 语法:cat(文件名) -n 显示行号 tac 显示文件内容(反向) 语法:tac(文件名) more

分页显示文件内容 语法:more(文件名) (空格)翻页 (Enter)换行 q 退出 less 分页显示文件内容(可向上翻页)语法:less (文件名) head 显示文件前面几行 语法head (文件名) -n 指定行数 tail 显示文件后几行 语法tail (文件名) -n 指定行数 -f 动态显示文件末尾内容 4.1.4链接命令 ln

生成链接文件 语法:ln -s (源文件)(目标文件) -s创建软连接 软链接特征:类似Windows快捷方式 lrwxrwxrwx l 软链接 软链接文件权限都为rwxrwxrwx 文件大小- 只是符号链接 /tmp/issue.soft -> /etc/issue 箭头指向原文件 4.2.1权限管理命令 chmod 改变文件或目录权限 语法:chmod [{ugoa}{+-=}{rwx}] (文件或目录)[mode=421 ](文件或目录) -R 递归修改 权限的数字表示 r ---- 4 w ---- 2 x ---- 1 rwx rw- r-- 7 6 4

相关文档