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

来源:互联网 发布:新疆大学教育网络系统 编辑:程序博客网 时间:2024/06/05 15:01

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

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