lsattr
查看文件的扩展属性,
如果文件被 chattr +i 添加了写保护,
用lsattr可以看到添加的属性
file
查看文件的类型
stat
查看文件的状态
=======================================================================
step1:
(if needed ;sudo su for root for all acts)
install ncurses : ftp://invisible-island.net/ncurses/ (choose ncurses-5.7.tar.gz for my process)
step2:
: cat /proc/version (check the version your kernel to run )
download linux source code for kernel(choose 2.6.31 for my process)
: cp linux-2.6.31.tar.gz(tar.bz2) /usr/src/
: cd /usr/src
: tar -xvvzf linux-2.6.30.tar.gz(tar xvjf linux-2.6.31.tar.bz2)
: cd linux-2.6.31
(if needed ;sudo su for root)
step3:
: make menuconfig (configure the module as you want )
step4:
compile the kernel
: make
step5:
compile the modules
: make modules
step6:
install the modules
: make modules_install
step7:
: make install
step8:
Copy this image to boot directory(note:where the bzImage is created can get from the make install message, match it indeed )
: cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.31
step9:
: cd /boot
: mkinitramfs -o initrd.img-2.6.31 2.6.31(match the version for yours)
step10:
: cp /boot/grub/menu.lst /boot/grub/menu.lst.old( backup the menu.lst)
: update-grub(note :choose the first one to create new menu.lst)
step11:
modify the value if necessary (note : if the title no match initrd, copy other for it )
: gedit /boot/grub/menu.lst(save if need)
step12:
: reboot
=======================================================================
PCI驱动编写流程
step1:
define the PCI ID table
step2:
create probe() callback
step3:
create remove() callback
step4:
create a pci_driver structure containing the three pointers above
step5:
create an init() function just calling the pci_register_driver() to register the pci_driver
table defined above.
step6:
create an exit() function to call the pci_unregister_driver() function.
=======================================================================
类别 |
函数名 |
功能 |
函数形成 |
参数 |
描述 |
驱动程序入口和出口点 |
module_init |
驱动程序初始化入口点 |
module_init ( x) |
x为启动时或插入模块时要运行的函数 |
如果在启动时就确认把这个驱动程序 插入内核或以静态形成链接,则module_init 将其初始化例程加入到"__initcall.int"代码段,否则将用init_module封装其初始化例程,以便该驱动程序作为模块来使用。 |
module_exit |
驱动程序退出出口点 |
module_exit ( x) |
x为驱动程序被卸载时要运行的函数 |
当驱动程序是一个模块,用rmmod卸载一个模块时module_exit()将用cleanup_module()封装clean-up代码。如果驱动程序是静态地链接进内核,则module_exit()函数不起任何作用。 |
|
原子和指针操作 |
atomic_read |
读取原子变量 |
atomic_read ( v) |
v为指向atomic_t类型的指针 |
原子地读取v的值。注意要保证atomic的有用范围只有24位。 |
atomic_set |
设置原子变量 |
atomic_set ( v, i) |
v为指向atomic_t类型的指针,i为待设置的值 |
原子地把v的值设置为i。注意要保证atomic的有用范围只有24位。 |
|
atomic_add |
把整数增加到原子变量 |
void atomic_add (int i, atomic_t * v) |
i为要增加的值,v为指向atomic_t类型的指针。 |
原子地把i 增加到v。注意要保证atomic的有用范围只有24位。 |
|
atomic_sub |
减原子变量的值 |
void atomic_sub (int i, atomic_t * v) |
i为要减取的值,v为指向atomic_t类型的指针。 |
原子地从v减取i。注意要保证atomic的有用范围只有24位。 |
|
atomic_sub_and_test |
从变量中减去值,并测试结果 |
int atomic_sub_and_test (int i, atomic_t * v) |
i为要减取的值,v为指向atomic_t类型的指针。 |
原子地从v减取i的值,如果结果为0,则返回真,其他所有情况都返回假。注意要保证atomic的有用范围只有24位。 |
|
atomic_inc |
增加原子变量的值 |
void atomic_inc (atomic_t * v) |
v为指向atomic_t类型的指针。 |
原子地从v减取1。注意要保证atomic的有用范围只有24位。 |
|
atomic_dec |
减取原子变量的值 |
void atomic_dec (atomic_t * v) |
v为指向atomic_t类型的指针。 |
原子地给v增加1。注意要保证atomic的有用范围只有24位。 |
|
atomic_dec_and_test |
减少和测试 |
int atomic_dec_and_test (atomic_t * v) |
v为指向atomic_t类型的指针。 |
原子地给v减取1,如果结果为0,则返回真,其他所有情况都返回假。注意要保证atomic的有用范围只有24位。 |
|
atomic_inc_and_test |
增加和测试 |
int atomic_ inc _and_test (atomic_t * v) |
v为指向atomic_t类型的指针。 |
原子地给v增加1,如果结果为0,则返回真,其他所有情况都返回假。注意要保证atomic的有用范围只有24位。 |
|
atomic_add_negative |
如果结果为负数,增加并测试 |
int atomic_add_negative (int i, atomic_t * v) |
i为要减取的值,v为指向atomic_t类型的指针。 |
原子地给v增加i,如果结果为负数,则返回真,如果结果大于等于0,则返回假。注意要保证atomic的有用范围只有24位。 |
|
et_unaligned |
从非对齐位置获取值 |
get_unaligned ( ptr) |
ptr指向获取的值
|
这个宏应该用来访问大于单个字节的值,该值所处的位置不在按字节对齐的位置,例如从非u16对齐的位置检索一个u16的值。注意,在某些体系结构中,非对齐访问要化费较高的代价。 |
|
put_unaligned |
把值放在一个非对齐位置 |
put_unaligned ( val, ptr) |
val为要放置的值,ptr指向要放置的位置
|
这个宏用来把大于单个字节的值放置在不按字节对齐的位置,例如把一个u16值写到一个非u16对齐的位置。注意事项同上。 |
|
延时、调度及定时器例程 |
schedule_timeout |
睡眠到定时时间到 |
signed long schedule_timeout (signed long timeout) |
timeout为以jiffies为单位的到期时间 |
使当前进程睡眠,直到所设定的时间到期。如果当前进程的状态没有进行专门的设置,则睡眠时间一到该例程就立即返回。如果当前进程的状态设置为: TASK_UNINTERRUPTIBLE:则睡眠到期该例程返回0 :TASK_INTERRUPTIBLE:如果当前进程接收到一个信号,则该例程就返回,返回值取决于剩余到期时间。 当该例程返回时,要确保当前进程处于TASK_RUNNING状态。 |
=======================================================================
查看内核版本:
uname -a
more /etc/*release
more /etc/redhat-release
more /proc/version
查看CPU信息:
grep "model name" /proc/cpuinfo
more /proc/cpuinfo
查看CPU位数:
getconf LONG_BIT
查看libc、gcc版本:
ldd /sbin/mii-tool
rpm -qa | grep glibc
gcc –v
查看内存信息:
more /proc/meminfo
grep MemTotal /proc/meminfo
=======================================================================
COMMAND 命令 | DESCRIPTION 注解 |
System information 系统信息 |
|
arch | show architecture of machine 显示主机的体系结构 |
uname -r | show used kernel version 显示kernel版本信息 |
dmidecode -q | show hardware system components - (SMBIOS / DMI) 显示硬件系统部件 |
hdaparm -i /dev/hda | displays the characteristics of a hard-disk 显示某一硬盘特点 |
hdparm -tT /dev/sda | perform test reading on a hard-disk 执行某一硬盘读取测试 |
cat /proc/cpuinfo | show information CPU info 显示CPU信息 |
cat /proc/interrupts | show interrupts 显示中断信息 |
cat /proc/meminfo | verify memory use 核实内存使用情况 |
cat /proc/swaps | show file(s) swap 显示文件swap情况 |
cat /proc/version | show version of the kernel 显示kernel版本信息 |
cat /proc/net/dev | show network adpters and statistics 显示网络信息 |
cat /proc/mounts | show mounted file system(s) 显示挂载系统信息 |
lspci -tv | display PCI devices 显示PCI设备 |
lsusb -tv | show USB devices 显示USB设备 |
date | show system date 显示系统日期 |
cal 2007 | show the timetable of 2007 显示2007年日历 |
date 041217002007.00 | set date and time - MonthDayhoursMinutesYear.Second 设置时间和日期 - 格式:月日时分年.秒 |
clock -w | save changes on BIOS 保存BIOS设置 |
COMMAND 命令 | DESCRIPTION 注解 |
Shutdown, Restart of a system and Logout 系统关机,重启或注销 |
|
shutdown -h now | shutdown system 关闭系统 |
init 0 | |
shutdown -r hours:minutes | planned shutdown of the system 定时关机 |
shutdown -c | cancel a planned shutdown of the system 取消定时关机 |
shutdown -r now | reboot 重启系统 |
reboot | |
logout | leaving session 注销用户 |
COMMAND 命令 | DESCRIPTION 注解 |
Mounting a Filesystem 挂载文件系统 |
|
mount /dev/hda2 /mnt/hda2 | mount disk called hda2 - verify existence of the directory '/ mnt/hda2' 挂载名为hda2的硬盘设备 |
umount /dev/hda2 | unmount disk called hda2 - exit from mount point '/ mnt/hda2' first 取消挂载名为hda2的硬盘设备 |
fuser -km /mnt/hda2 | force umount when the device is busy 强行取消挂载设备 |
umount -n /mnt/hda2 | run umount without writing the file /etc/mtab - useful when the file is read-only or the hard disk is full 不记录挂载信息直接取消挂载 - 当硬盘为只读或硬盘已满时很实用 |
mount /dev/fd0 /mnt/floppy | mount a floppy disk 挂载软盘 |
mount /dev/cdrom /mnt/cdrom | mount a cdrom / dvdrom 挂载CDrom或DVDrom |
mount /dev/hdc /mnt/cdrecorder | mount a cdrw / dvdrom 挂载CD-RW或DVDrom |
mount /dev/hdb /mnt/cdrecorder | mount a cdrw / dvdrom 挂载CD-RW或DVDrom |
mount -o loop file.iso /mnt/cdrom | mount a file or iso image 挂载一个文件或ISO光盘镜像 |
mount -t vfat /dev/hda5 /mnt/hda5 | mount a Windows FAT32 file system 挂载windows FAT32文件系统 |
mount /dev/sda1 /mnt/usbdisk | mount a usb pen-drive or flash-drive 挂载USB闪存设备 |
mount -t smbfs -o username=user,password=pass //winclient/share /mnt/share | mount a windows network share 挂载windows网络共享 |
=======================================================================
NFS相关
host
1 NFS安装
####sudo apt-get install nfs-kernel-server
####sudo apt-get install portmap nfs-kernel-server
sudo apt-get install nfs-kernel-server nfs-common portmap
配置NFS:
配置portmap$ sudo dpkg-reconfigure portmap ,
对Should portmap be bound to the loopback address? 选N.
In /etc/default/nfs-common we set:
NEED_IDMAPD=yes
NEED_GSSD=no # no is default
/etc/idmapd.conf file
[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup
配置/etc/hosts.deny
禁止任何host(主机)能和你的NFS服务器进行NFS连接,加入:
### NFS DAEMONS
portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL
配置/etc/hosts.allow
允许那些你想要的主机和你的NFS服务器建立连接。
下列步骤将允许任何IP地址以192.168.1开头的主机(连接到NFS服务器上),
也可以指定特定的IP地址。参看man页 hosts_access(5), hosts_options(5)。
### NFS DAEMONS
portmap: 192.168.1.
lockd: 192.168.1.
rquotad: 192.168.1.
mountd: 192.168.1.
statd: 192.168.1.
/etc/hosts.deny 和 /etc/hosts.allow 设置对portmap的访问.
采用这两个配置文件有点类似"mask"的意思.
先在/etc/hosts.deny中禁止所有用户对portmap的访问.
再在/etc/hosts.allow 中允许某些用户对portmap的访问.
运行 $ sudo /etc/init.d/portmap restart 重启portmap daemon.
(sudo service portmap restart)
2 修改配置文件/etc/exports
/directory *(rw,sync,no_root_squash)
no_root_squash,挂载此目录的客户机享有主机root的权利;
最好加上sync,否则$ sudo exportfs -r 时会给出警告, sync是NFS的默认选项.
修改目录权限 :chmod 777 -R /directory
3 exportfs –rv来使配置文件生效
sudo exportfs -arv
运行 $ showmount -e 查看NFS server的export list
4 配置宿主机的IP
# ifconfig eth0 192.168.x.xx
5 启动宿主机NFS服务
//-----/etc/init.d/portmap restart
/etc/init.d/nfs-kernel-server restart
$ sudo iptables -F
client
$ sudo apt-get install nfs-commmon
#sudo /etc/init.d/portmap start
将portmap服务开启。
然后执行(192.168.1.121这是我的服务器IP地址):
# showmount -e 192.168.1.121
mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 <host ip>:/主机nfs目录 /挂载路径
auto mount by fstab
sudo gedit /etc/fstab
192.168.1.121:/home/zhaohui/NFS_11_04 /home/zhaohui/NFS_client nfs auto,rw,user 0 0
192.168.1.121:/home/zhaohui/NFS_10_04 /home/zhaohui/NFS_client nfs auto,rw,user 0 0
192.168.1.121:/home/zhaohui/NFS_09_10 /home/zhaohui/NFS_client nfs auto,rw,user 0 0
Ubuntu nfs常用的参数有:
ro 只读访问
rw 读写访问sync 所有数据在请求时写入共享
async nfs在写入数据前可以响应请求
secure nfs通过1024以下的安全TCP/IP端口发送
insecure nfs通过1024以上的端口发送
wdelay 如果多个用户要写入nfs目录,则归组写入(默认)
no_wdelay 如果多个用户要写入nfs目录,则立即写入,当使用async时,无需此设置。
hide 在nfs共享目录中不共享其子目录
no_hide 共享nfs目录的子目录
subtree_check 如果共享/usr/bin之类的子目录时,强制nfs检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squas root用户具有根目录的完全管理访问权限
anonuid=xxx 指定nfs服务器/etc/passwd文件中匿名用户的UID
anongid=xxx 指定nfs服务器/etc/passwd文件中匿名用户的GID
NFS相关的几个文件, 命令:
1, /etc/exports
对NFS卷的访问是由exports来批准, 它枚举了若干有权访问NFS服务器上文件系统的主机名.
2, /usr/sbin/exportfs
维护NFS的资源共享. 可以通过它重新设定 /etc/exports 的共享目录, 卸载NFS Server共享的目录或者重新共享等.
3, /usr/sbin/showmount
用在 NFS Server 端,而 showmount 则主要用在 Client 端. showmount 可以用來查看 NFS 共享的目录资源.
4, /var/lib/nfs/xtab
NFS的记录文档: 通过它可以查看有哪些Client 连接到NFS主机的记录.
RPC相关的几个文件
5, /etc/default/portmap
实际上, portmap负责映射所有的RPC服务端口, 它的内容非常非常之简单(后面详述)
6, /etc/hosts
设定拒绝\允许portmap服务的主机
other for ubuntu
安装解压文件!
sudo apt-get install unace unrar zip unzip p7zip-full p7zip-rar
sharutils rar uudeview mpack lha arj
cabextract file-roller
备份数据Deja Dup!
sudo apt-get install deja-dup
=======================================================================
GNU binutils工具使用
$ gcc -Wall -c file1.c file2.c file3.c
|
$ ar rv libNAME.a file1.o file2.o file3.o
|
$ gcc -Wall -c -fpic file1.c file2.c file3.c
|
$ gcc -shared -o libNAME.so file1.o file2.o file3.o
|
$ gcc -Wall -shared -fpic -o libNAME.so file1.c file2.c file3.c
|
error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory |
export LD_LIBRARY_PATH=
动态库所在目录
:$LD_LIBRARY_PATH
|
$ ar tv archiveNAME
|
int main(int argc, char *argv[]) { hello(); bye(); return 0; } |
void hello(void) { printf("hello!/n"); } |
void bye(void) { printf("good bye!/n"); } |
main.o: U bye U hello 00000000 T main hello.o: 00000000 T hello U puts bye.o: 00000000 T bye U puts |
$ file hello.o hello
|
$ objcopy -O srec hello hello_srec $ file hello.o hello |
$ objdump -f hello hello_srec
|
$ objdump -d hello.o
|
$
readelf -h hello
|
#include <stdio.h> /* Computes the length of Collatz sequences */ unsigned int step (unsigned int x) { if (x % 2 == 0) { return (x / 2); } else { return (3 * x + 1); } } unsigned int nseq (unsigned int x0) { unsigned int i = 1, x; if (x0 == 1 || x0 == 0) return i; x = step (x0); while (x != 1 && x != 0) { x = step (x); i++; } return i; } int main (void) { unsigned int i, m = 0, im = 0; for (i = 1; i < 500000; i++) { unsigned int k = nseq (i); if (k > m) { m = k; im = i; printf ("sequence length = %u for %u/n", m, im); } } return 0; } |
$
gcc -Wall -c -pg collatz.c
|
$
gcc -Wall -pg -o collatz collatz.o
|
=======================================================================
嵌入式开发基本工具
minicom
sudo apt-get install minicom
NFS
sudo apt-get install nfs-kernel-server
sudo gedit /etc/exports
echo '/home/zhaohui/dvsdk/filesys *(rw,no_root_squash,no_all_squash,sync,no_subtree_check)' >> /etc/exports
sudo /usr/sbin/exportfs -va
sudo service nfs-kernel-server restart
tftp
sudo apt-get install tftpd-hpa
sudo gedit /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-c --secure"
sudo service tftpd-hpa restart
Uboot-mkimage
sudo apt-get install uboot-mkimage
Nautilus-open-terminal
sudo apt-get install nautilus-open-terminal
Ibus-pinyin
sudo apt-get install ibus-pinyin
rapidsvn
sudo apt-get install rapidsvn
meld
sudo apt-get install meld
=======================================================================
=======================================================================