TLPI-Chapter 7 内存分配

第七章将的malloc函数族,进程可以动态分配和释放内存。在讨论这些函数的实现时,描述了程序对已分配内存处理失当的种种情况,还点出了一些有助于定位此类错误根源的调试工具。

在课后练习中针对free_and_sbrk.c的修改如下:在每次malloc后,打印出program break堆顶的当前值。来验证malloc不会每次被调用时都调用sbrk()来调整program break的位置,而是周期性地分配大块内存。

root@ubuntu:~/tlpi-book/memalloc# ./free_and_sbrk 1000 1024 1 1 1000

Initial program br......

TLPI-Chapter 6 进程

每个进程都有一个唯一进程标识号(process ID),并保存有对其父进程号的记录。

进程的虚拟内存逻辑上被划分为许多段:文本段、数据段、栈和堆。

栈由一系列帧组成,随函数调用而增长,随函数返回而减,每个帧都包含有函数局部变量、函数实参以及单个函数调用的调用链接信息。

程序调用时命令行参数通过argc argv参数提供给main()函数。通常argv[0]包含调用程序的名称。

每个进程都会获得其父进程环境列表的一个副本,即一组”名称-值“的键值对。全局变量environ和各种库函数允许进程访问和修改其环境列表中的变量。

setjmp()函数和longjmp()函数提供了从函数甲执行非......

TLPI-Chapter 5深入探究文件I/O

原子操作

UNIX/Linux系统编程手册第5章深入探究文件I/O,所有的系统调用都是以原子操作方式执行。

内核保证系统调用中的所有步骤会作为一个独立操作而一次性加以执行,期间不会为其它进程或线程中断.

下面的代码中open并未使用O_EXCL标志,在程序中为了对执行该程序的进程加以区分,打印了进程号。

/*************************************************************************\

* Copyright (C) Michael Kerrisk, 2015. ......

TLPI-Chapter 4文件IO

所有执行I/O操作的系统调用都以文件描述符(一个非负整数)来指代打开的文件。文件描述符用以表示所有类型的已打开文件,包括管道、FIFO、socket、终端、设备、普通文件。它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。每个进程,文件描述符都自成一套。

三种标准的文件描述符:

0 标准输入 1 标准输出 2 标准错误

然后介绍执行文件IO操作的4个主要系统调用:

fd = open(pathname,flags,mode) 打开或创建一个新文件.

numread = read(f......

TLPI-源代码运行

上周末开始看《UNIX/Linux系统编程手册》这本书(豆瓣评分高达9.5),周末的时间看到第四章,觉得这本书比直接看Linux内核要好接受的多,因为从代码入手,可以更好的理解,比如第三章系统调用的讲解,如果只是理论方面可能比较枯燥,那么这本书中的代码,如何运行呢?

下载代码

这本书的主页.代码版本有两个:

Distribution version: a tarball of the source code that includes extra material not shown in the book. Probably, this is the version of the c......

TLPI-Chapter 3系统编程概念

第三章内容概念讲的其实相对好理解,主要有如下几点:

系统调用是可控的内核入口,进程可以请求内核以自己的名义去执行某些动作,这就用到了系统调用,讲处理器从用户态切换到内核态。

在书中作者用到一个例子X86-32为例,按事件发生顺序:

1.应用程序通过外壳(wapper)函数,发起系统调用

2.参数入栈,传入外壳函数。

3.外壳函数将参数置入特定寄存器(包括系统调用编号)

4执行中断机器指令(int 0x80)。

5.内核响应中断指令,调用system_call()里程处理中断。

如何处理中断呢?

在内核栈保存寄存器的值

审核系统调用编号的有效性

通过编号找到相应的系统调用......