您的位置:首页 > 运维架构 > Linux

Linux之设备驱动学习简过程<一>

2011-11-09 08:50 423 查看
为了记录学习驱动过程,自己简单的做了笔记。某年某月,当自己成为驱动高手的时候,我再回过头看看自己当时的想法。。。应该这种感觉是妙不可言的 

So,come on!Everyday is nice! 

 关于基础

1.tar 可以用来备份关键数据,而 dd 则可以用来备份整颗 partition 或 整颗 disk

2.vim区块选择(Visual Block)的功能

3.set 这个指令除了会将环境变量列出来之外,其它我们的自订变量,与所有的变量,都会被列出来喔

4.uptime查看开机运行时间

5. head 和 tail 命令

  用法为:head -n  文件名

6.lsmod rmmod insmod  modprobe

7.反汇编命令使用

arm-linux-objdump -D -S hello>log

8.wireshark 网络协议分析器

-----------------------------------------------------------------

9.shell 学习

if [ $a1 = $a2 ]

.在[和]符号两边的左右都有空格

.=左右都有空格

a1="hello"

echo $a1

.变量赋值两边不能有空格

.bash中语句不需要分号

.比较符号:-eq -gt -lt -ne -ge -le -z(为空) -n(不为空)

.判断文件符号:-e -f -s -d -r -w -x

.if语句

if []

then

  #code

else if []

     then

 #code

     else

 #code

     fi

fi

.for语句

for var in [list]

do

   #code

done

.while语句

while []

do

   #code

done

.until语句

until []

do

   #code

done

.case 语句

case "$var" in

 condition1 )

 ;;

 condition2 )

 ;;

*)

 default statments;;

esac

-----------------------------------------------------------------

10.makefile

.$^:代表所有的依赖文件

.$@:代表目标

.$<:代表第一个依赖文件

11.时间

time_t t;

t=time(NULL); //当前时间

gettimeofday(&tpstart,NULL); // 开始时间 

function();

gettimeofday(&tpend,NULL);   // 结束时间

-----------------------------------------------------------------

12.

fork子进程拷贝父进程的数据段,执行顺序不定

vfork:子进程与父进程共享数据段,子进程先运行

-----------------------------------------------------------------

13.exec函数族

exec启动一个新程序,替换原有进程,PID不变

-----------------------------------------------------------------

14.进程通信

.管道通信

.信号通信

.共享内存

管道:

.无名管道pipe(int fd[2])

.有名管道mkfifo(const char* filename,mode_t,mode)

15.posix 可移植的操作系统接口

-----------------------------------------------------------------

16.消息队列

.返回键值 key_t ftok(char* pathname,char proj)

.获取队列描述字 int msgget(key_t key,int msgflag)

.发送信息 int msgsnd(int msqid,struct msgbuf* msgp,int msgsz,int msgflg)

.读取信息 int msgrcv(int msqid,struct msgbuf* msgp,int msgsz,long msgtyp,int msgflg)

17.信号量

.二值信号灯 0,1

.计数信号灯 非负

18.多线程编程

.创建线程

int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,void *(*start_rtn)(void),void *arg)

tidp: 线程id

attr: 线程属性

start_rtn: 线程执行函数

arg start_rtn:的参数

.等待线程

int pthread_join(pthread_t *tid,void **rval_ptr)

tid:等待退出的线程id

rval_ptr:线程返回值的指针

.线程标识

pthread_t pthead_self(void)

返回线程id

-----------------------------------------------------------------

19.linux TCP/IP

.应用层 传输层 网络层 网络接口层

.socket三种类型:流式套接字(SOCK_STREAM)----可靠的、数据报套接字(SOCK_DGRAM)----不可靠的,原始套接字(SOCK_RAW).

.struct sockaddr_in记录网络地址

.地址转换

int inet_aton(const char *cp,struct in_addr *inp) 转网络ip

char *inet_ntoa(struct in_addr in) 转字符

.字节序

网络传输 big endian

htons/htonl 发送时用的、主机序转换到网络序

ntohs/ntohl 接收时用的、网络序转换到主机序

.获取ip或主机名

struct hostent *gethostbyname(const char *hostname)

-----------------------------------------------------------------
20.虚拟文件系统

VFS隐藏各种文件系统的具体细节,为文件操作提供统一的接口。
 

21.内核开发,主要修改driver(驱动)和arch(体系架构)

-----------------------------------------------------------------

22.内核配置与编译

.清除命令:make clean/make mrproper /make distclean

.确定目标系统软硬件配置,例如cpu的类型,网卡型号,还有支持的网络协议

.开始配置内核

执行命令:make menuconfig

.编译

make zImage/make bzImage

*make zImage V=1 获取编译信息

编译好的内核位于:arch/<cpu>/boot/

.编译内核模块

make modules

.安装内核模块

make modules_install

/lib/modules

.制作init ramdisk

mkinitrd initrd-2.6.29 2.6.29

23.内核安装步骤

. cp arch/x86/boot/bzImage /boot/vmlinuz-$version

. cp $initrd /boot/

. 修改/etc/grub.conf或者/etc/lilo.conf

24.内核模块

主要Makefile:

ifneq ($(KERNELRELEASE),)

obj-m :=hello.o

hello_objs: main.o add.o(多文件)

else

KDIR:= /lib/modules/2.6.18-53.el5/build

all:

 make -C $(KDIR) M=$(PWD) modules

clean: 

 rm -f *.ko *.o *.mod.o *.mod.c .symvers

endif

模块参数:module_param(name,type,perm)

int a=3;

module_param(a,int,S_IRUGO);

-----------------------------------------------------------------

25.内核符号导出---两个模块以上有用

EXPORT_SYMBOL(符号名)

EXPORT_SYMBOL_GPL(符号名)

26.内核打印 /proc/sys/kernel/printk

27.工具链arm-linux-gcc

-----------------------------------------------------------------

28.BootLoader工作流程
stage1

.硬件设备初始化

.为加载BootLoader的stage2准备RAM空间

.拷贝BootLoader的stage2到RAM空间

.设置好堆栈

.跳转stage2的C入口点

stage2

.初始化本阶段要使用的硬件设备

.将内核和根文件系统拷贝从flash拷贝到ram

.调用内核

-----------------------------------------------------------------

29.uboot

命令:help/printenv/setenv(添加、删除、修改)/saveenv\

md/mm/flinfo/protect off(on) all/erase start end/

cp/go/bdinfo(开发板信息)

移植:MCU/MPU参考

30.嵌入式内核制作

1.清除 make distclean

2.配置 make menuconfig ARCH=arm

3.编译 make uImage ARCH=arm CROSS_COMPILE=arm-linux-

-----------------------------------------------------------------

31.制作根文件系统

@创建根文件系统的目录

.mkdir rootfs

.cd rootfs

.mkdir bin dev etc lib proc sbin sys usr mnt tmp var

.mkdir usr/bin usr/lib usr/sbin lib/modules

@创建设备文件

.cd dev/

.mknod -m 666 console c 5 1

.mknod -m 666 null c 1 3

@安装/etc

.tar  etc.tar.gz -C /xxx/rootfs

@编译内核模块

.make modules ARCH=arm CROSS_COMPILE=arm-linux-

@安装内核模块

.make modules_install ARCH=arm

INSTALL_MOD_PATH=/xxx/rootfs

@配置busybox

@编译安装 

make ARCH=ARM CROSS_COMPILE=arm-linux

make install

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: