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
- Linux之设备驱动学习简过程<一>
- Linux之设备驱动学习简过程<二>
- Linux之设备驱动学习简过程<四>
- Linux之设备驱动学习简过程<五>
- Linux 设备驱动之字符设备(一)
- Linux 设备驱动之字符设备(一)
- Linux 设备驱动之字符设备(一)
- 学习《Linux设备模型浅析之驱动篇》笔记(一)
- Linux之设备驱动学习简过程<三>(不断添加中)
- linux驱动学习--第十一天:第六章 Linux 字符设备驱动(一) 之 Linux 字符设备驱动结构
- linux设备驱动(一)---字符设备之led驱动
- linux设备驱动开发学习笔记一
- linux块设备驱动学习(一)
- Linux设备驱动学习(一)
- LINUX设备驱动之serio总线(一)
- linux设备驱动之led子系统<一>
- LINUX设备驱动之serio总线(一)
- linux设备驱动之led子系统<一>
- dtd
- Ubutu/Debian使用 VSFTPD架设FTP服务器小结
- JSP的运行原理
- xml
- jQuery对所有name为一个值或约等于一个值的标签统一赋值
- Linux之设备驱动学习简过程<一>
- 动态网页和静态网页的比较
- 如何截取屏幕并生成GIF动画
- 子衿的事(52)
- 学生课堂感受_郭冰
- u盘被写保护
- 未来互联网领域投资方向
- 【欣赏】一组伤感唯美的图片
- Android执行linux外部命令