linux内核分析与移植,内核分析移植
1.make?menuconfig
添加對s3c2440的支持
system??type-->?s3c2440?machine-->?smdk2440
2.??__lookup_machine_type
處理uboot傳來的?machine?id?獲得一個?表示該id的?machine_desc?結構體
smdk2440的?machin_desc??結構體的定義如下/arch/arm/mach-s3c2440/mach-smdk2440.c
MACHINE_START(S3C2440,?"SMDK2440")
/*?Maintainer:?Ben?Dooks??*/
.phys_io?=?S3C2410_PA_UART,
.io_pg_offst?=?(((u32)S3C24XX_VA_UART)?>>?18)?&?0xfffc,
.boot_params?=?S3C2410_SDRAM_PA?+?0x100,
.init_irq?=?s3c24xx_init_irq,
.map_io??=?smdk2440_map_io,
.init_machine?=?smdk2440_machine_init,
.timer??=?&s3c24xx_timer,
MACHINE_END
3.?setup_arch函數
函數的目的?處理uboot傳來的tag?參數
__lookup_machine_type??????????獲取machine_desc-->boot_params
parse_tags(tags?)??????????????根據獲得的?boot_params?對tags????初步處理
__tagtable(ATAG_MEM,?parse_tag_mem32);?內存參數處理函數的定義
在全局結構變量meninfo結構中增加內存的描述
__tagtable(ATAG_CMDLINE,?parse_tag_cmdline);命令行參數(bootargs)處理函數的定義
將命令行字符串拷貝為?default_command_line
parse_cmdline(cmdline_p,?from);??進一步處理?default_command_line
__early_param("mem=",?early_mem);????當bootargs里有?men=xxx?時執行early_men函數?進行處理
__early_param("initrd=",?early_initrd);?當bootargs里有?initrd=xxx?時執行early_initrd函數進行處理
paging_init(&meminfo,?mdesc);??對上邊的?meninfo結構處理
-->?devicemaps_init(mdesc);
-->(mdesc->map_io())??這里的mdesc就是上邊的?machine_desc?結構體
map_o??就是smdk2440_machine_init()
smdk2440_machine_init()代碼如下??該函數主要用于?設置外部晶振12000000
該函數在mach_smdk2440.c中定義
static?void?__init?smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc,?ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(16934400);
s3c24xx_init_uarts(smdk2440_uartcfgs,?ARRAY_SIZE(smdk2440_uartcfgs));
}
4.parse_args()
setup_arch()函數并沒有全部處理完tag參數?比如?ttySAC0=?XXX
這個函數會繼續處理?并對已處理的參數進一步處理
5.console_init()
該函數依次調用?__con_initcall_start?與?__con_initcall_end之間定義的每個函數
這些函數用宏?console_initcall(?fn?)定義??例如console_initcall(s3c24xx_serial_initconsole)
s3c24xx_serial_initconsol函數在/dev/serial/s3c2410.c中定義
-->register_console(&s3c24xx_serial_console);??//向內核注冊控制臺
s3c24xx_serial_console?為一個結構體
6.修改MTD分區
MTD---內存技術設備
7.驅動對設備的識別
內核確定設備的信息?加載驅動時將驅動程序與設備信息比較
如果驅動和某個設備匹配?則通過該驅動操作這個設備
內核里設備的信息用?結構體表示
設備???????struct?platform_device?{
const?char?*?name;
u32??id;
struct?device?dev;
u32??num_resources;
struct?resource?*?resource;
};
驅動????????struct?platform_driver?{
int?(*probe)(struct?platform_device?*);
int?(*remove)(struct?platform_device?*);
void?(*shutdown)(struct?platform_device?*);
int?(*suspend)(struct?platform_device?*,?pm_message_t?state);
int?(*suspend_late)(struct?platform_device?*,?pm_message_t?state);
int?(*resume_early)(struct?platform_device?*);
int?(*resume)(struct?platform_device?*);
struct?device_driver?driver;
};
10.?默認的arm的mtd的分區在arch/arm/plat-s3c24xx/common-smdk.c文件中的smdk_default_nand_part結構體里
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的linux内核分析与移植,内核分析移植的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: linux安装定制添加输入,Arch L
 - 下一篇: linux c语言编程内嵌汇编,gcc编