## GNU
- 官网:
- grub:
- bash:
- libc:
- gcc:
- gdb:
C99
```
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
```
POSIX.1
```
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
```
## LINUX
- 官网:
- 文档:
- 源码:
- 开源:
- 代理:
## 系统内核
### 内核源码
lib
arch
init
kernel
include
drivers
ipc
net
mm
fs
firmware
security
crypto
sound
block
virt
tools
scripts
samples
Makefile
Kconfig
Kbuild
usr
README
COPYING
CREDITS
Documentation
MAINTAINERS
REPORTING-BUGS
### 系统启动
```
startup_32() // linux-2.6.12/arch/i386/kernel/head.S:57
start_kernel() // linux-2.6.12/init/main.c:424
do_basic_setup()
sock_init() // net/socket.c:2025
sched_init()
trap_init() // arch/i386/kernel/traps.c
init_IRQ()
init_timers()
softirq_init()
time_init() // arch/i386/kernel/time.c
time_init_hook()
setup_irq(0, timer_interrupt)
```
### 进程调度
```
struct task_struct { // linux-3.7.4/include/linux/sched.h:1190
// 进程状态
state long / TASK_RUNNING // include/linux/sched.h:108
// 线程信息
thread_info *struct thread_info
task *struct task_struct
status
// 进程树
parent *struct task_struct
children struct list_head
sibling struct list_head
mm *struct mm_struct
start_code
end_code
start_data
end_data
start_brk
brk
mmap_base
start_stack
arg_start
arg_end
env_start
env_end
thread struct thread_struct
sp0
sp
es
ds
fsindex
gsindex
ip
fs
gs
fs *struct fs_struct
files *struct files_struct
pid pid_t
tgid pit_t
}
schedule()
```
### 时间管理
```
timer_interrupt() // arch/i386/kernel/time.c:292
do_timer_interrupt() // arch/i386/kernel/time.c:250
do_timer_interrupt_hook()
do_timer() // kernel/timer.c:925
```
### 系统中断
```
interrupt() // arch/i386/kernel/entry.S:397
do_IRQ() // arch/i386/kernel/irq.c:51
__do_IRQ() // kernel/irq/handle.c:107
handle_IRQ_event()
do_softirq() // arch/i386/kernel/softirq.c:158
__do_softirq() // kernel/softirq.c:74
tasklet_schedule() // include/linux/interrupt.h
__tasklet_schedule() // kernel/softirq.c:223
run_workqueue() // kernel/workqueue.c:145
```
### 并发同步
```
atomic_add() // include/asm-i386/atomic.h
spin_lock_irq() // include/linux/spinlock.h
down_interruptible() // include/asm-i386/semaphore.h
wait_for_completion() // kernel/sched.c
```
### 系统调用
```
system_call() // arch/i386/kernel/entry.S:225
sys_call_table[] // arch/i386/kernel/syscall_table.S
.long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */
.long sys_exit() // kernel/exit.c:859
do_exit()
exit_mm()
exit_sem()
__exit_files()
__exit_fs()
exit_namespace()
exit_thread()
cpuset_exit()
exit_keys()
exit_notify()
schedule()
.long sys_fork // arch/i386/kernel/process.c:645
do_fork() // kernel/fork.c:1192
copy_process()
dup_task_struct()
copy_files()
copy_fs()
copy_sighand()
copy_signal()
copy_mm()
sched_fork()
wake_up_new_task()
.long sys_read
.long sys_write
.long sys_open /* 5 */
get_unused_fd()
filp_open()
open_namei()
path_lookup()
dentry_open()
fd_install()
.long sys_close
.long sys_socketcall // net/socket.c:1897
sys_socket()
socket_create()
__sock_create()
net_families[i]->create()/inet_create()
inetsw_array[j]->prot->init()/tcp_v2_init_sock()
sys_bind()
sys_connect()
sys_listen()
sys_accept()
sys_getsocketname()
sys_getpeername()
sys_socketpair()
sys_send()
sys_sendto()
sys_sendto()
socket_sendmsg()
__sock_sendmsg()
sys_recv()
sys_recvfrom()
sys_recvfrom()
sock_recvmsg()
__sock_recvmsg()
sock->ops->recvmsg()/inetsw_array[j]->ops->recvmsg()/inet_stream_ops->recvmsg()/sock_common_recvmsg()
sk->sk_prot->recvmsg()/inetsw_array[j]->prot->recvmsg()/tcp_prot->recvmsg()/tcp_recvmsg()
sk_wait_data()
prepare_to_wait(sk->sk_sleep)
sk_wait_event()
release_sock()
__release_sock()
sk->sk_backlog_rcv()/sk->sk_prot->backlog_rcv()/inetsw_array[j]->prot->backlog_rcv()/tcp_prot->backlog_rcv()/tcp_v4_do_rcv()
sys_shutdown()
sys_setsocketopt()
sys_getsocketopt()
sys_sendmsg()
sys_recvmsg()
...
```
## 网络编程
### 网络协议
MAC ARP
IP ICMP
TCP UDP SCTP
RIP BGP OSPF
DNS NAT DHCP
FTP SSH SNMP
SMTP IMAP POP3
HTTP HTML
### 网络命令
```
ifconfig
nslookup
netstat
tcpdump
telnet
ping
wget
curl
/etc/resolve.conf
/etc/hostname
/etc/hosts
```
### 网络编程
```
#include
socket()
bind()
listen()
accept()
connect()
recv()
send()
shutdown()
#include
socket_in: struct
sin_len: uint8_t
sin_family: sa_family_t
sin_port: in_port_t
sin_addr: struct in_addr
s_addr: in_addr_t
htons()
ntohs()
#include
inet_addr()
inet_ntoa()
inet_aton()
#include
gethostbyname()
gethostbyaddr()
getservbyname()
getservbyport()
```
### 系统调用
```
socket()/sys_socket() // net/socket.c:1180
sock_create(family, type, protocol, &sock)
__sock_create(family, type, protocol, res, 0)
net_families[PF_INET]->create(sock, protocol)/inet_create()
sock_init_data(sock, sk)
skb_queue_head_init(&sk->sk_receive_queue)
skb_queue_head_init(&sk->sk_write_queue)
skb_queue_head_init(&sk->sk_error_queue)
sk->sk_state_change = sock_def_wakeup
sk->sk_data_ready = sock_def_readable
sk->sk_prot->init(sk)/tcp_v4_init_sock()
tcp_init_xmit_timers(sk)
tp->retransmit_timer.function = &tcp_write_timer
tp->delack_timer.function = &tcp_delack_timer
sk->sk_timer.function = &tcp_keepalive_timer
sk->sk_state = TCP_CLOSE
sock_map_fd(sock)
file->f_op = SOCK_INODE(sock)->i_fop = &socket_file_ops
bind()/sys_bind() // net/socket.c:1276
sock->ops->bind(sock)/inet_bind()
listen()/sys_listen() // net/socket.c:1306
sock->ops->listen(sock)/inet_listen() // net/ipv4/af_inet.c:193
tcp_listen_start(sk)
tp->accept_queue = tp->accept_queue_tail = NULL
accept()/sys_accept() // net/socket.c:1340
sock->ops->accept(sock, newsock)/inet_accept() // net/ipv4/af_inet.c:590
sk1->sk_prot->accept(sk1)/tcp_accept() // net/ipv4/tcp.c:1895
wait_for_connect(sk, timeo)
prepare_to_wait_exclusive(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE)
tp->accept_queue->sk
connect()/sys_connect() // net/socket.c:1410
sock->ops->connect()/inet_stream_connect() // net/ipv4/af_inet.c:504
sk->sk_prot->connect(sk)/tcp_v4_connect() // net/ipv4/tcp_ipv4.c:747
tcp_set_state(sk, TCP_SYN_SENT) // include/net/tcp.h:1607
tcp_v4_hash_connect(sk)
tcp_connect(sk) // net/ipv4/tcp_output.c:1481
__skb_queue_tail(&sk->sk_write_queue, buff)
tcp_transmit_skb(sk, skb_clone(buff, GFP_KERNEL))
tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto)
inet_wait_for_connect(sk, timeo)
prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE)
recv()/sys_recv() // net/socket.c:1592
sock_recvfrom()
sock_recvmsg()
__sock_recvmsg()
sock->ops->recvmsg()/inetsw_array[j]->ops->recvmsg()/inet_stream_ops->recvmsg()/sock_common_recvmsg()
sk->sk_prot->recvmsg()/inetsw_array[j]->prot->recvmsg()/tcp_prot->recvmsg()/tcp_recvmsg()
sk_wait_data()
prepare_to_wait(sk->sk_sleep)
sk_wait_event()
release_sock()
__release_sock()
sk->sk_backlog_rcv()/sk->sk_prot->backlog_rcv()/inetsw_array[j]->prot->backlog_rcv()/tcp_prot->backlog_rcv()/tcp_v4_do_rcv()
send()/sys_send() // net/socket.c:1541
sys_send_to()
sock_sendmsg(sock, &msg, len)
__sock_sendmsg(&iocb, sock, msg, size)
sock->ops->sendmsg(iocb, sock, msg, size)/tcp_sendmsg()
skb_entail(sk, tp, skb)
__skb_queue_tail(&sk->sk_write_queue, skb)
sk->sk_send_head = skb
tcp_push_one(sk, mss_now)
tcp_transmit_skb(sk, skb_clone(skb, sk->sk_allocation))
shutdown()/sys_shutdown() // net/socket.c:1660
sock->ops->shutdown(sock, how)/inet_shutdown() // net/ipv4/af_inet.c:671
sk->sk_prot->shutdown(sk, how)/tcp_shutdown() // net/ipv4/tcp.c:1571
tcp_close_state()
tcp_send_fin() // net/ipv4/tcp_output.c:1247
```
### 内核模块
```
static struct inet_protosw inetsw_array[] = { // net/ipv4/af_inet.c:857
{
type/SOCK_STREAM
protocol/IPPROTO_TCP
prot/tcp_prot // net/ipv4/tcp_ipv4.c:2593
init/tcp_v4_init_sock
accept/tcp_accept
connect/tcp_v4_connect
sendmsg/tcp_sendmsg
recvmsg/tcp_recvmsg
shutdown/tcp_shutdown,
ops/inet_stream_ops // net/ipv4/af_inet.c:777
bind/inet_bind
listen/inet_listen
accept/inet_accept
connect/inet_stream_connect
sendmsg/inet_sendmsg
recvmsg/sock_common_recvmsg
shutdown/inet_shutdown
},
}
struct tcp_func ipv4_specific = { // net/ipv4/tcp_ipv4.c:2023
syn_recv_sock/tcp_v4_syn_recv_sock
conn_request/tcp_v4_conn_request
send_check/tcp_v4_send_check
queue_xmit/ip_queue_xmit
}
enum { // include/linux/tcp.h:59
TCP_ESTABLISHED = 1,
TCP_SYN_SENT,
TCP_SYN_RECV,
TCP_FIN_WAIT1,
TCP_FIN_WAIT2,
TCP_TIME_WAIT,
TCP_CLOSE,
TCP_CLOSE_WAIT,
TCP_LAST_ACK,
TCP_LISTEN,
TCP_CLOSING, /* now a valid state */
TCP_MAX_STATES /* Leave at the end! */
};
module_init(inet_init) net/ipv4/af_inet.c:1115
inet_init() net/ipv4/af_inet.c:1012
sock_register()
net_families[PF_INET]=inet_family_ops
proto_register(&tcp_prot, 1)
proto_register(&udp_prot, 1)
proto_register(&raw_prot, 1)
arp_init()
ip_init()
dev_add_pack()
tcp_v4_init()
tcp_init()
icmp_init()
```
### 网卡驱动
```
e1000_up() // drivers/net/e1000/e1000_main.c:297
e1000_configure_rx()
adapter->clean_rx = e1000_clean_rx_irq
request_irq(e1000_intr)
e1000_intr()
adapter->clean_rx()/e1000_clean_rx_irq()
netif_receive_skb(skb)
deliver_skb(skb, pt_prev)
pt_recv->func()/ip_rcv() // net/ipv4/ip_input():360
ip_rcv_finish()
dst_input()
skb->dst->input()/ip_local_deliver()
ip_local_deliver_finish()
ipprot->handler()/tcp_v4_rcv()
tcp_v4_do_rcv()
TCP_LISTEN? tcp_v4_hnd_req(sk, skb)
tcp_check_req(sk, skb, req, prev)
tcp_acceptq_queue(sk, req, child)
tp->accept_queue = req
tcp_rcv_state_process()
tcp_rcv_state_process() // net/ipv4/tcp_input.c:4688
TCP_LISTEN? tp->af_specific->conn_request()/tcp_func->conn_request()/tcp_v4_conn_request() // net/ipv4/tcp_ipv4.c:1396
tcp_v4_send_synack(sk, req, dst)
TCP_SYN_SENT? tcp_rcv_synsent_state_process(sk, skb, th, len)
th->ack&&th->syn? tcp_ack(sk, skb, FLAG_SLOWPATH)
th->ack&&th->syn? tcp_set_state(sk, TCP_ESTABLISHED)
sk_wake_async(sk, 0, POLL_OUT);
th->rst? tcp_reset()
tcp_done()
tcp_set_state(sk, TCP_CLOSE)
th->ack?
TCP_SYN_RECV? tcp_set_state(sk, TCP_ESTABLISHED)
TCP_SYN_RECV? sk_wake_async(sk,0,POLL_OUT)
TCP_FIN_WAIT1? tcp_set_state(sk, TCP_FIN_WAIT2)
TCP_CLOSING? tcp_time_wait(sk, TCP_TIME_WAIT, 0)
TCP_LAST_ACK? tcp_done()
tcp_urg(sk, skb, th)
TCP_ESTABLISHED? tcp_data_queue(sk, skb)
__skb_queue_tail(&sk->sk_receive_queue, skb)
th->fin? tcp_fin(skb, sk, th)
TCP_SYN_RECV? tcp_set_state(sk, TCP_CLOSE_WAIT)
TCP_ESTABLISHED? tcp_set_state(sk, TCP_CLOSE_WAIT)
TCP_FIN_WAIT1? tcp_send_ack(sk);
TCP_FIN_WAIT1? tcp_set_state(sk, TCP_CLOSING);
TCP_FIN_WAIT2? tcp_send_ack(sk);
TCP_FIN_WAIT2? tcp_set_state(sk, TCP_TIME_WAIT);
sk->sk_data_ready()/sock_def_readable()
wake_up_interruptible(sk->sk_sleep)
sk_wake_async(sk,1,POLL_IN)
```
## 并发编程
### 文件
```
#include
#include
fcntl()sys_fcntl() // fs/fcntl.c:333
open()/sys_open() // fs.open.c:933
fd = get_unused_fd()
f = filp_open()
nd = open_namei(filename)
path_lookup(name, nd)
nd->mnt = mntget(current->fs->rootmnt);
nd->dentry = dget(current->fs->root);
nd->mnt = mntget(current->fs->pwdmnt);
nd->dentry = dget(current->fs->pwd);
link_path_walk(name, nd);
__link_path_walk(name, nd);
do_lookup(nd, &this, &next);
real_lookup(nd->dentry, name, nd);
dir->i_op->lookup(dir, dentry, nd)/ext3_lookup()
ext3_find_entry(dentry, &de)
__lookup_hash(&nd->last, nd->dentry, nd)
cached_lookup(base, name, nd)
new = d_alloc(base, name)
inode->i_op->lookup(inode, new, nd)
vfs_create(dir->d_inode, path.dentry, mode, nd)
dir->i_op->create(dir, dentry, mode, nd)/ext3_create()
inode = ext3_new_inode(handle, dir, mode)
new_inode()
alloc_inode(sb)
sb->s_op->alloc_inode(sb)
inode->i_op = &ext3_file_inode_operations;
inode->i_fop = &ext3_file_operations;
dentry_open(nd.dentry, md.mnt)
f->f_dentry = dentry
f->f_vfsmnt = mnt
inode = dentry->d_inode
f->f_op = fops_get(inode->i_fop)
f->f_op->open(inode,f)
fd_install(fd, f)
files->fd[fd] = f
read()/sys_read() // fs/read_write.c:312
file_pos_read()
vfs_read()
rw_verify_area(READ, file, pos, count)
locks_mandatory_area()
__posix_lock_file(inode, &fl)
wait_event_interruptible(fl.fl_wait, !fl.fl_next)
file->f_op->read(file, buf, count, pos)/do_sync_read()
filp->f_op->aio_read(&kiocb, buf, len, kiocb.ki_pos)/generic_file_aio_read()
__generic_file_aio_read(iocb, &local_iov, 1, &iocb->ki_pos)
do_generic_file_read(filp,ppos,&desc,file_read_actor)
do_generic_mapping_read(filp->f_mapping)
find_get_page(mapping, index)
radix_tree_lookup(&mapping->page_tree, offset)
page_cache_get(page)
mapping->a_ops->readpage(filp, page)/ext3_readpage()
mpage_readpage()
do_mpage_readpage()
mpage_bio_submit(READ, bio)
submit_bio(rw, bio)
generic_make_request(bio)
block_wait_queue_running(q)
prepare_to_wait_exclusive(&rl->drain, &wait, TASK_UNINTERRUPTIBLE)
file_pos_write()
write()/sys_write() // fs/sys_write():330
file_pos_read(file)
vfs_write(file, buf, count, &pos)
rw_verify_area(WRITE, file, pos, count)
file->f_op->write(file, buf, count, pos)/do_sync_write()
filp->f_op->aio_write(&kiocb, buf, len, kiocb.ki_pos)/ext3_file_write()
generic_file_aio_write(iocb, buf, count, pos)
__generic_file_aio_write_nolock(iocb, &local_iov, 1, &iocb->ki_pos)
generic_file_buffered_write(iocb, iov, nr_segs, pos, ppos, count, written)
a_ops->commit_write(file, page, offset, offset+bytes)/ext3_writeback_commit_write()
generic_commit_write(file, page, from, to)
__block_commit_write(inode,page,from,to)
sync_page_range(inode, mapping, pos, ret)
file_pos_write(file, pos)
current:*struct task_struct
fs:*struct fs_struct
pwd:*struct dentry
root:*struct dentry
altroot:*struct dentry
pwdmnt:*struct vfsmount
rootmnt:*struct vfsmount
altrootmnt:*struct vfsmount
files:*struct files_struct
fd:**struct file // include/linux/fs.h:576
f_pos:loff_t
f_count:atomic_t
f_op:*struct file_operations
f_dentry:*struct dentry // include/linux/dcache.h:83
d_name:struct qstr
d_inode:*struct inode // include/linux/fs.h:427
i_ino:unsigned long
i_size:loff_t
i_op:*struct inode_operations/ext3_dir_inode_operations
lookup:ext3_lookup
create:ext3_create
i_op:*struct inode_operations/ext3_file_inode_operations
i_op:*struct inode_operations/ext3_symlink_inode_operations
i_op:*struct inode_operations/ext3_fast_symlink_inode_operations
i_fop:*struct file_operations/ext3_dir_operations
i_fop:*struct file_operations/ext3_file_operations
open:generic_file_open
ioctl:ext3_ioctl
read:do_sync_read
write:do_sync_write
aio_read:generic_file_aio_read
aio_write:ext3_file_write
llseek:generic_file_llseek
release:ext3_release_file
i_mapping:*struct address_space
a_ops:*struct address_space_operations/ext3_writeback_aops
commit_write:ext3_writeback_commit_write
writepage:ext3_writeback_writepage
d_op:*struct dentry_operations
d_sb:*struct super_block
s_op:*struct super_operations
f_vfsmnt:*struct vfsmount
ext3_sops:struct super_operations
alloc_inode:ext3_alloc_inode
destroy_inode:ext3_destroy_inode
read_inode:ext3_read_inode
write_inode:ext3_write_inode
module_init(init_ext3_fs)
register_filesystem(&ext3_fs_type)
```
```
/dev/null
/dev/stdio
/dev/stdout
/dev/stderr
#include
STDIN_FILENO
STDOUT_FILENO
STDERR_FILENO
read()
write()
lseek()
close()
ioctl()
sync()
fsync()
fdatasync()
```
### 信号
signal()
### 进程并发
fork()
exec()
exit()
wait()
### 线程并发
pthread_create()
pthread_self()
pthread_exit()
pthread_join()
pthread_detach()
pthread_mutex_lock()
pthread_mutex_unlock()
pthread_cond_wait()
pthread_cond_signal()
## 系统编程
### 启动
/etc/passwd
/etc/shadow
fork()
setsid()
### 配置
### 多路
select()
epoll()
```
```
### 日志
```
#include
errno:int
#include
strerror()
#include
perror()
#include
syslog()
```
### 用户
```
/etc/passwd
/etc/shadow
/etc/group
getuid()
getpid()
```
### 调试
### 定时
### 延时
alarm()
### 集群
### 存储
## Compile
```
linux-3.7.4/Makefile
include $(srctree)/arch/$(SRCARCH)/Makefile # linux-3.7.4/Makefile:495
```
sudo apt-get install libncurses5-dev
make defconfig
make menuconfig
make
make tags
## GCC
gcc -E hi.c -o hi.i
gcc -S hi.c
gcc -c hi.c
ar -r hi.a hi.o he.o
gcc -shared -fPIC -o hi.so hi.c he.c
gcc -L./ -lhi main.c
nm
readelf -S hi.o
objdump -d hi.o
hexdump -C hi.o
## GRUB
- 下载:
BIOS MBR GRUB
## 内核启动
```
startup_32() // arch/x86/kernel/head_32.S:88
i386_start_kernel() // arch/x86/kernel/head32.c:31
start_kernel() // init/main.c:468
mm_init()
sched_init()
console_init()
signals_init()
rest_init()
kernel_thread(kernel_init)
do_fork() // kernel/fork.c:1548
copy_process()
wake_up_new_task() // kernel/sched/core.c:1622
activate_task()
enqueue_task(rq, p)
kernel_init() // init/main.c:805
run_init_process()
kernel_execve() // fs/exec.c:1710
do_execve()
do_execve_common()
open_exec()
sched_exec() // kernel/sched/core.c:2538
select_task_rq()
bprm_mm_init()
prepare_binprm()
search_binary_handler()
formats[i]->load_binary()
fair_sched_class() // kernel/sched/fair.c:5308
select_task_rq_fair()
pick_next_task_fair()
pick_next_entity()
__pick_first_entity()
rb_entry()
formats[i]->load_binary()
load_elf_binary() // fs/binfmt_elf.c:561
current->mm->start_stack
set_brk(elf_bss, elf_brk)
start_thread() // arch/x86/kernel/process_32.c:200
formats[i]->load_binary()
load_script()
bprm_change_interp()
open_exec()
prepare_binprm()
search_binary_handler()
```